[FFmpeg-cvslog] avcodec/vorbisdec: export skip_samples instead of dropping frames

James Almer git at videolan.org
Wed Mar 22 17:51:40 EET 2023


ffmpeg | branch: release/6.0 | James Almer <jamrial at gmail.com> | Thu Mar 16 14:09:49 2023 -0300| [3980415627a187d188dc25669cea6b12912eb178] | committer: James Almer

avcodec/vorbisdec: export skip_samples instead of dropping frames

pts may not be set on input packets, which could result in the entire stream
being discarded.
This reverts commit 8fc2dedfe6e8fcc58dd052bf3b85cd4754133b17, reintroducing the
behavior it replaced but now allowing the caller to manually drop the preroll
samples by looking at the skip_samples side data at the start while ignoring it
on seek, by setting the skip_manual avctx flag.

Fixes ticket #10251.

Suggested-by: Anton Khirnov <anton at khirnov.net>
Signed-off-by: James Almer <jamrial at gmail.com>
(cherry picked from commit cbcc817353a019da4332ad43deb7bbc4e695d02a)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3980415627a187d188dc25669cea6b12912eb178
---

 libavcodec/vorbisdec.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
index dd856a6dfe..e9dad4ef4f 100644
--- a/libavcodec/vorbisdec.c
+++ b/libavcodec/vorbisdec.c
@@ -38,6 +38,7 @@
 #include "codec_internal.h"
 #include "decode.h"
 #include "get_bits.h"
+#include "internal.h"
 #include "vorbis.h"
 #include "vorbisdsp.h"
 #include "vorbis_data.h"
@@ -134,7 +135,6 @@ typedef struct vorbis_context_s {
     av_tx_fn      mdct_fn[2];
 
     uint8_t       first_frame;
-    int64_t       initial_pts;
     uint32_t      version;
     uint8_t       audio_channels;
     uint32_t      audio_samplerate;
@@ -1839,13 +1839,7 @@ static int vorbis_decode_frame(AVCodecContext *avctx, AVFrame *frame,
 
     if (!vc->first_frame) {
         vc->first_frame = 1;
-        vc->initial_pts = frame->pts;
-    }
-
-    if (frame->pts == vc->initial_pts) {
-        *got_frame_ptr = 0;
-        av_frame_unref(frame);
-        return buf_size;
+        avctx->internal->skip_samples = len;
     }
 
     ff_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
@@ -1877,6 +1871,7 @@ static av_cold void vorbis_decode_flush(AVCodecContext *avctx)
                              sizeof(*vc->saved));
     }
     vc->previous_window = -1;
+    vc->first_frame = 0;
 }
 
 const FFCodec ff_vorbis_decoder = {



More information about the ffmpeg-cvslog mailing list