From ab1bd84889273bc21efdabe5ff6f4633eb918a85 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 30 Aug 2012 14:51:40 -0700 Subject: Only run the wifi display RTSP server on demand, and only on the wifi direct interface. Change-Id: I7d3c44cb79cd40e73499f2d7ccf35c69b628e6d7 --- media/libmedia/IMediaPlayerService.cpp | 18 ++++++-- media/libmediaplayerservice/MediaPlayerService.cpp | 14 +++++-- media/libmediaplayerservice/MediaPlayerService.h | 2 +- media/libmediaplayerservice/RemoteDisplay.cpp | 6 +-- media/libmediaplayerservice/RemoteDisplay.h | 2 +- .../wifi-display/ANetworkSession.cpp | 12 +++++- .../libstagefright/wifi-display/ANetworkSession.h | 6 ++- .../wifi-display/source/PlaybackSession.cpp | 2 +- .../wifi-display/source/WifiDisplaySource.cpp | 48 ++++++++++++++++++---- .../wifi-display/source/WifiDisplaySource.h | 2 +- media/libstagefright/wifi-display/wfd.cpp | 16 +++++--- 11 files changed, 97 insertions(+), 31 deletions(-) (limited to 'media') diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index 41969b1..d3e2e19 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -121,10 +121,17 @@ public: return interface_cast(reply.readStrongBinder()); } - virtual status_t enableRemoteDisplay(bool enable) { + virtual status_t enableRemoteDisplay(const char *iface) { Parcel data, reply; data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); - data.writeInt32(enable); + + if (iface != NULL) { + data.writeInt32(1); + data.writeCString(iface); + } else { + data.writeInt32(0); + } + remote()->transact(ENABLE_REMOTE_DISPLAY, data, &reply); return reply.readInt32(); } @@ -217,8 +224,11 @@ status_t BnMediaPlayerService::onTransact( } break; case ENABLE_REMOTE_DISPLAY: { CHECK_INTERFACE(IMediaPlayerService, data, reply); - bool enable = data.readInt32(); - reply->writeInt32(enableRemoteDisplay(enable)); + const char *iface = NULL; + if (data.readInt32()) { + iface = data.readCString(); + } + reply->writeInt32(enableRemoteDisplay(iface)); return NO_ERROR; } break; case ADD_BATTERY_DATA: { diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 5fe446f..166bae9 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -279,13 +279,17 @@ sp MediaPlayerService::makeCrypto() { return new Crypto; } -status_t MediaPlayerService::enableRemoteDisplay(bool enable) { +status_t MediaPlayerService::enableRemoteDisplay(const char *iface) { Mutex::Autolock autoLock(mLock); - if (enable && mRemoteDisplay == NULL) { + if (iface != NULL) { + if (mRemoteDisplay != NULL) { + return INVALID_OPERATION; + } + mRemoteDisplay = new RemoteDisplay; - status_t err = mRemoteDisplay->start(); + status_t err = mRemoteDisplay->start(iface); if (err != OK) { mRemoteDisplay.clear(); @@ -293,7 +297,9 @@ status_t MediaPlayerService::enableRemoteDisplay(bool enable) { } return OK; - } else if (!enable && mRemoteDisplay != NULL) { + } + + if (mRemoteDisplay != NULL) { mRemoteDisplay->stop(); mRemoteDisplay.clear(); } diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 8fbc5d5..2577c58 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -248,7 +248,7 @@ public: virtual sp decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat); virtual sp getOMX(); virtual sp makeCrypto(); - virtual status_t enableRemoteDisplay(bool enable); + virtual status_t enableRemoteDisplay(const char *iface); virtual status_t dump(int fd, const Vector& args); diff --git a/media/libmediaplayerservice/RemoteDisplay.cpp b/media/libmediaplayerservice/RemoteDisplay.cpp index 855824a..49f7278 100644 --- a/media/libmediaplayerservice/RemoteDisplay.cpp +++ b/media/libmediaplayerservice/RemoteDisplay.cpp @@ -32,13 +32,11 @@ RemoteDisplay::RemoteDisplay() RemoteDisplay::~RemoteDisplay() { } -status_t RemoteDisplay::start() { +status_t RemoteDisplay::start(const char *iface) { mNetSession->start(); mLooper->start(); - // XXX replace with 8554 for bcom dongle (it doesn't respect the - // default port or the one advertised in the wfd IE). - mSource->start(WifiDisplaySource::kWifiDisplayDefaultPort); + mSource->start(iface); return OK; } diff --git a/media/libmediaplayerservice/RemoteDisplay.h b/media/libmediaplayerservice/RemoteDisplay.h index 6b37afb..3607d06 100644 --- a/media/libmediaplayerservice/RemoteDisplay.h +++ b/media/libmediaplayerservice/RemoteDisplay.h @@ -31,7 +31,7 @@ struct WifiDisplaySource; struct RemoteDisplay : public RefBase { RemoteDisplay(); - status_t start(); + status_t start(const char *iface); status_t stop(); protected: diff --git a/media/libstagefright/wifi-display/ANetworkSession.cpp b/media/libstagefright/wifi-display/ANetworkSession.cpp index ee0600c..4ddd778 100644 --- a/media/libstagefright/wifi-display/ANetworkSession.cpp +++ b/media/libstagefright/wifi-display/ANetworkSession.cpp @@ -537,6 +537,7 @@ status_t ANetworkSession::createRTSPClient( int32_t *sessionID) { return createClientOrServer( kModeCreateRTSPClient, + NULL /* addr */, 0 /* port */, host, port, @@ -545,9 +546,11 @@ status_t ANetworkSession::createRTSPClient( } status_t ANetworkSession::createRTSPServer( - unsigned port, const sp ¬ify, int32_t *sessionID) { + const struct in_addr &addr, unsigned port, + const sp ¬ify, int32_t *sessionID) { return createClientOrServer( kModeCreateRTSPServer, + &addr, port, NULL /* remoteHost */, 0 /* remotePort */, @@ -568,6 +571,7 @@ status_t ANetworkSession::createUDPSession( int32_t *sessionID) { return createClientOrServer( kModeCreateUDPSession, + NULL /* addr */, localPort, remoteHost, remotePort, @@ -608,6 +612,7 @@ status_t ANetworkSession::MakeSocketNonBlocking(int s) { status_t ANetworkSession::createClientOrServer( Mode mode, + const struct in_addr *localAddr, unsigned port, const char *remoteHost, unsigned remotePort, @@ -677,8 +682,11 @@ status_t ANetworkSession::createClientOrServer( addr.sin_addr.s_addr = *(in_addr_t *)ent->h_addr; addr.sin_port = htons(remotePort); + } else if (localAddr != NULL) { + addr.sin_addr = *localAddr; + addr.sin_port = htons(port); } else { - addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); } diff --git a/media/libstagefright/wifi-display/ANetworkSession.h b/media/libstagefright/wifi-display/ANetworkSession.h index d4cd14f..8d961ee 100644 --- a/media/libstagefright/wifi-display/ANetworkSession.h +++ b/media/libstagefright/wifi-display/ANetworkSession.h @@ -23,6 +23,8 @@ #include #include +#include + namespace android { struct AMessage; @@ -40,7 +42,8 @@ struct ANetworkSession : public RefBase { int32_t *sessionID); status_t createRTSPServer( - unsigned port, const sp ¬ify, int32_t *sessionID); + const struct in_addr &addr, unsigned port, + const sp ¬ify, int32_t *sessionID); status_t createUDPSession( unsigned localPort, const sp ¬ify, int32_t *sessionID); @@ -92,6 +95,7 @@ private: }; status_t createClientOrServer( Mode mode, + const struct in_addr *addr, unsigned port, const char *remoteHost, unsigned remotePort, diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index c99a11e..f9223d6 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -625,7 +625,7 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() { ssize_t index = mSerializer->addSource(source); #else ssize_t index = mSerializer->addSource( - new RepeaterSource(source, 55.0 /* rateHz */)); + new RepeaterSource(source, 30.0 /* rateHz */)); #endif CHECK_GE(index, 0); diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index 3f75bc3..35d4414 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -27,6 +27,9 @@ #include #include +#include +#include + namespace android { WifiDisplaySource::WifiDisplaySource(const sp &netSession) @@ -39,9 +42,9 @@ WifiDisplaySource::WifiDisplaySource(const sp &netSession) WifiDisplaySource::~WifiDisplaySource() { } -status_t WifiDisplaySource::start(int32_t port) { +status_t WifiDisplaySource::start(const char *iface) { sp msg = new AMessage(kWhatStart, id()); - msg->setInt32("port", port); + msg->setString("iface", iface); sp response; status_t err = msg->postAndAwaitResponse(&response); @@ -81,13 +84,44 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - int32_t port; - CHECK(msg->findInt32("port", &port)); + AString iface; + CHECK(msg->findString("iface", &iface)); + + status_t err = OK; + + ssize_t colonPos = iface.find(":"); + + unsigned long port; + + if (colonPos >= 0) { + const char *s = iface.c_str() + colonPos + 1; + + char *end; + port = strtoul(s, &end, 10); + + if (end == s || *end != '\0' || port > 65535) { + err = -EINVAL; + } else { + iface.erase(colonPos, iface.size() - colonPos); + } + } else { + port = kWifiDisplayDefaultPort; + } + + struct in_addr addr; - sp notify = new AMessage(kWhatRTSPNotify, id()); + if (err == OK) { + if (inet_aton(iface.c_str(), &addr) != 0) { + sp notify = new AMessage(kWhatRTSPNotify, id()); - status_t err = mNetSession->createRTSPServer( - port, notify, &mSessionID); + err = mNetSession->createRTSPServer( + addr, port, notify, &mSessionID); + + ALOGI("createRTSPServer returned err %d", err); + } else { + err = -EINVAL; + } + } sp response = new AMessage; response->setInt32("err", err); diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.h b/media/libstagefright/wifi-display/source/WifiDisplaySource.h index 95c3560..cd9939b 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.h +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.h @@ -33,7 +33,7 @@ struct WifiDisplaySource : public AHandler { WifiDisplaySource(const sp &netSession); - status_t start(int32_t port); + status_t start(const char *iface); status_t stop(); protected: diff --git a/media/libstagefright/wifi-display/wfd.cpp b/media/libstagefright/wifi-display/wfd.cpp index 32cdf3f..5e7d9fd 100644 --- a/media/libstagefright/wifi-display/wfd.cpp +++ b/media/libstagefright/wifi-display/wfd.cpp @@ -32,7 +32,7 @@ namespace android { -static void enableDisableRemoteDisplay(bool enable) { +static void enableDisableRemoteDisplay(const char *iface) { sp sm = defaultServiceManager(); sp binder = sm->getService(String16("media.player")); @@ -41,7 +41,7 @@ static void enableDisableRemoteDisplay(bool enable) { CHECK(service.get() != NULL); - service->enableRemoteDisplay(enable); + service->enableRemoteDisplay(iface); } } // namespace android @@ -53,7 +53,7 @@ static void usage(const char *me) { " %s -c host[:port]\tconnect to wifi source\n" " -u uri \tconnect to an rtsp uri\n" #endif - " -e \tenable remote display\n" + " -e ip[:port] \tenable remote display\n" " -d \tdisable remote display\n", me); } @@ -70,7 +70,7 @@ int main(int argc, char **argv) { AString uri; int res; - while ((res = getopt(argc, argv, "hc:l:u:ed")) >= 0) { + while ((res = getopt(argc, argv, "hc:l:u:e:d")) >= 0) { switch (res) { #if SUPPORT_SINK case 'c': @@ -103,9 +103,15 @@ int main(int argc, char **argv) { #endif case 'e': + { + enableDisableRemoteDisplay(optarg); + exit(0); + break; + } + case 'd': { - enableDisableRemoteDisplay(res == 'e'); + enableDisableRemoteDisplay(NULL); exit(0); break; } -- cgit v1.1