summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-03-22 09:56:29 -0700
committerAndreas Huber <andih@google.com>2013-03-25 10:36:33 -0700
commita64ea768de9c02bce0e545be032dabe8b6c39727 (patch)
tree5f915fef2c62d376c13669aac409ce22c7a8d0a8 /media/libstagefright/wifi-display
parent2247dd0dc60096d1b5a91ccadb5539f0b100c88f (diff)
downloadframeworks_av-a64ea768de9c02bce0e545be032dabe8b6c39727.zip
frameworks_av-a64ea768de9c02bce0e545be032dabe8b6c39727.tar.gz
frameworks_av-a64ea768de9c02bce0e545be032dabe8b6c39727.tar.bz2
Separate the mode of the RTP and RTCP channels.
I now can use a TCP reliable data channel with a UDP back channel. Change-Id: Ieb0f0970e3a6da4cff250e9547e181c0c961b9fb
Diffstat (limited to 'media/libstagefright/wifi-display')
-rw-r--r--media/libstagefright/wifi-display/MediaSender.cpp11
-rw-r--r--media/libstagefright/wifi-display/rtp/RTPBase.h1
-rw-r--r--media/libstagefright/wifi-display/rtp/RTPSender.cpp55
-rw-r--r--media/libstagefright/wifi-display/rtp/RTPSender.h6
4 files changed, 48 insertions, 25 deletions
diff --git a/media/libstagefright/wifi-display/MediaSender.cpp b/media/libstagefright/wifi-display/MediaSender.cpp
index d13a92e..6fc50f7 100644
--- a/media/libstagefright/wifi-display/MediaSender.cpp
+++ b/media/libstagefright/wifi-display/MediaSender.cpp
@@ -124,10 +124,14 @@ status_t MediaSender::initAsync(
looper()->registerHandler(mTSSender);
err = mTSSender->initAsync(
- transportMode,
remoteHost,
remoteRTPPort,
+ transportMode, // rtpMode
remoteRTCPPort,
+ (transportMode == RTPSender::TRANSPORT_UDP
+ && remoteRTCPPort >= 0)
+ ? transportMode
+ : RTPSender::TRANSPORT_NONE, // rtcpMode
localRTPPort);
if (err != OK) {
@@ -174,10 +178,13 @@ status_t MediaSender::initAsync(
looper()->registerHandler(info->mSender);
status_t err = info->mSender->initAsync(
- transportMode,
remoteHost,
remoteRTPPort,
+ transportMode, // rtpMode
remoteRTCPPort,
+ (transportMode == RTPSender::TRANSPORT_UDP && remoteRTCPPort >= 0)
+ ? transportMode
+ : RTPSender::TRANSPORT_NONE, // rtcpMode
localRTPPort);
if (err != OK) {
diff --git a/media/libstagefright/wifi-display/rtp/RTPBase.h b/media/libstagefright/wifi-display/rtp/RTPBase.h
index 6507a6f..e3fa845 100644
--- a/media/libstagefright/wifi-display/rtp/RTPBase.h
+++ b/media/libstagefright/wifi-display/rtp/RTPBase.h
@@ -29,6 +29,7 @@ struct RTPBase {
enum TransportMode {
TRANSPORT_UNDEFINED,
+ TRANSPORT_NONE,
TRANSPORT_UDP,
TRANSPORT_TCP,
TRANSPORT_TCP_INTERLEAVED,
diff --git a/media/libstagefright/wifi-display/rtp/RTPSender.cpp b/media/libstagefright/wifi-display/rtp/RTPSender.cpp
index c8e265c..c686e01 100644
--- a/media/libstagefright/wifi-display/rtp/RTPSender.cpp
+++ b/media/libstagefright/wifi-display/rtp/RTPSender.cpp
@@ -38,7 +38,8 @@ RTPSender::RTPSender(
const sp<AMessage> &notify)
: mNetSession(netSession),
mNotify(notify),
- mMode(TRANSPORT_UNDEFINED),
+ mRTPMode(TRANSPORT_UNDEFINED),
+ mRTCPMode(TRANSPORT_UNDEFINED),
mRTPSessionID(0),
mRTCPSessionID(0),
mRTPConnected(false),
@@ -74,18 +75,24 @@ int32_t RTPBase::PickRandomRTPPort() {
}
status_t RTPSender::initAsync(
- TransportMode mode,
const char *remoteHost,
int32_t remoteRTPPort,
+ TransportMode rtpMode,
int32_t remoteRTCPPort,
+ TransportMode rtcpMode,
int32_t *outLocalRTPPort) {
- if (mMode != TRANSPORT_UNDEFINED || mode == TRANSPORT_UNDEFINED) {
+ if (mRTPMode != TRANSPORT_UNDEFINED
+ || rtpMode == TRANSPORT_UNDEFINED
+ || rtpMode == TRANSPORT_NONE
+ || rtcpMode == TRANSPORT_UNDEFINED) {
return INVALID_OPERATION;
}
- CHECK_NE(mMode, TRANSPORT_TCP_INTERLEAVED);
+ CHECK_NE(rtpMode, TRANSPORT_TCP_INTERLEAVED);
+ CHECK_NE(rtcpMode, TRANSPORT_TCP_INTERLEAVED);
- if (mode == TRANSPORT_TCP && remoteRTCPPort >= 0) {
+ if (rtcpMode == TRANSPORT_NONE && remoteRTCPPort >= 0
+ || rtcpMode != TRANSPORT_NONE && remoteRTCPPort < 0) {
return INVALID_OPERATION;
}
@@ -105,7 +112,7 @@ status_t RTPSender::initAsync(
localRTPPort = PickRandomRTPPort();
status_t err;
- if (mode == TRANSPORT_UDP) {
+ if (rtpMode == TRANSPORT_UDP) {
err = mNetSession->createUDPSession(
localRTPPort,
remoteHost,
@@ -113,7 +120,7 @@ status_t RTPSender::initAsync(
rtpNotify,
&mRTPSessionID);
} else {
- CHECK_EQ(mode, TRANSPORT_TCP);
+ CHECK_EQ(rtpMode, TRANSPORT_TCP);
err = mNetSession->createTCPDatagramSession(
localRTPPort,
remoteHost,
@@ -130,7 +137,7 @@ status_t RTPSender::initAsync(
break;
}
- if (mode == TRANSPORT_UDP) {
+ if (rtcpMode == TRANSPORT_UDP) {
err = mNetSession->createUDPSession(
localRTPPort + 1,
remoteHost,
@@ -138,7 +145,7 @@ status_t RTPSender::initAsync(
rtcpNotify,
&mRTCPSessionID);
} else {
- CHECK_EQ(mode, TRANSPORT_TCP);
+ CHECK_EQ(rtcpMode, TRANSPORT_TCP);
err = mNetSession->createTCPDatagramSession(
localRTPPort + 1,
remoteHost,
@@ -155,15 +162,20 @@ status_t RTPSender::initAsync(
mRTPSessionID = 0;
}
- if (mode == TRANSPORT_UDP) {
+ if (rtpMode == TRANSPORT_UDP) {
mRTPConnected = true;
+ }
+
+ if (rtcpMode == TRANSPORT_UDP) {
mRTCPConnected = true;
}
- mMode = mode;
+ mRTPMode = rtpMode;
+ mRTCPMode = rtcpMode;
*outLocalRTPPort = localRTPPort;
- if (mMode == TRANSPORT_UDP) {
+ if (mRTPMode == TRANSPORT_UDP
+ && (mRTCPMode == TRANSPORT_UDP || mRTCPMode == TRANSPORT_NONE)) {
notifyInitDone(OK);
}
@@ -496,12 +508,12 @@ void RTPSender::onNetNotify(bool isRTP, const sp<AMessage> &msg) {
mRTCPSessionID = 0;
}
- if (mMode == TRANSPORT_TCP) {
- if (!mRTPConnected
- || (mRTCPSessionID > 0 && !mRTCPConnected)) {
- notifyInitDone(err);
- break;
- }
+ if (!mRTPConnected
+ || (mRTPMode != TRANSPORT_NONE && !mRTCPConnected)) {
+ // We haven't completed initialization, attach the error
+ // to the notification instead.
+ notifyInitDone(err);
+ break;
}
notifyError(err);
@@ -523,20 +535,21 @@ void RTPSender::onNetNotify(bool isRTP, const sp<AMessage> &msg) {
case ANetworkSession::kWhatConnected:
{
- CHECK_EQ(mMode, TRANSPORT_TCP);
-
int32_t sessionID;
CHECK(msg->findInt32("sessionID", &sessionID));
if (isRTP) {
+ CHECK_EQ(mRTPMode, TRANSPORT_TCP);
CHECK_EQ(sessionID, mRTPSessionID);
mRTPConnected = true;
} else {
+ CHECK_EQ(mRTCPMode, TRANSPORT_TCP);
CHECK_EQ(sessionID, mRTCPSessionID);
mRTCPConnected = true;
}
- if (mRTPConnected && (mRTCPSessionID == 0 || mRTCPConnected)) {
+ if (mRTPConnected
+ && (mRTCPMode == TRANSPORT_NONE || mRTCPConnected)) {
notifyInitDone(OK);
}
break;
diff --git a/media/libstagefright/wifi-display/rtp/RTPSender.h b/media/libstagefright/wifi-display/rtp/RTPSender.h
index 90b1796..8409b8d 100644
--- a/media/libstagefright/wifi-display/rtp/RTPSender.h
+++ b/media/libstagefright/wifi-display/rtp/RTPSender.h
@@ -43,10 +43,11 @@ struct RTPSender : public RTPBase, public AHandler {
const sp<AMessage> &notify);
status_t initAsync(
- TransportMode mode,
const char *remoteHost,
int32_t remoteRTPPort,
+ TransportMode rtpMode,
int32_t remoteRTCPPort,
+ TransportMode rtcpMode,
int32_t *outLocalRTPPort);
status_t queueBuffer(
@@ -72,7 +73,8 @@ private:
sp<ANetworkSession> mNetSession;
sp<AMessage> mNotify;
- TransportMode mMode;
+ TransportMode mRTPMode;
+ TransportMode mRTCPMode;
int32_t mRTPSessionID;
int32_t mRTCPSessionID;
bool mRTPConnected;