summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2024-02-05 22:15:31 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2024-02-09 08:16:25 +0100
commit38f234c06ee0d98c3568120338c1ec4078f8f9cc (patch)
treeae049b10478fc28c18f3db24669f47ae82f21e3b
parent687a287e140e87317986ad9445c3dfc2fcd0d342 (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.c9
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) {