diff --git a/daemon/call.c b/daemon/call.c index 458ac2988..682a8cd02 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2937,6 +2937,8 @@ static void media_init_extmap(struct call_media *media, struct rtp_extension *ex t_hash_table_insert(media->ext_name_ht, &ext->name, ext); t_hash_table_insert(media->extmap_ht, GUINT_TO_POINTER(ext->id), ext); + ext->handler = rtp_extension_get_handler(&ext->name); + if (ext->id > 0 && ext->id <= 14) media->extmap_a[ext->id - 1] = ext; else diff --git a/daemon/media_socket.c b/daemon/media_socket.c index df432bc44..8d1df682f 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2668,6 +2668,25 @@ static void media_packet_rtcp_mux(struct packet_handler_ctx *phc, struct sink_ha } +static void rtp_ext_mid_parse(struct packet_handler_ctx *phc, const struct rtp_extension_data *data) { + __auto_type media = t_hash_table_lookup(phc->mp.media->monologue->media_ids, &data->content); + if (!media) + return; // XXX log error? + + media_packet_reset_media(phc, media); +} + +static const rtp_ext_handler rtp_ext_mid = { + .parse = rtp_ext_mid_parse, + .id = RTP_EXT_MID, +}; + +rtp_ext_handler rtp_extension_get_handler(const str *name) { + if (!str_cmp(name, "urn:ietf:params:rtp-hdrext:sdes:mid")) + return rtp_ext_mid; + return (rtp_ext_handler) { .id = RTP_EXT_UNKNOWN }; +} + static void media_packet_rtp_extension(struct packet_handler_ctx *phc, unsigned int id, const str *data) { __auto_type ext = phc->mp.media->extmap_ops->lookup(phc->mp.media, id); if (!ext) @@ -2679,6 +2698,9 @@ static void media_packet_rtp_extension(struct packet_handler_ctx *phc, unsigned edata->content = *data; t_queue_push_tail_link(&phc->mp.extmap, &edata->link); + + if (ext->handler.parse) + ext->handler.parse(phc, edata); } static void media_packet_rtp_extensions(struct packet_handler_ctx *phc) { diff --git a/include/media_socket.h b/include/media_socket.h index c1587697f..888ec4636 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -305,9 +305,30 @@ struct media_packet { int ptime; // returned from decoding }; +struct packet_handler_ctx; + + +struct rtp_extension; + +typedef struct { + void (*parse)(struct packet_handler_ctx *, const struct rtp_extension_data *); + + ssize_t (*len)(struct call_media *); + ssize_t (*print)(void *dst, struct rtp_extension *, struct call_media *); + + enum { + RTP_EXT_MID = 0, + + RTP_EXT_NUM, + + RTP_EXT_UNKNOWN, + } id; +} rtp_ext_handler; + struct rtp_extension { unsigned int id; str name; // urn:ietf:params:rtp- hdrext:... or URI + rtp_ext_handler handler; bool accepted:1; }; @@ -337,6 +358,8 @@ void extmap_header_long(void *); size_t extmap_print_long(void *, const struct rtp_extension_data *); +rtp_ext_handler rtp_extension_get_handler(const str *); + extern local_intf_q all_local_interfaces; // read-only during runtime