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.
This commit is contained in:
Romain Vimont 2023-02-18 17:37:58 +01:00
parent d722b9de4d
commit 3f3e60dd7a

View file

@ -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: