You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc/ffv1: always use the main context values of ac
It cannot change between slices.
This commit is contained in:
		| @@ -59,7 +59,7 @@ av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1Context *fs) | ||||
|     for (j = 0; j < f->plane_count; j++) { | ||||
|         PlaneContext *const p = &fs->plane[j]; | ||||
|  | ||||
|         if (fs->ac != AC_GOLOMB_RICE) { | ||||
|         if (f->ac != AC_GOLOMB_RICE) { | ||||
|             if (!p->state) | ||||
|                 p->state = av_malloc_array(p->context_count, CONTEXT_SIZE * | ||||
|                                      sizeof(uint8_t)); | ||||
| @@ -78,7 +78,7 @@ av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1Context *fs) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (fs->ac == AC_RANGE_CUSTOM_TAB) { | ||||
|     if (f->ac == AC_RANGE_CUSTOM_TAB) { | ||||
|         //FIXME only redo if state_transition changed | ||||
|         for (j = 1; j < 256; j++) { | ||||
|             fs->c. one_state[      j] = f->state_transition[j]; | ||||
| @@ -167,7 +167,7 @@ void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1Context *fs) | ||||
|     for (i = 0; i < f->plane_count; i++) { | ||||
|         PlaneContext *p = &fs->plane[i]; | ||||
|  | ||||
|         if (fs->ac != AC_GOLOMB_RICE) { | ||||
|         if (f->ac != AC_GOLOMB_RICE) { | ||||
|             if (f->initial_states[p->quant_table_index]) { | ||||
|                 memcpy(p->state, f->initial_states[p->quant_table_index], | ||||
|                        CONTEXT_SIZE * p->context_count); | ||||
|   | ||||
| @@ -94,10 +94,9 @@ static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state, | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static int is_input_end(FFV1Context *s, GetBitContext *gb) | ||||
| static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac) | ||||
| { | ||||
|     if (s->ac != AC_GOLOMB_RICE) { | ||||
|         RangeCoder *const c = &s->c; | ||||
|     if (ac != AC_GOLOMB_RICE) { | ||||
|         if (c->overread > MAX_OVERREAD) | ||||
|             return AVERROR_INVALIDDATA; | ||||
|     } else { | ||||
| @@ -123,6 +122,7 @@ static int decode_plane(FFV1Context *f, | ||||
|                         uint8_t *src, int w, int h, int stride, int plane_index, | ||||
|                          int pixel_stride) | ||||
| { | ||||
|     const int ac = f->ac; | ||||
|     int x, y; | ||||
|     int16_t *sample[2]; | ||||
|     sample[0] = sc->sample_buffer + 3; | ||||
| @@ -142,13 +142,13 @@ static int decode_plane(FFV1Context *f, | ||||
|         sample[0][w]  = sample[0][w - 1]; | ||||
|  | ||||
|         if (s->avctx->bits_per_raw_sample <= 8) { | ||||
|             int ret = decode_line(f, s, sc, gb, w, sample, plane_index, 8); | ||||
|             int ret = decode_line(f, s, sc, gb, w, sample, plane_index, 8, ac); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|             for (x = 0; x < w; x++) | ||||
|                 src[x*pixel_stride + stride * y] = sample[1][x]; | ||||
|         } else { | ||||
|             int ret = decode_line(f, s, sc, gb, w, sample, plane_index, s->avctx->bits_per_raw_sample); | ||||
|             int ret = decode_line(f, s, sc, gb, w, sample, plane_index, s->avctx->bits_per_raw_sample, ac); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|             if (s->packed_at_lsb) { | ||||
| @@ -197,7 +197,7 @@ static int decode_slice_header(const FFV1Context *f, FFV1Context *fs, | ||||
|     av_assert0 (   (unsigned)sc->slice_x + (uint64_t)sc->slice_width  <= f->width | ||||
|                 && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height); | ||||
|  | ||||
|     if (fs->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23)) | ||||
|     if (f->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23)) | ||||
|         return AVERROR_INVALIDDATA; | ||||
|  | ||||
|     for (unsigned i = 0; i < f->plane_count; i++) { | ||||
| @@ -284,7 +284,7 @@ static int decode_slice(AVCodecContext *c, void *arg) | ||||
|             pdst->state = NULL; | ||||
|             pdst->vlc_state = NULL; | ||||
|  | ||||
|             if (fssrc->ac) { | ||||
|             if (f->ac) { | ||||
|                 pdst->state = av_malloc_array(CONTEXT_SIZE,  psrc->context_count); | ||||
|                 memcpy(pdst->state, psrc->state, CONTEXT_SIZE * psrc->context_count); | ||||
|             } else { | ||||
| @@ -319,7 +319,7 @@ static int decode_slice(AVCodecContext *c, void *arg) | ||||
|     x      = sc->slice_x; | ||||
|     y      = sc->slice_y; | ||||
|  | ||||
|     if (fs->ac == AC_GOLOMB_RICE) { | ||||
|     if (f->ac == AC_GOLOMB_RICE) { | ||||
|         if (f->version == 3 && f->micro_version > 1 || f->version > 3) | ||||
|             get_rac(&fs->c, (uint8_t[]) { 129 }); | ||||
|         fs->ac_byte_count = f->version > 2 || (!x && !y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0; | ||||
| @@ -358,7 +358,7 @@ static int decode_slice(AVCodecContext *c, void *arg) | ||||
|                                p->data[3] + ps * x + y * p->linesize[3] }; | ||||
|         decode_rgb_frame(f, fs, sc, &gb, planes, width, height, p->linesize); | ||||
|     } | ||||
|     if (fs->ac != AC_GOLOMB_RICE && f->version > 2) { | ||||
|     if (f->ac != AC_GOLOMB_RICE && f->version > 2) { | ||||
|         int v; | ||||
|         get_rac(&fs->c, (uint8_t[]) { 129 }); | ||||
|         v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5*f->ec; | ||||
| @@ -791,7 +791,6 @@ static int read_header(FFV1Context *f) | ||||
|     for (int j = 0; j < f->slice_count; j++) { | ||||
|         FFV1Context *fs = f->slice_context[j]; | ||||
|         FFV1SliceContext *sc = &f->slices[j]; | ||||
|         fs->ac            = f->ac; | ||||
|         fs->packed_at_lsb = f->packed_at_lsb; | ||||
|  | ||||
|         fs->slice_damaged = 0; | ||||
|   | ||||
| @@ -26,7 +26,8 @@ static av_always_inline int | ||||
| RENAME(decode_line)(FFV1Context *f, | ||||
|                     FFV1Context *s, FFV1SliceContext *sc, | ||||
|                     GetBitContext *gb, | ||||
|                     int w, TYPE *sample[2], int plane_index, int bits) | ||||
|                     int w, TYPE *sample[2], int plane_index, int bits, | ||||
|                     int ac) | ||||
| { | ||||
|     PlaneContext *const p = &s->plane[plane_index]; | ||||
|     RangeCoder *const c   = &s->c; | ||||
| @@ -36,7 +37,7 @@ RENAME(decode_line)(FFV1Context *f, | ||||
|     int run_mode  = 0; | ||||
|     int run_index = sc->run_index; | ||||
|  | ||||
|     if (is_input_end(s, gb)) | ||||
|     if (is_input_end(c, gb, ac)) | ||||
|         return AVERROR_INVALIDDATA; | ||||
|  | ||||
|     if (sc->slice_coding_mode == 1) { | ||||
| @@ -56,7 +57,7 @@ RENAME(decode_line)(FFV1Context *f, | ||||
|         int diff, context, sign; | ||||
|  | ||||
|         if (!(x & 1023)) { | ||||
|             if (is_input_end(s, gb)) | ||||
|             if (is_input_end(c, gb, ac)) | ||||
|                 return AVERROR_INVALIDDATA; | ||||
|         } | ||||
|  | ||||
| @@ -70,7 +71,7 @@ RENAME(decode_line)(FFV1Context *f, | ||||
|  | ||||
|         av_assert2(context < p->context_count); | ||||
|  | ||||
|         if (s->ac != AC_GOLOMB_RICE) { | ||||
|         if (ac != AC_GOLOMB_RICE) { | ||||
|             diff = get_symbol_inline(c, p->state[context], 1); | ||||
|         } else { | ||||
|             if (context == 0 && run_mode == 0) | ||||
| @@ -142,6 +143,7 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f, | ||||
|     int bits   = s->avctx->bits_per_raw_sample > 0 ? s->avctx->bits_per_raw_sample : 8; | ||||
|     int offset = 1 << bits; | ||||
|     int transparency = f->transparency; | ||||
|     int ac = f->ac; | ||||
|  | ||||
|     for (x = 0; x < 4; x++) { | ||||
|         sample[x][0] = RENAME(sc->sample_buffer) +  x * 2      * (w + 6) + 3; | ||||
| @@ -163,9 +165,9 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f, | ||||
|             sample[p][1][-1]= sample[p][0][0  ]; | ||||
|             sample[p][0][ w]= sample[p][0][w-1]; | ||||
|             if (lbd && sc->slice_coding_mode == 0) | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, 9); | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, 9, ac); | ||||
|             else | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, bits + (sc->slice_coding_mode != 1)); | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, bits + (sc->slice_coding_mode != 1), ac); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|         } | ||||
|   | ||||
| @@ -275,6 +275,7 @@ static int encode_plane(FFV1Context *f, | ||||
|                          int stride, int plane_index, int pixel_stride) | ||||
| { | ||||
|     int x, y, i, ret; | ||||
|     const int ac = f->ac; | ||||
|     const int ring_size = s->context_model ? 3 : 2; | ||||
|     int16_t *sample[3]; | ||||
|     sc->run_index = 0; | ||||
| @@ -290,7 +291,7 @@ static int encode_plane(FFV1Context *f, | ||||
|         if (s->bits_per_raw_sample <= 8) { | ||||
|             for (x = 0; x < w; x++) | ||||
|                 sample[0][x] = src[x * pixel_stride + stride * y]; | ||||
|             if((ret = encode_line(f, s, sc, w, sample, plane_index, 8)) < 0) | ||||
|             if((ret = encode_line(f, s, sc, w, sample, plane_index, 8, ac)) < 0) | ||||
|                 return ret; | ||||
|         } else { | ||||
|             if (s->packed_at_lsb) { | ||||
| @@ -302,7 +303,7 @@ static int encode_plane(FFV1Context *f, | ||||
|                     sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample); | ||||
|                 } | ||||
|             } | ||||
|             if((ret = encode_line(f, s, sc, w, sample, plane_index, s->bits_per_raw_sample)) < 0) | ||||
|             if((ret = encode_line(f, s, sc, w, sample, plane_index, s->bits_per_raw_sample, ac)) < 0) | ||||
|                 return ret; | ||||
|         } | ||||
|     } | ||||
| @@ -1053,7 +1054,7 @@ retry: | ||||
|     if (f->version > 2) { | ||||
|         encode_slice_header(f, fs, sc); | ||||
|     } | ||||
|     if (fs->ac == AC_GOLOMB_RICE) { | ||||
|     if (f->ac == AC_GOLOMB_RICE) { | ||||
|         fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c, f->version > 2) : 0; | ||||
|         init_put_bits(&sc->pb, | ||||
|                       fs->c.bytestream_start + fs->ac_byte_count, | ||||
| @@ -1085,7 +1086,7 @@ retry: | ||||
|  | ||||
|     if (ret < 0) { | ||||
|         av_assert0(sc->slice_coding_mode == 0); | ||||
|         if (fs->version < 4 || !fs->ac) { | ||||
|         if (fs->version < 4 || !f->ac) { | ||||
|             av_log(c, AV_LOG_ERROR, "Buffer too small\n"); | ||||
|             return ret; | ||||
|         } | ||||
| @@ -1210,7 +1211,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, | ||||
|         FFV1SliceContext *sc = &f->slices[i]; | ||||
|         int bytes; | ||||
|  | ||||
|         if (fs->ac != AC_GOLOMB_RICE) { | ||||
|         if (f->ac != AC_GOLOMB_RICE) { | ||||
|             bytes = ff_rac_terminate(&fs->c, 1); | ||||
|         } else { | ||||
|             flush_put_bits(&sc->pb); // FIXME: nicer padding | ||||
|   | ||||
| @@ -25,7 +25,8 @@ | ||||
| static av_always_inline int | ||||
| RENAME(encode_line)(FFV1Context *f, | ||||
|                     FFV1Context *s, FFV1SliceContext *sc, | ||||
|                     int w, TYPE *sample[3], int plane_index, int bits) | ||||
|                     int w, TYPE *sample[3], int plane_index, int bits, | ||||
|                     int ac) | ||||
| { | ||||
|     PlaneContext *const p = &s->plane[plane_index]; | ||||
|     RangeCoder *const c   = &s->c; | ||||
| @@ -34,7 +35,7 @@ RENAME(encode_line)(FFV1Context *f, | ||||
|     int run_count = 0; | ||||
|     int run_mode  = 0; | ||||
|  | ||||
|     if (s->ac != AC_GOLOMB_RICE) { | ||||
|     if (ac != AC_GOLOMB_RICE) { | ||||
|         if (c->bytestream_end - c->bytestream < w * 35) { | ||||
|             av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | ||||
|             return AVERROR_INVALIDDATA; | ||||
| @@ -72,7 +73,7 @@ RENAME(encode_line)(FFV1Context *f, | ||||
|  | ||||
|         diff = fold(diff, bits); | ||||
|  | ||||
|         if (s->ac != AC_GOLOMB_RICE) { | ||||
|         if (ac != AC_GOLOMB_RICE) { | ||||
|             if (s->flags & AV_CODEC_FLAG_PASS1) { | ||||
|                 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, | ||||
|                                   s->rc_stat2[p->quant_table_index][context]); | ||||
| @@ -134,6 +135,7 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, | ||||
|     int x, y, p, i; | ||||
|     const int ring_size = s->context_model ? 3 : 2; | ||||
|     TYPE *sample[4][3]; | ||||
|     const int ac = f->ac; | ||||
|     int lbd    = s->bits_per_raw_sample <= 8; | ||||
|     int packed = !src[1]; | ||||
|     int bits   = s->bits_per_raw_sample > 0 ? s->bits_per_raw_sample : 8; | ||||
| @@ -196,9 +198,9 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, | ||||
|             sample[p][0][-1] = sample[p][1][0  ]; | ||||
|             sample[p][1][ w] = sample[p][1][w-1]; | ||||
|             if (lbd && sc->slice_coding_mode == 0) | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, 9); | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, 9, ac); | ||||
|             else | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, bits + (sc->slice_coding_mode != 1)); | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, bits + (sc->slice_coding_mode != 1), ac); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user