r2982 - trunk/libminisip/source/mediahandler
mikma at minisip.org
mikma at minisip.org
Sat Dec 2 21:58:40 CET 2006
Author: mikma
Date: 2006-12-02 21:58:38 +0100 (Sat, 02 Dec 2006)
New Revision: 2982
Modified:
trunk/libminisip/source/mediahandler/MediaStream.cxx
Log:
MediaStream: Fix SDP codec negotiation. Check encoding name, clock rate and
encoding parameters
Modified: trunk/libminisip/source/mediahandler/MediaStream.cxx
===================================================================
--- trunk/libminisip/source/mediahandler/MediaStream.cxx 2006-12-02 19:46:44 UTC (rev 2981)
+++ trunk/libminisip/source/mediahandler/MediaStream.cxx 2006-12-02 20:58:38 UTC (rev 2982)
@@ -65,6 +65,25 @@
return media->getSdpAttributes();
}
+bool parseRtpMap(string rtpMap, string &name, string &rate, string ¶m){
+ size_t pos = rtpMap.find('/');
+
+ if( pos == string::npos )
+ return false;
+
+ size_t pos2 = rtpMap.find('/', pos + 1);
+
+ name = rtpMap.substr(0, pos);
+ rate = rtpMap.substr(pos + 1, pos2 - pos - 1);
+
+ if( pos2 != string::npos )
+ param = rtpMap.substr(pos2);
+ else
+ param = "1";
+
+ return true;
+}
+
bool MediaStream::matches( MRef<SdpHeaderM *> m, uint32_t formatIndex ){
string sdpRtpMap;
string sdpFmtpParam;
@@ -84,13 +103,16 @@
std::list<MRef<Codec *> > codecs = media->getAvailableCodecs();
std::list<MRef<Codec *> >::iterator iC;
- string codecRtpMap;
- uint8_t codecPayloadType;
+ string sdpName;
+ string sdpRate;
+ string sdpParam;
- size_t s1;
- size_t s2 = sdpRtpMap.find("/");
+ parseRtpMap(sdpRtpMap, sdpName, sdpRate, sdpParam);
for( iC = codecs.begin(); iC != codecs.end(); iC ++ ){
+ string codecRtpMap;
+ uint8_t codecPayloadType;
+
codecRtpMap = (*iC)->getSdpMediaAttributes();
codecPayloadType = (*iC)->getSdpMediaType();
if( (*iC)->getCodecName() == "iLBC" ) {
@@ -99,8 +121,14 @@
} //else ... does not mean we accept it, it still goes through the normal checks ...
}
if( sdpRtpMap != "" && codecRtpMap != "" ){
- s1 = codecRtpMap.find("/");
- bool sdpRtpMapEqual = !strCaseCmp( codecRtpMap.substr(0, s1).c_str(), sdpRtpMap.substr(0,s2).c_str() );
+ string codecName;
+ string codecRate;
+ string codecParam;
+
+ if( !parseRtpMap(codecRtpMap, codecName, codecRate, codecParam) )
+ continue;
+
+ bool sdpRtpMapEqual = !strCaseCmp( codecName.c_str(), sdpName.c_str() ) && codecRate == sdpRate && codecParam == sdpParam;
if ( sdpRtpMapEqual ) {
localPayloadType = codecPayloadType;
return true;
More information about the Minisip-devel
mailing list