From 3f3e60dd7aaf369d4b7cf740f88c92781c65626c Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sat, 18 Feb 2023 17:37:58 +0100 Subject: [PATCH] Do not merge config audio packets For video streams (at least H.264 and H.265), the config packet containing SPS/PPS must be prepended to the next packet (the following keyframe). For audio streams (at least OPUS), they must not be merged. --- app/src/demuxer.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/demuxer.c b/app/src/demuxer.c index 6089e614..53a0effe 100644 --- a/app/src/demuxer.c +++ b/app/src/demuxer.c @@ -191,8 +191,15 @@ run_demuxer(void *data) { goto end; } + // Config packets must be merged with the next non-config packet only for + // video streams + bool must_merge_config_packet = codec->type == AVMEDIA_TYPE_VIDEO; + struct sc_packet_merger merger; - sc_packet_merger_init(&merger); + + if (must_merge_config_packet) { + sc_packet_merger_init(&merger); + } AVPacket *packet = av_packet_alloc(); if (!packet) { @@ -208,11 +215,13 @@ run_demuxer(void *data) { break; } - // Prepend any config packet to the next media packet - ok = sc_packet_merger_merge(&merger, packet); - if (!ok) { - av_packet_unref(packet); - break; + if (must_merge_config_packet) { + // Prepend any config packet to the next media packet + ok = sc_packet_merger_merge(&merger, packet); + if (!ok) { + av_packet_unref(packet); + break; + } } ok = sc_demuxer_push_packet(demuxer, packet); @@ -225,7 +234,9 @@ run_demuxer(void *data) { LOGD("End of frames"); - sc_packet_merger_destroy(&merger); + if (must_merge_config_packet) { + sc_packet_merger_destroy(&merger); + } av_packet_free(&packet); finally_close_sinks: