summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display/rtp/RTPSender.cpp
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
commit6e98aba4d23d00cab236d993d895f57ea76ea0e5 (patch)
treea166df2eae20c39768fa13c5b803a246275de5b8 /media/libstagefright/wifi-display/rtp/RTPSender.cpp
parenta97d15e2e2f0b317a345d3a6f02df80b8988b1f6 (diff)
downloadframeworks_av-6e98aba4d23d00cab236d993d895f57ea76ea0e5.zip
frameworks_av-6e98aba4d23d00cab236d993d895f57ea76ea0e5.tar.gz
frameworks_av-6e98aba4d23d00cab236d993d895f57ea76ea0e5.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/rtp/RTPSender.cpp')
-rw-r--r--media/libstagefright/wifi-display/rtp/RTPSender.cpp55
1 files changed, 34 insertions, 21 deletions
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;