X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcdxl.c;h=465867c098b8547c00b606572e53787bc7a58789;hb=bdd1567c355a8092e7746ef99e831d579e34fa6a;hp=7726ebfe2ffaea44965aa92b7fe528315338c32c;hpb=42459c6abb8e9149836ad56853952f4468d75369;p=ffmpeg diff --git a/libavcodec/cdxl.c b/libavcodec/cdxl.c index 7726ebfe2ff..465867c098b 100644 --- a/libavcodec/cdxl.c +++ b/libavcodec/cdxl.c @@ -23,6 +23,7 @@ #include "libavutil/imgutils.h" #include "avcodec.h" #include "get_bits.h" +#include "internal.h" #define BIT_PLANAR 0x00 #define BYTE_PLANAR 0x20 @@ -48,7 +49,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; @@ -112,15 +112,15 @@ 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]; 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; @@ -128,7 +128,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); @@ -159,11 +159,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; @@ -171,7 +171,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); @@ -202,15 +202,15 @@ static void cdxl_decode_ham8(CDXLVideoContext *c) } AV_WL24(out + x * 3, r | g | b); } - out += c->frame.linesize[0]; + out += frame->linesize[0]; } } static int cdxl_decode_frame(AVCodecContext *avctx, void *data, - int *data_size, AVPacket *pkt) + 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; @@ -247,22 +247,18 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, if (c->video_size < aligned_width * avctx->height * c->bpp / 8) return AVERROR_INVALIDDATA; if (!encoding && c->palette_size && c->bpp <= 8) { - avctx->pix_fmt = PIX_FMT_PAL8; + avctx->pix_fmt = AV_PIX_FMT_PAL8; } else if (encoding == 1 && (c->bpp == 6 || c->bpp == 8)) { if (c->palette_size != (1 << (c->bpp - 1))) return AVERROR_INVALIDDATA; - avctx->pix_fmt = PIX_FMT_BGR24; + avctx->pix_fmt = AV_PIX_FMT_BGR24; } else { av_log_ask_for_sample(avctx, "unsupported encoding %d and bpp %d\n", encoding, c->bpp); return AVERROR_PATCHWELCOME; } - if (p->data[0]) - avctx->release_buffer(avctx, p); - - p->reference = 0; - if ((ret = avctx->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; } @@ -274,14 +270,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); } - *data_size = sizeof(AVFrame); - *(AVFrame*)data = c->frame; + *got_frame = 1; return buf_size; } @@ -291,8 +286,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; } @@ -300,7 +293,7 @@ static av_cold int cdxl_decode_end(AVCodecContext *avctx) AVCodec ff_cdxl_decoder = { .name = "cdxl", .type = AVMEDIA_TYPE_VIDEO, - .id = CODEC_ID_CDXL, + .id = AV_CODEC_ID_CDXL, .priv_data_size = sizeof(CDXLVideoContext), .init = cdxl_decode_init, .close = cdxl_decode_end,