86 ast_debug_rtp(3,
"(%p) RTP not sending keepalive since direct media is in use\n", rtp);
93 ast_debug_rtp(3,
"(%p) RTP it has been %d seconds since RTP was last sent. %sending keepalive\n",
137 return timeout * 500;
141 if (elapsed < timeout) {
143 return (timeout - elapsed) * 1000;
146 ast_log(
LOG_NOTICE,
"Disconnecting channel '%s' for lack of %s RTP activity in %d seconds\n",
163 const struct pjmedia_sdp_media *remote_media)
181 const pjmedia_sdp_session *sdp)
191 for (index = 0; index < sdp->media_count; ++index) {
205 if (other_id == -1) {
226 const pjmedia_sdp_session *sdp)
236 session->endpoint->media.address);
239 ast_debug_rtp(1,
"Endpoint %s: RTP media address invalid: %s\n",
241 session->endpoint->media.address);
253 char hoststr[PJ_INET6_ADDRSTRLEN];
255 pj_sockaddr_print(&trans_state->
host, hoststr,
sizeof(hoststr), 0);
257 ast_debug_rtp(1,
"Transport %s bound to %s: Using it for RTP media.\n",
258 session->endpoint->transport, hoststr);
261 ast_debug_rtp(1,
"Transport %s bound to %s: Invalid for RTP media.\n",
262 session->endpoint->transport, hoststr);
271 ast_log(
LOG_ERROR,
"Unable to create RTP instance using RTP engine '%s'\n",
session->endpoint->media.rtp.engine);
290 (
session->endpoint->media.tos_audio ||
session->endpoint->media.cos_audio)) {
292 session->endpoint->media.cos_audio,
"SIP RTP Audio");
297 if (
session->endpoint->media.webrtc) {
301 if (
session->endpoint->media.tos_video ||
session->endpoint->media.cos_video) {
303 session->endpoint->media.cos_video,
"SIP RTP Video");
315 pjmedia_sdp_attr *attr;
316 pjmedia_sdp_rtpmap *rtpmap;
317 pjmedia_sdp_fmtp fmtp;
319 int i, num = 0, tel_event = 0;
332 for (i = 0; i < stream->desc.fmt_count; ++i) {
336 if (!(attr = pjmedia_sdp_media_find_attr2(stream,
"rtpmap", &stream->desc.fmt[i]))) {
341 if ((pjmedia_sdp_attr_to_rtpmap(
session->inv_session->pool_prov, attr, &rtpmap)) != PJ_SUCCESS) {
346 if (strcmp(
name,
"telephone-event") == 0) {
352 pj_strtoul(&stream->desc.fmt[i]), media,
name,
options, rtpmap->clock_rate);
354 if (!(attr = pjmedia_sdp_media_find_attr2(stream,
"fmtp", &rtpmap->pt))) {
358 if ((pjmedia_sdp_attr_get_fmtp(attr, &fmtp)) == PJ_SUCCESS) {
360 if (sscanf(fmt_param,
"%30d", &num) != 1) {
380 for (i = 0; i < stream->desc.fmt_count; ++i) {
404 if ((attr = pjmedia_sdp_media_find_attr2(stream,
"ptime",
NULL))) {
405 unsigned long framing = pj_strtoul(pj_strltrim(&attr->value));
406 if (framing &&
session->endpoint->media.rtp.use_ptime) {
426 if (session_media_transport != session_media && session_media->
bundled) {
448 const struct pjmedia_sdp_media *stream)
494 const struct pjmedia_sdp_media *stream,
495 int is_offer,
struct ast_stream *asterisk_stream)
504 int dsp_features = 0;
517 if (direct_media_enabled) {
533 ast_log(
LOG_NOTICE,
"No joint capabilities for '%s' media stream between our configuration(%s) and incoming SDP(%s)\n",
537 SCOPE_EXIT_RTN_VALUE(-1,
"No joint capabilities for '%s' media stream between our configuration(%s) and incoming SDP(%s)\n",
562 if (
session->endpoint->preferred_codec_only){
566 }
else if (!
session->endpoint->asymmetric_rtp_codec) {
621 #ifndef HAVE_PJSIP_ENDPOINT_COMPACT_FORM
622 extern pj_bool_t pjsip_use_compact_form;
624 pj_bool_t pjsip_use_compact_form = pjsip_cfg()->endpt.use_compact_form;
626 pjmedia_sdp_rtpmap rtpmap;
627 pjmedia_sdp_attr *attr =
NULL;
632 snprintf(
tmp,
sizeof(
tmp),
"%d", rtp_code);
633 pj_strdup2(pool, &media->desc.fmt[media->desc.fmt_count++],
tmp);
639 rtpmap.pt = media->desc.fmt[media->desc.fmt_count - 1];
642 if (!pj_stricmp2(&rtpmap.enc_name,
"opus")) {
643 pj_cstr(&rtpmap.param,
"2");
645 pj_cstr(&rtpmap.param,
NULL);
648 pjmedia_sdp_rtpmap_to_attr(pool, &rtpmap, &attr);
657 pjmedia_sdp_attr *attr =
NULL;
664 while (*
tmp ==
'\r' || *
tmp ==
'\n') --
tmp;
668 if (
tmp &&
tmp[1] !=
'\0') {
669 fmtp1 = pj_str(
tmp + 1);
673 attr = pjmedia_sdp_attr_create(pool,
"fmtp", &fmtp1);
680 unsigned int include_candidates)
684 const char *username, *password;
686 pjmedia_sdp_attr *attr;
700 attr = pjmedia_sdp_attr_create(pool,
"ice-ufrag", pj_cstr(&stmp, username));
701 media->attr[media->attr_count++] = attr;
705 attr = pjmedia_sdp_attr_create(pool,
"ice-pwd", pj_cstr(&stmp, password));
706 media->attr[media->attr_count++] = attr;
709 if (!include_candidates) {
726 switch (candidate->
type) {
743 attr = pjmedia_sdp_attr_create(pool,
"candidate", pj_cstr(&stmp,
ast_str_buffer(attr_candidate)));
744 media->attr[media->attr_count++] = attr;
755 const struct pjmedia_sdp_media *remote_stream)
758 const pjmedia_sdp_attr *attr;
767 for (attr_i = 0; attr_i < remote_stream->attr_count; ++attr_i) {
768 attr = remote_stream->attr[attr_i];
769 if (!pj_strcmp2(&attr->name,
"candidate")) {
775 if (attr_i == remote_stream->attr_count) {
781 const struct pjmedia_sdp_session *remote,
const struct pjmedia_sdp_media *remote_stream)
784 const pjmedia_sdp_attr *ufrag_attr, *passwd_attr;
785 char ufrag_attr_value[256];
786 char passwd_attr_value[256];
793 ufrag_attr = pjmedia_sdp_media_find_attr2(remote_stream,
"ice-ufrag",
NULL);
795 ufrag_attr = pjmedia_sdp_attr_find2(remote->attr_count, remote->attr,
"ice-ufrag",
NULL);
798 ast_copy_pj_str(ufrag_attr_value, (pj_str_t*)&ufrag_attr->value,
sizeof(ufrag_attr_value));
802 passwd_attr = pjmedia_sdp_media_find_attr2(remote_stream,
"ice-pwd",
NULL);
804 passwd_attr = pjmedia_sdp_attr_find2(remote->attr_count, remote->attr,
"ice-pwd",
NULL);
807 ast_copy_pj_str(passwd_attr_value, (pj_str_t*)&passwd_attr->value,
sizeof(passwd_attr_value));
812 if (ufrag_attr && passwd_attr) {
819 const struct pjmedia_sdp_session *remote,
const struct pjmedia_sdp_media *remote_stream)
822 const pjmedia_sdp_attr *attr;
823 char attr_value[256];
833 attr = pjmedia_sdp_media_find_attr2(remote_stream,
"ice-ufrag",
NULL);
835 attr = pjmedia_sdp_attr_find2(remote->attr_count, remote->attr,
"ice-ufrag",
NULL);
838 ast_copy_pj_str(attr_value, (pj_str_t*)&attr->value,
sizeof(attr_value));
841 ast_debug_ice(2,
"(%p) ICE no, or invalid ice-ufrag\n", session_media->
rtp);
845 attr = pjmedia_sdp_media_find_attr2(remote_stream,
"ice-pwd",
NULL);
847 attr = pjmedia_sdp_attr_find2(remote->attr_count, remote->attr,
"ice-pwd",
NULL);
850 ast_copy_pj_str(attr_value, (pj_str_t*)&attr->value,
sizeof(attr_value));
857 if (pjmedia_sdp_media_find_attr2(remote_stream,
"ice-lite",
NULL)) {
862 for (attr_i = 0; attr_i < remote_stream->attr_count; ++attr_i) {
863 char foundation[33], transport[32],
address[PJ_INET6_ADDRSTRLEN + 1], cand_type[6], relay_address[PJ_INET6_ADDRSTRLEN + 1] =
"";
864 unsigned int port, relay_port = 0;
867 attr = remote_stream->attr[attr_i];
870 if (pj_strcmp2(&attr->name,
"candidate")) {
874 ast_copy_pj_str(attr_value, (pj_str_t*)&attr->value,
sizeof(attr_value));
876 if (sscanf(attr_value,
"%32s %30u %31s %30u %46s %30u typ %5s %*s %23s %*s %30u",
foundation, &candidate.
id,
transport,
895 if (!strcasecmp(cand_type,
"host")) {
897 }
else if (!strcasecmp(cand_type,
"srflx")) {
899 }
else if (!strcasecmp(cand_type,
"relay")) {
916 ice->
set_role(session_media->
rtp, pjmedia_sdp_neg_was_answer_remote(
session->inv_session->neg) == PJ_TRUE ?
926 for (i = 0; i < stream->attr_count; i++) {
927 pjmedia_sdp_attr *attr;
930 attr = stream->attr[i];
931 if (pj_strcmp2(&attr->name,
"crypto")) {
943 const struct pjmedia_sdp_media *stream,
unsigned int *optimistic)
949 if (!transport_str) {
952 if (strstr(transport_str,
"UDP/TLS")) {
954 }
else if (strstr(transport_str,
"SAVP")) {
976 const struct pjmedia_sdp_media *stream)
979 char transport_end = stream->desc.transport.ptr[stream->desc.transport.slen - 1];
980 unsigned int optimistic;
990 return incoming_encryption;
995 return incoming_encryption;
1010 if (!session_media->
srtp) {
1012 if (!session_media->
srtp) {
1032 if (!
session->endpoint->media.rtp.dtls_cfg.enabled || !session_media->
rtp) {
1043 ast_log(
LOG_ERROR,
"Attempted to set an invalid DTLS-SRTP configuration on RTP instance '%p'\n",
1044 session_media->
rtp);
1055 pjmedia_sdp_attr *attr)
1060 if (!attr->value.ptr || !dtls) {
1064 value = pj_strtrim(&attr->value);
1066 if (!pj_strcmp2(&attr->name,
"setup")) {
1067 if (!pj_stricmp2(
value,
"active")) {
1069 }
else if (!pj_stricmp2(
value,
"passive")) {
1071 }
else if (!pj_stricmp2(
value,
"actpass")) {
1073 }
else if (!pj_stricmp2(
value,
"holdconn")) {
1078 }
else if (!pj_strcmp2(&attr->name,
"connection")) {
1079 if (!pj_stricmp2(
value,
"new")) {
1081 }
else if (!pj_stricmp2(
value,
"existing")) {
1086 }
else if (!pj_strcmp2(&attr->name,
"fingerprint")) {
1087 char hash_value[256], hash[32];
1088 char fingerprint_text[
value->slen + 1];
1090 if (sscanf(fingerprint_text,
"%31s %255s", hash, hash_value) == 2) {
1091 if (!strcasecmp(hash,
"sha-1")) {
1093 }
else if (!strcasecmp(hash,
"sha-256")) {
1104 const struct pjmedia_sdp_session *sdp,
1105 const struct pjmedia_sdp_media *stream)
1109 for (i = 0; i < sdp->attr_count; i++) {
1113 for (i = 0; i < stream->attr_count; i++) {
1123 const struct pjmedia_sdp_media *stream)
1127 for (i = 0; i < stream->attr_count; i++) {
1128 pjmedia_sdp_attr *attr;
1132 attr = stream->attr[i];
1133 if (pj_strcmp2(&attr->name,
"crypto")) {
1137 crypto_str =
ast_strndup(attr->value.ptr, attr->value.slen);
1151 ast_debug(1,
"Ignoring crypto offer with unsupported parameters: %s\n", crypto_str);
1160 const struct pjmedia_sdp_session *sdp,
1161 const struct pjmedia_sdp_media *stream)
1192 if (!
session->endpoint->media.rtp.ice_support || !ice) {
1209 pjmedia_sdp_attr *attr;
1217 attr = pjmedia_sdp_attr_create(pool,
"ssrc", pj_cstr(&stmp,
tmp));
1218 media->attr[media->attr_count++] = attr;
1223 const struct pjmedia_sdp_media *remote_stream)
1227 if (!
session->endpoint->media.bundle) {
1231 for (index = 0; index < remote_stream->attr_count; ++index) {
1232 pjmedia_sdp_attr *attr = remote_stream->attr[index];
1233 char attr_value[pj_strlen(&attr->value) + 1];
1234 char *ssrc_attribute_name, *ssrc_attribute_value =
NULL;
1238 if (pj_strcmp2(&attr->name,
"ssrc")) {
1244 if ((ssrc_attribute_name = strchr(attr_value,
' '))) {
1246 *ssrc_attribute_name++ =
'\0';
1247 ssrc_attribute_value = strchr(ssrc_attribute_name,
':');
1248 if (ssrc_attribute_value) {
1250 *ssrc_attribute_value++ =
'\0';
1254 if (sscanf(attr_value,
"%30u", &ssrc) < 1) {
1261 if (pjmedia_sdp_neg_get_state(
session->inv_session->neg) == PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER &&
1262 session->active_media_state) {
1281 pjmedia_sdp_attr *attr;
1285 if (!
session->endpoint->media.webrtc) {
1308 snprintf(msid,
sizeof(msid),
"%s %s", session_media->
mslabel, session_media->
label);
1309 ast_debug(3,
"Stream msid: %p %s %s\n", stream,
1311 attr = pjmedia_sdp_attr_create(pool,
"msid", pj_cstr(&stmp, msid));
1312 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1316 ast_debug(3,
"Stream Label: %p %s %s\n", stream,
1318 attr = pjmedia_sdp_attr_create(pool,
"label", pj_cstr(&stmp, stream_label));
1319 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1327 pjmedia_sdp_attr *attr;
1329 if (!
session->endpoint->media.webrtc) {
1337 attr = pjmedia_sdp_attr_create(pool,
"rtcp-fb", pj_cstr(&stmp,
"* transport-cc"));
1338 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1348 attr = pjmedia_sdp_attr_create(pool,
"rtcp-fb", pj_cstr(&stmp,
"* ccm fir"));
1349 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1351 attr = pjmedia_sdp_attr_create(pool,
"rtcp-fb", pj_cstr(&stmp,
"* goog-remb"));
1352 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1354 attr = pjmedia_sdp_attr_create(pool,
"rtcp-fb", pj_cstr(&stmp,
"* nack"));
1355 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1362 char extmap_value[256];
1371 const char *direction_str =
"";
1373 pjmedia_sdp_attr *attr;
1386 direction_str =
"/sendonly";
1389 direction_str =
"/recvonly";
1396 direction_str =
"/inactive";
1400 snprintf(extmap_value,
sizeof(extmap_value),
"%d%s %s", idx, direction_str,
1402 attr = pjmedia_sdp_attr_create(pool,
"extmap", pj_cstr(&stmp, extmap_value));
1403 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
1409 const struct pjmedia_sdp_media *remote_stream)
1419 for (index = 0; index < remote_stream->attr_count; ++index) {
1420 pjmedia_sdp_attr *attr = remote_stream->attr[index];
1421 char attr_value[pj_strlen(&attr->value) + 1];
1424 char direction_str[10] =
"";
1429 if (pj_strcmp2(&attr->name,
"extmap")) {
1436 uri = strchr(attr_value,
' ');
1442 if ((sscanf(attr_value,
"%30d%9s", &
id, direction_str) < 1) || (
id < 1)) {
1448 if (!strcasecmp(direction_str,
"/sendonly")) {
1450 }
else if (!strcasecmp(direction_str,
"/recvonly")) {
1452 }
else if (!strcasecmp(direction_str,
"/inactive")) {
1456 attributes = strchr(uri,
' ');
1458 *attributes++ =
'\0';
1467 const pjmedia_sdp_media *media,
1475 pjmedia_sdp_media_find_attr2(media,
"sendonly",
NULL) ||
1476 pjmedia_sdp_media_find_attr2(media,
"inactive",
NULL)) {
1491 int index,
struct ast_stream *asterisk_stream)
1493 char host[NI_MAXHOST];
1495 pjmedia_sdp_media *stream = sdp->media[index];
1505 ast_debug(3,
"Endpoint has no codecs for media type '%s', declining stream\n",
1511 if (!
session->endpoint->media.rtp.use_received_transport) {
1519 ast_copy_pj_str(host, stream->conn ? &stream->conn->addr : &sdp->conn->addr,
sizeof(host));
1536 if (session_media_transport == session_media || !session_media->
bundled) {
1545 if (!
session->endpoint->media.rtp.encryption_optimistic ||
1546 !pj_strncmp2(&stream->desc.transport,
"RTP/SAVP", 8)) {
1562 if ((
session->endpoint->media.rtp.use_received_transport) ||
1564 pj_strdup(
session->inv_session->pool, &session_media->
transport, &stream->desc.transport);
1596 pj_pool_t *pool, pjmedia_sdp_media *media)
1599 pjmedia_sdp_attr *attr;
1601 const char *crypto_attribute;
1604 static const pj_str_t STR_NEW = {
"new", 3 };
1605 static const pj_str_t STR_EXISTING = {
"existing", 8 };
1606 static const pj_str_t STR_ACTIVE = {
"active", 6 };
1607 static const pj_str_t STR_PASSIVE = {
"passive", 7 };
1608 static const pj_str_t STR_ACTPASS = {
"actpass", 7 };
1609 static const pj_str_t STR_HOLDCONN = {
"holdconn", 8 };
1617 if (!session_media->
srtp) {
1619 if (!session_media->
srtp) {
1629 session->endpoint->media.rtp.srtp_tag_32 );
1630 if (!crypto_attribute) {
1635 attr = pjmedia_sdp_attr_create(pool,
"crypto",
1636 pj_cstr(&stmp, crypto_attribute));
1637 media->attr[media->attr_count++] = attr;
1653 attr = pjmedia_sdp_attr_create(pool,
"connection", &STR_NEW);
1654 media->attr[media->attr_count++] = attr;
1657 attr = pjmedia_sdp_attr_create(pool,
"connection", &STR_EXISTING);
1658 media->attr[media->attr_count++] = attr;
1668 && pjmedia_sdp_neg_get_state(
session->inv_session->neg) != PJMEDIA_SDP_NEG_STATE_DONE) {
1671 setup =
session->endpoint->media.rtp.dtls_cfg.default_setup;
1676 attr = pjmedia_sdp_attr_create(pool,
"setup", &STR_ACTIVE);
1677 media->attr[media->attr_count++] = attr;
1680 attr = pjmedia_sdp_attr_create(pool,
"setup", &STR_PASSIVE);
1681 media->attr[media->attr_count++] = attr;
1684 attr = pjmedia_sdp_attr_create(pool,
"setup", &STR_ACTPASS);
1685 media->attr[media->attr_count++] = attr;
1688 attr = pjmedia_sdp_attr_create(pool,
"setup", &STR_HOLDCONN);
1703 ast_str_set(&fingerprint, 0,
"SHA-1 %s", crypto_attribute);
1705 ast_str_set(&fingerprint, 0,
"SHA-256 %s", crypto_attribute);
1708 attr = pjmedia_sdp_attr_create(pool,
"fingerprint", pj_cstr(&stmp,
ast_str_buffer(fingerprint)));
1709 media->attr[media->attr_count++] = attr;
1719 struct pjmedia_sdp_session *sdp,
const struct pjmedia_sdp_session *remote,
struct ast_stream *stream)
1721 pj_pool_t *pool =
session->inv_session->pool_prov;
1722 static const pj_str_t STR_RTP_AVP = {
"RTP/AVP", 7 };
1723 static const pj_str_t STR_IN = {
"IN", 2 };
1724 static const pj_str_t STR_IP4 = {
"IP4", 3};
1725 static const pj_str_t STR_IP6 = {
"IP6", 3};
1726 static const pj_str_t STR_SENDRECV = {
"sendrecv", 8 };
1727 static const pj_str_t STR_SENDONLY = {
"sendonly", 8 };
1728 static const pj_str_t STR_INACTIVE = {
"inactive", 8 };
1729 static const pj_str_t STR_RECVONLY = {
"recvonly", 8 };
1730 pjmedia_sdp_media *media;
1731 const char *hostip =
NULL;
1735 pjmedia_sdp_attr *attr;
1738 int min_packet_size = 0, max_packet_size = 0;
1749 media = pj_pool_zalloc(pool,
sizeof(
struct pjmedia_sdp_media));
1758 media->desc.port = 0;
1759 media->desc.port_count = 1;
1765 media->desc.transport = remote_media->desc.transport;
1768 for (index = 0; index < remote_media->desc.fmt_count; ++index) {
1769 media->desc.fmt[index] = remote_media->desc.fmt[index];
1771 media->desc.fmt_count = remote_media->desc.fmt_count;
1774 media->desc.transport = STR_RTP_AVP;
1775 pj_strdup2(pool, &media->desc.fmt[media->desc.fmt_count++],
"32");
1778 sdp->media[sdp->media_count++] = media;
1790 for (index = 0; index < sdp->media_count; ++index) {
1809 if (session_media_transport == session_media || !session_media->
bundled) {
1820 if (pj_strlen(&session_media->
transport)) {
1822 media->desc.transport = session_media->
transport;
1826 !
session->endpoint->media.rtp.encryption_optimistic &&
1828 session_media->
rtp,
session->endpoint->media.rtp.use_avpf,
1829 session->endpoint->media.rtp.force_avp));
1832 media->conn = pj_pool_zalloc(pool,
sizeof(
struct pjmedia_sdp_conn));
1838 if (direct_media_enabled) {
1843 hostip =
session->endpoint->media.address;
1852 media->conn->net_type = STR_IN;
1854 media->conn->addr_type = STR_IP4;
1855 pj_strdup2(pool, &media->conn->addr, hostip);
1857 if ((pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &media->conn->addr, &ip) == PJ_SUCCESS) &&
1858 (ip.addr.sa_family == pj_AF_INET6())) {
1859 media->conn->addr_type = STR_IP6;
1867 media->desc.port_count = 1;
1869 pjmedia_sdp_media *bundle_group_stream = sdp->media[session_media_transport->
stream_num];
1872 media->desc.transport = bundle_group_stream->desc.transport;
1873 media->conn = bundle_group_stream->conn;
1874 media->desc.port = bundle_group_stream->desc.port;
1891 if (direct_media_enabled) {
1908 if (session_media_transport != session_media) {
1925 media->attr[media->attr_count++] = attr;
1929 media->attr[media->attr_count++] = attr;
1938 if (media->desc.fmt_count == PJMEDIA_MAX_SDP_FMT) {
1945 && media->desc.fmt_count < PJMEDIA_MAX_SDP_FMT) {
1946 for (index = 1LL; index <=
AST_RTP_MAX; index <<= 1) {
1947 if (!(noncodec & index)) {
1952 if (rtp_code == -1) {
1957 media->attr[media->attr_count++] = attr;
1961 snprintf(
tmp,
sizeof(
tmp),
"%d 0-16", rtp_code);
1962 attr = pjmedia_sdp_attr_create(pool,
"fmtp", pj_cstr(&stmp,
tmp));
1963 media->attr[media->attr_count++] = attr;
1966 if (media->desc.fmt_count == PJMEDIA_MAX_SDP_FMT) {
1974 if (!media->desc.fmt_count) {
1980 if (!min_packet_size) {
1983 if (min_packet_size) {
1984 snprintf(
tmp,
sizeof(
tmp),
"%d", min_packet_size);
1985 attr = pjmedia_sdp_attr_create(pool,
"ptime", pj_cstr(&stmp,
tmp));
1986 media->attr[media->attr_count++] = attr;
1989 if (max_packet_size) {
1990 snprintf(
tmp,
sizeof(
tmp),
"%d", max_packet_size);
1991 attr = pjmedia_sdp_attr_create(pool,
"maxptime", pj_cstr(&stmp,
tmp));
1992 media->attr[media->attr_count++] = attr;
1995 attr = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_attr);
1998 attr->name = STR_INACTIVE;
2000 attr->name = STR_SENDONLY;
2004 attr->name = STR_RECVONLY;
2006 attr->name = STR_SENDONLY;
2008 attr->name = STR_RECVONLY;
2010 attr->name = STR_INACTIVE;
2012 attr->name = STR_SENDRECV;
2015 media->attr[media->attr_count++] = attr;
2019 attr = pjmedia_sdp_attr_create(pool,
"rtcp-mux",
NULL);
2020 pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
2029 sdp->media[sdp->media_count++] = media;
2038 if (!session_media->
rtp) {
2056 if (!session_media->
rtp) {
2072 if (!session_media->
rtp) {
2081 const struct pjmedia_sdp_session *remote,
int index,
struct ast_stream *asterisk_stream)
2084 struct pjmedia_sdp_media *remote_stream = remote->media[index];
2086 char host[NI_MAXHOST];
2097 if (!
session->endpoint->media.rtp.use_received_transport &&
2112 if (session_media_transport == session_media || !session_media->
bundled) {
2119 if (!
session->endpoint->media.rtp.encryption_optimistic && res) {
2126 if (!remote_stream->conn && !remote->conn) {
2130 ast_copy_pj_str(host, remote_stream->conn ? &remote_stream->conn->addr : &remote->conn->addr,
sizeof(host));
2159 if (
set_caps(
session, session_media, session_media_transport, remote_stream, 0, asterisk_stream)) {
2174 if ((pjmedia_sdp_neg_was_answer_remote(
session->inv_session->neg) == PJ_FALSE)
2175 && (
session->inv_session->state == PJSIP_INV_STATE_CONFIRMED)) {
2196 }
else if ((pjmedia_sdp_neg_was_answer_remote(
session->inv_session->neg) == PJ_FALSE)
2197 && (
session->inv_session->state == PJSIP_INV_STATE_CONFIRMED)) {
2204 if (
session->endpoint->media.rtp.keepalive > 0 &&
2245 char host[NI_MAXHOST];
2249 if (!stream->conn || !transport_state) {
2270 if (!session_media->
rtp) {
2282 if (session_media->
rtp) {
2313 struct pjsip_transaction *tsx;
2314 pjsip_tx_data *tdata;
2322 tsx = pjsip_rdata_get_tsx(rdata);
2326 if (pjsip_dlg_create_response(
session->inv_session->dlg, rdata, 200,
NULL, &tdata) == PJ_SUCCESS) {
2327 pjsip_dlg_send_response(
session->inv_session->dlg, tsx, tdata);
2404 .requires =
"res_pjsip,res_pjsip_session",
Access Control of various sorts.
Asterisk main include file. File version handling, generic pbx functions.
static struct ast_mansession session
#define ast_strndup(str, len)
A wrapper for strndup()
#define ao2_iterator_next(iter)
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
Internal Asterisk hangup causes.
#define AST_CAUSE_REQUESTED_CHAN_UNAVAIL
static snd_pcm_format_t format
static struct ast_sockaddr media_address
General Asterisk PBX channel definitions.
void ast_channel_set_unbridged_nolock(struct ast_channel *chan, int value)
Variant of ast_channel_set_unbridged. Use this if the channel is already locked prior to calling.
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
#define ast_channel_lock(chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame without payload.
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
const char * ast_channel_name(const struct ast_channel *chan)
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup up a channel.
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
#define ast_channel_unref(c)
Decrease channel reference count.
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
struct ast_channel * ast_channel_get_by_name(const char *name)
Find a channel by name.
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
#define ast_channel_unlock(chan)
ast_channel_state
ast_channel states
static struct ao2_container * codecs
Registered codecs.
ast_media_type
Types of media.
const char * ast_codec_media_type2str(enum ast_media_type type)
Conversion function to take a media type and turn it into a string.
Convenient Signal Processing routines.
void ast_dsp_free(struct ast_dsp *dsp)
#define DSP_FEATURE_DIGIT_DETECT
int ast_dsp_get_features(struct ast_dsp *dsp)
Get features.
void ast_dsp_set_features(struct ast_dsp *dsp, int features)
Select feature set.
@ AST_CONTROL_UPDATE_RTP_PEER
struct ast_frame ast_null_frame
#define ast_debug(level,...)
Log a DEBUG message.
#define SCOPE_EXIT_RTN(...)
#define SCOPE_EXIT_RTN_VALUE(__return_value,...)
#define SCOPE_ENTER(level,...)
A set of macros to manage forward-linked lists.
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Asterisk module definitions.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODPRI_CHANNEL_DRIVER
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
@ AST_MODULE_LOAD_SUCCESS
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
static char * ast_sockaddr_stringify_addr_remote(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
#define AST_SOCKADDR_STR_ADDR
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
int ast_sockaddr_is_any(const struct ast_sockaddr *addr)
Determine if the address type is unspecified, or "any" address.
int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family)
Parses a string with an IPv4 or IPv6 address and place results into an array.
static char * ast_sockaddr_stringify_port(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
char * ast_sockaddr_stringify_fmt(const struct ast_sockaddr *addr, int format)
Convert a socket address to a string.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
pjsip_media_type pjsip_media_type_application_media_control_xml
ast_sip_session_media_encryption
@ AST_SIP_MEDIA_ENCRYPT_SDES
@ AST_SIP_MEDIA_TRANSPORT_INVALID
@ AST_SIP_MEDIA_ENCRYPT_NONE
@ AST_SIP_MEDIA_ENCRYPT_DTLS
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b)
Compare pjsip media types.
#define ast_sip_transport_is_nonlocal(transport_state, addr)
struct ast_sip_transport_state * ast_sip_get_transport_state(const char *transport_id)
Retrieve transport state.
const char * ast_sip_get_host_ip_string(int af)
Retrieve the local host address in string form.
static int send_keepalive(const void *data)
static void apply_dtls_attrib(struct ast_sip_session_media *session_media, pjmedia_sdp_attr *attr)
static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const pjmedia_sdp_session *sdp, int index, struct ast_stream *asterisk_stream)
Function which negotiates an incoming media stream.
static void set_session_media_remotely_held(struct ast_sip_session_media *session_media, const struct ast_sip_session *session, const pjmedia_sdp_media *media, const struct ast_stream *stream, const struct ast_sockaddr *addrs)
static void check_ice_support(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *remote_stream)
Function which checks for ice attributes in an audio stream.
static enum ast_sip_session_media_encryption check_endpoint_media_transport(struct ast_sip_endpoint *endpoint, const struct pjmedia_sdp_media *stream)
Checks whether the encryption offered in SDP is compatible with the endpoint's configuration.
static struct ast_sched_context * sched
Scheduler for RTCP purposes.
static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *local, const struct pjmedia_sdp_session *remote, int index, struct ast_stream *asterisk_stream)
static void process_ice_attributes(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream)
Function which processes ICE attributes in an audio stream.
static int set_caps(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct ast_sip_session_media *session_media_transport, const struct pjmedia_sdp_media *stream, int is_offer, struct ast_stream *asterisk_stream)
static pjmedia_sdp_attr * generate_rtpmap_attr(struct ast_sip_session *session, pjmedia_sdp_media *media, pj_pool_t *pool, int rtp_code, int asterisk_format, struct ast_format *format, int code)
static int media_session_rtp_write_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct ast_frame *frame)
static int rtp_check_timeout(const void *data)
Check whether RTP is being received or not.
static const char STR_AUDIO[]
static struct ast_sip_session_sdp_handler audio_sdp_handler
SDP handler for 'audio' media stream.
static int apply_cap_to_bundled(struct ast_sip_session_media *session_media, struct ast_sip_session_media *session_media_transport, struct ast_stream *asterisk_stream, struct ast_format_cap *joint)
static void add_ice_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media, unsigned int include_candidates)
Function which adds ICE attributes to a media stream.
static void add_extmap_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media)
static int setup_media_encryption(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_media *stream)
static void get_codecs(struct ast_sip_session *session, const struct pjmedia_sdp_media *stream, struct ast_rtp_codecs *codecs, struct ast_sip_session_media *session_media, struct ast_format_cap *astformats)
static void stream_stop(struct ast_sip_session_media *session_media)
Function which stops the RTP instance.
static pjmedia_sdp_attr * generate_fmtp_attr(pj_pool_t *pool, struct ast_format *format, int rtp_code)
static struct ast_frame * media_session_rtp_read_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
static int setup_srtp(struct ast_sip_session_media *session_media)
static void stream_destroy(struct ast_sip_session_media *session_media)
Function which destroys the RTP instance when session ends.
static int parse_dtls_attrib(struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_media *stream)
static const char STR_VIDEO[]
static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struct pjmedia_sdp_media *stream, struct ast_sip_transport *transport)
Function which updates the media stream with external media address, if applicable.
static struct ast_frame * media_session_rtcp_read_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
static int media_stream_has_crypto(const struct pjmedia_sdp_media *stream)
figure out if media stream has crypto lines for sdes
static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_session *remote, struct ast_stream *stream)
Function which creates an outgoing stream.
static void process_extmap_attributes(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *remote_stream)
Function which processes extmap attributes in a stream.
static void process_ice_auth_attrb(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream)
static struct ast_format_cap * set_incoming_call_offer_cap(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *stream)
static void add_rtcp_fb_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media)
static struct ast_sockaddr address_rtp
Address for RTP.
static void add_msid_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media, struct ast_stream *stream)
static struct ast_sip_session_sdp_handler video_sdp_handler
SDP handler for 'video' media stream.
static int load_module(void)
Load the module.
static enum ast_sip_session_media_encryption get_media_encryption_type(pj_str_t transport, const struct pjmedia_sdp_media *stream, unsigned int *optimistic)
figure out media transport encryption type from the media transport string
static int unload_module(void)
Unloads the sdp RTP/AVP module from Asterisk.
static int video_info_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
static struct ast_sip_session_supplement video_info_supplement
static int add_crypto_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media)
static void enable_rtp_extension(struct ast_sip_session *session, struct ast_sip_session_media *session_media, enum ast_rtp_extension extension, enum ast_rtp_extension_direction direction, const pjmedia_sdp_session *sdp)
Enable an RTP extension on an RTP session.
static void add_ssrc_to_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media)
Function which adds ssrc attributes to a media stream.
static void enable_rtcp(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *remote_media)
Enable RTCP on an RTP session.
static int setup_sdes_srtp(struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *stream)
static int create_rtp(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const pjmedia_sdp_session *sdp)
Internal function which creates an RTP instance.
static int setup_dtls_srtp(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
static void set_ice_components(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
static void process_ssrc_attributes(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *remote_stream)
Function which processes ssrc attributes in a stream.
void ast_sip_session_unregister_sdp_handler(struct ast_sip_session_sdp_handler *handler, const char *stream_type)
Unregister an SDP handler.
int ast_sip_session_register_sdp_handler(struct ast_sip_session_sdp_handler *handler, const char *stream_type)
Register an SDP handler.
int ast_sip_session_is_pending_stream_default(const struct ast_sip_session *session, const struct ast_stream *stream)
Determines if a provided pending stream will be the default stream or not.
int ast_sip_session_media_add_read_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, int fd, ast_sip_session_media_read_cb callback)
Set a read callback for a media session with a specific file descriptor.
const char * ast_sip_session_get_name(const struct ast_sip_session *session)
Get the channel or endpoint name associated with the session.
#define ast_sip_session_register_supplement(supplement)
struct ast_sip_session_media * ast_sip_session_media_get_transport(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
Retrieve the underlying media session that is acting as transport for a media session.
void ast_sip_session_unregister_supplement(struct ast_sip_session_supplement *supplement)
Unregister a an supplement to SIP session processing.
int ast_sip_session_media_set_write_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, ast_sip_session_media_write_cb callback)
Set a write callback for a media session.
struct ast_format_cap * ast_sip_session_create_joint_call_cap(const struct ast_sip_session *session, enum ast_media_type media_type, const struct ast_format_cap *remote)
Create joint capabilities.
static uint32_t keepalive
@ AST_AES_CM_128_HMAC_SHA1_80
@ AST_AES_CM_128_HMAC_SHA1_32
Pluggable RTP Architecture.
ast_rtp_dtls_setup
DTLS setup types.
@ AST_RTP_DTLS_SETUP_PASSIVE
@ AST_RTP_DTLS_SETUP_HOLDCONN
@ AST_RTP_DTLS_SETUP_ACTPASS
@ AST_RTP_DTLS_SETUP_ACTIVE
struct ast_rtp_instance * ast_rtp_instance_new(const char *engine_name, struct ast_sched_context *sched, const struct ast_sockaddr *sa, void *data)
Create a new RTP instance.
struct ast_rtp_codecs * ast_rtp_instance_get_codecs(struct ast_rtp_instance *instance)
Get the codecs structure of an RTP instance.
unsigned int ast_rtp_lookup_sample_rate2(int asterisk_format, const struct ast_format *format, int code)
Get the sample rate associated with known RTP payload types.
@ AST_RTP_ICE_ROLE_CONTROLLING
@ AST_RTP_ICE_ROLE_CONTROLLED
void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs)
Destroy the contents of an RTP codecs structure (but not the structure itself)
int ast_rtp_instance_destroy(struct ast_rtp_instance *instance)
Destroy an RTP instance.
enum ast_rtp_dtmf_mode ast_rtp_instance_dtmf_mode_get(struct ast_rtp_instance *instance)
Get the DTMF mode of an RTP instance.
int ast_rtp_codecs_payload_set_rx(struct ast_rtp_codecs *codecs, int code, struct ast_format *format)
Set a payload code for use with a specific Asterisk format.
const char * ast_rtp_instance_get_cname(struct ast_rtp_instance *rtp)
Retrieve the CNAME used in RTCP SDES items.
const char * ast_rtp_instance_extmap_get_uri(struct ast_rtp_instance *instance, int id)
Retrieve the URI for an RTP extension id.
struct ast_rtp_engine_ice * ast_rtp_instance_get_ice(struct ast_rtp_instance *instance)
Obtain a pointer to the ICE support present on an RTP instance.
void ast_rtp_instance_set_last_rx(struct ast_rtp_instance *rtp, time_t time)
Set the last RTP reception time.
ast_rtp_dtls_hash
DTLS fingerprint hashes.
@ AST_RTP_DTLS_HASH_SHA256
@ AST_RTP_DTMF_MODE_RFC2833
@ AST_RTP_DTMF_MODE_INBAND
int ast_rtp_instance_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
Set the DTMF mode that should be used.
void ast_rtp_instance_stop(struct ast_rtp_instance *instance)
Stop an RTP instance.
@ AST_RTP_INSTANCE_RTCP_MUX
@ AST_RTP_INSTANCE_RTCP_STANDARD
void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
Copy payload information from one RTP instance to another.
size_t ast_rtp_instance_extmap_count(struct ast_rtp_instance *instance)
Get the number of known unique identifiers.
int ast_rtp_instance_extmap_enable(struct ast_rtp_instance *instance, int id, enum ast_rtp_extension extension, enum ast_rtp_extension_direction direction)
Enable support for an RTP extension on an instance.
@ AST_RTP_INSTANCE_STAT_REMOTE_SSRC
void ast_rtp_instance_set_stream_num(struct ast_rtp_instance *instance, int stream_num)
Set the stream number for an RTP instance.
int ast_rtp_instance_get_keepalive(struct ast_rtp_instance *instance)
Get the RTP keepalive interval.
int ast_rtp_instance_get_timeout(struct ast_rtp_instance *instance)
Get the RTP timeout value.
#define ast_debug_rtp(sublevel,...)
Log debug level RTP information.
int ast_rtp_instance_bundle(struct ast_rtp_instance *child, struct ast_rtp_instance *parent)
Request that an RTP instance be bundled with another.
struct ast_format * ast_rtp_codecs_get_payload_format(struct ast_rtp_codecs *codecs, int payload)
Retrieve the actual ast_format stored on the codecs structure for a specific tx payload type.
void ast_rtp_codecs_set_framing(struct ast_rtp_codecs *codecs, unsigned int framing)
Set the framing used for a set of codecs.
time_t ast_rtp_instance_get_last_tx(const struct ast_rtp_instance *rtp)
Get the last RTP transmission time.
void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
Record tx payload type information that was seen in an m= SDP line.
void ast_rtp_instance_set_prop(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
Set the value of an RTP instance property.
void ast_rtp_instance_get_local_address(struct ast_rtp_instance *instance, struct ast_sockaddr *address)
Get the local address that we are expecting RTP on.
int ast_rtp_instance_get_stats(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
Retrieve statistics about an RTP instance.
@ AST_RTP_ICE_CANDIDATE_TYPE_RELAYED
@ AST_RTP_ICE_CANDIDATE_TYPE_SRFLX
@ AST_RTP_ICE_CANDIDATE_TYPE_HOST
enum ast_rtp_extension ast_rtp_instance_extmap_get_extension(struct ast_rtp_instance *instance, int id)
Retrieve the extension for an RTP extension id.
int ast_rtp_instance_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
Send a frame out over RTP.
ast_rtp_extension
Known RTP extensions.
@ AST_RTP_EXTENSION_TRANSPORT_WIDE_CC
@ AST_RTP_EXTENSION_ABS_SEND_TIME
@ AST_RTP_EXTENSION_UNSUPPORTED
struct ast_frame * ast_rtp_instance_read(struct ast_rtp_instance *instance, int rtcp)
Receive a frame over RTP.
#define ast_rtp_instance_set_remote_address(instance, address)
Set the address of the remote endpoint that we are sending RTP to.
int ast_rtp_instance_sendcng(struct ast_rtp_instance *instance, int level)
Send a comfort noise packet to the RTP instance.
void ast_rtp_instance_set_remote_ssrc(struct ast_rtp_instance *rtp, unsigned int ssrc)
Set the remote SSRC for an RTP instance.
@ AST_RTP_OPT_G726_NONSTANDARD
@ AST_RTP_DTLS_CONNECTION_NEW
@ AST_RTP_DTLS_CONNECTION_EXISTING
int ast_rtp_codecs_payloads_initialize(struct ast_rtp_codecs *codecs)
Initialize an RTP codecs structure.
@ AST_RTP_PROPERTY_RETRANS_RECV
@ AST_RTP_PROPERTY_RETRANS_SEND
@ AST_RTP_PROPERTY_ASYMMETRIC_CODEC
#define AST_RTP_PT_LAST_STATIC
#define ast_debug_ice(sublevel,...)
Log debug level ICE information.
int ast_rtp_instance_activate(struct ast_rtp_instance *instance)
Indicate to the RTP engine that packets are now expected to be sent/received on the RTP instance.
time_t ast_rtp_instance_get_last_rx(const struct ast_rtp_instance *rtp)
Get the last RTP reception time.
int ast_rtp_instance_set_qos(struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
Set QoS parameters on an RTP session.
void ast_rtp_instance_set_channel_id(struct ast_rtp_instance *instance, const char *uniqueid)
Set the channel that owns this RTP instance.
ast_rtp_extension_direction
Directions for RTP extensions.
@ AST_RTP_EXTENSION_DIRECTION_SENDRECV
@ AST_RTP_EXTENSION_DIRECTION_NONE
@ AST_RTP_EXTENSION_DIRECTION_INACTIVE
@ AST_RTP_EXTENSION_DIRECTION_RECVONLY
@ AST_RTP_EXTENSION_DIRECTION_SENDONLY
struct ast_rtp_engine_dtls * ast_rtp_instance_get_dtls(struct ast_rtp_instance *instance)
Obtain a pointer to the DTLS support present on an RTP instance.
int ast_rtp_codecs_payload_replace_format(struct ast_rtp_codecs *codecs, int payload, struct ast_format *format)
Update the format associated with a tx payload type in a codecs structure.
int ast_rtp_codecs_payloads_set_rtpmap_type_rate(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int pt, char *mimetype, char *mimesubtype, enum ast_rtp_options options, unsigned int sample_rate)
Set tx payload type to a known MIME media type for a codec with a specific sample rate.
#define AST_RTP_CODECS_NULL_INIT
int ast_rtp_instance_extmap_get_id(struct ast_rtp_instance *instance, enum ast_rtp_extension extension)
Retrieve the id for an RTP extension.
const char * ast_rtp_lookup_mime_subtype2(const int asterisk_format, const struct ast_format *format, int code, enum ast_rtp_options options)
Retrieve mime subtype information on a payload.
void ast_rtp_instance_change_source(struct ast_rtp_instance *instance)
Indicate a new source of audio has dropped in and the ssrc should change.
int ast_rtp_instance_extmap_negotiate(struct ast_rtp_instance *instance, int id, enum ast_rtp_extension_direction direction, const char *uri, const char *attributes)
Negotiate received RTP extension information.
void ast_rtp_instance_extmap_clear(struct ast_rtp_instance *instance)
Clear negotiated RTP extension information.
const char * ast_rtp_instance_get_channel_id(struct ast_rtp_instance *instance)
Get the unique ID of the channel that owns this RTP instance.
int ast_rtp_instance_fd(struct ast_rtp_instance *instance, int rtcp)
Get the file descriptor for an RTP session (or RTCP)
unsigned int ast_rtp_codecs_get_framing(struct ast_rtp_codecs *codecs)
Get the framing used for a set of codecs.
void ast_rtp_instance_set_keepalive(struct ast_rtp_instance *instance, int timeout)
Set the RTP keepalive interval.
unsigned int ast_rtp_instance_get_ssrc(struct ast_rtp_instance *rtp)
Retrieve the local SSRC value that we will be using.
int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, int asterisk_format, struct ast_format *format, int code)
Retrieve a rx mapped payload type based on whether it is an Asterisk format and the code.
enum ast_rtp_extension_direction ast_rtp_instance_extmap_get_direction(struct ast_rtp_instance *instance, int id)
Retrieve the negotiated direction for an RTP extension id.
void ast_rtp_codecs_payloads_xover(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
Crossover copy the tx payload mapping of src to the rx payload mapping of dest.
void ast_rtp_instance_set_timeout(struct ast_rtp_instance *instance, int timeout)
Set the RTP timeout value.
Scheduler Routines (derived from cheops)
#define AST_SCHED_DEL(sched, id)
Remove a scheduler entry.
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
int ast_sched_start_thread(struct ast_sched_context *con)
Start a thread for processing scheduler entries.
int ast_sched_add_variable(struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data, int variable) attribute_warn_unused_result
Adds a scheduled event with rescheduling support.
SRTP and SDP Security descriptions.
struct ast_sdp_srtp * ast_sdp_srtp_alloc(void)
allocate a ast_sdp_srtp structure
int ast_sdp_crypto_process(struct ast_rtp_instance *rtp, struct ast_sdp_srtp *srtp, const char *attr)
Parse the a=crypto line from SDP and set appropriate values on the ast_sdp_crypto struct.
const char * ast_sdp_srtp_get_attrib(struct ast_sdp_srtp *srtp, int dtls_enabled, int default_taglen_32)
Get the crypto attribute line for the srtp structure.
struct ast_sdp_crypto * ast_sdp_crypto_alloc(void)
Initialize an return an ast_sdp_crypto struct.
char * ast_sdp_get_rtp_profile(unsigned int sdes_active, struct ast_rtp_instance *instance, unsigned int using_avpf, unsigned int force_avp)
Get the RTP profile in use by a media session.
#define AST_SRTP_CRYPTO_OFFER_OK
media_type
Media types generate different "dummy answers" for not accepting the offer of a media stream....
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
const char * ast_stream_get_metadata(const struct ast_stream *stream, const char *m_key)
Get a stream metadata value.
int ast_stream_set_metadata(struct ast_stream *stream, const char *m_key, const char *value)
Set a stream metadata value.
@ AST_STREAM_STATE_RECVONLY
Set when the stream is receiving media only.
@ AST_STREAM_STATE_INACTIVE
Set when the stream is not sending OR receiving media.
@ AST_STREAM_STATE_REMOVED
Set when the stream has been removed/declined.
@ AST_STREAM_STATE_SENDONLY
Set when the stream is sending media only.
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
void ast_stream_set_state(struct ast_stream *stream, enum ast_stream_state state)
Set the state of a stream.
enum ast_stream_state ast_stream_get_state(const struct ast_stream *stream)
Get the current state of a stream.
int ast_stream_get_group(const struct ast_stream *stream)
Get the stream group that a stream is part of.
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
void ast_stream_set_formats(struct ast_stream *stream, struct ast_format_cap *caps)
Set the current negotiated formats of a stream.
const struct ast_format_cap * ast_stream_get_formats(const struct ast_stream *stream)
Get the current negotiated formats of a stream.
const char * ast_stream_to_str(const struct ast_stream *stream, struct ast_str **buf)
Get a string representing the stream for debugging/display purposes.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
#define ast_str_alloca(init_len)
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Main Channel structure associated with a channel.
Data structure associated with a single frame of data.
Structure that represents the optional DTLS SRTP support within an RTP engine.
int(* set_configuration)(struct ast_rtp_instance *instance, const struct ast_rtp_dtls_cfg *dtls_cfg)
enum ast_rtp_dtls_setup(* get_setup)(struct ast_rtp_instance *instance)
enum ast_rtp_dtls_hash(* get_fingerprint_hash)(struct ast_rtp_instance *instance)
const char *(* get_fingerprint)(struct ast_rtp_instance *instance)
void(* reset)(struct ast_rtp_instance *instance)
void(* set_fingerprint)(struct ast_rtp_instance *instance, enum ast_rtp_dtls_hash hash, const char *fingerprint)
enum ast_rtp_dtls_connection(* get_connection)(struct ast_rtp_instance *instance)
void(* set_setup)(struct ast_rtp_instance *instance, enum ast_rtp_dtls_setup setup)
Structure for an ICE candidate.
struct ast_sockaddr address
enum ast_rtp_ice_component_type id
struct ast_sockaddr relay_address
enum ast_rtp_ice_candidate_type type
Structure that represents the optional ICE support within an RTP engine.
void(* ice_lite)(struct ast_rtp_instance *instance)
struct ao2_container *(* get_local_candidates)(struct ast_rtp_instance *instance)
void(* stop)(struct ast_rtp_instance *instance)
const char *(* get_password)(struct ast_rtp_instance *instance)
void(* change_components)(struct ast_rtp_instance *instance, int num_components)
void(* set_authentication)(struct ast_rtp_instance *instance, const char *ufrag, const char *password)
void(* start)(struct ast_rtp_instance *instance)
const char *(* get_ufrag)(struct ast_rtp_instance *instance)
void(* add_remote_candidate)(struct ast_rtp_instance *instance, const struct ast_rtp_engine_ice_candidate *candidate)
void(* set_role)(struct ast_rtp_instance *instance, enum ast_rtp_ice_role role)
structure for secure RTP audio
struct ast_sdp_srtp::@308 sdp_srtp_list
struct ast_sdp_crypto * crypto
An entity with which Asterisk communicates.
struct ast_sip_endpoint_media_configuration media
A handler for SDPs in SIP sessions.
A supplement to SIP message processing.
A structure describing a SIP session.
Structure for SIP transport information.
struct pjsip_transport * transport
Transport itself.
Socket address structure.
Support for dynamic strings.
structure to hold extensions
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define ast_set_flag(p, flag)
int ast_check_ipv6(void)
Test that an OS supports IPv6 Networking.
char * ast_uuid_generate_str(char *buf, size_t size)
Generate a UUID string.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.