Commit 126802b169 for ffmpeg

commit 126802b1692ef363aca700435918fcfb655f7ba7
Author: Kacper Michajłow <kasper93@gmail.com>
Date:   Wed Oct 28 21:00:56 2026 +0100

    avformat/oggparsevorbis: reuse fixup_vorbis_headers() for chained streams

    Signed-off-by: Kacper Michajłow <kasper93@gmail.com>

diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c
index 18160ec3dd..5a23fc4450 100644
--- a/libavformat/oggparsevorbis.c
+++ b/libavformat/oggparsevorbis.c
@@ -213,12 +213,6 @@ struct oggvorbis_private {
     unsigned int len[3];
     unsigned char *packet[3];
     AVVorbisParseContext *vp;
-    uint8_t *header;
-    int header_size;
-    uint8_t *comment;
-    int comment_size;
-    uint8_t *setup;
-    int setup_size;
     int64_t bos_page_pos;
     int ts_offset;
     int64_t last_page_granule;
@@ -273,10 +267,6 @@ static void vorbis_cleanup(AVFormatContext *s, int idx)
         av_vorbis_parse_free(&priv->vp);
         for (i = 0; i < 3; i++)
             av_freep(&priv->packet[i]);
-
-        av_freep(&priv->header);
-        av_freep(&priv->comment);
-        av_freep(&priv->setup);
     }
 }

@@ -462,7 +452,7 @@ static int vorbis_packet(AVFormatContext *s, int idx)
     struct oggvorbis_private *priv = os->private;
     int duration, flags = 0;
     int bos, skip_packet = 0;
-    int ret, new_extradata_size;
+    int ret;

     if (os->psize == 0)
         return AVERROR_INVALIDDATA;
@@ -567,12 +557,12 @@ static int vorbis_packet(AVFormatContext *s, int idx)
         if (ret < 0)
             return ret;

-        ret = av_reallocp(&priv->header, os->psize);
+        ret = av_reallocp(&priv->packet[0], os->psize);
         if (ret < 0)
             return ret;

-        memcpy(priv->header, os->buf + os->pstart, os->psize);
-        priv->header_size = os->psize;
+        memcpy(priv->packet[0], os->buf + os->pstart, os->psize);
+        priv->len[0] = os->psize;

         skip_packet = 1;
     }
@@ -582,24 +572,24 @@ static int vorbis_packet(AVFormatContext *s, int idx)
         if (ret < 0)
             return ret;

-        ret = av_reallocp(&priv->comment, os->psize);
+        ret = av_reallocp(&priv->packet[1], os->psize);
         if (ret < 0)
             return ret;

-        memcpy(priv->comment, os->buf + os->pstart, os->psize);
-        priv->comment_size = os->psize;
+        memcpy(priv->packet[1], os->buf + os->pstart, os->psize);
+        priv->len[1] = os->psize;

         flags = 0;
         skip_packet = 1;
     }

     if (flags & VORBIS_FLAG_SETUP) {
-        ret = av_reallocp(&priv->setup, os->psize);
+        ret = av_reallocp(&priv->packet[2], os->psize);
         if (ret < 0)
             return ret;

-        memcpy(priv->setup, os->buf + os->pstart, os->psize);
-        priv->setup_size = os->psize;
+        memcpy(priv->packet[2], os->buf + os->pstart, os->psize);
+        priv->len[2] = os->psize;

         skip_packet = 1;
     }
@@ -607,40 +597,14 @@ static int vorbis_packet(AVFormatContext *s, int idx)

     /* All three headers for the new chained stream have been collected;
      * pack them into new extradata to be attached to the next data packet. */
-    if (priv->header && priv->comment && priv->setup) {
-        uint64_t total_size = (uint64_t)priv->header_size + priv->comment_size +
-                              priv->setup_size;
-        uint8_t *p;
-
-        /* Use Xiph lacing like vorbis_header() does: 16-bit sizes cannot
-         * describe headers larger than 64 KiB, e.g. a comment header with
-         * embedded cover art. */
-        if (total_size + total_size / 255 + 3 > INT_MAX)
-            return AVERROR_INVALIDDATA;
-        new_extradata_size = 1 + priv->header_size / 255 + 1 +
-                             priv->comment_size / 255 + 1 + total_size;
-
-        ret = av_reallocp(&os->new_extradata, new_extradata_size);
-        if (ret < 0)
+    if (priv->packet[0] && priv->packet[1] && priv->packet[2]) {
+        av_freep(&os->new_extradata);
+        ret = fixup_vorbis_headers(s, priv, &os->new_extradata);
+        if (ret < 0) {
+            os->new_extradata_size = 0;
             return ret;
-
-        os->new_extradata_size = new_extradata_size;
-        p     = os->new_extradata;
-        *p++  = 2;
-        p    += av_xiphlacing(p, priv->header_size);
-        p    += av_xiphlacing(p, priv->comment_size);
-        memcpy(p, priv->header, priv->header_size);
-        p    += priv->header_size;
-        memcpy(p, priv->comment, priv->comment_size);
-        p    += priv->comment_size;
-        memcpy(p, priv->setup, priv->setup_size);
-
-        av_freep(&priv->header);
-        priv->header_size = 0;
-        av_freep(&priv->comment);
-        priv->comment_size = 0;
-        av_freep(&priv->setup);
-        priv->setup_size = 0;
+        }
+        os->new_extradata_size = ret;

         av_vorbis_parse_free(&priv->vp);
         priv->vp = av_vorbis_parse_init(os->new_extradata, os->new_extradata_size);