diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2024-02-05 22:15:31 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2024-02-09 08:16:25 +0100 |
commit | 38f234c06ee0d98c3568120338c1ec4078f8f9cc (patch) | |
tree | ae049b10478fc28c18f3db24669f47ae82f21e3b | |
parent | 687a287e140e87317986ad9445c3dfc2fcd0d342 (diff) |
avcodec/vc1dec: Set pointers for hwaccel even without hwaccel
VC-1 uses a 0x03 escaping scheme like H.26x and our decoder
unescapes data for this purpose, but hardware accelerations
just want the data as-is and therefore get fed the original
data. The pointers to the actual data are only setcorrectly
if avctx->hwaccel is set (after all, they are only used in
this case).
There are two problems with this: The first is that the branch
is pointless; the second is that it is harmful, because
a hardware acceleration may be added after the packet has been
parsed (in case there is a reconfiguration e.g. due to frame
size changes) in which case decoding the first few frames
won't work.
So delete these branches.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r-- | libavcodec/vc1dec.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 6eff2ec04c..6462a40fd3 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -846,14 +846,12 @@ static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict, if (size <= 0) continue; switch (AV_RB32(start)) { case VC1_CODE_FRAME: - if (avctx->hwaccel) - buf_start = start; + buf_start = start; buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2); break; case VC1_CODE_FIELD: { int buf_size3; - if (avctx->hwaccel) - buf_start_second_field = start; + buf_start_second_field = start; av_size_mult(sizeof(*slices), n_slices+1, &next_allocated); tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL; if (!tmp) { @@ -918,8 +916,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict, ret = AVERROR_INVALIDDATA; goto err; } else { // found field marker, unescape second field - if (avctx->hwaccel) - buf_start_second_field = divider; + buf_start_second_field = divider; av_size_mult(sizeof(*slices), n_slices+1, &next_allocated); tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL; if (!tmp) { |