diff options
author | Andreas Huber <andih@google.com> | 2012-09-13 16:43:51 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-09-13 16:43:51 -0700 |
commit | 496238cc7551d414067dcbbb4fe3bd801f205f95 (patch) | |
tree | 90e4402e792c22804bf42f6f773c97e57d06e5dc /media/libstagefright/wifi-display | |
parent | f4bca03d996b584030a80268f58cdb29dc7b7cde (diff) | |
download | frameworks_av-496238cc7551d414067dcbbb4fe3bd801f205f95.zip frameworks_av-496238cc7551d414067dcbbb4fe3bd801f205f95.tar.gz frameworks_av-496238cc7551d414067dcbbb4fe3bd801f205f95.tar.bz2 |
Support IDR requests in wifi display, MediaCodec and ACodec.
Change-Id: I596cf8dd61b63465437f78413186fad2be287244
Diffstat (limited to 'media/libstagefright/wifi-display')
5 files changed, 39 insertions, 1 deletions
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<AMessage> &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<ABuffer> &accessUnit); void signalEOS(); + void requestIDRFrame(); + enum { kWhatAccessUnit, kWhatEOS, @@ -57,13 +59,15 @@ private: enum { kWhatFeedAccessUnit, kWhatInputEOS, - kWhatDoMoreWork + kWhatDoMoreWork, + kWhatRequestIDRFrame, }; status_t mInitCheck; sp<AMessage> mNotify; sp<ALooper> mCodecLooper; sp<AMessage> mInputFormat; + bool mIsVideo; sp<AMessage> mOutputFormat; sp<MediaCodec> 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> &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"; |