From 27db53de35bbe83ce3b906da675b065803471481 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 15 Feb 2011 13:32:42 -0800 Subject: [PATCH] Derive the Transport "source" attribute from the RTSP endpoint address if necessary and continue even if we were unable to poke a hole into the firewall. related-to-bug: 3457201 Change-Id: I0a523f38e6959bf00b8b140a70bb65fcc414c9c1 --- media/libstagefright/rtsp/MyHandler.h | 65 ++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index e6ae52bcdcd4..d15d9c5c0966 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -38,6 +38,7 @@ #include #include +#include // If no access units are received within 5 secs, assume that the rtp // stream has ended and signal end of stream. @@ -121,9 +122,10 @@ struct MyHandler : public AHandler { // want to transmit user/pass in cleartext. AString host, path, user, pass; unsigned port; - if (ARTSPConnection::ParseURL( - mSessionURL.c_str(), &host, &port, &path, &user, &pass) - && user.size() > 0) { + CHECK(ARTSPConnection::ParseURL( + mSessionURL.c_str(), &host, &port, &path, &user, &pass)); + + if (user.size() > 0) { mSessionURL.clear(); mSessionURL.append("rtsp://"); mSessionURL.append(host); @@ -133,6 +135,8 @@ struct MyHandler : public AHandler { LOGI("rewritten session url: '%s'", mSessionURL.c_str()); } + + mSessionHost = host; } void connect(const sp &doneMsg) { @@ -249,14 +253,35 @@ struct MyHandler : public AHandler { // rtp/rtcp ports to poke a hole into the firewall for future incoming // packets. We're going to send an RR/SDES RTCP packet to both of them. bool pokeAHole(int rtpSocket, int rtcpSocket, const AString &transport) { + struct sockaddr_in addr; + memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); + addr.sin_family = AF_INET; + AString source; AString server_port; if (!GetAttribute(transport.c_str(), "source", - &source) - || !GetAttribute(transport.c_str(), + &source)) { + LOGW("Missing 'source' field in Transport response. Using " + "RTSP endpoint address."); + + struct hostent *ent = gethostbyname(mSessionHost.c_str()); + if (ent == NULL) { + LOGE("Failed to look up address of session host '%s'", + mSessionHost.c_str()); + + return false; + } + + addr.sin_addr.s_addr = *(in_addr_t *)ent->h_addr; + } else { + addr.sin_addr.s_addr = inet_addr(source.c_str()); + } + + if (!GetAttribute(transport.c_str(), "server_port", &server_port)) { + LOGI("Missing 'server_port' field in Transport response."); return false; } @@ -278,11 +303,6 @@ struct MyHandler : public AHandler { "in the future."); } - struct sockaddr_in addr; - memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr(source.c_str()); - if (addr.sin_addr.s_addr == INADDR_NONE) { return true; } @@ -499,22 +519,20 @@ struct MyHandler : public AHandler { if (!track->mUsingInterleavedTCP) { AString transport = response->mHeaders.valueAt(i); - if (!pokeAHole( - track->mRTPSocket, - track->mRTCPSocket, - transport)) { - result = UNKNOWN_ERROR; - } + // We are going to continue even if we were + // unable to poke a hole into the firewall... + pokeAHole( + track->mRTPSocket, + track->mRTCPSocket, + transport); } - if (result == OK) { - mRTPConn->addStream( - track->mRTPSocket, track->mRTCPSocket, - mSessionDesc, index, - notify, track->mUsingInterleavedTCP); + mRTPConn->addStream( + track->mRTPSocket, track->mRTCPSocket, + mSessionDesc, index, + notify, track->mUsingInterleavedTCP); - mSetupTracksSuccessful = true; - } + mSetupTracksSuccessful = true; } } @@ -1067,6 +1085,7 @@ private: sp mSessionDesc; AString mOriginalSessionURL; // This one still has user:pass@ AString mSessionURL; + AString mSessionHost; AString mBaseURL; AString mSessionID; bool mSetupTracksSuccessful; -- 2.11.0