diff options
Diffstat (limited to 'libavcodec/dxa.c')
-rw-r--r-- | libavcodec/dxa.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/libavcodec/dxa.c b/libavcodec/dxa.c index a2fe5578df..5d9da0011f 100644 --- a/libavcodec/dxa.c +++ b/libavcodec/dxa.c @@ -39,7 +39,7 @@ * Decoder context */ typedef struct DxaDecContext { - AVFrame pic, prev; + AVFrame prev; int dsize; uint8_t *decomp_buf; @@ -49,12 +49,12 @@ typedef struct DxaDecContext { static const int shift1[6] = { 0, 8, 8, 8, 4, 4 }; static const int shift2[6] = { 0, 0, 8, 4, 0, 4 }; -static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, uint8_t *src, uint8_t *ref) +static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, + int stride, uint8_t *src, uint8_t *ref) { uint8_t *code, *data, *mv, *msk, *tmp, *tmp2; int i, j, k; int type, x, y, d, d2; - int stride = c->pic.linesize[0]; uint32_t mask; code = src + 12; @@ -192,6 +192,7 @@ static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, uint static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { + AVFrame *frame = data; DxaDecContext * const c = avctx->priv_data; uint8_t *outptr, *srcptr, *tmpptr; unsigned long dsize; @@ -211,17 +212,17 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac pc = 1; } - if ((ret = ff_get_buffer(avctx, &c->pic)) < 0) { + if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } - memcpy(c->pic.data[1], c->pal, AVPALETTE_SIZE); - c->pic.palette_has_changed = pc; + memcpy(frame->data[1], c->pal, AVPALETTE_SIZE); + frame->palette_has_changed = pc; - outptr = c->pic.data[0]; + outptr = frame->data[0]; srcptr = c->decomp_buf; tmpptr = c->prev.data[0]; - stride = c->pic.linesize[0]; + stride = frame->linesize[0]; if (bytestream2_get_le32(&gb) == MKTAG('N','U','L','L')) compr = -1; @@ -239,22 +240,22 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac } switch(compr){ case -1: - c->pic.key_frame = 0; - c->pic.pict_type = AV_PICTURE_TYPE_P; + frame->key_frame = 0; + frame->pict_type = AV_PICTURE_TYPE_P; if(c->prev.data[0]) - memcpy(c->pic.data[0], c->prev.data[0], c->pic.linesize[0] * avctx->height); + memcpy(frame->data[0], c->prev.data[0], frame->linesize[0] * avctx->height); else{ // Should happen only when first frame is 'NULL' - memset(c->pic.data[0], 0, c->pic.linesize[0] * avctx->height); - c->pic.key_frame = 1; - c->pic.pict_type = AV_PICTURE_TYPE_I; + memset(frame->data[0], 0, frame->linesize[0] * avctx->height); + frame->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; } break; case 2: case 3: case 4: case 5: - c->pic.key_frame = !(compr & 1); - c->pic.pict_type = (compr & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; + frame->key_frame = !(compr & 1); + frame->pict_type = (compr & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; for(j = 0; j < avctx->height; j++){ if((compr & 1) && tmpptr){ for(i = 0; i < avctx->width; i++) @@ -268,25 +269,24 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac break; case 12: // ScummVM coding case 13: - c->pic.key_frame = 0; - c->pic.pict_type = AV_PICTURE_TYPE_P; + frame->key_frame = 0; + frame->pict_type = AV_PICTURE_TYPE_P; if (!c->prev.data[0]) { av_log(avctx, AV_LOG_ERROR, "Missing reference frame\n"); return AVERROR_INVALIDDATA; } - decode_13(avctx, c, c->pic.data[0], srcptr, c->prev.data[0]); + decode_13(avctx, c, frame->data[0], frame->linesize[0], srcptr, c->prev.data[0]); break; default: av_log(avctx, AV_LOG_ERROR, "Unknown/unsupported compression type %d\n", compr); return AVERROR_INVALIDDATA; } - FFSWAP(AVFrame, c->pic, c->prev); - if(c->pic.data[0]) - avctx->release_buffer(avctx, &c->pic); + av_frame_unref(&c->prev); + if ((ret = av_frame_ref(&c->prev, frame)) < 0) + return ret; *got_frame = 1; - *(AVFrame*)data = c->prev; /* always report that the buffer was completely consumed */ return avpkt->size; @@ -298,7 +298,6 @@ static av_cold int decode_init(AVCodecContext *avctx) avctx->pix_fmt = AV_PIX_FMT_PAL8; - avcodec_get_frame_defaults(&c->pic); avcodec_get_frame_defaults(&c->prev); c->dsize = avctx->width * avctx->height * 2; @@ -316,10 +315,7 @@ static av_cold int decode_end(AVCodecContext *avctx) DxaDecContext * const c = avctx->priv_data; av_freep(&c->decomp_buf); - if(c->prev.data[0]) - avctx->release_buffer(avctx, &c->prev); - if(c->pic.data[0]) - avctx->release_buffer(avctx, &c->pic); + av_frame_unref(&c->prev); return 0; } |