From 0b73d4730202fcad53aefc4314a06e7b95f442f0 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 5 Sep 2012 10:26:52 -0700 Subject: Expose an IRemoteDisplay to trigger wifi display connections setup and feedback. Change-Id: I7602cda0e38073c9f0e63fa4de238ca0d4b4ce8e --- .../wifi-display/source/PlaybackSession.cpp | 38 +++++++++++++++++----- .../wifi-display/source/PlaybackSession.h | 12 ++++++- .../wifi-display/source/WifiDisplaySource.cpp | 23 +++++++++++-- .../wifi-display/source/WifiDisplaySource.h | 6 +++- 4 files changed, 66 insertions(+), 13 deletions(-) (limited to 'media/libstagefright') diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index c9d6562..6c01c7b 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -113,9 +113,11 @@ void WifiDisplaySource::PlaybackSession::Track::setPacketizerTrackIndex(size_t i WifiDisplaySource::PlaybackSession::PlaybackSession( const sp &netSession, - const sp ¬ify) + const sp ¬ify, + bool legacyMode) : mNetSession(netSession), mNotify(notify), + mLegacyMode(legacyMode), mLastLifesignUs(), mTSQueue(new ABuffer(12 + kMaxNumTSPacketsPerRTPPacket * 188)), mPrevTimeUs(-1ll), @@ -240,11 +242,6 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() { mPacketizer.clear(); - sp sm = defaultServiceManager(); - sp binder = sm->getService(String16("SurfaceFlinger")); - sp service = interface_cast(binder); - CHECK(service != NULL); - if (mSerializer != NULL) { mSerializer->stop(); @@ -257,7 +254,14 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() { mSerializerLooper.clear(); } - service->connectDisplay(NULL); + if (mLegacyMode) { + sp sm = defaultServiceManager(); + sp binder = sm->getService(String16("SurfaceFlinger")); + sp service = interface_cast(binder); + CHECK(service != NULL); + + service->connectDisplay(NULL); + } if (mRTCPSessionID != 0) { mNetSession->destroySession(mRTCPSessionID); @@ -598,7 +602,7 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() { SurfaceComposerClient::getDisplayInfo(0, &info); // sp source = new SurfaceMediaSource(info.w, info.h); - sp source = new SurfaceMediaSource(720, 1280); + sp source = new SurfaceMediaSource(width(), height()); #if 0 ssize_t index = mSerializer->addSource(source); @@ -641,7 +645,11 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() { err = source->setMaxAcquiredBufferCount(numInputBuffers + 1); CHECK_EQ(err, (status_t)OK); - service->connectDisplay(source->getBufferQueue()); + mBufferQueue = source->getBufferQueue(); + + if (mLegacyMode) { + service->connectDisplay(mBufferQueue); + } #endif #if 0 @@ -673,6 +681,18 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() { return OK; } +sp WifiDisplaySource::PlaybackSession::getSurfaceTexture() { + return mBufferQueue; +} + +int32_t WifiDisplaySource::PlaybackSession::width() const { + return 720; +} + +int32_t WifiDisplaySource::PlaybackSession::height() const { + return 1280; +} + void WifiDisplaySource::PlaybackSession::scheduleSendSR() { if (mSendSRPending) { return; diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h index a6c9f27..5c228f6 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.h +++ b/media/libstagefright/wifi-display/source/PlaybackSession.h @@ -23,6 +23,8 @@ namespace android { struct ABuffer; +struct BufferQueue; +struct ISurfaceTexture; struct Serializer; struct TSPacketizer; @@ -32,7 +34,9 @@ struct TSPacketizer; // display. struct WifiDisplaySource::PlaybackSession : public AHandler { PlaybackSession( - const sp &netSession, const sp ¬ify); + const sp &netSession, + const sp ¬ify, + bool legacyMode); status_t init( const char *clientIP, int32_t clientRtp, int32_t clientRtcp, @@ -46,6 +50,10 @@ struct WifiDisplaySource::PlaybackSession : public AHandler { status_t play(); status_t pause(); + sp getSurfaceTexture(); + int32_t width() const; + int32_t height() const; + enum { kWhatSessionDead, kWhatBinaryData, @@ -73,6 +81,7 @@ private: sp mNetSession; sp mNotify; + bool mLegacyMode; int64_t mLastLifesignUs; @@ -80,6 +89,7 @@ private: sp mSerializer; sp mPacketizer; sp mCodecLooper; + sp mBufferQueue; KeyedVector > mTracks; diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index a998dcd..0786f2b 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -22,6 +22,9 @@ #include "PlaybackSession.h" #include "ParsedMessage.h" +#include + +#include #include #include #include @@ -32,8 +35,11 @@ namespace android { -WifiDisplaySource::WifiDisplaySource(const sp &netSession) +WifiDisplaySource::WifiDisplaySource( + const sp &netSession, + const sp &client) : mNetSession(netSession), + mClient(client), mSessionID(0), mReaperPending(false), mNextCSeq(1) { @@ -201,6 +207,10 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { mPlaybackSessions.removeItemsAt(i); } + if (mClient != NULL) { + mClient->onDisplayDisconnected(); + } + status_t err = OK; sp response = new AMessage; @@ -768,7 +778,8 @@ void WifiDisplaySource::onSetupRequest( notify->setInt32("sessionID", sessionID); sp playbackSession = - new PlaybackSession(mNetSession, notify); + new PlaybackSession( + mNetSession, notify, mClient == NULL /* legacyMode */); looper()->registerHandler(playbackSession); @@ -869,6 +880,14 @@ void WifiDisplaySource::onPlayRequest( err = mNetSession->sendRequest(sessionID, response.c_str()); CHECK_EQ(err, (status_t)OK); + + if (mClient != NULL) { + mClient->onDisplayConnected( + playbackSession->getSurfaceTexture(), + playbackSession->width(), + playbackSession->height(), + 0 /* flags */); + } } void WifiDisplaySource::onPauseRequest( diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.h b/media/libstagefright/wifi-display/source/WifiDisplaySource.h index f56347d..99eb4f5 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.h +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.h @@ -24,6 +24,7 @@ namespace android { +struct IRemoteDisplayClient; struct ParsedMessage; // Represents the RTSP server acting as a wifi display source. @@ -31,7 +32,9 @@ struct ParsedMessage; struct WifiDisplaySource : public AHandler { static const unsigned kWifiDisplayDefaultPort = 7236; - WifiDisplaySource(const sp &netSession); + WifiDisplaySource( + const sp &netSession, + const sp &client); status_t start(const char *iface); status_t stop(); @@ -74,6 +77,7 @@ private: kPlaybackSessionTimeoutSecs * 1000000ll; sp mNetSession; + sp mClient; int32_t mSessionID; struct ClientInfo { -- cgit v1.1