From 8db8813d39e3c8b5fbd580dfc3062830744afd63 Mon Sep 17 00:00:00 2001 From: Ronghua Wu Date: Wed, 22 Apr 2015 13:51:35 -0700 Subject: DO NOT MERGE libmediaplayerservice: set priority and operating rate for the codec used by nuplayer. Bug: 20481562 Change-Id: I9806414962352fbcda726f8274f1cd348c961de0 (cherry picked from commit f19f5d716b39a5d9dc1abdcd5a16a7aaf1b1ab8b) --- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 19 +++++++++++++++++++ .../nuplayer/NuPlayerDecoder.cpp | 8 ++++++++ .../libmediaplayerservice/nuplayer/NuPlayerDecoder.h | 1 + .../nuplayer/NuPlayerDecoderBase.cpp | 14 ++++++++++++++ .../nuplayer/NuPlayerDecoderBase.h | 3 +++ .../nuplayer/NuPlayerDecoderPassThrough.cpp | 4 ++++ .../nuplayer/NuPlayerDecoderPassThrough.h | 1 + media/libstagefright/ACodec.cpp | 12 ++++++++++++ 8 files changed, 62 insertions(+) (limited to 'media') diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index a028b01..b670d68 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -634,6 +634,17 @@ void NuPlayer::onMessageReceived(const sp &msg) { if (mRenderer != NULL) { mRenderer->setPlaybackRate(mPlaybackRate); } + + if (mVideoDecoder != NULL) { + sp meta = getFileMeta(); + int32_t rate; + if (meta != NULL && meta->findInt32(kKeyFrameRate, &rate) && rate > 0) { + sp params = new AMessage(); + params->setFloat("operating-rate", rate * mPlaybackRate); + mVideoDecoder->setParameters(params); + } + } + break; } @@ -1249,6 +1260,8 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp *decoder) { return -EWOULDBLOCK; } + format->setInt32("priority", 0 /* realtime */); + if (!audio) { AString mime; CHECK(format->findString("mime", &mime)); @@ -1265,6 +1278,12 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp *decoder) { if (mSourceFlags & Source::FLAG_PROTECTED) { format->setInt32("protected", true); } + + sp meta = getFileMeta(); + int32_t rate; + if (meta != NULL && meta->findInt32(kKeyFrameRate, &rate) && rate > 0) { + format->setFloat("operating-rate", rate * mPlaybackRate); + } } if (audio) { diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index acc9ef5..3c4d695 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -252,6 +252,14 @@ void NuPlayer::Decoder::onConfigure(const sp &format) { mResumePending = false; } +void NuPlayer::Decoder::onSetParameters(const sp ¶ms) { + if (mCodec == NULL) { + ALOGW("onSetParameters called before codec is created."); + return; + } + mCodec->setParameters(params); +} + void NuPlayer::Decoder::onSetRenderer(const sp &renderer) { bool hadNoRenderer = (mRenderer == NULL); mRenderer = renderer; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h index 9f0ef1b5..dd84620 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h @@ -40,6 +40,7 @@ protected: virtual void onMessageReceived(const sp &msg); virtual void onConfigure(const sp &format); + virtual void onSetParameters(const sp ¶ms); virtual void onSetRenderer(const sp &renderer); virtual void onGetInputBuffers(Vector > *dstBuffers); virtual void onResume(bool notifyComplete); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp index 36b41ec..9d509bf 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp @@ -70,6 +70,12 @@ void NuPlayer::DecoderBase::init() { mDecoderLooper->registerHandler(this); } +void NuPlayer::DecoderBase::setParameters(const sp ¶ms) { + sp msg = new AMessage(kWhatSetParameters, this); + msg->setMessage("params", params); + msg->post(); +} + void NuPlayer::DecoderBase::setRenderer(const sp &renderer) { sp msg = new AMessage(kWhatSetRenderer, this); msg->setObject("renderer", renderer); @@ -123,6 +129,14 @@ void NuPlayer::DecoderBase::onMessageReceived(const sp &msg) { break; } + case kWhatSetParameters: + { + sp params; + CHECK(msg->findMessage("params", ¶ms)); + onSetParameters(params); + break; + } + case kWhatSetRenderer: { sp obj; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h index 262f5d5..b52e7f7 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h @@ -33,6 +33,7 @@ struct NuPlayer::DecoderBase : public AHandler { void configure(const sp &format); void init(); + void setParameters(const sp ¶ms); void setRenderer(const sp &renderer); @@ -62,6 +63,7 @@ protected: virtual void onMessageReceived(const sp &msg); virtual void onConfigure(const sp &format) = 0; + virtual void onSetParameters(const sp ¶ms) = 0; virtual void onSetRenderer(const sp &renderer) = 0; virtual void onGetInputBuffers(Vector > *dstBuffers) = 0; virtual void onResume(bool notifyComplete) = 0; @@ -78,6 +80,7 @@ protected: private: enum { kWhatConfigure = 'conf', + kWhatSetParameters = 'setP', kWhatSetRenderer = 'setR', kWhatGetInputBuffers = 'gInB', kWhatRequestInputBuffers = 'reqB', diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp index fdb9039..d7b070e 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp @@ -88,6 +88,10 @@ void NuPlayer::DecoderPassThrough::onConfigure(const sp &format) { } } +void NuPlayer::DecoderPassThrough::onSetParameters(const sp &/*params*/) { + ALOGW("onSetParameters() called unexpectedly"); +} + void NuPlayer::DecoderPassThrough::onSetRenderer( const sp &renderer) { // renderer can't be changed during offloading diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h index b7dcb8d..2f6df2c 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.h @@ -40,6 +40,7 @@ protected: virtual void onMessageReceived(const sp &msg); virtual void onConfigure(const sp &format); + virtual void onSetParameters(const sp ¶ms); virtual void onSetRenderer(const sp &renderer); virtual void onGetInputBuffers(Vector > *dstBuffers); virtual void onResume(bool notifyComplete); diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index da22f11..c7df5a0 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -405,6 +405,7 @@ ACodec::ACodec() : mQuirks(0), mNode(0), mSentFormat(false), + mIsVideo(false), mIsEncoder(false), mUseMetadataOnEncoderOutput(false), mShutdownInProgress(false), @@ -1186,6 +1187,7 @@ status_t ACodec::configureCodec( mIsEncoder = encoder; + status_t err = setComponentRole(encoder /* isEncoder */, mime); if (err != OK) { @@ -1244,6 +1246,7 @@ status_t ACodec::configureCodec( // sps/pps to idr frames, since in metadata mode the bitstream is in an // opaque handle, to which we don't have access. int32_t video = !strncasecmp(mime, "video/", 6); + mIsVideo = video; if (encoder && video) { OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) @@ -5684,6 +5687,15 @@ status_t ACodec::setParameters(const sp ¶ms) { } } + float rate; + if (params->findFloat("operating-rate", &rate) && rate > 0) { + status_t err = setOperatingRate(rate, mIsVideo); + if (err != OK) { + ALOGE("Failed to set parameter 'operating-rate' (err %d)", err); + return err; + } + } + return OK; } -- cgit v1.1