diff options
Diffstat (limited to 'media/libmediaplayerservice/nuplayer')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 36 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.h | 3 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 4 |
3 files changed, 42 insertions, 1 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 544d501..11cea3b 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -39,6 +39,7 @@ #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> +#include <media/stagefright/SkipCutBuffer.h> #include <gui/ISurfaceTexture.h> #include "avc_utils.h" @@ -63,10 +64,13 @@ NuPlayer::NuPlayer() mSkipRenderingVideoUntilMediaTimeUs(-1ll), mVideoLateByUs(0ll), mNumFramesTotal(0ll), - mNumFramesDropped(0ll) { + mNumFramesDropped(0ll), + mSkipCutBuffer(NULL) { } NuPlayer::~NuPlayer() { + delete mSkipCutBuffer; + mSkipCutBuffer = NULL; } void NuPlayer::setUID(uid_t uid) { @@ -234,6 +238,32 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mSource->start(); + sp<MetaData> meta = mSource->getFormat(true /* audio */); + if (meta != NULL) { + int32_t delay = 0; + if (!meta->findInt32(kKeyEncoderDelay, &delay)) { + delay = 0; + } + int32_t padding = 0; + if (!meta->findInt32(kKeyEncoderPadding, &padding)) { + padding = 0; + } + int32_t numchannels = 0; + if (delay + padding) { + if (meta->findInt32(kKeyChannelCount, &numchannels)) { + size_t frameSize = numchannels * sizeof(int16_t); + if (mSkipCutBuffer) { + size_t prevbuffersize = mSkipCutBuffer->size(); + if (prevbuffersize != 0) { + ALOGW("Replacing SkipCutBuffer holding %d bytes", prevbuffersize); + } + delete mSkipCutBuffer; + } + mSkipCutBuffer = new SkipCutBuffer(delay * frameSize, padding * frameSize); + } + } + } + mRenderer = new Renderer( mAudioSink, new AMessage(kWhatRendererNotify, id())); @@ -844,6 +874,10 @@ void NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { skipUntilMediaTimeUs = -1; } + if (audio && mSkipCutBuffer) { + mSkipCutBuffer->submit(buffer); + } + mRenderer->queueBuffer(audio, buffer, reply); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index 25766e0..f917f64 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -27,6 +27,7 @@ namespace android { struct ACodec; struct MetaData; struct NuPlayerDriver; +class SkipCutBuffer; struct NuPlayer : public AHandler { NuPlayer(); @@ -128,6 +129,8 @@ private: int64_t mVideoLateByUs; int64_t mNumFramesTotal, mNumFramesDropped; + SkipCutBuffer *mSkipCutBuffer; + status_t instantiateDecoder(bool audio, sp<Decoder> *decoder); status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index ecbc428..1f13955 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -591,6 +591,10 @@ bool NuPlayer::Renderer::dropBufferWhileFlushing( void NuPlayer::Renderer::onAudioSinkChanged() { CHECK(!mDrainAudioQueuePending); mNumFramesWritten = 0; + uint32_t written; + if (mAudioSink->getFramesWritten(&written) == OK) { + mNumFramesWritten = written; + } } void NuPlayer::Renderer::notifyPosition() { |