diff options
9 files changed, 63 insertions, 0 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index a8d0fcb..c14e6c0 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -192,6 +192,7 @@ private: List<sp<AMessage> > mDeferredQueue; bool mSentFormat; + bool mIsVideo; bool mIsEncoder; bool mUseMetadataOnEncoderOutput; bool mShutdownInProgress; 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<AMessage> &msg) { if (mRenderer != NULL) { mRenderer->setPlaybackRate(mPlaybackRate); } + + if (mVideoDecoder != NULL) { + sp<MetaData> meta = getFileMeta(); + int32_t rate; + if (meta != NULL && meta->findInt32(kKeyFrameRate, &rate) && rate > 0) { + sp<AMessage> params = new AMessage(); + params->setFloat("operating-rate", rate * mPlaybackRate); + mVideoDecoder->setParameters(params); + } + } + break; } @@ -1249,6 +1260,8 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp<DecoderBase> *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<DecoderBase> *decoder) { if (mSourceFlags & Source::FLAG_PROTECTED) { format->setInt32("protected", true); } + + sp<MetaData> 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<AMessage> &format) { mResumePending = false; } +void NuPlayer::Decoder::onSetParameters(const sp<AMessage> ¶ms) { + if (mCodec == NULL) { + ALOGW("onSetParameters called before codec is created."); + return; + } + mCodec->setParameters(params); +} + void NuPlayer::Decoder::onSetRenderer(const sp<Renderer> &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<AMessage> &msg); virtual void onConfigure(const sp<AMessage> &format); + virtual void onSetParameters(const sp<AMessage> ¶ms); virtual void onSetRenderer(const sp<Renderer> &renderer); virtual void onGetInputBuffers(Vector<sp<ABuffer> > *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<AMessage> ¶ms) { + sp<AMessage> msg = new AMessage(kWhatSetParameters, this); + msg->setMessage("params", params); + msg->post(); +} + void NuPlayer::DecoderBase::setRenderer(const sp<Renderer> &renderer) { sp<AMessage> msg = new AMessage(kWhatSetRenderer, this); msg->setObject("renderer", renderer); @@ -123,6 +129,14 @@ void NuPlayer::DecoderBase::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatSetParameters: + { + sp<AMessage> params; + CHECK(msg->findMessage("params", ¶ms)); + onSetParameters(params); + break; + } + case kWhatSetRenderer: { sp<RefBase> 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<AMessage> &format); void init(); + void setParameters(const sp<AMessage> ¶ms); void setRenderer(const sp<Renderer> &renderer); @@ -62,6 +63,7 @@ protected: virtual void onMessageReceived(const sp<AMessage> &msg); virtual void onConfigure(const sp<AMessage> &format) = 0; + virtual void onSetParameters(const sp<AMessage> ¶ms) = 0; virtual void onSetRenderer(const sp<Renderer> &renderer) = 0; virtual void onGetInputBuffers(Vector<sp<ABuffer> > *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<AMessage> &format) { } } +void NuPlayer::DecoderPassThrough::onSetParameters(const sp<AMessage> &/*params*/) { + ALOGW("onSetParameters() called unexpectedly"); +} + void NuPlayer::DecoderPassThrough::onSetRenderer( const sp<Renderer> &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<AMessage> &msg); virtual void onConfigure(const sp<AMessage> &format); + virtual void onSetParameters(const sp<AMessage> ¶ms); virtual void onSetRenderer(const sp<Renderer> &renderer); virtual void onGetInputBuffers(Vector<sp<ABuffer> > *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<AMessage> ¶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; } |