Continues from commit 702239bc500b, fixing FATE failures on MacOS. Signed-off-by: James Almer <jamr...@gmail.com> --- Confirmed by Martin Storsjö. Float encoding untested.
libavcodec/ffv1.h | 16 ++++ libavcodec/ffv1enc.c | 177 +++++++++++++++++-------------------------- 2 files changed, 84 insertions(+), 109 deletions(-) diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index 09118e0b7d..d1c239f138 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -115,6 +115,22 @@ typedef struct FFV1SliceContext { uint32_t val; //this is unneeded if you accept a dereference on each access uint16_t ndx; } unit[4][65536]; + struct RemapEncoderState { + int delta_stack[65536]; //We need to encode the run value before the adjustments, this stores the adjustments until we know the length of the run + int16_t index_stack[65537]; //only needed with multiple segments + uint8_t state[2][3][32]; + int mul[4096+1]; + RangeCoder rc; + int lu; + int run; + int64_t last_val; + int compact_index; + int mul_count; + int i; + int pixel_num; + int p; + int current_mul_index; + } remap_state; } FFV1SliceContext; typedef struct FFV1Context { diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c index 4340a301e1..8dcca7e1d6 100644 --- a/libavcodec/ffv1enc.c +++ b/libavcodec/ffv1enc.c @@ -1246,42 +1246,7 @@ static void load_rgb_float32_frame(FFV1Context *f, FFV1SliceContext *sc, AV_QSORT(sc->unit[3], i, struct Unit, CMP); } -typedef struct RemapEncoderState { - int delta_stack[65536]; //We need to encode the run value before the adjustments, this stores the adjustments until we know the length of the run - int16_t index_stack[65537]; //only needed with multiple segments - uint8_t state[2][3][32]; - int mul[4096+1]; - RangeCoder rc; - int lu; - int run; - int64_t last_val; - int compact_index; - int mul_count; - int i; - int pixel_num; - int p; - int current_mul_index; -} RemapEncoderState; - -static inline void copy_state(RemapEncoderState *dst, const RemapEncoderState *src) -{ - dst->rc = src->rc; - memcpy(dst->mul, src->mul, (src->mul_count + 1) * sizeof(src->mul[0])); - memcpy(dst->delta_stack, src->delta_stack, src->run * sizeof(src->delta_stack[0])); - memcpy(dst->index_stack, src->index_stack, (src->run + 1) * sizeof(src->index_stack[0])); - memcpy(dst->state, src->state, sizeof(dst->state)); - dst->lu = src->lu; - dst->run = src->run; - dst->last_val = src->last_val; - dst->compact_index = src->compact_index; - dst->mul_count = src->mul_count; - 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) +static inline void encode_mul(struct RemapEncoderState *s, int mul_index) { av_assert2(s->mul[ mul_index ]); if (s->mul[ mul_index ] < 0) { @@ -1290,122 +1255,116 @@ static inline void encode_mul(RemapEncoderState *s, int mul_index) } } -static int encode_float32_remap_segment(FFV1SliceContext *sc, - RemapEncoderState *state_arg, int update, int final) +static int encode_float32_remap_segment(FFV1SliceContext *sc, int final) { - RemapEncoderState s; - - copy_state(&s, state_arg); - - if (s.i == 0) { - memset(s.state, 128, sizeof(s.state)); - put_symbol(&s.rc, s.state[0][0], s.mul_count, 0); - memset(s.state, 128, sizeof(s.state)); - s.last_val = -1; - s.compact_index = -1; - s.lu = 0; - s.run = 0; - s.current_mul_index = -1; + struct RemapEncoderState *s = &sc->remap_state; + + if (s->i == 0) { + memset(s->state, 128, sizeof(s->state)); + put_symbol(&s->rc, s->state[0][0], s->mul_count, 0); + memset(s->state, 128, sizeof(s->state)); + s->last_val = -1; + 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]); + 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) { + if (s->i == s->pixel_num) { + if (s->last_val == 0xFFFFFFFF) { break; } else { val = 1LL<<32; } } else - val = sc->unit[s.p][s.i].val; + val = sc->unit[s->p][s->i].val; - if (s.last_val != val) { + if (s->last_val != val) { int64_t delta = 0; - av_assert2(s.last_val < val); + av_assert2(s->last_val < val); av_assert2(current_mul > 0); if (current_mul > 1) { - delta = val - s.last_val; + delta = val - s->last_val; val = FFMAX(1, (delta + current_mul/2) / current_mul); delta -= val*current_mul; av_assert2(delta <= current_mul/2); av_assert2(delta > -current_mul); - val += s.last_val; + val += s->last_val; } - av_assert2(s.last_val < val); - if (s.lu) { - 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 == sc->unit[s.p][s.i].val); - s.last_val += current_mul + delta; + av_assert2(s->last_val < val); + if (s->lu) { + 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 == sc->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); + 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] ]; + for(int k=0; k<s->run; k++) { + int stack_mul = s->mul[ s->index_stack[k] ]; if (stack_mul>1) - put_symbol_inline(&s.rc, s.state[s.lu][1], s.delta_stack[k], 1, NULL, NULL); - encode_mul(&s, s.index_stack[k+1]); + put_symbol_inline(&s->rc, s->state[s->lu][1], s->delta_stack[k], 1, NULL, NULL); + encode_mul(s, s->index_stack[k+1]); } - if (s.run == 0) - s.lu ^= 1; - s.run = 0; - s.i--; // we did not encode val so we need to backstep - s.last_val += current_mul; + if (s->run == 0) + s->lu ^= 1; + s->run = 0; + s->i--; // we did not encode val so we need to backstep + s->last_val += current_mul; continue; } } else { - av_assert2(s.run == 0); - put_symbol_inline(&s.rc, s.state[s.lu][0], val - s.last_val - 1, 0, NULL, NULL); + 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; + put_symbol_inline(&s->rc, s->state[s->lu][1], delta, 1, NULL, NULL); + if (val - s->last_val == 1) + s->lu ^= 1; - av_assert2(s.i == s.pixel_num || s.last_val + (val - s.last_val) * current_mul + delta == sc->unit[s.p][s.i].val); - if (s.i < s.pixel_num) - s.last_val = sc->unit[s.p][s.i].val; + av_assert2(s->i == s->pixel_num || s->last_val + (val - s->last_val) * current_mul + delta == sc->unit[s->p][s->i].val); + if (s->i < s->pixel_num) + s->last_val = sc->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 ++; + 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) - sc->bitmap[s.p][sc->unit[s.p][s.i].ndx] = s.compact_index; + if (final && s->i < s->pixel_num) + sc->bitmap[s->p][sc->unit[s->p][s->i].ndx] = s->compact_index; } - if (update) { - copy_state(state_arg, &s); - } - return get_rac_count(&s.rc); + return get_rac_count(&s->rc); } static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, const uint8_t *src[4]) { - RemapEncoderState s; - s.pixel_num = sc->slice_width * sc->slice_height; + struct RemapEncoderState *s = &sc->remap_state; + s->pixel_num = sc->slice_width * sc->slice_height; - av_assert0 (s.pixel_num <= 65536); + av_assert0 (s->pixel_num <= 65536); for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) { float score_tab[16] = {0}; int64_t last_val = -1; int best_index = 0; - s.rc = sc->c; - s.i = 0; - s.p = p; + s->rc = sc->c; + s->i = 0; + s->p = p; - s.mul_count = 1; + s->mul_count = 1; - for (int i= 0; i<s.pixel_num; i++) { + for (int i= 0; i<s->pixel_num; i++) { int64_t val = sc->unit[p][i].val; if (val != last_val) { av_assert2(last_val < val); @@ -1422,12 +1381,12 @@ static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, if (score_tab[si] < score_tab[ best_index ]) best_index = si; } - s.mul[0] = -1 << best_index; - s.mul[s.mul_count] = 1; + s->mul[0] = -1 << best_index; + s->mul[s->mul_count] = 1; - encode_float32_remap_segment(sc, &s, 1, 1); + encode_float32_remap_segment(sc, 1); - sc->c = s.rc; + sc->c = s->rc; } } -- 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".