diff options
author | Anton Khirnov <anton@khirnov.net> | 2024-07-10 17:38:24 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2024-08-01 10:09:26 +0200 |
commit | f2aeba56c45ad83b2a776effccfbb622525a3ca8 (patch) | |
tree | 18b3daf4a3e79a826b60044baa395dadccf0bc7d | |
parent | 84dda322020584e249840bc815591429c75fe5d0 (diff) | |
download | ffmpeg-f2aeba56c45ad83b2a776effccfbb622525a3ca8.tar.gz |
lavc/ffv1dec: move slice_reset_contexts to per-slice context
-rw-r--r-- | libavcodec/ffv1.h | 16 | ||||
-rw-r--r-- | libavcodec/ffv1dec.c | 4 |
2 files changed, 15 insertions, 5 deletions
diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index ae81940073..cef61f38ec 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -86,8 +86,19 @@ typedef struct FFV1SliceContext { RangeCoder c; int ac_byte_count; ///< number of bytes used for AC coding - uint64_t rc_stat[256][2]; - uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2]; + + union { + // decoder-only + struct { + int slice_reset_contexts; + }; + + // encoder-only + struct { + uint64_t rc_stat[256][2]; + uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2]; + }; + }; } FFV1SliceContext; typedef struct FFV1Context { @@ -135,7 +146,6 @@ typedef struct FFV1Context { int max_slice_count; int num_v_slices; int num_h_slices; - int slice_reset_contexts; FFV1SliceContext *slices; } FFV1Context; diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index d171660c85..ddcbe1583e 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -239,7 +239,7 @@ static int decode_slice_header(const FFV1Context *f, FFV1Context *fs, } if (fs->version > 3) { - fs->slice_reset_contexts = get_rac(c, state); + sc->slice_reset_contexts = get_rac(c, state); sc->slice_coding_mode = get_symbol(c, state, 0); if (sc->slice_coding_mode != 1) { sc->slice_rct_by_coef = get_symbol(c, state, 0); @@ -309,7 +309,7 @@ static int decode_slice(AVCodecContext *c, void *arg) } if ((ret = ff_ffv1_init_slice_state(f, sc)) < 0) return ret; - if ((p->flags & AV_FRAME_FLAG_KEY) || fs->slice_reset_contexts) { + if ((p->flags & AV_FRAME_FLAG_KEY) || sc->slice_reset_contexts) { ff_ffv1_clear_slice_state(f, sc); } else if (fs->slice_damaged) { return AVERROR_INVALIDDATA; |