This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 13ddd5821035bcc5cca57b813faecfede7ad6a98
Author:     Romain Beauxis <[email protected]>
AuthorDate: Fri Nov 6 16:25:03 2026 -0600
Commit:     Romain Beauxis <[email protected]>
CommitDate: Sat Nov 7 15:00:17 2026 +0000

    avcodec/vorbisdec: attach the tags of a dropped frame to the first frame 
with samples
    
    The priming frame of a Vorbis stream is dropped whole, along with the tags 
it took from its packet, such as a chained Ogg link's title.
    
    Hand those tags on to the first frame with samples, so that they line up 
with the first sample played.
    
    The first link of the vorbis chained-meta test now reports its tags on its 
first frame.
---
 libavcodec/vorbisdec.c                     | 23 +++++++++++++++++++++++
 tests/ref/fate/ogg-vorbis-chained-meta.txt |  2 +-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
index aeea1b4908..111fe44318 100644
--- a/libavcodec/vorbisdec.c
+++ b/libavcodec/vorbisdec.c
@@ -30,6 +30,7 @@
 #include <math.h>
 
 #include "libavutil/avassert.h"
+#include "libavutil/dict.h"
 #include "libavutil/float_dsp.h"
 #include "libavutil/mem.h"
 #include "libavutil/tx.h"
@@ -158,6 +159,10 @@ typedef struct vorbis_context_s {
     int8_t       previous_window;
     float        *channel_residues;
     float        *saved;
+    /**
+     * Tags of a dropped priming frame, added to the first frame with samples.
+     */
+    AVDictionary *pending_metadata;
 } vorbis_context;
 
 /* Helper functions */
@@ -1859,6 +1864,22 @@ static int vorbis_decode_frame(AVCodecContext *avctx, 
AVFrame *frame,
     if (!vc->first_frame) {
         vc->first_frame = 1;
         avctx->internal->skip_samples = len;
+        if (!(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
+            av_dict_free(&vc->pending_metadata);
+            vc->pending_metadata = frame->metadata;
+            frame->metadata      = NULL;
+        }
+    } else if (vc->pending_metadata) {
+        if (!frame->metadata) {
+            frame->metadata      = vc->pending_metadata;
+            vc->pending_metadata = NULL;
+        } else {
+            ret = av_dict_copy(&frame->metadata, vc->pending_metadata,
+                               AV_DICT_DONT_OVERWRITE);
+            av_dict_free(&vc->pending_metadata);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     ff_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
@@ -1877,6 +1898,7 @@ static av_cold int vorbis_decode_close(AVCodecContext 
*avctx)
     vorbis_context *vc = avctx->priv_data;
 
     vorbis_free(vc);
+    av_dict_free(&vc->pending_metadata);
 
     return 0;
 }
@@ -1885,6 +1907,7 @@ static av_cold void vorbis_decode_flush(AVCodecContext 
*avctx)
 {
     vorbis_context *vc = avctx->priv_data;
 
+    av_dict_free(&vc->pending_metadata);
     if (vc->saved) {
         memset(vc->saved, 0, (vc->blocksize[1] / 4) * vc->audio_channels *
                              sizeof(*vc->saved));
diff --git a/tests/ref/fate/ogg-vorbis-chained-meta.txt 
b/tests/ref/fate/ogg-vorbis-chained-meta.txt
index 5a102fdd7e..84feb88ddd 100644
--- a/tests/ref/fate/ogg-vorbis-chained-meta.txt
+++ b/tests/ref/fate/ogg-vorbis-chained-meta.txt
@@ -2,7 +2,7 @@ Stream ID: 0, codec name: vorbis, metadata: 
encoder=Lavc61.19.100 libvorbis:titl
 Stream ID: 0, packet PTS: -128, packet DTS: -128
 Stream ID: 0, new metadata: encoder=Lavc61.19.100 libvorbis:title=First Stream
 Stream ID: 0, packet PTS: 0, packet DTS: 0
-Stream ID: 0, frame PTS: 0, metadata: N/A
+Stream ID: 0, frame PTS: 0, metadata: encoder=Lavc61.19.100 
libvorbis:title=First Stream
 Stream ID: 0, packet PTS: 576, packet DTS: 576
 Stream ID: 0, frame PTS: 576, metadata: N/A
 Stream ID: 0, packet PTS: 1600, packet DTS: 1600

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to