summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-08-30 14:51:40 -0700
committerAndreas Huber <andih@google.com>2012-08-30 14:51:40 -0700
commitbcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9 (patch)
tree12db95dcd0186648022458280b950cf4aa154849 /media/libstagefright
parent86b1961a8d61086ef8d5475182f2a3cf4392b42c (diff)
downloadframeworks_av-bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9.zip
frameworks_av-bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9.tar.gz
frameworks_av-bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9.tar.bz2
Only run the wifi display RTSP server on demand, and only on the wifi direct
interface. Change-Id: I7d3c44cb79cd40e73499f2d7ccf35c69b628e6d7
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/wifi-display/ANetworkSession.cpp12
-rw-r--r--media/libstagefright/wifi-display/ANetworkSession.h6
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp2
-rw-r--r--media/libstagefright/wifi-display/source/WifiDisplaySource.cpp48
-rw-r--r--media/libstagefright/wifi-display/source/WifiDisplaySource.h2
-rw-r--r--media/libstagefright/wifi-display/wfd.cpp16
6 files changed, 69 insertions, 17 deletions
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<AMessage> &notify, int32_t *sessionID) {
+ const struct in_addr &addr, unsigned port,
+ const sp<AMessage> &notify, 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 <utils/RefBase.h>
#include <utils/Thread.h>
+#include <netinet/in.h>
+
namespace android {
struct AMessage;
@@ -40,7 +42,8 @@ struct ANetworkSession : public RefBase {
int32_t *sessionID);
status_t createRTSPServer(
- unsigned port, const sp<AMessage> &notify, int32_t *sessionID);
+ const struct in_addr &addr, unsigned port,
+ const sp<AMessage> &notify, int32_t *sessionID);
status_t createUDPSession(
unsigned localPort, const sp<AMessage> &notify, 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 <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaErrors.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
namespace android {
WifiDisplaySource::WifiDisplaySource(const sp<ANetworkSession> &netSession)
@@ -39,9 +42,9 @@ WifiDisplaySource::WifiDisplaySource(const sp<ANetworkSession> &netSession)
WifiDisplaySource::~WifiDisplaySource() {
}
-status_t WifiDisplaySource::start(int32_t port) {
+status_t WifiDisplaySource::start(const char *iface) {
sp<AMessage> msg = new AMessage(kWhatStart, id());
- msg->setInt32("port", port);
+ msg->setString("iface", iface);
sp<AMessage> response;
status_t err = msg->postAndAwaitResponse(&response);
@@ -81,13 +84,44 @@ void WifiDisplaySource::onMessageReceived(const sp<AMessage> &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<AMessage> notify = new AMessage(kWhatRTSPNotify, id());
+ if (err == OK) {
+ if (inet_aton(iface.c_str(), &addr) != 0) {
+ sp<AMessage> 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<AMessage> 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<ANetworkSession> &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<IServiceManager> sm = defaultServiceManager();
sp<IBinder> 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;
}