Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAndroidMediaEncoderRunnable::Audio Class Reference

Public Member Functions

 Audio (mlt_audio_format format, int sampleRate, int channelCount)
 
int channelCount () const
 
bool finish (Context &ctx)
 
void finishFrame ()
 
QString formatName () const
 
bool isFinished () const
 
bool isSampleDataRemaining () const
 
bool open (Context &ctx, const KisMediaEncoderWrapperSettings &settings)
 
int pullFrame (Context &ctx)
 
bool pushSamples (Context &ctx)
 
int sampleRate () const
 

Static Public Attributes

static constexpr int PULL_FRAME_END_OF_STREAM = 1
 
static constexpr int PULL_FRAME_ERROR = 2
 
static constexpr int PULL_FRAME_OK = 0
 

Private Member Functions

int samplesToSize (int samples) const
 
int sizeToSamples (int size) const
 

Private Attributes

QByteArray m_audioFileBytes
 
const int m_channelCount
 
std::unique_ptr< Mlt::Filter > m_filter
 
bool m_finished = false
 
const mlt_audio_format m_format
 
std::unique_ptr< Mlt::Frame > m_frame
 
std::unique_ptr< Mlt::Producer > m_producer
 
std::unique_ptr< Mlt::Profile > m_profile
 
int m_sampleCount = 0
 
const unsigned char * m_sampleData = nullptr
 
int m_samplePos = 0
 
const int m_sampleRate
 
const int m_sampleSize
 

Detailed Description

Definition at line 433 of file KisAndroidMediaEncoderRunnable.cpp.

Constructor & Destructor Documentation

◆ Audio()

KisAndroidMediaEncoderRunnable::Audio::Audio ( mlt_audio_format format,
int sampleRate,
int channelCount )
inline

Member Function Documentation

◆ channelCount()

int KisAndroidMediaEncoderRunnable::Audio::channelCount ( ) const
inline

Definition at line 458 of file KisAndroidMediaEncoderRunnable.cpp.

459 {
460 return m_channelCount;
461 }

References m_channelCount.

◆ finish()

bool KisAndroidMediaEncoderRunnable::Audio::finish ( Context & ctx)
inline

Definition at line 583 of file KisAndroidMediaEncoderRunnable.cpp.

584 {
585 if (!m_finished) {
586 int finishAudioResult = int(ctx.encoder().callMethod<jint>("finishAudio", "()I"));
587 if (ctx.checkResult(QStringLiteral("finishAudio"), finishAudioResult)) {
588 return false;
589 }
590 m_finished = true;
591 }
592 return true;
593 }

References KisAndroidMediaEncoderRunnable::Context::checkResult(), KisAndroidMediaEncoderRunnable::Context::encoder(), and m_finished.

◆ finishFrame()

void KisAndroidMediaEncoderRunnable::Audio::finishFrame ( )
inline

◆ formatName()

QString KisAndroidMediaEncoderRunnable::Audio::formatName ( ) const
inline

Definition at line 448 of file KisAndroidMediaEncoderRunnable.cpp.

449 {
450 return QString::fromUtf8(mlt_audio_format_name(m_format));
451 }

References m_format.

◆ isFinished()

bool KisAndroidMediaEncoderRunnable::Audio::isFinished ( ) const
inline

Definition at line 463 of file KisAndroidMediaEncoderRunnable.cpp.

464 {
465 return m_finished;
466 }

References m_finished.

◆ isSampleDataRemaining()

bool KisAndroidMediaEncoderRunnable::Audio::isSampleDataRemaining ( ) const
inline

Definition at line 570 of file KisAndroidMediaEncoderRunnable.cpp.

571 {
572 return m_samplePos < m_sampleCount;
573 }

References m_sampleCount, and m_samplePos.

◆ open()

bool KisAndroidMediaEncoderRunnable::Audio::open ( Context & ctx,
const KisMediaEncoderWrapperSettings & settings )
inline

Definition at line 468 of file KisAndroidMediaEncoderRunnable.cpp.

