X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fjvdec.c;h=662a94492d47b89a0135489231c6739dad3ca4c2;hb=e9a77f4bc084e5174baba3a8bc869ce4d102c4f0;hp=0da1142fc870d42185c399a8910e149636050b79;hpb=2912e87a6c9264d556734e2bf94a99c64cf9b102;p=ffmpeg diff --git a/libavcodec/jvdec.c b/libavcodec/jvdec.c index 0da1142fc87..662a94492d4 100644 --- a/libavcodec/jvdec.c +++ b/libavcodec/jvdec.c @@ -25,14 +25,16 @@ * @author Peter Ross */ +#include "libavutil/intreadwrite.h" + #include "avcodec.h" #include "dsputil.h" #include "get_bits.h" -#include "libavutil/intreadwrite.h" +#include "internal.h" typedef struct JvContext { DSPContext dsp; - AVFrame frame; + AVFrame *frame; uint32_t palette[AVPALETTE_COUNT]; int palette_has_changed; } JvContext; @@ -40,8 +42,13 @@ typedef struct JvContext { static av_cold int decode_init(AVCodecContext *avctx) { JvContext *s = avctx->priv_data; - avctx->pix_fmt = PIX_FMT_PAL8; - dsputil_init(&s->dsp, avctx); + + s->frame = av_frame_alloc(); + if (!s->frame) + return AVERROR(ENOMEM); + + avctx->pix_fmt = AV_PIX_FMT_PAL8; + ff_dsputil_init(&s->dsp, avctx); return 0; } @@ -56,19 +63,19 @@ static inline void decode2x2(GetBitContext *gb, uint8_t *dst, int linesize) case 1: v[0] = get_bits(gb, 8); for (j = 0; j < 2; j++) - memset(dst + j*linesize, v[0], 2); + memset(dst + j * linesize, v[0], 2); break; case 2: v[0] = get_bits(gb, 8); v[1] = get_bits(gb, 8); for (j = 0; j < 2; j++) for (i = 0; i < 2; i++) - dst[j*linesize + i] = v[get_bits1(gb)]; + dst[j * linesize + i] = v[get_bits1(gb)]; break; case 3: for (j = 0; j < 2; j++) for (i = 0; i < 2; i++) - dst[j*linesize + i] = get_bits(gb, 8); + dst[j * linesize + i] = get_bits(gb, 8); } } @@ -83,29 +90,30 @@ static inline void decode4x4(GetBitContext *gb, uint8_t *dst, int linesize) case 1: v[0] = get_bits(gb, 8); for (j = 0; j < 4; j++) - memset(dst + j*linesize, v[0], 4); + memset(dst + j * linesize, v[0], 4); break; case 2: v[0] = get_bits(gb, 8); v[1] = get_bits(gb, 8); for (j = 2; j >= 0; j -= 2) { for (i = 0; i < 4; i++) - dst[j*linesize + i] = v[get_bits1(gb)]; + dst[j * linesize + i] = v[get_bits1(gb)]; for (i = 0; i < 4; i++) - dst[(j+1)*linesize + i] = v[get_bits1(gb)]; + dst[(j + 1) * linesize + i] = v[get_bits1(gb)]; } break; case 3: for (j = 0; j < 4; j += 2) for (i = 0; i < 4; i += 2) - decode2x2(gb, dst + j*linesize + i, linesize); + decode2x2(gb, dst + j * linesize + i, linesize); } } /** * Decode 8x8 block */ -static inline void decode8x8(GetBitContext *gb, uint8_t *dst, int linesize, DSPContext *dsp) +static inline void decode8x8(GetBitContext *gb, uint8_t *dst, int linesize, + DSPContext *dsp) { int i, j, v[2]; @@ -118,54 +126,56 @@ static inline void decode8x8(GetBitContext *gb, uint8_t *dst, int linesize, DSPC v[0] = get_bits(gb, 8); v[1] = get_bits(gb, 8); for (j = 7; j >= 0; j--) - for (i = 0; i < 8; i++) - dst[j*linesize + i] = v[get_bits1(gb)]; + for (i = 0; i < 8; i++) + dst[j * linesize + i] = v[get_bits1(gb)]; break; case 3: for (j = 0; j < 8; j += 4) for (i = 0; i < 8; i += 4) - decode4x4(gb, dst + j*linesize + i, linesize); + decode4x4(gb, dst + j * linesize + i, linesize); } } -static int decode_frame(AVCodecContext *avctx, - void *data, int *data_size, +static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { - JvContext *s = avctx->priv_data; - int buf_size = avpkt->size; - const uint8_t *buf = avpkt->data; + JvContext *s = avctx->priv_data; + int buf_size = avpkt->size; + const uint8_t *buf = avpkt->data; const uint8_t *buf_end = buf + buf_size; - int video_size, video_type, i, j; + int video_size, video_type, i, j, ret; video_size = AV_RL32(buf); video_type = buf[4]; buf += 5; if (video_size) { - if (avctx->reget_buffer(avctx, &s->frame) < 0) { + if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return -1; + return ret; } if (video_type == 0 || video_type == 1) { GetBitContext gb; - init_get_bits(&gb, buf, FFMIN(video_size, buf_end - buf)); + init_get_bits(&gb, buf, 8 * FFMIN(video_size, buf_end - buf)); for (j = 0; j < avctx->height; j += 8) for (i = 0; i < avctx->width; i += 8) - decode8x8(&gb, s->frame.data[0] + j*s->frame.linesize[0] + i, - s->frame.linesize[0], &s->dsp); + decode8x8(&gb, + s->frame->data[0] + j * s->frame->linesize[0] + i, + s->frame->linesize[0], &s->dsp); buf += video_size; } else if (video_type == 2) { if (buf + 1 <= buf_end) { int v = *buf++; for (j = 0; j < avctx->height; j++) - memset(s->frame.data[0] + j*s->frame.linesize[0], v, avctx->width); + memset(s->frame->data[0] + j * s->frame->linesize[0], + v, avctx->width); } } else { - av_log(avctx, AV_LOG_WARNING, "unsupported frame type %i\n", video_type); + av_log(avctx, AV_LOG_WARNING, + "unsupported frame type %i\n", video_type); return AVERROR_INVALIDDATA; } } @@ -179,14 +189,15 @@ static int decode_frame(AVCodecContext *avctx, } if (video_size) { - s->frame.key_frame = 1; - s->frame.pict_type = FF_I_TYPE; - s->frame.palette_has_changed = s->palette_has_changed; - s->palette_has_changed = 0; - memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); - - *data_size = sizeof(AVFrame); - *(AVFrame*)data = s->frame; + s->frame->key_frame = 1; + s->frame->pict_type = AV_PICTURE_TYPE_I; + s->frame->palette_has_changed = s->palette_has_changed; + s->palette_has_changed = 0; + memcpy(s->frame->data[1], s->palette, AVPALETTE_SIZE); + + if ((ret = av_frame_ref(data, s->frame)) < 0) + return ret; + *got_frame = 1; } return buf_size; @@ -196,8 +207,7 @@ static av_cold int decode_close(AVCodecContext *avctx) { JvContext *s = avctx->priv_data; - if(s->frame.data[0]) - avctx->release_buffer(avctx, &s->frame); + av_frame_free(&s->frame); return 0; } @@ -205,8 +215,8 @@ static av_cold int decode_close(AVCodecContext *avctx) AVCodec ff_jv_decoder = { .name = "jv", .long_name = NULL_IF_CONFIG_SMALL("Bitmap Brothers JV video"), - .type = CODEC_TYPE_VIDEO, - .id = CODEC_ID_JV, + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_JV, .priv_data_size = sizeof(JvContext), .init = decode_init, .close = decode_close,