summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-13 16:43:51 -0700
committerAndreas Huber <andih@google.com>2012-09-13 16:43:51 -0700
commit496238cc7551d414067dcbbb4fe3bd801f205f95 (patch)
tree90e4402e792c22804bf42f6f773c97e57d06e5dc /media/libstagefright/wifi-display
parentf4bca03d996b584030a80268f58cdb29dc7b7cde (diff)
downloadframeworks_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')
-rw-r--r--media/libstagefright/wifi-display/source/Converter.cpp21
-rw-r--r--media/libstagefright/wifi-display/source/Converter.h6
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp8
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.h2
-rw-r--r--media/libstagefright/wifi-display/source/WifiDisplaySource.cpp3
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";