diff options
author | Andreas Huber <andih@google.com> | 2012-10-02 14:17:38 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-10-02 14:17:38 -0700 |
commit | 07fbf9458a9a6a5b644e7d02f7e59c7b75218d0c (patch) | |
tree | 3ec3948c0d7b9fa0c7c4fa5da81331de5f10f278 /media/libstagefright/wifi-display | |
parent | 77c887a262840d5dc013b7abb838696eb5cb5ee7 (diff) | |
download | frameworks_av-07fbf9458a9a6a5b644e7d02f7e59c7b75218d0c.zip frameworks_av-07fbf9458a9a6a5b644e7d02f7e59c7b75218d0c.tar.gz frameworks_av-07fbf9458a9a6a5b644e7d02f7e59c7b75218d0c.tar.bz2 |
Enable silence detection and don't driver the audio encoder
or send any audio out over the network if we've seen at least one second
of silence.
Change-Id: Ic2bca4ce7d55bd246283dc669f5f5cb6106d88ea
related-to-bug: 7248248
Diffstat (limited to 'media/libstagefright/wifi-display')
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.cpp | 80 | ||||
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.h | 9 |
2 files changed, 77 insertions, 12 deletions
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp index b9539e9..6f336c7 100644 --- a/media/libstagefright/wifi-display/source/Converter.cpp +++ b/media/libstagefright/wifi-display/source/Converter.cpp @@ -44,7 +44,12 @@ Converter::Converter( mCodecLooper(codecLooper), mInputFormat(format), mIsVideo(false), - mDoMoreWorkPending(false) { + mDoMoreWorkPending(false) +#if ENABLE_SILENCE_DETECTION + ,mFirstSilentFrameUs(-1ll) + ,mInSilentMode(false) +#endif + { AString mime; CHECK(mInputFormat->findString("mime", &mime)); @@ -171,6 +176,20 @@ void Converter::notifyError(status_t err) { notify->post(); } +// static +bool Converter::IsSilence(const sp<ABuffer> &accessUnit) { + const uint8_t *ptr = accessUnit->data(); + const uint8_t *end = ptr + accessUnit->size(); + while (ptr < end) { + if (*ptr != 0) { + return false; + } + ++ptr; + } + + return true; +} + void Converter::onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case kWhatMediaPullerNotify: @@ -220,6 +239,30 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) { } #endif +#if ENABLE_SILENCE_DETECTION + if (!mIsVideo) { + if (IsSilence(accessUnit)) { + if (!mInSilentMode) { + int64_t nowUs = ALooper::GetNowUs(); + + if (mFirstSilentFrameUs < 0ll) { + mFirstSilentFrameUs = nowUs; + } else if (nowUs >= mFirstSilentFrameUs + 1000000ll) { + mInSilentMode = true; + ALOGI("audio in silent mode now."); + break; + } + } + } else { + if (mInSilentMode) { + ALOGI("audio no longer in silent mode."); + } + mInSilentMode = false; + mFirstSilentFrameUs = -1ll; + } + } +#endif + mInputBufferQueue.push_back(accessUnit); feedEncoderInputBuffers(); @@ -283,7 +326,7 @@ void Converter::scheduleDoMoreWork() { } mDoMoreWorkPending = true; - (new AMessage(kWhatDoMoreWork, id()))->post(10000ll); + (new AMessage(kWhatDoMoreWork, id()))->post(mIsVideo ? 10000ll : 5000ll); } status_t Converter::feedEncoderInputBuffers() { @@ -338,14 +381,21 @@ status_t Converter::doMoreWork() { feedEncoderInputBuffers(); } - size_t offset; - size_t size; - int64_t timeUs; - uint32_t flags; - err = mEncoder->dequeueOutputBuffer( - &bufferIndex, &offset, &size, &timeUs, &flags); + for (;;) { + size_t offset; + size_t size; + int64_t timeUs; + uint32_t flags; + err = mEncoder->dequeueOutputBuffer( + &bufferIndex, &offset, &size, &timeUs, &flags); + + if (err != OK) { + if (err == -EAGAIN) { + err = OK; + } + break; + } - if (err == OK) { if (flags & MediaCodec::BUFFER_FLAG_EOS) { sp<AMessage> notify = mNotify->dup(); notify->setInt32("what", kWhatEOS); @@ -354,6 +404,10 @@ status_t Converter::doMoreWork() { sp<ABuffer> buffer = new ABuffer(size); buffer->meta()->setInt64("timeUs", timeUs); + if (!mIsVideo) { + ALOGV("audio time %lld us (%.2f secs)", timeUs, timeUs / 1E6); + } + memcpy(buffer->data(), mEncoderOutputBuffers.itemAt(bufferIndex)->base() + offset, size); @@ -368,9 +422,11 @@ status_t Converter::doMoreWork() { } } - err = mEncoder->releaseOutputBuffer(bufferIndex); - } else if (err == -EAGAIN) { - err = OK; + mEncoder->releaseOutputBuffer(bufferIndex); + + if (flags & MediaCodec::BUFFER_FLAG_EOS) { + break; + } } return err; diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h index 9f54523..93ff72f 100644 --- a/media/libstagefright/wifi-display/source/Converter.h +++ b/media/libstagefright/wifi-display/source/Converter.h @@ -25,6 +25,8 @@ namespace android { struct ABuffer; struct MediaCodec; +#define ENABLE_SILENCE_DETECTION 1 + // Utility class that receives media access units and converts them into // media access unit of a different format. // Right now this'll convert raw video into H.264 and raw audio into AAC. @@ -83,6 +85,11 @@ private: bool mDoMoreWorkPending; +#if ENABLE_SILENCE_DETECTION + int64_t mFirstSilentFrameUs; + bool mInSilentMode; +#endif + status_t initEncoder(); status_t feedEncoderInputBuffers(); @@ -92,6 +99,8 @@ private: void notifyError(status_t err); + static bool IsSilence(const sp<ABuffer> &accessUnit); + DISALLOW_EVIL_CONSTRUCTORS(Converter); }; |