diff mbox series

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

Message ID 20230316170949.3782-1-jamrial@gmail.com
State Accepted
Commit cbcc817353a019da4332ad43deb7bbc4e695d02a
Headers show
Series [FFmpeg-devel] avcodec/vorbisdec: export skip_samples instead of dropping frames | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished

Commit Message

James Almer March 16, 2023, 5:09 p.m. UTC
pts may not be set on input packets, which could result in the entire stream
being discarded.
This undoes 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.

Suggested-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/vorbisdec.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

Comments

Anton Khirnov March 17, 2023, 6:38 p.m. UTC | #1
CCing the author of the commit that's being undone.
Jyrki, you should set AV_CODEC_FLAG2_SKIP_MANUAL in
AVCodecContext.flags2 to avoid lavc dropping any samples. Please let us
know if this works for your case.
Jyrki Vesterinen March 17, 2023, 6:45 p.m. UTC | #2
perjantai, 17. maaliskuuta 2023, klo 20.38 (+02:00), Anton Khirnov 
kirjoitti:

 > CCing the author of the commit that's being undone.
 > Jyrki, you should set AV_CODEC_FLAG2_SKIP_MANUAL in
 > AVCodecContext.flags2 to avoid lavc dropping any samples. Please let us
 > know if this works for your case.
 > 

OK, I'll test it next week.
Jyrki Vesterinen March 22, 2023, 3:45 p.m. UTC | #3
perjantai, 17. maaliskuuta 2023, klo 20.45 (+02:00), Jyrki Vesterinen 
kirjoitti:

 > 
 > perjantai, 17. maaliskuuta 2023, klo 20.38 (+02:00), Anton Khirnov 
kirjoitti:
 > 
 > > CCing the author of the commit that's being undone.
 > > Jyrki, you should set AV_CODEC_FLAG2_SKIP_MANUAL in
 > > AVCodecContext.flags2 to avoid lavc dropping any samples. Please let 
us
 > > know if this works for your case.
 > > 
 > OK, I'll test it next week.
 > 

I have verified that with your patch applied and when the client code 
passes AV_CODEC_FLAG2_SKIP_MANUAL, our use case works correctly and audio 
samples aren't being skipped. Thank you!
diff mbox series

Patch

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 = {