diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 5933ee414..c4cab2c7a 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1576,7 +1576,6 @@ G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(kernelize_state, kernelize_state_clear) static void fill_pt_stats(kernelize_state *s, struct packet_stream *stream) { rtp_stats_ht_iter iter; t_hash_table_iter_init(&iter, stream->rtp_stats); - s->num_payload_types = 0; struct rtp_stats *rs; while (t_hash_table_iter_next(&iter, NULL, &rs) && s->num_payload_types < RTPE_NUM_PAYLOAD_TYPES) { s->pt_streams[s->num_payload_types] = stream; @@ -1591,6 +1590,28 @@ static void fill_media_sinks(kernelize_state *s, unsigned int media_idx, struct s->rtcp_sinks[media_idx] = &ps->rtcp_sinks; } +__attribute__((nonnull(1, 2))) +static void fill_pt_bundle_media(kernelize_state *s, struct call_media *media, unsigned int component) { + if (!t_hash_table_is_set(media->pt_media)) + return; + + // reset output stream and stats for any PTs known to belong to other media + for (unsigned int i = 0; i < s->num_payload_types; i++) { + struct rtp_stats *rs = s->payload_types[i]; + __auto_type pt_media = t_hash_table_lookup(media->pt_media, GUINT_TO_POINTER(rs->payload_type)); + if (!pt_media) + continue; + if (pt_media == media) + continue; + + struct packet_stream *pt_ps = get_media_component(pt_media, component); + if (!pt_ps) + continue; // log as error? + s->pt_streams[s->num_payload_types] = pt_ps; + } + +} + __attribute__((nonnull(1, 2))) static const char *kernelize_target(kernelize_state *s, struct packet_stream *stream) { struct call_media *media = stream->media; @@ -1691,7 +1712,10 @@ static const char *kernelize_target(kernelize_state *s, struct packet_stream *st // handle known RTP payload types: // create sorted list of payload types + s->num_payload_types = 0; + fill_pt_stats(s, stream); + fill_pt_bundle_media(s, media, stream->component); if (!s->num_payload_types) { // set single output