| @@ -33,7 +33,7 @@ | |||
| typedef struct TSCC2Context { | |||
| AVCodecContext *avctx; | |||
| AVFrame pic; | |||
| AVFrame *pic; | |||
| int mb_width, mb_height; | |||
| uint8_t *slice_quants; | |||
| int quant[2]; | |||
| @@ -200,9 +200,9 @@ static int tscc2_decode_slice(TSCC2Context *c, int mb_y, | |||
| if (q == 0 || q == 3) // skip block | |||
| continue; | |||
| for (i = 0; i < 3; i++) { | |||
| off = mb_x * 16 + mb_y * 8 * c->pic.linesize[i]; | |||
| off = mb_x * 16 + mb_y * 8 * c->pic->linesize[i]; | |||
| ret = tscc2_decode_mb(c, c->q[q - 1], c->quant[q - 1] - 2, | |||
| c->pic.data[i] + off, c->pic.linesize[i], i); | |||
| c->pic->data[i] + off, c->pic->linesize[i], i); | |||
| if (ret) | |||
| return ret; | |||
| } | |||
| @@ -230,14 +230,14 @@ static int tscc2_decode_frame(AVCodecContext *avctx, void *data, | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| if ((ret = ff_reget_buffer(avctx, &c->pic)) < 0) { | |||
| if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | |||
| return ret; | |||
| } | |||
| if (frame_type == 0) { | |||
| *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; | |||
| @@ -322,13 +322,24 @@ static int tscc2_decode_frame(AVCodecContext *avctx, void *data, | |||
| } | |||
| *got_frame = 1; | |||
| if ((ret = av_frame_ref(data, &c->pic)) < 0) | |||
| if ((ret = av_frame_ref(data, c->pic)) < 0) | |||
| return ret; | |||
| /* always report that the buffer was completely consumed */ | |||
| return buf_size; | |||
| } | |||
| static av_cold int tscc2_decode_end(AVCodecContext *avctx) | |||
| { | |||
| TSCC2Context * const c = avctx->priv_data; | |||
| av_frame_free(&c->pic); | |||
| av_freep(&c->slice_quants); | |||
| free_vlcs(c); | |||
| return 0; | |||
| } | |||
| static av_cold int tscc2_decode_init(AVCodecContext *avctx) | |||
| { | |||
| TSCC2Context * const c = avctx->priv_data; | |||
| @@ -352,16 +363,11 @@ static av_cold int tscc2_decode_init(AVCodecContext *avctx) | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| return 0; | |||
| } | |||
| static av_cold int tscc2_decode_end(AVCodecContext *avctx) | |||
| { | |||
| TSCC2Context * const c = avctx->priv_data; | |||
| av_frame_unref(&c->pic); | |||
| av_freep(&c->slice_quants); | |||
| free_vlcs(c); | |||
| c->pic = av_frame_alloc(); | |||
| if (!c->pic) { | |||
| tscc2_decode_end(avctx); | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| return 0; | |||
| } | |||