From 36eb641966078c27b385ed9afc12e518ab85ba62 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 30 Oct 2020 08:56:43 -0400 Subject: [PATCH] TT#98901 add media_packet_copy/_release Change-Id: I60bc6b258e9efc0d704b6d8cc6b2c2c915330bdc --- daemon/jitter_buffer.c | 6 ++---- daemon/media_socket.c | 23 +++++++++++++++++++++++ include/media_socket.h | 2 ++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/daemon/jitter_buffer.c b/daemon/jitter_buffer.c index 811247cc4..7370379ca 100644 --- a/daemon/jitter_buffer.c +++ b/daemon/jitter_buffer.c @@ -107,8 +107,7 @@ static struct jb_packet* get_jb_packet(struct media_packet *mp, const str *s) { struct jb_packet *p = g_slice_alloc0(sizeof(*p)); p->buf = buf; - p->mp = *mp; - obj_hold(p->mp.sfd); + media_packet_copy(&p->mp, mp); str_init_len(&p->mp.raw, buf + RTP_BUFFER_HEAD_ROOM, s->len); memcpy(p->mp.raw.s, s->s, s->len); @@ -440,8 +439,7 @@ void jb_packet_free(struct jb_packet **jbp) { return; free((*jbp)->buf); - if ((*jbp)->mp.sfd) - obj_put((*jbp)->mp.sfd); + media_packet_release(&(*jbp)->mp); g_slice_free1(sizeof(**jbp), *jbp); *jbp = NULL; } diff --git a/daemon/media_socket.c b/daemon/media_socket.c index b1ab083e1..d7612d7ca 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1792,6 +1792,29 @@ int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink) { return 0; } +void media_packet_copy(struct media_packet *dst, const struct media_packet *src) { + *dst = *src; + g_queue_init(&dst->packets_out); + if (dst->sfd) + obj_hold(dst->sfd); + if (dst->ssrc_in) + obj_hold(&dst->ssrc_in->parent->h); + if (dst->ssrc_out) + obj_hold(&dst->ssrc_out->parent->h); + dst->rtp = g_memdup(src->rtp, sizeof(*src->rtp)); + dst->rtcp = g_memdup(src->rtp, sizeof(*src->rtp)); + dst->payload = STR_NULL; + dst->raw = STR_NULL; +} +void media_packet_release(struct media_packet *mp) { + obj_put(mp->sfd); + obj_put(&mp->ssrc_in->parent->h); + obj_put(&mp->ssrc_out->parent->h); + g_queue_clear_full(&mp->packets_out, codec_packet_free); + g_free(mp->rtp); + g_free(mp->rtcp); +} + /* called lock-free */ static int stream_packet(struct packet_handler_ctx *phc) { diff --git a/include/media_socket.h b/include/media_socket.h index fc3873b2f..36439cf49 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -176,6 +176,8 @@ void __unkernelize(struct packet_stream *); void unkernelize(struct packet_stream *); void __stream_unconfirm(struct packet_stream *); +void media_packet_copy(struct media_packet *, const struct media_packet *); +void media_packet_release(struct media_packet *); int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink); const struct streamhandler *determine_handler(const struct transport_protocol *in_proto, struct call_media *out_media, int must_recrypt);