From f7813a5324be39d13ab536c245d15dfc602a7849 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Sun, 29 Dec 2013 12:19:38 +0000 Subject: basic type mechanism working --- ffmpeg/libavcodec/mss4.c | 68 ++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 31 deletions(-) (limited to 'ffmpeg/libavcodec/mss4.c') diff --git a/ffmpeg/libavcodec/mss4.c b/ffmpeg/libavcodec/mss4.c index 391805f..662cf24 100644 --- a/ffmpeg/libavcodec/mss4.c +++ b/ffmpeg/libavcodec/mss4.c @@ -126,7 +126,7 @@ static const uint8_t mss4_vec_entry_vlc_syms[2][9] = { #define MAX_ENTRIES 162 typedef struct MSS4Context { - AVFrame pic; + AVFrame *pic; VLC dc_vlc[2], ac_vlc[2]; VLC vec_entry_vlc[2]; @@ -297,10 +297,10 @@ static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb, return ret; c->prev_dc[0][mb_x * 2 + i] = c->dc_cache[j][LEFT]; - ff_mss34_dct_put(out + xpos * 8, c->pic.linesize[0], + ff_mss34_dct_put(out + xpos * 8, c->pic->linesize[0], c->block); } - out += 8 * c->pic.linesize[0]; + out += 8 * c->pic->linesize[0]; } for (i = 1; i < 3; i++) { @@ -320,7 +320,7 @@ static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb, for (j = 0; j < 16; j++) { for (k = 0; k < 8; k++) AV_WN16A(out + k * 2, c->imgbuf[i][k + (j & ~1) * 4] * 0x101); - out += c->pic.linesize[i]; + out += c->pic->linesize[i]; } } @@ -481,7 +481,7 @@ static int mss4_decode_image_block(MSS4Context *ctx, GetBitContext *gb, for (i = 0; i < 3; i++) for (j = 0; j < 16; j++) - memcpy(picdst[i] + mb_x * 16 + j * ctx->pic.linesize[i], + memcpy(picdst[i] + mb_x * 16 + j * ctx->pic->linesize[i], ctx->imgbuf[i] + j * 16, 16); return 0; @@ -554,14 +554,14 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return AVERROR_INVALIDDATA; } - if ((ret = ff_reget_buffer(avctx, &c->pic)) < 0) + if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) return ret; - c->pic.key_frame = (frame_type == INTRA_FRAME); - c->pic.pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I + c->pic->key_frame = (frame_type == INTRA_FRAME); + c->pic->pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; if (frame_type == SKIP_FRAME) { *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; @@ -573,13 +573,13 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, ff_mss34_gen_quant_mat(c->quant_mat[i], quality, !i); } - init_get_bits(&gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8); + init_get_bits8(&gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE)); mb_width = FFALIGN(width, 16) >> 4; mb_height = FFALIGN(height, 16) >> 4; - dst[0] = c->pic.data[0]; - dst[1] = c->pic.data[1]; - dst[2] = c->pic.data[2]; + dst[0] = c->pic->data[0]; + dst[1] = c->pic->data[1]; + dst[2] = c->pic->data[2]; memset(c->prev_vec, 0, sizeof(c->prev_vec)); for (y = 0; y < mb_height; y++) { @@ -613,12 +613,12 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if (blk_type != DCT_BLOCK) mss4_update_dc_cache(c, x); } - dst[0] += c->pic.linesize[0] * 16; - dst[1] += c->pic.linesize[1] * 16; - dst[2] += c->pic.linesize[2] * 16; + dst[0] += c->pic->linesize[0] * 16; + dst[1] += c->pic->linesize[1] * 16; + dst[2] += c->pic->linesize[2] * 16; } - if ((ret = av_frame_ref(data, &c->pic)) < 0) + if ((ret = av_frame_ref(data, c->pic)) < 0) return ret; *got_frame = 1; @@ -626,6 +626,19 @@ static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return buf_size; } +static av_cold int mss4_decode_end(AVCodecContext *avctx) +{ + MSS4Context * const c = avctx->priv_data; + int i; + + av_frame_free(&c->pic); + for (i = 0; i < 3; i++) + av_freep(&c->prev_dc[i]); + mss4_free_vlcs(c); + + return 0; +} + static av_cold int mss4_decode_init(AVCodecContext *avctx) { MSS4Context * const c = avctx->priv_data; @@ -646,26 +659,20 @@ static av_cold int mss4_decode_init(AVCodecContext *avctx) } } - avctx->pix_fmt = AV_PIX_FMT_YUV444P; - - return 0; -} - -static av_cold int mss4_decode_end(AVCodecContext *avctx) -{ - MSS4Context * const c = avctx->priv_data; - int i; + c->pic = av_frame_alloc(); + if (!c->pic) { + mss4_decode_end(avctx); + return AVERROR(ENOMEM); + } - av_frame_unref(&c->pic); - for (i = 0; i < 3; i++) - av_freep(&c->prev_dc[i]); - mss4_free_vlcs(c); + avctx->pix_fmt = AV_PIX_FMT_YUV444P; return 0; } AVCodec ff_mts2_decoder = { .name = "mts2", + .long_name = NULL_IF_CONFIG_SMALL("MS Expression Encoder Screen"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_MTS2, .priv_data_size = sizeof(MSS4Context), @@ -673,5 +680,4 @@ AVCodec ff_mts2_decoder = { .close = mss4_decode_end, .decode = mss4_decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("MS Expression Encoder Screen"), }; -- cgit v1.2.3