From 496238cc7551d414067dcbbb4fe3bd801f205f95 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 13 Sep 2012 16:43:51 -0700 Subject: Support IDR requests in wifi display, MediaCodec and ACodec. Change-Id: I596cf8dd61b63465437f78413186fad2be287244 --- media/libstagefright/ACodec.cpp | 41 ++++++++++++++++++++++ media/libstagefright/MediaCodec.cpp | 12 +++++++ .../wifi-display/source/Converter.cpp | 21 +++++++++++ .../libstagefright/wifi-display/source/Converter.h | 6 +++- .../wifi-display/source/PlaybackSession.cpp | 8 +++++ .../wifi-display/source/PlaybackSession.h | 2 ++ .../wifi-display/source/WifiDisplaySource.cpp | 3 ++ 7 files changed, 92 insertions(+), 1 deletion(-) (limited to 'media') diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 3dd5d60..8190498 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -34,6 +34,8 @@ #include +#include "include/avc_utils.h" + namespace android { template @@ -401,6 +403,10 @@ void ACodec::initiateShutdown(bool keepComponentAllocated) { msg->post(); } +void ACodec::signalRequestIDRFrame() { + (new AMessage(kWhatRequestIDRFrame, id()))->post(); +} + status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); @@ -2284,6 +2290,24 @@ error: ACodec::PortDescription::PortDescription() { } +status_t ACodec::requestIDRFrame() { + if (!mIsEncoder) { + return ERROR_UNSUPPORTED; + } + + OMX_CONFIG_INTRAREFRESHVOPTYPE params; + InitOMXParams(¶ms); + + params.nPortIndex = kPortIndexOutput; + params.IntraRefreshVOP = OMX_TRUE; + + return mOMX->setConfig( + mNode, + OMX_IndexConfigVideoIntraVOPRefresh, + ¶ms, + sizeof(params)); +} + void ACodec::PortDescription::addBuffer( IOMX::buffer_id id, const sp &buffer) { mBufferIDs.push_back(id); @@ -2737,6 +2761,12 @@ bool ACodec::BaseState::onOMXFillBufferDone( if (mCodec->mNativeWindow == NULL) { info->mData->setRange(rangeOffset, rangeLength); + +#if 0 + if (IsIDR(info->mData)) { + ALOGI("IDR frame"); + } +#endif } if (mCodec->mSkipCutBuffer != NULL) { @@ -3400,6 +3430,17 @@ bool ACodec::ExecutingState::onMessageReceived(const sp &msg) { break; } + case kWhatRequestIDRFrame: + { + status_t err = mCodec->requestIDRFrame(); + if (err != OK) { + ALOGW("Requesting an IDR frame failed."); + } + + handled = true; + break; + } + default: handled = BaseState::onMessageReceived(msg); break; diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 2060699..7f97430 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -327,6 +327,12 @@ status_t MediaCodec::flush() { return PostAndAwaitResponse(msg, &response); } +status_t MediaCodec::requestIDRFrame() { + (new AMessage(kWhatRequestIDRFrame, id()))->post(); + + return OK; +} + //////////////////////////////////////////////////////////////////////////////// void MediaCodec::cancelPendingDequeueOperations() { @@ -1133,6 +1139,12 @@ void MediaCodec::onMessageReceived(const sp &msg) { break; } + case kWhatRequestIDRFrame: + { + mCodec->signalRequestIDRFrame(); + break; + } + default: TRESPASS(); } diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp index c4845e3..390b2e2 100644 --- a/media/libstagefright/wifi-display/source/Converter.cpp +++ b/media/libstagefright/wifi-display/source/Converter.cpp @@ -40,7 +40,15 @@ Converter::Converter( mNotify(notify), mCodecLooper(codecLooper), mInputFormat(format), + mIsVideo(false), mDoMoreWorkPending(false) { + AString mime; + CHECK(mInputFormat->findString("mime", &mime)); + + if (!strncasecmp("video/", mime.c_str(), 6)) { + mIsVideo = true; + } + mInitCheck = initEncoder(); } @@ -202,6 +210,15 @@ void Converter::onMessageReceived(const sp &msg) { break; } + case kWhatRequestIDRFrame: + { + if (mIsVideo) { + ALOGI("requesting IDR frame"); + mEncoder->requestIDRFrame(); + } + break; + } + default: TRESPASS(); } @@ -306,5 +323,9 @@ status_t Converter::doMoreWork() { return err; } +void Converter::requestIDRFrame() { + (new AMessage(kWhatRequestIDRFrame, id()))->post(); +} + } // namespace android diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h index 67471c7..901ae2e 100644 --- a/media/libstagefright/wifi-display/source/Converter.h +++ b/media/libstagefright/wifi-display/source/Converter.h @@ -43,6 +43,8 @@ struct Converter : public AHandler { void feedAccessUnit(const sp &accessUnit); void signalEOS(); + void requestIDRFrame(); + enum { kWhatAccessUnit, kWhatEOS, @@ -57,13 +59,15 @@ private: enum { kWhatFeedAccessUnit, kWhatInputEOS, - kWhatDoMoreWork + kWhatDoMoreWork, + kWhatRequestIDRFrame, }; status_t mInitCheck; sp mNotify; sp mCodecLooper; sp mInputFormat; + bool mIsVideo; sp mOutputFormat; sp mEncoder; diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index c38a300..f6f7030 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -1164,5 +1164,13 @@ status_t WifiDisplaySource::PlaybackSession::parseTSFB( return OK; } +void WifiDisplaySource::PlaybackSession::requestIDRFrame() { + for (size_t i = 0; i < mTracks.size(); ++i) { + const sp &track = mTracks.valueAt(i); + + track->converter()->requestIDRFrame(); + } +} + } // namespace android diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h index 88f6ea9..8b6ddee 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.h +++ b/media/libstagefright/wifi-display/source/PlaybackSession.h @@ -58,6 +58,8 @@ struct WifiDisplaySource::PlaybackSession : public AHandler { int32_t width() const; int32_t height() const; + void requestIDRFrame(); + enum { kWhatSessionDead, kWhatBinaryData, diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index aeefcf3..53adb87 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -984,6 +984,9 @@ void WifiDisplaySource::onSetParameterRequest( } #endif + // XXX check that the parameter is about that. + playbackSession->requestIDRFrame(); + playbackSession->updateLiveness(); AString response = "RTSP/1.0 200 OK\r\n"; -- cgit v1.1