summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRajneesh Chowdury <rajneeshc@google.com>2011-07-20 13:47:34 -0700
committerRajneesh Chowdury <rajneeshc@google.com>2011-07-20 15:27:53 -0700
commit1c3c54395729dfae20357d4e510038084cc416cc (patch)
tree58df3b3f7fec18cbb8ea7b5550da31b1c5c45c41
parentb13adac0f1ce1792151192966e428d1eed3ef826 (diff)
downloadframeworks_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-xlibvideoeditor/lvpp/VideoEditorSRC.cpp105
-rwxr-xr-xlibvideoeditor/lvpp/VideoEditorSRC.h2
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;