You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc/ffv1: move FFV1Context.slice_{coding_mode,rct_.y_coef} to per-slice context
This commit is contained in:
		| @@ -77,6 +77,9 @@ typedef struct FFV1SliceContext { | ||||
|     int slice_y; | ||||
|  | ||||
|     int run_index; | ||||
|     int slice_coding_mode; | ||||
|     int slice_rct_by_coef; | ||||
|     int slice_rct_ry_coef; | ||||
|  | ||||
|     PutBitContext pb; | ||||
| } FFV1SliceContext; | ||||
| @@ -130,9 +133,6 @@ typedef struct FFV1Context { | ||||
|     int num_v_slices; | ||||
|     int num_h_slices; | ||||
|     int slice_reset_contexts; | ||||
|     int slice_coding_mode; | ||||
|     int slice_rct_by_coef; | ||||
|     int slice_rct_ry_coef; | ||||
|  | ||||
|     FFV1SliceContext *slices; | ||||
| } FFV1Context; | ||||
|   | ||||
| @@ -240,11 +240,11 @@ static int decode_slice_header(const FFV1Context *f, FFV1Context *fs, | ||||
|  | ||||
|     if (fs->version > 3) { | ||||
|         fs->slice_reset_contexts = get_rac(c, state); | ||||
|         fs->slice_coding_mode = get_symbol(c, state, 0); | ||||
|         if (fs->slice_coding_mode != 1) { | ||||
|             fs->slice_rct_by_coef = get_symbol(c, state, 0); | ||||
|             fs->slice_rct_ry_coef = get_symbol(c, state, 0); | ||||
|             if ((uint64_t)fs->slice_rct_by_coef + (uint64_t)fs->slice_rct_ry_coef > 4) { | ||||
|         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); | ||||
|             sc->slice_rct_ry_coef = get_symbol(c, state, 0); | ||||
|             if ((uint64_t)sc->slice_rct_by_coef + (uint64_t)sc->slice_rct_ry_coef > 4) { | ||||
|                 av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n"); | ||||
|                 return AVERROR_INVALIDDATA; | ||||
|             } | ||||
| @@ -294,8 +294,8 @@ static int decode_slice(AVCodecContext *c, void *arg) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fs->slice_rct_by_coef = 1; | ||||
|     fs->slice_rct_ry_coef = 1; | ||||
|     sc->slice_rct_by_coef = 1; | ||||
|     sc->slice_rct_ry_coef = 1; | ||||
|  | ||||
|     if (f->version > 2) { | ||||
|         if (ff_ffv1_init_slice_state(f, fs) < 0) | ||||
|   | ||||
| @@ -39,7 +39,7 @@ RENAME(decode_line)(FFV1Context *f, | ||||
|     if (is_input_end(s, gb)) | ||||
|         return AVERROR_INVALIDDATA; | ||||
|  | ||||
|     if (s->slice_coding_mode == 1) { | ||||
|     if (sc->slice_coding_mode == 1) { | ||||
|         int i; | ||||
|         for (x = 0; x < w; x++) { | ||||
|             int v = 0; | ||||
| @@ -162,10 +162,10 @@ 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 && s->slice_coding_mode == 0) | ||||
|             if (lbd && sc->slice_coding_mode == 0) | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, 9); | ||||
|             else | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, bits + (s->slice_coding_mode != 1)); | ||||
|                 ret = RENAME(decode_line)(f, s, sc, gb, w, sample[p], (p + 1)/2, bits + (sc->slice_coding_mode != 1)); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|         } | ||||
| @@ -175,10 +175,10 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f, | ||||
|             int r = sample[2][1][x]; | ||||
|             int a = sample[3][1][x]; | ||||
|  | ||||
|             if (s->slice_coding_mode != 1) { | ||||
|             if (sc->slice_coding_mode != 1) { | ||||
|                 b -= offset; | ||||
|                 r -= offset; | ||||
|                 g -= (b * s->slice_rct_by_coef + r * s->slice_rct_ry_coef) >> 2; | ||||
|                 g -= (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2; | ||||
|                 b += g; | ||||
|                 r += g; | ||||
|             } | ||||
|   | ||||
| @@ -926,13 +926,13 @@ static void encode_slice_header(FFV1Context *f, FFV1Context *fs, | ||||
|     put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.num, 0); | ||||
|     put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.den, 0); | ||||
|     if (f->version > 3) { | ||||
|         put_rac(c, state, fs->slice_coding_mode == 1); | ||||
|         if (fs->slice_coding_mode == 1) | ||||
|         put_rac(c, state, sc->slice_coding_mode == 1); | ||||
|         if (sc->slice_coding_mode == 1) | ||||
|             ff_ffv1_clear_slice_state(f, fs); | ||||
|         put_symbol(c, state, fs->slice_coding_mode, 0); | ||||
|         if (fs->slice_coding_mode != 1) { | ||||
|             put_symbol(c, state, fs->slice_rct_by_coef, 0); | ||||
|             put_symbol(c, state, fs->slice_rct_ry_coef, 0); | ||||
|         put_symbol(c, state, sc->slice_coding_mode, 0); | ||||
|         if (sc->slice_coding_mode != 1) { | ||||
|             put_symbol(c, state, sc->slice_rct_by_coef, 0); | ||||
|             put_symbol(c, state, sc->slice_rct_ry_coef, 0); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1016,8 +1016,8 @@ static void choose_rct_params(FFV1Context *fs, FFV1SliceContext *sc, | ||||
|             best = i; | ||||
|     } | ||||
|  | ||||
|     fs->slice_rct_by_coef = rct_y_coeff[best][1]; | ||||
|     fs->slice_rct_ry_coef = rct_y_coeff[best][0]; | ||||
|     sc->slice_rct_by_coef = rct_y_coeff[best][1]; | ||||
|     sc->slice_rct_ry_coef = rct_y_coeff[best][0]; | ||||
| } | ||||
|  | ||||
| static int encode_slice(AVCodecContext *c, void *arg) | ||||
| @@ -1039,12 +1039,12 @@ static int encode_slice(AVCodecContext *c, void *arg) | ||||
|                                 p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL, | ||||
|                                 p->data[3] ? p->data[3] + ps*x + y*p->linesize[3] : NULL}; | ||||
|  | ||||
|     fs->slice_coding_mode = 0; | ||||
|     sc->slice_coding_mode = 0; | ||||
|     if (f->version > 3) { | ||||
|         choose_rct_params(fs, sc, planes, p->linesize, width, height); | ||||
|     } else { | ||||
|         fs->slice_rct_by_coef = 1; | ||||
|         fs->slice_rct_ry_coef = 1; | ||||
|         sc->slice_rct_by_coef = 1; | ||||
|         sc->slice_rct_ry_coef = 1; | ||||
|     } | ||||
|  | ||||
| retry: | ||||
| @@ -1084,13 +1084,13 @@ retry: | ||||
|     } | ||||
|  | ||||
|     if (ret < 0) { | ||||
|         av_assert0(fs->slice_coding_mode == 0); | ||||
|         av_assert0(sc->slice_coding_mode == 0); | ||||
|         if (fs->version < 4 || !fs->ac) { | ||||
|             av_log(c, AV_LOG_ERROR, "Buffer too small\n"); | ||||
|             return ret; | ||||
|         } | ||||
|         av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n"); | ||||
|         fs->slice_coding_mode = 1; | ||||
|         sc->slice_coding_mode = 1; | ||||
|         fs->c = c_bak; | ||||
|         goto retry; | ||||
|     } | ||||
|   | ||||
| @@ -46,7 +46,7 @@ RENAME(encode_line)(FFV1Context *f, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (s->slice_coding_mode == 1) { | ||||
|     if (sc->slice_coding_mode == 1) { | ||||
|         for (x = 0; x < w; x++) { | ||||
|             int i; | ||||
|             int v = sample[0][x]; | ||||
| @@ -178,10 +178,10 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, | ||||
|                 r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y)); | ||||
|             } | ||||
|  | ||||
|             if (s->slice_coding_mode != 1) { | ||||
|             if (sc->slice_coding_mode != 1) { | ||||
|                 b -= g; | ||||
|                 r -= g; | ||||
|                 g += (b * s->slice_rct_by_coef + r * s->slice_rct_ry_coef) >> 2; | ||||
|                 g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2; | ||||
|                 b += offset; | ||||
|                 r += offset; | ||||
|             } | ||||
| @@ -195,10 +195,10 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, | ||||
|             int ret; | ||||
|             sample[p][0][-1] = sample[p][1][0  ]; | ||||
|             sample[p][1][ w] = sample[p][1][w-1]; | ||||
|             if (lbd && s->slice_coding_mode == 0) | ||||
|             if (lbd && sc->slice_coding_mode == 0) | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, 9); | ||||
|             else | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, bits + (s->slice_coding_mode != 1)); | ||||
|                 ret = RENAME(encode_line)(f, s, sc, w, sample[p], (p + 1) / 2, bits + (sc->slice_coding_mode != 1)); | ||||
|             if (ret < 0) | ||||
|                 return ret; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user