diff --git a/daemon/media_socket.c b/daemon/media_socket.c index d37fe3d24..84110ef2a 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2356,7 +2356,12 @@ static void media_packet_rtp_extension(struct packet_handler_ctx *phc, unsigned if (!ext) return; - // stub + __auto_type edata = g_new0(struct rtp_extension_data, 1); + edata->ext = ext; + edata->link.data = edata; + edata->content = *data; + + t_queue_push_tail_link(&phc->mp.extmap, &edata->link); } static void media_packet_rtp_extensions(struct packet_handler_ctx *phc) { @@ -2801,6 +2806,7 @@ void media_packet_copy(struct media_packet *dst, const struct media_packet *src) dst->payload = STR_NULL; dst->raw = STR_NULL; dst->extensions = STR_NULL; + t_queue_init(&dst->extmap); } void media_packet_release(struct media_packet *mp) { obj_release(mp->sfd); @@ -3194,8 +3200,13 @@ out: media_socket_dequeue(&phc->mp, NULL); // just free ssrc_entry_release(phc->mp.ssrc_out); - ssrc_entry_release(phc->mp.ssrc_in); + + while (phc->mp.extmap.length) { + __auto_type l = t_queue_pop_head_link(&phc->mp.extmap); + rtp_ext_data_free(l->data); + } + rtcp_list_free(&phc->rtcp_list); g_queue_clear_full(&free_list, bufferpool_unref); diff --git a/include/media_socket.h b/include/media_socket.h index c502fbf69..771cf902b 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -264,6 +264,9 @@ struct sink_handler { int kernel_output_idx; struct sink_attrs attrs; }; + +TYPED_GQUEUE(extmap_data, struct rtp_extension_data); + struct media_packet { str raw; @@ -282,6 +285,7 @@ struct media_packet { struct ssrc_entry_call *ssrc_in, *ssrc_out; // SSRC contexts from in_srtp and out_srtp str payload; str extensions; + extmap_data_q extmap; codec_packet_q packets_out; int ptime; // returned from decoding @@ -293,9 +297,18 @@ struct rtp_extension { bool accepted:1; }; +struct rtp_extension_data { + extmap_data_list link; + struct rtp_extension *ext; + str content; +}; + static inline void rtp_extension_free(struct rtp_extension *r) { g_free(r); } +static inline void rtp_ext_data_free(struct rtp_extension_data *r) { + g_free(r); +} TYPED_GQUEUE(extmap, struct rtp_extension); TYPED_GHASHTABLE(extmap_ht, void, struct rtp_extension, g_direct_hash, g_direct_equal, NULL, NULL);