469 {
471
472 m_profile = std::make_unique<Mlt::Profile>();
473 m_profile->set_frame_rate(settings.outputFps, 1);
474
475 m_producer = std::make_unique<Mlt::Producer>(*m_profile, "avformat", m_audioFileBytes.constData());
476 if (!m_producer->is_valid()) {
477 ctx.setInternalErrorMessage(QStringLiteral("failed to open MLT producer for '%1'").arg(settings.audioFile));
478 return false;
479 }
480
481 m_filter = std::make_unique<Mlt::Filter>(*m_profile, "swresample");
482 if (!m_filter->is_valid()) {
483 ctx.setInternalErrorMessage(QStringLiteral("failed to create MLT filter"));
484 return false;
485 }
486
487 int result = m_producer->attach(*m_filter);
488 if (result != 0) {
489 ctx.setInternalErrorMessage(QStringLiteral("error %1 attaching MLT filter").arg(result));
490 return false;
491 }
492
494
495 return true;
496 }
const KisMediaEncoderWrapperSettings settings()

References KisMediaEncoderWrapperSettings::audioFile, KisMediaEncoderWrapperSettings::audioSeekFrame, m_audioFileBytes, m_filter, m_producer, m_profile, KisMediaEncoderWrapperSettings::outputFps, KisLibavEncoderContext::setInternalErrorMessage(), and KisMediaEncoderRunnable::settings().

◆ pullFrame()

int KisAndroidMediaEncoderRunnable::Audio::pullFrame ( Context & ctx)
inline

Definition at line 498 of file KisAndroidMediaEncoderRunnable.cpp.

499 {
500 if (m_frame) {
501 return PULL_FRAME_OK;
502 }
503
504 m_frame.reset(m_producer->get_frame());
505 if (!m_frame || !m_frame->is_valid()) {
506 m_frame.reset();
508 }
509
510 mlt_audio_format format = m_format;
513
514 float fps = float(m_profile->fps());
515 int64_t position = m_frame->get_position();
516 int sampleCount = mlt_audio_calculate_frame_samples(fps, sampleRate, position);
517 const void *sampleData = m_frame->get_audio(format, sampleRate, channelCount, sampleCount);
518 if (sampleCount <= 0 || !sampleData) {
519 m_frame.reset();
521 }
522
523 if (format != m_format || sampleRate != m_sampleRate || channelCount != m_channelCount) {
524 ctx.setInternalErrorMessage(QStringLiteral("bad MLT frame format %1:%2:%3 != not %4:%5:%6")
525 .arg(int(format))
526 .arg(sampleRate)
527 .arg(channelCount)
528 .arg(int(m_format))
529 .arg(m_sampleRate)
530 .arg(m_channelCount));
531 m_frame.reset();
532 return PULL_FRAME_ERROR;
533 }
534
535 m_sampleCount = sampleCount;
536 m_sampleData = reinterpret_cast<const unsigned char *>(sampleData);
537 m_samplePos = 0;
538 return PULL_FRAME_OK;
539 }

References channelCount(), m_channelCount, m_format, m_frame, m_producer, m_profile, m_sampleCount, m_sampleData, m_samplePos, m_sampleRate, PULL_FRAME_END_OF_STREAM, PULL_FRAME_ERROR, PULL_FRAME_OK, sampleRate(), and KisLibavEncoderContext::setInternalErrorMessage().

◆ pushSamples()

bool KisAndroidMediaEncoderRunnable::Audio::pushSamples ( Context & ctx)
inline

Definition at line 541 of file KisAndroidMediaEncoderRunnable.cpp.

542 {
543 void *buffer;
544 int availableSize;
545 if (!readAudioInputBuffer(ctx, buffer, availableSize)) {
546 return false;
547 }
548
549 int availableSamples = sizeToSamples(availableSize);
550 if (availableSamples <= 0) {
551 ctx.setInternalErrorMessage(QStringLiteral("no available samples from size %1").arg(availableSize));
552 return false;
553 }
554
555 int remainingSamples = m_sampleCount - m_samplePos;
556 int chunkSamples = qMin(availableSamples, remainingSamples);
557 int chunkSize = samplesToSize(chunkSamples);
558 memcpy(buffer, m_sampleData + samplesToSize(m_samplePos), chunkSize);
559
560 int commitResult =
561 int(ctx.encoder().callMethod<jint>("commitAudio", "(II)I", jint(chunkSamples), jint(chunkSize)));
562 if (ctx.checkResult(QStringLiteral("commitAudio"), commitResult)) {
563 return false;
564 }
565
566 m_samplePos += chunkSamples;
567 return true;
568 }
static bool readAudioInputBuffer(Context &ctx, void *&outBuffer, int &outSize)

