|
|
|
@ -2079,6 +2079,52 @@ const struct rtpext_printer rtpext_printer_copy = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool extmap_short_is_valid(const struct rtp_extension_data *ext) { |
|
|
|
// valid ranges for short form? |
|
|
|
if (ext->ext->id <= 0 || ext->ext->id >= 15) |
|
|
|
return false; |
|
|
|
if (ext->content.len > 16) |
|
|
|
return false; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
size_t extmap_length_short(const struct media_packet *mp) { |
|
|
|
const extmap_data_q *q = &mp->extmap; |
|
|
|
|
|
|
|
size_t ret = 4; // 0xbede + int16 length |
|
|
|
for (__auto_type l = q->head; l; l = l->next) { |
|
|
|
__auto_type ext = l->data; |
|
|
|
if (!extmap_short_is_valid(ext)) { |
|
|
|
ilog(LOG_WARN | LOG_FLAG_LIMIT, "RTP extension with id %d length %zu not valid " |
|
|
|
"for short form", ext->ext->id, ext->content.len); |
|
|
|
continue; |
|
|
|
} |
|
|
|
ret++; // 1-byte header |
|
|
|
ret += ext->content.len; |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
void extmap_header_short(void *_dst) { |
|
|
|
unsigned char *dst = _dst; |
|
|
|
dst[0] = 0xbe; |
|
|
|
dst[1] = 0xde; |
|
|
|
} |
|
|
|
|
|
|
|
size_t extmap_print_short(void *_dst, const struct rtp_extension_data *ext) { |
|
|
|
unsigned char *dst = _dst; |
|
|
|
|
|
|
|
if (!extmap_short_is_valid(ext)) |
|
|
|
return 0; |
|
|
|
|
|
|
|
dst[0] = (ext->ext->id << 4) | (ext->content.len - 1); |
|
|
|
memcpy(dst + 1, ext->content.s, ext->content.len); |
|
|
|
return ext->content.len + 1; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// `out_media` can be NULL XXX streamline this to remove this exception |
|
|
|
const struct streamhandler *determine_handler(const struct transport_protocol *in_proto, |
|
|
|
struct call_media *out_media, bool must_recrypt) |
|
|
|
|