X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwnv1.c;h=7676c89080d15c9ac5b5afdd301899d882600c86;hb=f349f4b5502c94943c30001b8a4d75daded3281c;hp=e4b222cf8702bd21b89872872551b95a3d2ff7b8;hpb=562b6c744abdde4e673038fcb0c126a4aadfa6c7;p=ffmpeg diff --git a/libavcodec/wnv1.c b/libavcodec/wnv1.c index e4b222cf870..7676c89080d 100644 --- a/libavcodec/wnv1.c +++ b/libavcodec/wnv1.c @@ -26,21 +26,21 @@ #include "avcodec.h" #include "get_bits.h" -#include "libavutil/common.h" +#include "internal.h" +#include "mathops.h" -typedef struct WNV1Context{ +typedef struct WNV1Context { AVCodecContext *avctx; - AVFrame pic; int shift; GetBitContext gb; } WNV1Context; -static const uint16_t code_tab[16][2]={ -{0x1FD,9}, {0xFD,8}, {0x7D,7}, {0x3D,6}, {0x1D,5}, {0x0D,4}, {0x005,3}, -{0x000,1}, -{0x004,3}, {0x0C,4}, {0x1C,5}, {0x3C,6}, {0x7C,7}, {0xFC,8}, {0x1FC,9}, {0xFF,8} +static const uint16_t code_tab[16][2] = { + { 0x1FD, 9 }, { 0xFD, 8 }, { 0x7D, 7 }, { 0x3D, 6 }, { 0x1D, 5 }, { 0x0D, 4 }, { 0x005, 3 }, + { 0x000, 1 }, + { 0x004, 3 }, { 0x0C, 4 }, { 0x1C, 5 }, { 0x3C, 6 }, { 0x7C, 7 }, { 0xFC, 8 }, { 0x1FC, 9 }, { 0xFF, 8 } }; #define CODE_VLC_BITS 9 @@ -51,57 +51,60 @@ static inline int wnv1_get_code(WNV1Context *w, int base_value) { int v = get_vlc2(&w->gb, code_vlc.table, CODE_VLC_BITS, 1); - if(v==15) - return av_reverse[ get_bits(&w->gb, 8 - w->shift) ]; + if (v == 15) + return ff_reverse[get_bits(&w->gb, 8 - w->shift)]; else - return base_value + ((v - 7)<shift); + return base_value + ((v - 7) << w->shift); } static int decode_frame(AVCodecContext *avctx, - void *data, int *data_size, + void *data, int *got_frame, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; - int buf_size = avpkt->size; WNV1Context * const l = avctx->priv_data; - AVFrame * const p = &l->pic; + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; + AVFrame * const p = data; unsigned char *Y,*U,*V; - int i, j; + int i, j, ret; int prev_y = 0, prev_u = 0, prev_v = 0; uint8_t *rbuf; + if (buf_size < 8) { + av_log(avctx, AV_LOG_ERROR, "Packet is too short\n"); + return AVERROR_INVALIDDATA; + } + rbuf = av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE); - if(!rbuf){ + if (!rbuf) { av_log(avctx, AV_LOG_ERROR, "Cannot allocate temporary buffer\n"); - return -1; + return AVERROR(ENOMEM); } - if(p->data[0]) - avctx->release_buffer(avctx, p); - - p->reference = 0; - if(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"); av_free(rbuf); - return -1; + return ret; } p->key_frame = 1; - for(i=8; igb, rbuf+8, (buf_size-8)*8); + for (i = 8; i < buf_size; i++) + rbuf[i] = ff_reverse[buf[i]]; + init_get_bits(&l->gb, rbuf + 8, (buf_size - 8) * 8); if (buf[2] >> 4 == 6) l->shift = 2; else { l->shift = 8 - (buf[2] >> 4); if (l->shift > 4) { - av_log_ask_for_sample(avctx, "Unknown WNV1 frame header value %i\n", + avpriv_request_sample(avctx, + "Unknown WNV1 frame header value %i", buf[2] >> 4); l->shift = 4; } if (l->shift < 1) { - av_log_ask_for_sample(avctx, "Unknown WNV1 frame header value %i\n", + avpriv_request_sample(avctx, + "Unknown WNV1 frame header value %i", buf[2] >> 4); l->shift = 1; } @@ -123,21 +126,21 @@ static int decode_frame(AVCodecContext *avctx, } - *data_size = sizeof(AVFrame); - *(AVFrame*)data = l->pic; + *got_frame = 1; av_free(rbuf); return buf_size; } -static av_cold int decode_init(AVCodecContext *avctx){ +static av_cold int decode_init(AVCodecContext *avctx) +{ WNV1Context * const l = avctx->priv_data; static VLC_TYPE code_table[1 << CODE_VLC_BITS][2]; - l->avctx = avctx; - avctx->pix_fmt = PIX_FMT_YUV422P; + l->avctx = avctx; + avctx->pix_fmt = AV_PIX_FMT_YUV422P; - code_vlc.table = code_table; + code_vlc.table = code_table; code_vlc.table_allocated = 1 << CODE_VLC_BITS; init_vlc(&code_vlc, CODE_VLC_BITS, 16, &code_tab[0][1], 4, 2, @@ -146,24 +149,13 @@ static av_cold int decode_init(AVCodecContext *avctx){ return 0; } -static av_cold int decode_end(AVCodecContext *avctx){ - WNV1Context * const l = avctx->priv_data; - AVFrame *pic = &l->pic; - - if (pic->data[0]) - avctx->release_buffer(avctx, pic); - - return 0; -} - AVCodec ff_wnv1_decoder = { .name = "wnv1", + .long_name = NULL_IF_CONFIG_SMALL("Winnov WNV1"), .type = AVMEDIA_TYPE_VIDEO, - .id = CODEC_ID_WNV1, + .id = AV_CODEC_ID_WNV1, .priv_data_size = sizeof(WNV1Context), .init = decode_init, - .close = decode_end, .decode = decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("Winnov WNV1"), };