From 8d9a0d247c69034c095432944aff7d7161559dd9 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 6 Mar 2019 08:18:53 -0500 Subject: [PATCH] TT#50652 remove already enqueued packets when media is stopped Change-Id: I0fd2a7100d331d341518888d2c591dbf84b2599d --- daemon/codec.c | 1 + daemon/media_player.c | 33 ++++++++++++++++++++++++++++++++- include/codec.h | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/daemon/codec.c b/daemon/codec.c index 39295e0e2..335d2838b 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -711,6 +711,7 @@ static void __output_rtp(struct media_packet *mp, struct codec_ssrc_handler *ch, p->s.len = payload_len + sizeof(struct rtp_header); payload_tracker_add(&ssrc_out->tracker, handler->dest_pt.payload_type); p->free_func = free; + p->source = handler; // this packet is dynamically allocated, so we're able to schedule it. // determine scheduled time to send diff --git a/daemon/media_player.c b/daemon/media_player.c index ddb0a1e86..c427e15cb 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -31,11 +31,42 @@ static struct timerthread send_timer_thread; #ifdef WITH_TRANSCODING -// appropriate lock must be held +// called with call->master lock in W +static unsigned int send_timer_flush(struct send_timer *st, void *ptr) { + if (!st) + return 0; + + unsigned int num = 0; + GList *l = st->packets.head; + while (l) { + GList *next = l->next; + struct codec_packet *p = l->data; + if (p->source != ptr) + goto next; + g_queue_delete_link(&st->packets, l); + codec_packet_free(p); + num++; + +next: + l = next; + } + return num; +} + + +// called with call->master lock in W static void media_player_shutdown(struct media_player *mp) { ilog(LOG_DEBUG, "shutting down media_player"); timerthread_obj_deschedule(&mp->tt_obj); avformat_close_input(&mp->fmtctx); + + if (mp->sink) { + unsigned int num = send_timer_flush(mp->sink->send_timer, mp->handler); + ilog(LOG_DEBUG, "%u packets removed from send queue", num); + // roll back seq numbers already used + mp->ssrc_out->parent->seq_diff -= num; + } + mp->media = NULL; if (mp->handler) codec_handler_free(mp->handler); diff --git a/include/codec.h b/include/codec.h index 449d42cb0..6f9039696 100644 --- a/include/codec.h +++ b/include/codec.h @@ -36,6 +36,7 @@ struct codec_handler { struct codec_packet { str s; + void *source; // opaque void (*free_func)(void *); struct timeval to_send; };