From bf8696d02e2fdc81854909b43513981b20228f13 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Mon, 2 Jan 2023 15:55:46 +0100 Subject: [PATCH] Avoid unnecessary copy on config packets demuxing Use av_packet_ref() to reference the packet without copy. This also simplifies the logic, by making the "offset" variable and the memcpy() call local to the if-block. --- app/src/demuxer.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/demuxer.c b/app/src/demuxer.c index 2c0c64a8..c88af220 100644 --- a/app/src/demuxer.c +++ b/app/src/demuxer.c @@ -95,29 +95,27 @@ sc_demuxer_push_packet(struct sc_demuxer *demuxer, AVPacket *packet) { // A config packet must not be decoded immediately (it contains no // frame); instead, it must be concatenated with the future data packet. if (demuxer->pending || is_config) { - size_t offset; if (demuxer->pending) { - offset = demuxer->pending->size; + size_t offset = demuxer->pending->size; if (av_grow_packet(demuxer->pending, packet->size)) { LOG_OOM(); return false; } + + memcpy(demuxer->pending->data + offset, packet->data, packet->size); } else { - offset = 0; demuxer->pending = av_packet_alloc(); if (!demuxer->pending) { LOG_OOM(); return false; } - if (av_new_packet(demuxer->pending, packet->size)) { + if (av_packet_ref(demuxer->pending, packet)) { LOG_OOM(); av_packet_free(&demuxer->pending); return false; } } - memcpy(demuxer->pending->data + offset, packet->data, packet->size); - if (!is_config) { // prepare the concat packet to send to the decoder demuxer->pending->pts = packet->pts;