Loading media/libstagefright/codecs/aacenc/AACEncoder.cpp +29 −13 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ AACEncoder::AACEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta) mStarted(false), mBufferGroup(NULL), mInputBuffer(NULL), mInputFrame(NULL), mEncoderHandle(NULL), mApiHandle(NULL), mMemOperator(NULL) { Loading @@ -45,6 +46,7 @@ status_t AACEncoder::initCheck() { CHECK(mApiHandle == NULL && mEncoderHandle == NULL); CHECK(mMeta->findInt32(kKeySampleRate, &mSampleRate)); CHECK(mMeta->findInt32(kKeyChannelCount, &mChannels)); CHECK(mChannels <= 2 && mChannels >= 1); CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate)); mApiHandle = new VO_AUDIO_CODECAPI; Loading Loading @@ -145,6 +147,10 @@ status_t AACEncoder::start(MetaData *params) { mNumInputSamples = 0; mAnchorTimeUs = 0; mFrameCount = 0; mInputFrame = new int16_t[mChannels * kNumSamplesPerFrame]; CHECK(mInputFrame != NULL); mSource->start(params); mStarted = true; Loading Loading @@ -176,6 +182,10 @@ status_t AACEncoder::stop() { mApiHandle = NULL; mStarted = false; if (mInputFrame) { delete[] mInputFrame; mInputFrame = NULL; } return OK; } Loading Loading @@ -222,7 +232,8 @@ status_t AACEncoder::read( buffer->meta_data()->setInt32(kKeyIsCodecConfig, false); } while (mNumInputSamples < kNumSamplesPerFrame) { const int32_t nSamples = mChannels * kNumSamplesPerFrame; while (mNumInputSamples < nSamples) { if (mInputBuffer == NULL) { if (mSource->read(&mInputBuffer, options) != OK) { if (mNumInputSamples == 0) { Loading @@ -231,7 +242,7 @@ status_t AACEncoder::read( } memset(&mInputFrame[mNumInputSamples], 0, sizeof(int16_t) * (kNumSamplesPerFrame - mNumInputSamples)); sizeof(int16_t) * (nSamples - mNumInputSamples)); mNumInputSamples = 0; break; } Loading @@ -250,8 +261,7 @@ status_t AACEncoder::read( } else { readFromSource = false; } size_t copy = (kNumSamplesPerFrame - mNumInputSamples) * sizeof(int16_t); size_t copy = (nSamples - mNumInputSamples) * sizeof(int16_t); if (copy > mInputBuffer->range_length()) { copy = mInputBuffer->range_length(); Loading @@ -271,8 +281,8 @@ status_t AACEncoder::read( mInputBuffer = NULL; } mNumInputSamples += copy / sizeof(int16_t); if (mNumInputSamples >= kNumSamplesPerFrame) { mNumInputSamples %= kNumSamplesPerFrame; if (mNumInputSamples >= nSamples) { mNumInputSamples %= nSamples; break; } } Loading @@ -280,7 +290,7 @@ status_t AACEncoder::read( VO_CODECBUFFER inputData; memset(&inputData, 0, sizeof(inputData)); inputData.Buffer = (unsigned char*) mInputFrame; inputData.Length = kNumSamplesPerFrame * sizeof(int16_t); inputData.Length = nSamples * sizeof(int16_t); CHECK(VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData)); VO_CODECBUFFER outputData; Loading @@ -289,15 +299,21 @@ status_t AACEncoder::read( memset(&outputInfo, 0, sizeof(outputInfo)); VO_U32 ret = VO_ERR_NONE; size_t nOutputBytes = 0; do { outputData.Buffer = outPtr; outputData.Length = buffer->size(); outputData.Length = buffer->size() - nOutputBytes; ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo); CHECK(ret == VO_ERR_NONE || ret == VO_ERR_INPUT_BUFFER_SMALL); CHECK(outputData.Length != 0); buffer->set_range(0, outputData.Length); if (ret == VO_ERR_NONE) { outPtr += outputData.Length; nOutputBytes += outputData.Length; } } while (ret != VO_ERR_INPUT_BUFFER_SMALL); buffer->set_range(0, nOutputBytes); int64_t mediaTimeUs = ((mFrameCount - 1) * 1000000LL * kNumSamplesPerFrame) / mSampleRate; buffer->meta_data()->setInt64(kKeyTime, mAnchorTimeUs + mediaTimeUs); if (readFromSource && wallClockTimeUs != -1) { buffer->meta_data()->setInt64(kKeyDriftTime, mediaTimeUs - wallClockTimeUs); Loading media/libstagefright/include/AACEncoder.h +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ class AACEncoder: public MediaSource { kNumSamplesPerFrame = 1024, }; int16_t mInputFrame[kNumSamplesPerFrame]; int16_t *mInputFrame; uint8_t mAudioSpecificConfigData[2]; // auido specific data void *mEncoderHandle; Loading Loading
media/libstagefright/codecs/aacenc/AACEncoder.cpp +29 −13 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ AACEncoder::AACEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta) mStarted(false), mBufferGroup(NULL), mInputBuffer(NULL), mInputFrame(NULL), mEncoderHandle(NULL), mApiHandle(NULL), mMemOperator(NULL) { Loading @@ -45,6 +46,7 @@ status_t AACEncoder::initCheck() { CHECK(mApiHandle == NULL && mEncoderHandle == NULL); CHECK(mMeta->findInt32(kKeySampleRate, &mSampleRate)); CHECK(mMeta->findInt32(kKeyChannelCount, &mChannels)); CHECK(mChannels <= 2 && mChannels >= 1); CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate)); mApiHandle = new VO_AUDIO_CODECAPI; Loading Loading @@ -145,6 +147,10 @@ status_t AACEncoder::start(MetaData *params) { mNumInputSamples = 0; mAnchorTimeUs = 0; mFrameCount = 0; mInputFrame = new int16_t[mChannels * kNumSamplesPerFrame]; CHECK(mInputFrame != NULL); mSource->start(params); mStarted = true; Loading Loading @@ -176,6 +182,10 @@ status_t AACEncoder::stop() { mApiHandle = NULL; mStarted = false; if (mInputFrame) { delete[] mInputFrame; mInputFrame = NULL; } return OK; } Loading Loading @@ -222,7 +232,8 @@ status_t AACEncoder::read( buffer->meta_data()->setInt32(kKeyIsCodecConfig, false); } while (mNumInputSamples < kNumSamplesPerFrame) { const int32_t nSamples = mChannels * kNumSamplesPerFrame; while (mNumInputSamples < nSamples) { if (mInputBuffer == NULL) { if (mSource->read(&mInputBuffer, options) != OK) { if (mNumInputSamples == 0) { Loading @@ -231,7 +242,7 @@ status_t AACEncoder::read( } memset(&mInputFrame[mNumInputSamples], 0, sizeof(int16_t) * (kNumSamplesPerFrame - mNumInputSamples)); sizeof(int16_t) * (nSamples - mNumInputSamples)); mNumInputSamples = 0; break; } Loading @@ -250,8 +261,7 @@ status_t AACEncoder::read( } else { readFromSource = false; } size_t copy = (kNumSamplesPerFrame - mNumInputSamples) * sizeof(int16_t); size_t copy = (nSamples - mNumInputSamples) * sizeof(int16_t); if (copy > mInputBuffer->range_length()) { copy = mInputBuffer->range_length(); Loading @@ -271,8 +281,8 @@ status_t AACEncoder::read( mInputBuffer = NULL; } mNumInputSamples += copy / sizeof(int16_t); if (mNumInputSamples >= kNumSamplesPerFrame) { mNumInputSamples %= kNumSamplesPerFrame; if (mNumInputSamples >= nSamples) { mNumInputSamples %= nSamples; break; } } Loading @@ -280,7 +290,7 @@ status_t AACEncoder::read( VO_CODECBUFFER inputData; memset(&inputData, 0, sizeof(inputData)); inputData.Buffer = (unsigned char*) mInputFrame; inputData.Length = kNumSamplesPerFrame * sizeof(int16_t); inputData.Length = nSamples * sizeof(int16_t); CHECK(VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData)); VO_CODECBUFFER outputData; Loading @@ -289,15 +299,21 @@ status_t AACEncoder::read( memset(&outputInfo, 0, sizeof(outputInfo)); VO_U32 ret = VO_ERR_NONE; size_t nOutputBytes = 0; do { outputData.Buffer = outPtr; outputData.Length = buffer->size(); outputData.Length = buffer->size() - nOutputBytes; ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo); CHECK(ret == VO_ERR_NONE || ret == VO_ERR_INPUT_BUFFER_SMALL); CHECK(outputData.Length != 0); buffer->set_range(0, outputData.Length); if (ret == VO_ERR_NONE) { outPtr += outputData.Length; nOutputBytes += outputData.Length; } } while (ret != VO_ERR_INPUT_BUFFER_SMALL); buffer->set_range(0, nOutputBytes); int64_t mediaTimeUs = ((mFrameCount - 1) * 1000000LL * kNumSamplesPerFrame) / mSampleRate; buffer->meta_data()->setInt64(kKeyTime, mAnchorTimeUs + mediaTimeUs); if (readFromSource && wallClockTimeUs != -1) { buffer->meta_data()->setInt64(kKeyDriftTime, mediaTimeUs - wallClockTimeUs); Loading
media/libstagefright/include/AACEncoder.h +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ class AACEncoder: public MediaSource { kNumSamplesPerFrame = 1024, }; int16_t mInputFrame[kNumSamplesPerFrame]; int16_t *mInputFrame; uint8_t mAudioSpecificConfigData[2]; // auido specific data void *mEncoderHandle; Loading