fix: reject streams in SDP answer that we don't support/want

reject streams offered with port 0 aswell


git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1226 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 18 years ago
parent 96f41c1c2e
commit 6dcd9e5c29

@ -103,7 +103,8 @@ bool SdpPayload::operator == (int r)
//
AmSdp::AmSdp()
: remote_active(false),
telephone_event_pt(NULL)
telephone_event_pt(NULL),
accepted_media(0)
{
l_origin.user = "sems";
l_origin.sessId = get_random();
@ -118,7 +119,8 @@ AmSdp::AmSdp(const AmSdp& p_sdp_msg)
conn(p_sdp_msg.conn),
media(p_sdp_msg.media),
telephone_event_pt(NULL),
remote_active(false)
remote_active(false),
accepted_media(0)
{
memcpy(r_buf,p_sdp_msg.r_buf,BUFFER_SIZE);
}
@ -212,6 +214,21 @@ int AmSdp::genResponse(const string& localip, int localport, string& out_buf, bo
if(remote_active /* dir == SdpMedia::DirActive */)
out_buf += "a=direction:passive\r\n";
// add rejected media line for all except the accepted one
for( vector<SdpMedia>::iterator m_it = media.begin(); m_it != media.end(); ++m_it ){
if ((unsigned int)(m_it - media.begin()) != accepted_media) {
string rej_line = "m=" + media_t_2_str(m_it->type) + " 0 " +
transport_p_2_str(m_it->transport);
// add one bogus payload (required by sdp) - ignored (3264 s 6)
if (m_it->payloads.size()) {
rej_line += " "+int2str(m_it->payloads[0].payload_type)+"\n";
} else {
rej_line += " 0\n"; // violating 3264, but in this case the offer already did
}
out_buf += rej_line;
}
}
return 0;
}
@ -285,7 +302,9 @@ const vector<SdpPayload*>& AmSdp::getCompatiblePayloads(AmPayloadProviderInterfa
// DBG("media clock rates: %d\n", m_it->payloads[i].clock_rate);
//}
// DBG("type found: %d\n", m_it->payloads[0].t);
if( (media_type != m_it->type) )
// only accept our media type, and reject if port=0 (section 8.2)
if( (media_type != m_it->type) || (!m_it->port))
continue;
vector<SdpPayload>::iterator it = m_it->payloads.begin();
@ -338,6 +357,9 @@ const vector<SdpPayload*>& AmSdp::getCompatiblePayloads(AmPayloadProviderInterfa
remote_active = true;
port = (int)m_it->port;
// save index of accepted media
accepted_media = m_it - media.begin();
}
break;
}

@ -160,6 +160,8 @@ public:
// us to do passive RTP ?
bool remote_active;
unsigned int accepted_media; // index of the media which we accept (todo: multi stream)
SdpOrigin l_origin; // local origin (o= )
AmSdp();

@ -978,5 +978,10 @@ void add_env_path(const char* name, const string& path)
}
DBG("setting %s to: '%s'\n",name,var.c_str());
#ifndef BSD_COMP
setenv(name,var.c_str(),1);
#else
string sol_putenv = name + "=" + var;
putenv(sol_putenv.c_str());
#endif
}

Loading…
Cancel
Save