diff options
author | Rajneesh Chowdury <rajneeshc@google.com> | 2011-07-20 13:47:34 -0700 |
---|---|---|
committer | Rajneesh Chowdury <rajneeshc@google.com> | 2011-07-20 15:27:53 -0700 |
commit | 1c3c54395729dfae20357d4e510038084cc416cc (patch) | |
tree | 58df3b3f7fec18cbb8ea7b5550da31b1c5c45c41 | |
parent | b13adac0f1ce1792151192966e428d1eed3ef826 (diff) | |
download | frameworks_av-1c3c54395729dfae20357d4e510038084cc416cc.zip frameworks_av-1c3c54395729dfae20357d4e510038084cc416cc.tar.gz frameworks_av-1c3c54395729dfae20357d4e510038084cc416cc.tar.bz2 |
Fix for issue 4988956 No audio can be heard during preview
Change-Id: I61fc9086f2c00259e4f54535a5938b161d95b144
-rwxr-xr-x | libvideoeditor/lvpp/VideoEditorSRC.cpp | 105 | ||||
-rwxr-xr-x | libvideoeditor/lvpp/VideoEditorSRC.h | 2 |
2 files changed, 72 insertions, 35 deletions
diff --git a/libvideoeditor/lvpp/VideoEditorSRC.cpp b/libvideoeditor/lvpp/VideoEditorSRC.cpp index 9c50299..71411ab 100755 --- a/libvideoeditor/lvpp/VideoEditorSRC.cpp +++ b/libvideoeditor/lvpp/VideoEditorSRC.cpp @@ -109,40 +109,13 @@ status_t VideoEditorSRC::start (MetaData *params) { CHECK(!mStarted); LOGV(" VideoEditorSRC:start() called"); - sp<MetaData> format = mSource->getFormat(); - const char *mime; - bool success = format->findCString(kKeyMIMEType, &mime); - CHECK(success); - CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)); - - success = format->findInt32(kKeySampleRate, &mSampleRate); - CHECK(success); - - int32_t numChannels; - success = format->findInt32(kKeyChannelCount, &mChannelCnt); - CHECK(success); - - if(mSampleRate != mOutputSampleRate) { - LOGV("Resampling required (%d != %d)", mSampleRate, mOutputSampleRate); - mIsResamplingRequired = true; - LOGV("Create resampler %d %d %d", mBitDepth, mChannelCnt, mOutputSampleRate); - - mResampler = AudioResampler::create( - mBitDepth, mChannelCnt, mOutputSampleRate, AudioResampler::DEFAULT); - - if(mResampler == NULL) { - return NO_MEMORY; - } - LOGV("Set input rate %d", mSampleRate); - mResampler->setSampleRate(mSampleRate); - mResampler->setVolume(UNITY_GAIN, UNITY_GAIN); - - } else { - if(mChannelCnt != 2) { //we always make sure to provide stereo - LOGV("Only Channel convertion required"); - mIsChannelConvertionRequired = true; - } + // Set resampler if required + status_t err = checkAndSetResampler(); + if (err != OK) { + LOGE("checkAndSetResampler() returned error %d", err); + return err; } + mSeekTimeUs = -1; mSeekMode = ReadOptions::SEEK_PREVIOUS_SYNC; mStarted = true; @@ -271,7 +244,6 @@ status_t VideoEditorSRC::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) { bool lastBuffer = false; MediaBuffer *aBuffer; - //update the internal buffer // Store the leftover at the beginning of the local buffer if (mLeftover > 0) { @@ -300,7 +272,18 @@ status_t VideoEditorSRC::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) { /* This will be needed by the resampler */ status_t err = mSource->read(&aBuffer, &options); LOGV("mSource->read returned %d", err); - if(err != OK) { + if (err == INFO_FORMAT_CHANGED) { + LOGV("getNextBuffer: source read returned INFO_FORMAT_CHANGED"); + // Change resampler if required + status_t err1 = checkAndSetResampler(); + if (err1 != OK) { + LOGE("checkAndSetResampler() returned error %d", err1); + return err1; + } + // Update availableFrames with new channel count + availableFrames = mInterframeBufferPosition / (mChannelCnt*2); + continue; + } else if (err != OK) { if (mInterframeBufferPosition == 0) { mStarted = false; } @@ -366,4 +349,56 @@ void VideoEditorSRC::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) { pBuffer->frameCount = 0; } +status_t VideoEditorSRC::checkAndSetResampler() { + + LOGV("checkAndSetResampler"); + + sp<MetaData> format = mSource->getFormat(); + const char *mime; + bool success = format->findCString(kKeyMIMEType, &mime); + CHECK(success); + CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)); + + success = format->findInt32(kKeySampleRate, &mSampleRate); + CHECK(success); + + int32_t numChannels; + success = format->findInt32(kKeyChannelCount, &mChannelCnt); + CHECK(success); + + // If Resampler exists, delete it first + if (mResampler != NULL) { + delete mResampler; + mResampler = NULL; + } + + if (mSampleRate != mOutputSampleRate) { + LOGV("Resampling required (%d != %d)", mSampleRate, mOutputSampleRate); + mIsResamplingRequired = true; + LOGV("Create resampler %d %d %d", mBitDepth, mChannelCnt, mOutputSampleRate); + + mResampler = AudioResampler::create( + mBitDepth, mChannelCnt, mOutputSampleRate, AudioResampler::DEFAULT); + + if (mResampler == NULL) { + return NO_MEMORY; + } + LOGV("Set input rate %d", mSampleRate); + mResampler->setSampleRate(mSampleRate); + mResampler->setVolume(UNITY_GAIN, UNITY_GAIN); + + } else { + LOGV("Resampling not required (%d = %d)", mSampleRate, mOutputSampleRate); + mIsResamplingRequired = false; + if (mChannelCnt != 2) { + // we always make sure to provide stereo + LOGV("Only Channel convertion required"); + mIsChannelConvertionRequired = true; + } + } + + return OK; + +} + } //namespce android diff --git a/libvideoeditor/lvpp/VideoEditorSRC.h b/libvideoeditor/lvpp/VideoEditorSRC.h index 069665a..20313e3 100755 --- a/libvideoeditor/lvpp/VideoEditorSRC.h +++ b/libvideoeditor/lvpp/VideoEditorSRC.h @@ -67,6 +67,8 @@ class VideoEditorSRC : public MediaSource , public AudioBufferProvider { VideoEditorSRC(); VideoEditorSRC &operator=(const VideoEditorSRC &); + status_t checkAndSetResampler(); + AudioResampler *mResampler; sp<MediaSource> mSource; MediaBuffer *mCopyBuffer; |