diff options
author | Marco Nelissen <marcone@google.com> | 2012-03-29 09:31:28 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2012-04-02 09:19:03 -0700 |
commit | 4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f (patch) | |
tree | 7bb39d31afac7348bb91093cc0e1c2d9aa49cba2 /media/libmediaplayerservice/nuplayer | |
parent | a1472d9883e35edd280201c8be3191695007dfd4 (diff) | |
download | frameworks_av-4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f.zip frameworks_av-4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f.tar.gz frameworks_av-4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f.tar.bz2 |
Add gapless playback support for NuPlayer
This makes NuPlayer use a SkipCutBuffer when needed, and adds a new
AudioSink method to retrieve the number of frames written so far, so
NuPlayerRenderer can calculate how much data it can write without blocking.
Also make some more methods const.
Change-Id: Id7d253ad8a7b85e9a84ca2baafbe32817b16c744
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() { |