aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2024-07-10 17:38:24 +0200
committerAnton Khirnov <anton@khirnov.net>2024-08-01 10:09:26 +0200
commitf2aeba56c45ad83b2a776effccfbb622525a3ca8 (patch)
tree18b3daf4a3e79a826b60044baa395dadccf0bc7d
parent84dda322020584e249840bc815591429c75fe5d0 (diff)
downloadffmpeg-f2aeba56c45ad83b2a776effccfbb622525a3ca8.tar.gz
lavc/ffv1dec: move slice_reset_contexts to per-slice context
-rw-r--r--libavcodec/ffv1.h16
-rw-r--r--libavcodec/ffv1dec.c4
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;