diff options
Diffstat (limited to 'libavcodec/cdxl.c')
-rw-r--r-- | libavcodec/cdxl.c | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/libavcodec/cdxl.c b/libavcodec/cdxl.c index 1af69b75b4..8546e0bdb6 100644 --- a/libavcodec/cdxl.c +++ b/libavcodec/cdxl.c @@ -35,7 +35,6 @@ typedef struct { AVCodecContext *avctx; - AVFrame frame; int bpp; int format; int padded_bits; @@ -51,7 +50,6 @@ static av_cold int cdxl_decode_init(AVCodecContext *avctx) { CDXLVideoContext *c = avctx->priv_data; - avcodec_get_frame_defaults(&c->frame); c->new_video_size = 0; c->avctx = avctx; @@ -115,16 +113,16 @@ static void import_format(CDXLVideoContext *c, int linesize, uint8_t *out) } } -static void cdxl_decode_rgb(CDXLVideoContext *c) +static void cdxl_decode_rgb(CDXLVideoContext *c, AVFrame *frame) { - uint32_t *new_palette = (uint32_t *)c->frame.data[1]; + uint32_t *new_palette = (uint32_t *)frame->data[1]; - memset(c->frame.data[1], 0, AVPALETTE_SIZE); + memset(frame->data[1], 0, AVPALETTE_SIZE); import_palette(c, new_palette); - import_format(c, c->frame.linesize[0], c->frame.data[0]); + import_format(c, frame->linesize[0], frame->data[0]); } -static void cdxl_decode_ham6(CDXLVideoContext *c) +static void cdxl_decode_ham6(CDXLVideoContext *c, AVFrame *frame) { AVCodecContext *avctx = c->avctx; uint32_t new_palette[16], r, g, b; @@ -132,7 +130,7 @@ static void cdxl_decode_ham6(CDXLVideoContext *c) int x, y; ptr = c->new_video; - out = c->frame.data[0]; + out = frame->data[0]; import_palette(c, new_palette); import_format(c, avctx->width, c->new_video); @@ -163,11 +161,11 @@ static void cdxl_decode_ham6(CDXLVideoContext *c) } AV_WL24(out + x * 3, r | g | b); } - out += c->frame.linesize[0]; + out += frame->linesize[0]; } } -static void cdxl_decode_ham8(CDXLVideoContext *c) +static void cdxl_decode_ham8(CDXLVideoContext *c, AVFrame *frame) { AVCodecContext *avctx = c->avctx; uint32_t new_palette[64], r, g, b; @@ -175,7 +173,7 @@ static void cdxl_decode_ham8(CDXLVideoContext *c) int x, y; ptr = c->new_video; - out = c->frame.data[0]; + out = frame->data[0]; import_palette(c, new_palette); import_format(c, avctx->width, c->new_video); @@ -206,7 +204,7 @@ static void cdxl_decode_ham8(CDXLVideoContext *c) } AV_WL24(out + x * 3, r | g | b); } - out += c->frame.linesize[0]; + out += frame->linesize[0]; } } @@ -214,7 +212,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt) { CDXLVideoContext *c = avctx->priv_data; - AVFrame * const p = &c->frame; + AVFrame * const p = data; int ret, w, h, encoding, aligned_width, buf_size = pkt->size; const uint8_t *buf = pkt->data; @@ -262,11 +260,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_PATCHWELCOME; } - if (p->data[0]) - avctx->release_buffer(avctx, p); - - p->reference = 0; - if ((ret = ff_get_buffer(avctx, p)) < 0) { + if ((ret = ff_get_buffer(avctx, p, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -278,14 +272,13 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, if (!c->new_video) return AVERROR(ENOMEM); if (c->bpp == 8) - cdxl_decode_ham8(c); + cdxl_decode_ham8(c, p); else - cdxl_decode_ham6(c); + cdxl_decode_ham6(c, p); } else { - cdxl_decode_rgb(c); + cdxl_decode_rgb(c, p); } *got_frame = 1; - *(AVFrame*)data = c->frame; return buf_size; } @@ -295,8 +288,6 @@ static av_cold int cdxl_decode_end(AVCodecContext *avctx) CDXLVideoContext *c = avctx->priv_data; av_free(c->new_video); - if (c->frame.data[0]) - avctx->release_buffer(avctx, &c->frame); return 0; } |