diff options
author | Andreas Huber <andih@google.com> | 2013-02-07 10:56:14 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2013-02-07 10:56:14 -0800 |
commit | c71601c3b1dd63afc9be462194809813e4dbacf1 (patch) | |
tree | f91f7e9da453d188934ef99d136f2606a52fe3d9 | |
parent | 0955986e6c1c27ba752e293246086ea79c49d39c (diff) | |
download | frameworks_av-c71601c3b1dd63afc9be462194809813e4dbacf1.zip frameworks_av-c71601c3b1dd63afc9be462194809813e4dbacf1.tar.gz frameworks_av-c71601c3b1dd63afc9be462194809813e4dbacf1.tar.bz2 |
Allow for dynamic reconfiguration of the video bitrate used
to encode video while running as a wfd source.
Change-Id: I44f7b2350c88fc5807047c61bfe594ef8fa79275
-rw-r--r-- | include/media/stagefright/ACodec.h | 4 | ||||
-rw-r--r-- | include/media/stagefright/MediaCodec.h | 5 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 48 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 31 | ||||
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.cpp | 14 | ||||
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.h | 2 |
6 files changed, 104 insertions, 0 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index df1c46b..317b6f0 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -54,6 +54,8 @@ struct ACodec : public AHierarchicalStateMachine { void signalResume(); void initiateShutdown(bool keepComponentAllocated = false); + void signalSetParameters(const sp<AMessage> &msg); + void initiateAllocateComponent(const sp<AMessage> &msg); void initiateConfigureComponent(const sp<AMessage> &msg); void initiateStart(); @@ -105,6 +107,7 @@ private: kWhatConfigureComponent = 'conf', kWhatStart = 'star', kWhatRequestIDRFrame = 'ridr', + kWhatSetParameters = 'setP', }; enum { @@ -270,6 +273,7 @@ private: status_t internalError = UNKNOWN_ERROR); status_t requestIDRFrame(); + status_t setParameters(const sp<AMessage> ¶ms); DISALLOW_EVIL_CONSTRUCTORS(ACodec); }; diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h index 88aabf6..3f0d3b3 100644 --- a/include/media/stagefright/MediaCodec.h +++ b/include/media/stagefright/MediaCodec.h @@ -115,6 +115,8 @@ struct MediaCodec : public AHandler { status_t getName(AString *componentName) const; + status_t setParameters(const sp<AMessage> ¶ms); + protected: virtual ~MediaCodec(); virtual void onMessageReceived(const sp<AMessage> &msg); @@ -157,6 +159,7 @@ private: kWhatRequestIDRFrame = 'ridr', kWhatRequestActivityNotification = 'racN', kWhatGetName = 'getN', + kWhatSetParameters = 'setP', }; enum { @@ -230,6 +233,8 @@ private: void postActivityNotificationIfPossible(); + status_t onSetParameters(const sp<AMessage> ¶ms); + DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); }; diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 7b27843..a6cc4eb 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -374,6 +374,12 @@ void ACodec::initiateSetup(const sp<AMessage> &msg) { msg->post(); } +void ACodec::signalSetParameters(const sp<AMessage> ¶ms) { + sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); + msg->setMessage("params", params); + msg->post(); +} + void ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { msg->setWhat(kWhatAllocateComponent); msg->setTarget(id()); @@ -3550,6 +3556,23 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatSetParameters: + { + sp<AMessage> params; + CHECK(msg->findMessage("params", ¶ms)); + + status_t err = mCodec->setParameters(params); + + sp<AMessage> reply; + if (msg->findMessage("reply", &reply)) { + reply->setInt32("err", err); + reply->post(); + } + + handled = true; + break; + } + default: handled = BaseState::onMessageReceived(msg); break; @@ -3558,6 +3581,31 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { return handled; } +status_t ACodec::setParameters(const sp<AMessage> ¶ms) { + int32_t videoBitrate; + if (params->findInt32("videoBitrate", &videoBitrate)) { + OMX_VIDEO_CONFIG_BITRATETYPE configParams; + InitOMXParams(&configParams); + configParams.nPortIndex = kPortIndexOutput; + configParams.nEncodeBitrate = videoBitrate; + + status_t err = mOMX->setConfig( + mNode, + OMX_IndexConfigVideoBitrate, + &configParams, + sizeof(configParams)); + + if (err != OK) { + ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", + videoBitrate, err); + + return err; + } + } + + return OK; +} + bool ACodec::ExecutingState::onOMXEvent( OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { switch (event) { diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index cb8a651..77aceb7 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -1203,6 +1203,23 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatSetParameters: + { + uint32_t replyID; + CHECK(msg->senderAwaitsResponse(&replyID)); + + sp<AMessage> params; + CHECK(msg->findMessage("params", ¶ms)); + + status_t err = onSetParameters(params); + + sp<AMessage> response = new AMessage; + response->setInt32("err", err); + + response->postReply(replyID); + break; + } + default: TRESPASS(); } @@ -1556,4 +1573,18 @@ void MediaCodec::postActivityNotificationIfPossible() { } } +status_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { + sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); + msg->setMessage("params", params); + + sp<AMessage> response; + return PostAndAwaitResponse(msg, &response); +} + +status_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { + mCodec->signalSetParameters(params); + + return OK; +} + } // namespace android diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp index 5628dec..376b0df 100644 --- a/media/libstagefright/wifi-display/source/Converter.cpp +++ b/media/libstagefright/wifi-display/source/Converter.cpp @@ -54,6 +54,7 @@ Converter::Converter( ,mFirstSilentFrameUs(-1ll) ,mInSilentMode(false) #endif + ,mPrevVideoBitrate(-1) { AString mime; CHECK(mInputFormat->findString("mime", &mime)); @@ -185,6 +186,7 @@ status_t Converter::initEncoder() { int32_t audioBitrate = getBitrate("media.wfd.audio-bitrate", 128000); int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000); + mPrevVideoBitrate = videoBitrate; ALOGI("using audio bitrate of %d bps, video bitrate of %d bps", audioBitrate, videoBitrate); @@ -606,6 +608,18 @@ status_t Converter::feedEncoderInputBuffers() { } status_t Converter::doMoreWork() { + if (mIsVideo) { + int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000); + if (videoBitrate != mPrevVideoBitrate) { + sp<AMessage> params = new AMessage; + + params->setInt32("videoBitrate", videoBitrate); + mEncoder->setParameters(params); + + mPrevVideoBitrate = videoBitrate; + } + } + status_t err; for (;;) { diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h index 3357d61..57802bd 100644 --- a/media/libstagefright/wifi-display/source/Converter.h +++ b/media/libstagefright/wifi-display/source/Converter.h @@ -100,6 +100,8 @@ private: sp<ABuffer> mPartialAudioAU; + int32_t mPrevVideoBitrate; + status_t initEncoder(); void releaseEncoder(); |