|
|
|
|
@ -1550,7 +1550,7 @@ typedef struct {
|
|
|
|
|
static void kernelize_state_clear(kernelize_state *s) {
|
|
|
|
|
rtp_stats_arr_destroy_ptr(&s->payload_types);
|
|
|
|
|
t_queue_clear_full(&s->outputs,
|
|
|
|
|
(void (*)(struct rtpengine_destination_info *)) g_free); // should always be empty
|
|
|
|
|
(void (*)(struct rtpengine_destination_info *)) g_free);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(kernelize_state, kernelize_state_clear)
|
|
|
|
|
@ -1862,10 +1862,11 @@ static bool kernelize_one_sink_handler(kernelize_state *s,
|
|
|
|
|
static void kernelize(struct packet_stream *stream) {
|
|
|
|
|
call_t *call = stream->call;
|
|
|
|
|
struct call_media *media = stream->media;
|
|
|
|
|
g_auto(kernelize_state) s = {0};
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
|
|
|
|
|
g_auto(kernelize_state) s = {0};
|
|
|
|
|
|
|
|
|
|
LOCK(&stream->lock);
|
|
|
|
|
|
|
|
|
|
// set flag, return if set already
|
|
|
|
|
@ -1898,14 +1899,14 @@ static void kernelize(struct packet_stream *stream) {
|
|
|
|
|
continue;
|
|
|
|
|
bool ok = kernelize_one_sink_handler(&s, stream, sh);
|
|
|
|
|
if (!ok)
|
|
|
|
|
goto restart;
|
|
|
|
|
continue; // retry
|
|
|
|
|
}
|
|
|
|
|
// RTP egress mirrors
|
|
|
|
|
for (__auto_type l = stream->rtp_mirrors.head; l; l = l->next) {
|
|
|
|
|
struct sink_handler *sh = l->data;
|
|
|
|
|
bool ok = kernelize_one_sink_handler(&s, stream, sh);
|
|
|
|
|
if (!ok)
|
|
|
|
|
goto restart;
|
|
|
|
|
continue; // retry
|
|
|
|
|
}
|
|
|
|
|
// RTP -> RTCP sinks
|
|
|
|
|
// record number of RTP destinations up to now
|
|
|
|
|
@ -1916,7 +1917,7 @@ static void kernelize(struct packet_stream *stream) {
|
|
|
|
|
struct sink_handler *sh = l->data;
|
|
|
|
|
bool ok = kernelize_one_sink_handler(&s, stream, sh);
|
|
|
|
|
if (!ok)
|
|
|
|
|
goto restart;
|
|
|
|
|
continue; // retry
|
|
|
|
|
}
|
|
|
|
|
// mark the start of RTCP outputs
|
|
|
|
|
s.reti.num_rtcp_destinations = s.reti.num_destinations - num_rtp_dests;
|
|
|
|
|
@ -1948,14 +1949,6 @@ no_kernel:
|
|
|
|
|
PS_SET(stream, NO_KERNEL_SUPPORT);
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
restart: // handle detected deadlock
|
|
|
|
|
|
|
|
|
|
rtp_stats_arr_destroy_ptr(&s.payload_types);
|
|
|
|
|
|
|
|
|
|
while ((redi = t_queue_pop_head(&s.outputs)))
|
|
|
|
|
g_free(redi);
|
|
|
|
|
|
|
|
|
|
// try again, releases stream->lock
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|