diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index 9221cc15b3..bdc7b862d0 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -128,6 +128,8 @@ typedef struct FFV1Context { int slice_height; int slice_x; int slice_y; + int slice_reset_contexts; + int slice_coding_mode; } FFV1Context; int ffv1_common_init(AVCodecContext *avctx); diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index c600ce8d25..5455660819 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -105,6 +105,19 @@ static av_always_inline void decode_line(FFV1Context *s, int w, int run_mode = 0; int run_index = s->run_index; + if (s->slice_coding_mode == 1) { + int i; + for (x = 0; x < w; x++) { + int v = 0; + for (i=0; islice_coding_mode == 0) decode_line(s, w, sample[p], (p + 1)/2, 9); else - decode_line(s, w, sample[p], (p + 1)/2, bits + 1); + decode_line(s, w, sample[p], (p + 1)/2, bits + (s->slice_coding_mode != 1)); } for (x = 0; x < w; x++) { int g = sample[0][1][x]; @@ -244,11 +257,13 @@ static void decode_rgb_frame(FFV1Context *s, uint8_t *src[3], int w, int h, int int r = sample[2][1][x]; int a = sample[3][1][x]; - b -= offset; - r -= offset; - g -= (b + r) >> 2; - b += g; - r += g; + if (s->slice_coding_mode != 1) { + b -= offset; + r -= offset; + g -= (b + r) >> 2; + b += g; + r += g; + } if (lbd) *((uint32_t*)(src[0] + x*4 + stride[0]*y)) = b + (g<<8) + (r<<16) + (a<<24); @@ -315,7 +330,10 @@ static int decode_slice_header(FFV1Context *f, FFV1Context *fs) } f->cur->sample_aspect_ratio.num = get_symbol(c, state, 0); f->cur->sample_aspect_ratio.den = get_symbol(c, state, 0); - + if (fs->version > 3) { + fs->slice_reset_contexts = get_rac(c, state); + fs->slice_coding_mode = get_symbol(c, state, 0); + } return 0; } @@ -373,7 +391,7 @@ static int decode_slice(AVCodecContext *c, void *arg) } if ((ret = ffv1_init_slice_state(f, fs)) < 0) return ret; - if (f->cur->key_frame) + if (f->cur->key_frame || fs->slice_reset_contexts) ffv1_clear_slice_state(f, fs); width = fs->slice_width;