2
* Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
2
* Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
4
4
* Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
5
5
* Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
73
75
, telephoneEventPayload_(101) // same as asterisk
80
SIPAccount::releasePort(localAudioDataPort_);
82
SIPAccount::releasePort(localVideoDataPort_);
77
87
bool hasPayload(const std::vector<sfl::AudioCodec*> &codecs, int pt)
79
for (std::vector<sfl::AudioCodec*>::const_iterator i = codecs.begin(); i != codecs.end(); ++i)
80
if (*i and (*i)->getPayloadType() == pt)
89
for (const auto &i : codecs)
90
if (i and i->getPayloadType() == pt)
111
121
if (!pj_stricmp2(¤t->desc.media, "audio")) {
112
122
const unsigned long pt = pj_strtoul(¤t->desc.fmt[fmt]);
113
if (not hasPayload(sessionAudioMedia_, pt)) {
123
if (pt != telephoneEventPayload_ and not hasPayload(sessionAudioMedia_, pt)) {
114
124
sfl::AudioCodec *codec = Manager::instance().audioCodecFactory.getCodec(pt);
116
126
sessionAudioMedia_.push_back(codec);
197
void Sdp::getSessionAudioMedia(std::vector<sfl::AudioCodec*> &codecs) const
207
std::vector<sfl::AudioCodec*>
208
Sdp::getSessionAudioMedia() const
199
codecs = sessionAudioMedia_;
210
return sessionAudioMedia_;
214
225
int dynamic_payload = 96;
216
227
med->desc.fmt_count = audio ? audio_codec_list_.size() : video_codec_list_.size();
217
229
for (unsigned i = 0; i < med->desc.fmt_count; ++i) {
218
230
unsigned clock_rate;
233
const char *channels = "";
223
236
sfl::AudioCodec *codec = audio_codec_list_[i];
224
237
payload = codec->getPayloadType();
225
238
enc_name = codec->getMimeSubtype();
226
clock_rate = codec->getClockRate();
239
clock_rate = codec->getSDPClockRate();
240
channels = codec->getSDPChannels();
227
241
// G722 require G722/8000 media description even if it is 16000 codec
228
242
if (codec->getPayloadType () == 9)
229
243
clock_rate = 8000;
247
261
rtpmap.pt = med->desc.fmt[i];
248
262
rtpmap.enc_name = pj_str((char*) enc_name.c_str());
249
263
rtpmap.clock_rate = clock_rate;
250
rtpmap.param.ptr = ((char* const)"");
251
rtpmap.param.slen = 0;
264
rtpmap.param.ptr = (char *) channels;
265
rtpmap.param.slen = strlen(channels); // don't include NULL terminator
253
267
pjmedia_sdp_attr *attr;
254
268
pjmedia_sdp_rtpmap_to_attr(memPool_, &rtpmap, &attr);
256
270
med->attr[med->attr_count++] = attr;
258
273
if (enc_name == "H264") {
259
274
std::ostringstream os;
286
301
void Sdp::addRTCPAttribute(pjmedia_sdp_media *med)
288
303
std::ostringstream os;
289
os << localIpAddr_ << ":" << localAudioControlPort_;
304
os << publishedIpAddr_ << ":" << localAudioControlPort_;
290
305
const std::string str(os.str());
291
306
pj_str_t input_str = pj_str((char*) str.c_str());
292
307
pj_sockaddr outputAddr;
319
Sdp::setPublishedIP(const std::string &ip_addr)
321
publishedIpAddr_ = ip_addr;
323
localSession_->origin.addr = pj_str((char*) publishedIpAddr_.c_str());
324
localSession_->conn->addr = localSession_->origin.addr;
325
if (pjmedia_sdp_validate(localSession_) != PJ_SUCCESS)
326
ERROR("Could not validate SDP");
304
331
Sdp::updatePorts(const std::vector<pj_sockaddr_in> &sockets)
306
333
localAudioDataPort_ = pj_ntohs(sockets[0].sin_port);
307
334
localAudioControlPort_ = pj_ntohs(sockets[1].sin_port);
308
335
localVideoDataPort_ = pj_ntohs(sockets[2].sin_port);
309
336
localVideoControlPort_ = pj_ntohs(sockets[3].sin_port);
339
if (localSession_->media[0]) {
340
localSession_->media[0]->desc.port = localAudioDataPort_;
341
// update RTCP attribute
342
if (pjmedia_sdp_media_remove_all_attr(localSession_->media[0], "rtcp"))
343
addRTCPAttribute(localSession_->media[0]);
345
if (localSession_->media[1])
346
localSession_->media[1]->desc.port = localVideoDataPort_;
348
if (not pjmedia_sdp_validate(localSession_))
349
ERROR("Could not validate SDP");
313
354
void Sdp::setTelephoneEventRtpmap(pjmedia_sdp_media *med)
356
std::ostringstream s;
357
s << telephoneEventPayload_;
358
++med->desc.fmt_count;
359
pj_strdup2(memPool_, &med->desc.fmt[med->desc.fmt_count - 1], s.str().c_str());
315
361
pjmedia_sdp_attr *attr_rtpmap = static_cast<pjmedia_sdp_attr *>(pj_pool_zalloc(memPool_, sizeof(pjmedia_sdp_attr)));
316
362
attr_rtpmap->name = pj_str((char *) "rtpmap");
317
363
attr_rtpmap->value = pj_str((char *) "101 telephone-event/8000");
344
390
WARN("No selected codec while building local SDP offer");
346
392
audio_codec_list_.clear();
347
for (vector<int>::const_iterator i = selectedCodecs.begin(); i != selectedCodecs.end(); ++i) {
348
sfl::AudioCodec *codec = Manager::instance().audioCodecFactory.getCodec(*i);
393
for (const auto &i : selectedCodecs) {
394
sfl::AudioCodec *codec = Manager::instance().audioCodecFactory.getCodec(i);
351
397
audio_codec_list_.push_back(codec);
382
428
localSession_->origin.id = tv.sec + 2208988800UL;
383
429
localSession_->origin.net_type = pj_str((char*) "IN");
384
430
localSession_->origin.addr_type = pj_str((char*) "IP4");
385
localSession_->origin.addr = pj_str((char*) localIpAddr_.c_str());
431
localSession_->origin.addr = pj_str((char*) publishedIpAddr_.c_str());
387
433
localSession_->name = pj_str((char*) PACKAGE);
450
496
remoteSession_ = pjmedia_sdp_session_clone(memPool_, remote);
452
pjmedia_sdp_neg_create_w_remote_offer(memPool_, localSession_,
453
remoteSession_, &negotiator_);
498
if (pjmedia_sdp_neg_create_w_remote_offer(memPool_, localSession_,
499
remoteSession_, &negotiator_) != PJ_SUCCESS)
500
ERROR("Failed to initialize negotiator");
456
503
void Sdp::startNegotiation()
499
546
int size = pjmedia_sdp_print(sess, buffer, sizeof buffer);
500
547
string sdp(buffer, size);
501
548
const vector<string> tokens(split(sdp, '\n'));
502
for (vector<string>::const_iterator iter = tokens.begin(); iter != tokens.end(); ++iter)
503
if ((*iter).find(keyword) != string::npos)
549
for (const auto &item : tokens)
550
if (item.find(keyword) != string::npos)
614
661
void Sdp::addSdesAttribute(const vector<std::string>& crypto)
616
for (vector<std::string>::const_iterator iter = crypto.begin();
617
iter != crypto.end(); ++iter) {
618
pj_str_t val = { (char*)(*iter).c_str(), static_cast<pj_ssize_t>((*iter).size()) };
663
for (const auto &item : crypto) {
664
pj_str_t val = { (char*) item.c_str(), static_cast<pj_ssize_t>(item.size()) };
619
665
pjmedia_sdp_attr *attr = pjmedia_sdp_attr_create(memPool_, "crypto", &val);
621
667
for (unsigned i = 0; i < localSession_->media_count; i++)