Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> --- libavcodec/ffv1enc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c index 5b251ac2e80..4340d1b8732 100644 --- a/libavcodec/ffv1enc.c +++ b/libavcodec/ffv1enc.c @@ -1275,6 +1275,7 @@ typedef struct RemapEncoderState { int i; int pixel_num; int p; + int current_mul_index; } RemapEncoderState; static inline void copy_state(RemapEncoderState *dst, const RemapEncoderState *src) @@ -1292,6 +1293,7 @@ static inline void copy_state(RemapEncoderState *dst, const RemapEncoderState *s dst->i = src->i; dst->pixel_num = src->pixel_num; dst->p = src->p; + dst->current_mul_index = src->current_mul_index; } static inline void encode_mul(RemapEncoderState *s, int mul_index) @@ -1318,9 +1320,11 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, Unit unit[4][65536 s.compact_index = -1; s.lu = 0; s.run = 0; + s.current_mul_index = -1; } for (; s.i < s.pixel_num+1; s.i++) { + int current_mul = s.current_mul_index < 0 ? 1 : FFABS(s.mul[s.current_mul_index]); int64_t val; if (s.i == s.pixel_num) { if (s.last_val == 0xFFFFFFFF) { @@ -1332,8 +1336,6 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, Unit unit[4][65536 val = unit[s.p][s.i].val; if (s.last_val != val) { - int current_mul_index = ((s.last_val + 1) * s.mul_count) >> 32; - int current_mul = s.i ? FFABS(s.mul[current_mul_index]) : 1; int64_t delta = 0; av_assert2(s.last_val < val); av_assert2(current_mul > 0); @@ -1349,14 +1351,16 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, Unit unit[4][65536 } av_assert2(s.last_val < val); if (s.lu) { - s.index_stack[s.run] = current_mul_index; + s.index_stack[s.run] = s.current_mul_index; av_assert2(s.run < FF_ARRAY_ELEMS(s.delta_stack)); if (val - s.last_val == 1) { s.delta_stack[s.run] = delta; s.run ++; + av_assert2(s.i == s.pixel_num || s.last_val + current_mul + delta == unit[s.p][s.i].val); s.last_val += current_mul + delta; } else { put_symbol_inline(&s.rc, s.state[s.lu][0], s.run, 0, NULL, NULL); + for(int k=0; k<s.run; k++) { int stack_mul = s.mul[ s.index_stack[k] ]; if (stack_mul>1) @@ -1373,14 +1377,19 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, Unit unit[4][65536 } else { av_assert2(s.run == 0); put_symbol_inline(&s.rc, s.state[s.lu][0], val - s.last_val - 1, 0, NULL, NULL); + if (current_mul > 1) put_symbol_inline(&s.rc, s.state[s.lu][1], delta, 1, NULL, NULL); if (val - s.last_val == 1) s.lu ^= 1; - s.last_val += (val - s.last_val) * current_mul + delta; - encode_mul(&s, ((s.last_val + 1) * s.mul_count) >> 32); + av_assert2(s.i == s.pixel_num || s.last_val + (val - s.last_val) * current_mul + delta == unit[s.p][s.i].val); + if (s.i < s.pixel_num) + s.last_val = unit[s.p][s.i].val; } + s.current_mul_index = ((s.last_val + 1) * s.mul_count) >> 32; + if (!s.run) + encode_mul(&s, s.current_mul_index); s.compact_index ++; } if (final && s.i < s.pixel_num) -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".