|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|