summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/rtsp/MyHandler.h
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-02-15 13:32:42 -0800
committerAndreas Huber <andih@google.com>2011-02-15 13:49:32 -0800
commitde9a20c274983d4f7a688acb68d5dfc6a432eb10 (patch)
tree5deb27eed96a3ef6e1cf62712f2e497f5ef374bb /media/libstagefright/rtsp/MyHandler.h
parentdc468c5f9d72ce54de0070493e9a23efb8907e06 (diff)
downloadframeworks_av-de9a20c274983d4f7a688acb68d5dfc6a432eb10.zip
frameworks_av-de9a20c274983d4f7a688acb68d5dfc6a432eb10.tar.gz
frameworks_av-de9a20c274983d4f7a688acb68d5dfc6a432eb10.tar.bz2
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
Diffstat (limited to 'media/libstagefright/rtsp/MyHandler.h')
-rw-r--r--media/libstagefright/rtsp/MyHandler.h65
1 files changed, 42 insertions, 23 deletions
diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h
index e6ae52b..d15d9c5 100644
--- a/media/libstagefright/rtsp/MyHandler.h
+++ b/media/libstagefright/rtsp/MyHandler.h
@@ -38,6 +38,7 @@
#include <arpa/inet.h>
#include <sys/socket.h>
+#include <netdb.h>
// 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<AMessage> &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<ASessionDescription> mSessionDesc;
AString mOriginalSessionURL; // This one still has user:pass@
AString mSessionURL;
+ AString mSessionHost;
AString mBaseURL;
AString mSessionID;
bool mSetupTracksSuccessful;