summaryrefslogtreecommitdiff
path: root/ffmpeg/libavcodec/mss1.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/mss1.c
parentb7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff)
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/mss1.c')
-rw-r--r--ffmpeg/libavcodec/mss1.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/ffmpeg/libavcodec/mss1.c b/ffmpeg/libavcodec/mss1.c
index bb1858d..fc88eb0 100644
--- a/ffmpeg/libavcodec/mss1.c
+++ b/ffmpeg/libavcodec/mss1.c
@@ -30,7 +30,7 @@
typedef struct MSS1Context {
MSS12Context ctx;
- AVFrame pic;
+ AVFrame *pic;
SliceContext sc;
} MSS1Context;
@@ -139,8 +139,6 @@ static int decode_pal(MSS12Context *ctx, ArithCoder *acoder)
static int mss1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
AVPacket *avpkt)
{
- const uint8_t *buf = avpkt->data;
- int buf_size = avpkt->size;
MSS1Context *ctx = avctx->priv_data;
MSS12Context *c = &ctx->ctx;
GetBitContext gb;
@@ -148,41 +146,43 @@ static int mss1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
int pal_changed = 0;
int ret;
- init_get_bits(&gb, buf, buf_size * 8);
+ if ((ret = init_get_bits8(&gb, avpkt->data, avpkt->size)) < 0)
+ return ret;
+
arith_init(&acoder, &gb);
- if ((ret = ff_reget_buffer(avctx, &ctx->pic)) < 0)
+ if ((ret = ff_reget_buffer(avctx, ctx->pic)) < 0)
return ret;
- c->pal_pic = ctx->pic.data[0] + ctx->pic.linesize[0] * (avctx->height - 1);
- c->pal_stride = -ctx->pic.linesize[0];
+ c->pal_pic = ctx->pic->data[0] + ctx->pic->linesize[0] * (avctx->height - 1);
+ c->pal_stride = -ctx->pic->linesize[0];
c->keyframe = !arith_get_bit(&acoder);
if (c->keyframe) {
c->corrupted = 0;
ff_mss12_slicecontext_reset(&ctx->sc);
pal_changed = decode_pal(c, &acoder);
- ctx->pic.key_frame = 1;
- ctx->pic.pict_type = AV_PICTURE_TYPE_I;
+ ctx->pic->key_frame = 1;
+ ctx->pic->pict_type = AV_PICTURE_TYPE_I;
} else {
if (c->corrupted)
return AVERROR_INVALIDDATA;
- ctx->pic.key_frame = 0;
- ctx->pic.pict_type = AV_PICTURE_TYPE_P;
+ ctx->pic->key_frame = 0;
+ ctx->pic->pict_type = AV_PICTURE_TYPE_P;
}
c->corrupted = ff_mss12_decode_rect(&ctx->sc, &acoder, 0, 0,
avctx->width, avctx->height);
if (c->corrupted)
return AVERROR_INVALIDDATA;
- memcpy(ctx->pic.data[1], c->pal, AVPALETTE_SIZE);
- ctx->pic.palette_has_changed = pal_changed;
+ memcpy(ctx->pic->data[1], c->pal, AVPALETTE_SIZE);
+ ctx->pic->palette_has_changed = pal_changed;
- if ((ret = av_frame_ref(data, &ctx->pic)) < 0)
+ if ((ret = av_frame_ref(data, ctx->pic)) < 0)
return ret;
*got_frame = 1;
/* always report that the buffer was completely consumed */
- return buf_size;
+ return avpkt->size;
}
static av_cold int mss1_decode_init(AVCodecContext *avctx)
@@ -192,7 +192,9 @@ static av_cold int mss1_decode_init(AVCodecContext *avctx)
c->ctx.avctx = avctx;
- avcodec_get_frame_defaults(&c->pic);
+ c->pic = av_frame_alloc();
+ if (!c->pic)
+ return AVERROR(ENOMEM);
ret = ff_mss12_decode_init(&c->ctx, 0, &c->sc, NULL);
@@ -205,7 +207,7 @@ static av_cold int mss1_decode_end(AVCodecContext *avctx)
{
MSS1Context * const ctx = avctx->priv_data;
- av_frame_unref(&ctx->pic);
+ av_frame_free(&ctx->pic);
ff_mss12_decode_end(&ctx->ctx);
return 0;
@@ -213,6 +215,7 @@ static av_cold int mss1_decode_end(AVCodecContext *avctx)
AVCodec ff_mss1_decoder = {
.name = "mss1",
+ .long_name = NULL_IF_CONFIG_SMALL("MS Screen 1"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_MSS1,
.priv_data_size = sizeof(MSS1Context),
@@ -220,5 +223,4 @@ AVCodec ff_mss1_decoder = {
.close = mss1_decode_end,
.decode = mss1_decode_frame,
.capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("MS Screen 1"),
};