You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	mss4: make code independent of sizeof(AVFrame)
Also fixes #2455. Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
		| @@ -126,7 +126,7 @@ static const uint8_t mss4_vec_entry_vlc_syms[2][9] = { | ||||
| #define MAX_ENTRIES  162 | ||||
|  | ||||
| typedef struct MSS4Context { | ||||
|     AVFrame    pic; | ||||
|     AVFrame    *pic; | ||||
|  | ||||
|     VLC        dc_vlc[2], ac_vlc[2]; | ||||
|     VLC        vec_entry_vlc[2]; | ||||
| @@ -297,10 +297,10 @@ static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb, | ||||
|                 return ret; | ||||
|             c->prev_dc[0][mb_x * 2 + i] = c->dc_cache[j][LEFT]; | ||||
|  | ||||
|             ff_mss34_dct_put(out + xpos * 8, c->pic.linesize[0], | ||||
|             ff_mss34_dct_put(out + xpos * 8, c->pic->linesize[0], | ||||
|                              c->block); | ||||
|         } | ||||
|         out += 8 * c->pic.linesize[0]; | ||||
|         out += 8 * c->pic->linesize[0]; | ||||
|     } | ||||
|  | ||||
|     for (i = 1; i < 3; i++) { | ||||
| @@ -320,7 +320,7 @@ static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb, | ||||
|         for (j = 0; j < 16; j++) { | ||||
|             for (k = 0; k < 8; k++) | ||||
|                 AV_WN16A(out + k * 2, c->imgbuf[i][k + (j & ~1) * 4] * 0x101); | ||||
|             out += c->pic.linesize[i]; | ||||
|             out += c->pic->linesize[i]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -481,7 +481,7 @@ static int mss4_decode_image_block(MSS4Context *ctx, GetBitContext *gb, | ||||
|  | ||||
|     for (i = 0; i < 3; i++) | ||||
|         for (j = 0; j < 16; j++) | ||||
|             memcpy(picdst[i] + mb_x * 16 + j * ctx->pic.linesize[i], | ||||
|             memcpy(picdst[i] + mb_x * 16 + j * ctx->pic->linesize[i], | ||||
|                    ctx->imgbuf[i] + j * 16, 16); | ||||
|  | ||||
|     return 0; | ||||
| @@ -554,14 +554,14 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | ||||
|         return AVERROR_INVALIDDATA; | ||||
|     } | ||||
|  | ||||
|     if ((ret = ff_reget_buffer(avctx, &c->pic)) < 0) | ||||
|     if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) | ||||
|         return ret; | ||||
|     c->pic.key_frame = (frame_type == INTRA_FRAME); | ||||
|     c->pic.pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I | ||||
|     c->pic->key_frame = (frame_type == INTRA_FRAME); | ||||
|     c->pic->pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I | ||||
|                                                    : AV_PICTURE_TYPE_P; | ||||
|     if (frame_type == SKIP_FRAME) { | ||||
|         *got_frame      = 1; | ||||
|         if ((ret = av_frame_ref(data, &c->pic)) < 0) | ||||
|         if ((ret = av_frame_ref(data, c->pic)) < 0) | ||||
|             return ret; | ||||
|  | ||||
|         return buf_size; | ||||
| @@ -577,9 +577,9 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | ||||
|  | ||||
|     mb_width  = FFALIGN(width,  16) >> 4; | ||||
|     mb_height = FFALIGN(height, 16) >> 4; | ||||
|     dst[0] = c->pic.data[0]; | ||||
|     dst[1] = c->pic.data[1]; | ||||
|     dst[2] = c->pic.data[2]; | ||||
|     dst[0] = c->pic->data[0]; | ||||
|     dst[1] = c->pic->data[1]; | ||||
|     dst[2] = c->pic->data[2]; | ||||
|  | ||||
|     memset(c->prev_vec, 0, sizeof(c->prev_vec)); | ||||
|     for (y = 0; y < mb_height; y++) { | ||||
| @@ -613,12 +613,12 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | ||||
|             if (blk_type != DCT_BLOCK) | ||||
|                 mss4_update_dc_cache(c, x); | ||||
|         } | ||||
|         dst[0] += c->pic.linesize[0] * 16; | ||||
|         dst[1] += c->pic.linesize[1] * 16; | ||||
|         dst[2] += c->pic.linesize[2] * 16; | ||||
|         dst[0] += c->pic->linesize[0] * 16; | ||||
|         dst[1] += c->pic->linesize[1] * 16; | ||||
|         dst[2] += c->pic->linesize[2] * 16; | ||||
|     } | ||||
|  | ||||
|     if ((ret = av_frame_ref(data, &c->pic)) < 0) | ||||
|     if ((ret = av_frame_ref(data, c->pic)) < 0) | ||||
|         return ret; | ||||
|  | ||||
|     *got_frame      = 1; | ||||
| @@ -631,6 +631,10 @@ static av_cold int mss4_decode_init(AVCodecContext *avctx) | ||||
|     MSS4Context * const c = avctx->priv_data; | ||||
|     int i; | ||||
|  | ||||
|     c->pic = av_frame_alloc(); | ||||
|     if (!c->pic) | ||||
|         return AVERROR(ENOMEM); | ||||
|  | ||||
|     if (mss4_init_vlcs(c)) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Cannot initialise VLCs\n"); | ||||
|         mss4_free_vlcs(c); | ||||
| @@ -656,7 +660,8 @@ static av_cold int mss4_decode_end(AVCodecContext *avctx) | ||||
|     MSS4Context * const c = avctx->priv_data; | ||||
|     int i; | ||||
|  | ||||
|     av_frame_unref(&c->pic); | ||||
|     av_frame_free(&c->pic); | ||||
|  | ||||
|     for (i = 0; i < 3; i++) | ||||
|         av_freep(&c->prev_dc[i]); | ||||
|     mss4_free_vlcs(c); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user