diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-03-18 18:53:51 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-03-22 23:10:48 +0400 |
commit | 4e33582a0bfad3f066b65a8534cc9f561d4aff3c (patch) | |
tree | 2aa13bdd5f9b3fea478adc8feddc4ab57abec308 /libavcodec/tscc2.c | |
parent | 20a8ee3061e6d777600c13db731bee3c25878991 (diff) |
tscc2: allocate AVFrame properly.
Diffstat (limited to 'libavcodec/tscc2.c')
-rw-r--r-- | libavcodec/tscc2.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/libavcodec/tscc2.c b/libavcodec/tscc2.c index 439de91b40..aae7119e3a 100644 --- a/libavcodec/tscc2.c +++ b/libavcodec/tscc2.c @@ -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; } |