Loading media/libstagefright/rtsp/MyHandler.h +42 −23 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <arpa/inet.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/socket.h> #include <netdb.h> // If no access units are received within 5 secs, assume that the rtp // If no access units are received within 5 secs, assume that the rtp // stream has ended and signal end of stream. // stream has ended and signal end of stream. Loading Loading @@ -121,9 +122,10 @@ struct MyHandler : public AHandler { // want to transmit user/pass in cleartext. // want to transmit user/pass in cleartext. AString host, path, user, pass; AString host, path, user, pass; unsigned port; unsigned port; if (ARTSPConnection::ParseURL( CHECK(ARTSPConnection::ParseURL( mSessionURL.c_str(), &host, &port, &path, &user, &pass) mSessionURL.c_str(), &host, &port, &path, &user, &pass)); && user.size() > 0) { if (user.size() > 0) { mSessionURL.clear(); mSessionURL.clear(); mSessionURL.append("rtsp://"); mSessionURL.append("rtsp://"); mSessionURL.append(host); mSessionURL.append(host); Loading @@ -133,6 +135,8 @@ struct MyHandler : public AHandler { LOGI("rewritten session url: '%s'", mSessionURL.c_str()); LOGI("rewritten session url: '%s'", mSessionURL.c_str()); } } mSessionHost = host; } } void connect(const sp<AMessage> &doneMsg) { void connect(const sp<AMessage> &doneMsg) { Loading Loading @@ -249,14 +253,35 @@ struct MyHandler : public AHandler { // rtp/rtcp ports to poke a hole into the firewall for future incoming // 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. // packets. We're going to send an RR/SDES RTCP packet to both of them. bool pokeAHole(int rtpSocket, int rtcpSocket, const AString &transport) { 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 source; AString server_port; AString server_port; if (!GetAttribute(transport.c_str(), if (!GetAttribute(transport.c_str(), "source", "source", &source) &source)) { || !GetAttribute(transport.c_str(), 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", &server_port)) { &server_port)) { LOGI("Missing 'server_port' field in Transport response."); return false; return false; } } Loading @@ -278,11 +303,6 @@ struct MyHandler : public AHandler { "in the future."); "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) { if (addr.sin_addr.s_addr == INADDR_NONE) { return true; return true; } } Loading Loading @@ -499,15 +519,14 @@ struct MyHandler : public AHandler { if (!track->mUsingInterleavedTCP) { if (!track->mUsingInterleavedTCP) { AString transport = response->mHeaders.valueAt(i); AString transport = response->mHeaders.valueAt(i); if (!pokeAHole( // We are going to continue even if we were // unable to poke a hole into the firewall... pokeAHole( track->mRTPSocket, track->mRTPSocket, track->mRTCPSocket, track->mRTCPSocket, transport)) { transport); result = UNKNOWN_ERROR; } } } if (result == OK) { mRTPConn->addStream( mRTPConn->addStream( track->mRTPSocket, track->mRTCPSocket, track->mRTPSocket, track->mRTCPSocket, mSessionDesc, index, mSessionDesc, index, Loading @@ -516,7 +535,6 @@ struct MyHandler : public AHandler { mSetupTracksSuccessful = true; mSetupTracksSuccessful = true; } } } } } if (result != OK) { if (result != OK) { if (track) { if (track) { Loading Loading @@ -1067,6 +1085,7 @@ private: sp<ASessionDescription> mSessionDesc; sp<ASessionDescription> mSessionDesc; AString mOriginalSessionURL; // This one still has user:pass@ AString mOriginalSessionURL; // This one still has user:pass@ AString mSessionURL; AString mSessionURL; AString mSessionHost; AString mBaseURL; AString mBaseURL; AString mSessionID; AString mSessionID; bool mSetupTracksSuccessful; bool mSetupTracksSuccessful; Loading Loading
media/libstagefright/rtsp/MyHandler.h +42 −23 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <arpa/inet.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/socket.h> #include <netdb.h> // If no access units are received within 5 secs, assume that the rtp // If no access units are received within 5 secs, assume that the rtp // stream has ended and signal end of stream. // stream has ended and signal end of stream. Loading Loading @@ -121,9 +122,10 @@ struct MyHandler : public AHandler { // want to transmit user/pass in cleartext. // want to transmit user/pass in cleartext. AString host, path, user, pass; AString host, path, user, pass; unsigned port; unsigned port; if (ARTSPConnection::ParseURL( CHECK(ARTSPConnection::ParseURL( mSessionURL.c_str(), &host, &port, &path, &user, &pass) mSessionURL.c_str(), &host, &port, &path, &user, &pass)); && user.size() > 0) { if (user.size() > 0) { mSessionURL.clear(); mSessionURL.clear(); mSessionURL.append("rtsp://"); mSessionURL.append("rtsp://"); mSessionURL.append(host); mSessionURL.append(host); Loading @@ -133,6 +135,8 @@ struct MyHandler : public AHandler { LOGI("rewritten session url: '%s'", mSessionURL.c_str()); LOGI("rewritten session url: '%s'", mSessionURL.c_str()); } } mSessionHost = host; } } void connect(const sp<AMessage> &doneMsg) { void connect(const sp<AMessage> &doneMsg) { Loading Loading @@ -249,14 +253,35 @@ struct MyHandler : public AHandler { // rtp/rtcp ports to poke a hole into the firewall for future incoming // 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. // packets. We're going to send an RR/SDES RTCP packet to both of them. bool pokeAHole(int rtpSocket, int rtcpSocket, const AString &transport) { 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 source; AString server_port; AString server_port; if (!GetAttribute(transport.c_str(), if (!GetAttribute(transport.c_str(), "source", "source", &source) &source)) { || !GetAttribute(transport.c_str(), 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", &server_port)) { &server_port)) { LOGI("Missing 'server_port' field in Transport response."); return false; return false; } } Loading @@ -278,11 +303,6 @@ struct MyHandler : public AHandler { "in the future."); "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) { if (addr.sin_addr.s_addr == INADDR_NONE) { return true; return true; } } Loading Loading @@ -499,15 +519,14 @@ struct MyHandler : public AHandler { if (!track->mUsingInterleavedTCP) { if (!track->mUsingInterleavedTCP) { AString transport = response->mHeaders.valueAt(i); AString transport = response->mHeaders.valueAt(i); if (!pokeAHole( // We are going to continue even if we were // unable to poke a hole into the firewall... pokeAHole( track->mRTPSocket, track->mRTPSocket, track->mRTCPSocket, track->mRTCPSocket, transport)) { transport); result = UNKNOWN_ERROR; } } } if (result == OK) { mRTPConn->addStream( mRTPConn->addStream( track->mRTPSocket, track->mRTCPSocket, track->mRTPSocket, track->mRTCPSocket, mSessionDesc, index, mSessionDesc, index, Loading @@ -516,7 +535,6 @@ struct MyHandler : public AHandler { mSetupTracksSuccessful = true; mSetupTracksSuccessful = true; } } } } } if (result != OK) { if (result != OK) { if (track) { if (track) { Loading Loading @@ -1067,6 +1085,7 @@ private: sp<ASessionDescription> mSessionDesc; sp<ASessionDescription> mSessionDesc; AString mOriginalSessionURL; // This one still has user:pass@ AString mOriginalSessionURL; // This one still has user:pass@ AString mSessionURL; AString mSessionURL; AString mSessionHost; AString mBaseURL; AString mBaseURL; AString mSessionID; AString mSessionID; bool mSetupTracksSuccessful; bool mSetupTracksSuccessful; Loading