diff options
Diffstat (limited to 'media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp')
-rw-r--r-- | media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp b/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp index 0f0caf1..46c40c7 100644 --- a/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp +++ b/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp @@ -31,12 +31,27 @@ namespace android { WifiDisplaySink::WifiDisplaySink( const sp<ANetworkSession> &netSession, - const sp<IGraphicBufferProducer> &bufferProducer) + const sp<IGraphicBufferProducer> &bufferProducer, + const sp<AMessage> ¬ify) : mState(UNDEFINED), mNetSession(netSession), mSurfaceTex(bufferProducer), + mNotify(notify), mSessionID(0), mNextCSeq(1) { +#if 1 + // We support any and all resolutions, but prefer 720p30 + mSinkSupportedVideoFormats.setNativeResolution( + VideoFormats::RESOLUTION_CEA, 5); // 1280 x 720 p30 + + mSinkSupportedVideoFormats.enableAll(); +#else + // We only support 800 x 600 p60. + mSinkSupportedVideoFormats.disableAll(); + + mSinkSupportedVideoFormats.setNativeResolution( + VideoFormats::RESOLUTION_VESA, 1); // 800 x 600 p60 +#endif } WifiDisplaySink::~WifiDisplaySink() { @@ -123,6 +138,8 @@ void WifiDisplaySink::onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case kWhatStart: { + sleep(2); // XXX + int32_t sourcePort; if (msg->findString("setupURI", &mSetupURI)) { @@ -176,7 +193,13 @@ void WifiDisplaySink::onMessageReceived(const sp<AMessage> &msg) { mNetSession->destroySession(mSessionID); mSessionID = 0; - looper()->stop(); + if (mNotify == NULL) { + looper()->stop(); + } else { + sp<AMessage> notify = mNotify->dup(); + notify->setInt32("what", kWhatDisconnected); + notify->post(); + } } break; } @@ -227,6 +250,18 @@ void WifiDisplaySink::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatRequestIDRFrame: + { + ALOGI("requesting IDR frame"); + sendIDRFrameRequest(mSessionID); + break; + } + + case kWhatRTPSinkNotify: + { + break; + } + default: TRESPASS(); } @@ -392,6 +427,11 @@ status_t WifiDisplaySink::onReceivePlayResponse( return OK; } +status_t WifiDisplaySink::onReceiveIDRFrameRequestResponse( + int32_t sessionID, const sp<ParsedMessage> &msg) { + return OK; +} + void WifiDisplaySink::onReceiveClientData(const sp<AMessage> &msg) { int32_t sessionID; CHECK(msg->findInt32("sessionID", &sessionID)); @@ -474,11 +514,11 @@ void WifiDisplaySink::onGetParameterRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { - AString body = - "wfd_video_formats: " - "28 00 02 02 FFFFFFFF 0000000 00000000 00 0000 0000 00 none none\r\n" - "wfd_audio_codecs: AAC 0000000F 00\r\n" - "wfd_client_rtp_ports: RTP/AVP/UDP;unicast 19000 0 mode=play\r\n"; + AString body = "wfd_video_formats: "; + body.append(mSinkSupportedVideoFormats.getFormatSpec()); + body.append( + "\r\nwfd_audio_codecs: AAC 0000000F 00\r\n" + "wfd_client_rtp_ports: RTP/AVP/UDP;unicast 19000 0 mode=play\r\n"); AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq); @@ -517,7 +557,9 @@ status_t WifiDisplaySink::sendDescribe(int32_t sessionID, const char *uri) { } status_t WifiDisplaySink::sendSetup(int32_t sessionID, const char *uri) { - mRTPSink = new RTPSink(mNetSession, mSurfaceTex); + sp<AMessage> notify = new AMessage(kWhatRTPSinkNotify, id()); + + mRTPSink = new RTPSink(mNetSession, mSurfaceTex, notify); looper()->registerHandler(mRTPSink); status_t err = mRTPSink->init(sUseTCPInterleaving); @@ -584,6 +626,35 @@ status_t WifiDisplaySink::sendPlay(int32_t sessionID, const char *uri) { return OK; } +status_t WifiDisplaySink::sendIDRFrameRequest(int32_t sessionID) { + AString request = "SET_PARAMETER rtsp://localhost/wfd1.0 RTSP/1.0\r\n"; + + AppendCommonResponse(&request, mNextCSeq); + + AString content = "wfd_idr_request\r\n"; + + request.append(StringPrintf("Session: %s\r\n", mPlaybackSessionID.c_str())); + request.append(StringPrintf("Content-Length: %d\r\n", content.size())); + request.append("\r\n"); + request.append(content); + + status_t err = + mNetSession->sendRequest(sessionID, request.c_str(), request.size()); + + if (err != OK) { + return err; + } + + registerResponseHandler( + sessionID, + mNextCSeq, + &WifiDisplaySink::onReceiveIDRFrameRequestResponse); + + ++mNextCSeq; + + return OK; +} + void WifiDisplaySink::onSetParameterRequest( int32_t sessionID, int32_t cseq, |