From 84d85e7ad4ace228265af0c8c5caccc0730042fd Mon Sep 17 00:00:00 2001 From: James Almer Date: Thu, 13 Feb 2025 19:47:45 -0300 Subject: [PATCH] avformat/oggenc: don't discard empty packets with no side data Theora signals "Output last frame again" with an empty packet. To keep the behaviour of 18f24527eb of ignoring side data only packets, as generated by the FLAC encoder to propagate updated extradata, also check for pkt->side_data_size to choose wheter to mux the paket or not. Fixes part of ticket #11451. Signed-off-by: James Almer --- libavformat/oggenc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c index 224519a4da..0647111396 100644 --- a/libavformat/oggenc.c +++ b/libavformat/oggenc.c @@ -241,7 +241,8 @@ static int ogg_buffer_data(AVFormatContext *s, AVStream *st, len = FFMIN(size, segments*255); page->segments[page->segments_count++] = len - (segments-1)*255; - memcpy(page->data+page->size, p, len); + if (len) + memcpy(page->data+page->size, p, len); p += len; size -= len; i += segments; @@ -690,7 +691,7 @@ static int ogg_write_packet(AVFormatContext *s, AVPacket *pkt) int i; if (pkt) - return pkt->size ? ogg_write_packet_internal(s, pkt) : 0; + return pkt->size || !pkt->side_data_elems ? ogg_write_packet_internal(s, pkt) : 0; for (i = 0; i < s->nb_streams; i++) { OGGStreamContext *oggstream = s->streams[i]->priv_data; @@ -710,7 +711,7 @@ static int ogg_write_trailer(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { OGGStreamContext *oggstream = s->streams[i]->priv_data; - if (oggstream->page.size > 0) + if (oggstream->page.segments_count) ogg_buffer_page(s, oggstream); }