summaryrefslogtreecommitdiff
path: root/ffmpeg/libavcodec/tscc2.c
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
committerTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
commitf7813a5324be39d13ab536c245d15dfc602a7849 (patch)
treefad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavcodec/tscc2.c
parentb7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff)
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/tscc2.c')
-rw-r--r--ffmpeg/libavcodec/tscc2.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/ffmpeg/libavcodec/tscc2.c b/ffmpeg/libavcodec/tscc2.c
index f275ff9..bdc7525 100644
--- a/ffmpeg/libavcodec/tscc2.c
+++ b/ffmpeg/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];
@@ -192,7 +192,8 @@ static int tscc2_decode_slice(TSCC2Context *c, int mb_y,
int i, mb_x, q, ret;
int off;
- init_get_bits(&c->gb, buf, buf_size * 8);
+ if ((ret = init_get_bits8(&c->gb, buf, buf_size)) < 0)
+ return ret;
for (mb_x = 0; mb_x < c->mb_width; mb_x++) {
q = c->slice_quants[mb_x + c->mb_width * mb_y];
@@ -200,9 +201,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,12 +231,13 @@ 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) {
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;
@@ -320,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;
@@ -350,22 +363,18 @@ 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;
}
AVCodec ff_tscc2_decoder = {
.name = "tscc2",
+ .long_name = NULL_IF_CONFIG_SMALL("TechSmith Screen Codec 2"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_TSCC2,
.priv_data_size = sizeof(TSCC2Context),
@@ -373,5 +382,4 @@ AVCodec ff_tscc2_decoder = {
.close = tscc2_decode_end,
.decode = tscc2_decode_frame,
.capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("TechSmith Screen Codec 2"),
};