aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2023-03-16 14:09:49 -0300
committerJames Almer <jamrial@gmail.com>2023-03-22 12:51:17 -0300
commit3980415627a187d188dc25669cea6b12912eb178 (patch)
tree40aeb48367e0e93cffe7ba71bae4ecd52ce7ff01 /libavcodec
parenta0d65664984796c854e87d30e5187b067d6fde8a (diff)
downloadffmpeg-3980415627a187d188dc25669cea6b12912eb178.tar.gz
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@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com> (cherry picked from commit cbcc817353a019da4332ad43deb7bbc4e695d02a)
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/vorbisdec.c11
1 files 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 = {