References KisAndroidMediaEncoderRunnable::Context::checkResult(), KisAndroidMediaEncoderRunnable::Context::encoder(), m_sampleCount, m_sampleData, m_samplePos, KisAndroidMediaEncoderRunnable::readAudioInputBuffer(), samplesToSize(), KisLibavEncoderContext::setInternalErrorMessage(), and sizeToSamples().

◆ sampleRate()

int KisAndroidMediaEncoderRunnable::Audio::sampleRate ( ) const
inline

Definition at line 453 of file KisAndroidMediaEncoderRunnable.cpp.

454 {
455 return m_sampleRate;
456 }

References m_sampleRate.

◆ samplesToSize()

int KisAndroidMediaEncoderRunnable::Audio::samplesToSize ( int samples) const
inlineprivate

Definition at line 601 of file KisAndroidMediaEncoderRunnable.cpp.

602 {
603 return samples * m_channelCount * m_sampleSize;
604 }

References m_channelCount, and m_sampleSize.

◆ sizeToSamples()

int KisAndroidMediaEncoderRunnable::Audio::sizeToSamples ( int size) const
inlineprivate

Definition at line 596 of file KisAndroidMediaEncoderRunnable.cpp.

597 {
598 return size / (m_channelCount * m_sampleSize);
599 }
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References m_channelCount, and m_sampleSize.

Member Data Documentation

◆ m_audioFileBytes

QByteArray KisAndroidMediaEncoderRunnable::Audio::m_audioFileBytes
private

Definition at line 606 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_channelCount

const int KisAndroidMediaEncoderRunnable::Audio::m_channelCount
private

Definition at line 614 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_filter

std::unique_ptr<Mlt::Filter> KisAndroidMediaEncoderRunnable::Audio::m_filter
private

Definition at line 609 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_finished

bool KisAndroidMediaEncoderRunnable::Audio::m_finished = false
private

Definition at line 618 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_format

const mlt_audio_format KisAndroidMediaEncoderRunnable::Audio::m_format
private

Definition at line 612 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_frame

std::unique_ptr<Mlt::Frame> KisAndroidMediaEncoderRunnable::Audio::m_frame
private

Definition at line 610 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_producer

std::unique_ptr<Mlt::Producer> KisAndroidMediaEncoderRunnable::Audio::m_producer
private

Definition at line 608 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_profile

std::unique_ptr<Mlt::Profile> KisAndroidMediaEncoderRunnable::Audio::m_profile
private

Definition at line 607 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_sampleCount

int KisAndroidMediaEncoderRunnable::Audio::m_sampleCount = 0
private

Definition at line 616 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_sampleData

const unsigned char* KisAndroidMediaEncoderRunnable::Audio::m_sampleData = nullptr
private

Definition at line 611 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_samplePos

int KisAndroidMediaEncoderRunnable::Audio::m_samplePos = 0
private

Definition at line 617 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_sampleRate

const int KisAndroidMediaEncoderRunnable::Audio::m_sampleRate
private

Definition at line 613 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_sampleSize

const int KisAndroidMediaEncoderRunnable::Audio::m_sampleSize
private

Definition at line 615 of file KisAndroidMediaEncoderRunnable.cpp.

◆ PULL_FRAME_END_OF_STREAM

constexpr int KisAndroidMediaEncoderRunnable::Audio::PULL_FRAME_END_OF_STREAM = 1
staticconstexpr

Definition at line 437 of file KisAndroidMediaEncoderRunnable.cpp.

◆ PULL_FRAME_ERROR

constexpr int KisAndroidMediaEncoderRunnable::Audio::PULL_FRAME_ERROR = 2
staticconstexpr

Definition at line 438 of file KisAndroidMediaEncoderRunnable.cpp.

◆ PULL_FRAME_OK

constexpr int KisAndroidMediaEncoderRunnable::Audio::PULL_FRAME_OK = 0
staticconstexpr

Definition at line 436 of file KisAndroidMediaEncoderRunnable.cpp.


The documentation for this class was generated from the following file: