X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2F4xm.c;h=92157893dde9f359b98b16374e4244c77383e6cb;hb=87cf70eb237e7586cc7399627dafa1b980ec0b7d;hp=dd7daa5adddbb87a7cd108719ccb5110f9284aef;hpb=7a00bbad2100367481240e62876b941b5c4befdc;p=ffmpeg diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c index dd7daa5addd..92157893dde 100644 --- a/libavcodec/4xm.c +++ b/libavcodec/4xm.c @@ -2,32 +2,32 @@ * 4XM codec * Copyright (c) 2003 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file libavcodec/4xm.c + * @file * 4XM codec. */ #include "libavutil/intreadwrite.h" #include "avcodec.h" #include "dsputil.h" -#include "bitstream.h" +#include "get_bits.h" #include "bytestream.h" //#undef NDEBUG @@ -137,8 +137,8 @@ typedef struct FourXContext{ int mv[256]; VLC pre_vlc; int last_dc; - DECLARE_ALIGNED_8(DCTELEM, block[6][64]); - uint8_t *bitstream_buffer; + DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; + void *bitstream_buffer; unsigned int bitstream_buffer_size; int version; CFrameBuffer cfrm[CFRAME_BUFFER_COUNT]; @@ -237,12 +237,15 @@ static void idct(DCTELEM block[64]){ } static av_cold void init_vlcs(FourXContext *f){ + static VLC_TYPE table[8][32][2]; int i; for(i=0; i<8; i++){ + block_type_vlc[0][i].table= table[i]; + block_type_vlc[0][i].table_allocated= 32; init_vlc(&block_type_vlc[0][i], BLOCK_TYPE_VLC_BITS, 7, &block_type_tab[0][i][0][1], 2, 1, - &block_type_tab[0][i][0][0], 2, 1, 1); + &block_type_tab[0][i][0][0], 2, 1, INIT_VLC_USE_NEW_STATIC); } } @@ -257,6 +260,23 @@ static void init_mv(FourXContext *f){ } } +#if HAVE_BIGENDIAN +#define LE_CENTRIC_MUL(dst, src, scale, dc) \ + { \ + unsigned tmpval = AV_RN32(src); \ + tmpval = (tmpval << 16) | (tmpval >> 16); \ + tmpval = tmpval * (scale) + (dc); \ + tmpval = (tmpval << 16) | (tmpval >> 16); \ + AV_WN32A(dst, tmpval); \ + } +#else +#define LE_CENTRIC_MUL(dst, src, scale, dc) \ + { \ + unsigned tmpval = AV_RN32(src) * (scale) + (dc); \ + AV_WN32A(dst, tmpval); \ + } +#endif + static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, int dc){ int i; dc*= 0x10001; @@ -271,25 +291,25 @@ static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stri break; case 1: for(i=0; iavctx, AV_LOG_ERROR, "mv out of pic\n"); return; } - mcdc(dst, src, log2w, h, stride, 1, le2me_16(*f->wordstream++)); + mcdc(dst, src, log2w, h, stride, 1, av_le2ne16(*f->wordstream++)); }else if(code == 5){ - mcdc(dst, src, log2w, h, stride, 0, le2me_16(*f->wordstream++)); + mcdc(dst, src, log2w, h, stride, 0, av_le2ne16(*f->wordstream++)); }else if(code == 6){ if(log2w){ - dst[0] = le2me_16(*f->wordstream++); - dst[1] = le2me_16(*f->wordstream++); + dst[0] = av_le2ne16(*f->wordstream++); + dst[1] = av_le2ne16(*f->wordstream++); }else{ - dst[0 ] = le2me_16(*f->wordstream++); - dst[stride] = le2me_16(*f->wordstream++); + dst[0 ] = av_le2ne16(*f->wordstream++); + dst[stride] = av_le2ne16(*f->wordstream++); } } } @@ -375,8 +395,10 @@ static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length){ return -1; } - f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE); - f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4); + av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE); + if (!f->bitstream_buffer) + return AVERROR(ENOMEM); + f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4); init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size); f->wordstream= (const uint16_t*)(buf + extra + bitstream_size); @@ -653,8 +675,10 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){ prestream_size= length + buf - prestream; - f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE); - f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4); + av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE); + if (!f->bitstream_buffer) + return AVERROR(ENOMEM); + f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4); init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size); f->last_dc= 0*128*8*8; @@ -759,15 +783,23 @@ static int decode_frame(AVCodecContext *avctx, } if(frame_4cc == AV_RL32("ifr2")){ - p->pict_type= FF_I_TYPE; + p->pict_type= AV_PICTURE_TYPE_I; if(decode_i2_frame(f, buf-4, frame_size) < 0) return -1; }else if(frame_4cc == AV_RL32("ifrm")){ - p->pict_type= FF_I_TYPE; + p->pict_type= AV_PICTURE_TYPE_I; if(decode_i_frame(f, buf, frame_size) < 0) return -1; }else if(frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")){ - p->pict_type= FF_P_TYPE; + if(!f->last_picture.data[0]){ + f->last_picture.reference= 1; + if(avctx->get_buffer(avctx, &f->last_picture) < 0){ + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return -1; + } + } + + p->pict_type= AV_PICTURE_TYPE_P; if(decode_p_frame(f, buf, frame_size) < 0) return -1; }else if(frame_4cc == AV_RL32("snd_")){ @@ -776,7 +808,7 @@ static int decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n", buf_size); } - p->key_frame= p->pict_type == FF_I_TYPE; + p->key_frame= p->pict_type == AV_PICTURE_TYPE_I; *picture= *p; *data_size = sizeof(AVPicture); @@ -808,7 +840,7 @@ static av_cold int decode_init(AVCodecContext *avctx){ init_vlcs(f); if(f->version>2) avctx->pix_fmt= PIX_FMT_RGB565; - else avctx->pix_fmt= PIX_FMT_RGB555; + else avctx->pix_fmt= PIX_FMT_BGR555; return 0; } @@ -825,20 +857,23 @@ static av_cold int decode_end(AVCodecContext *avctx){ f->cfrm[i].allocated_size= 0; } free_vlc(&f->pre_vlc); + if(f->current_picture.data[0]) + avctx->release_buffer(avctx, &f->current_picture); + if(f->last_picture.data[0]) + avctx->release_buffer(avctx, &f->last_picture); return 0; } -AVCodec fourxm_decoder = { - "4xm", - CODEC_TYPE_VIDEO, - CODEC_ID_4XM, - sizeof(FourXContext), - decode_init, - NULL, - decode_end, - decode_frame, - /*CODEC_CAP_DR1,*/ +AVCodec ff_fourxm_decoder = { + .name = "4xm", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_4XM, + .priv_data_size = sizeof(FourXContext), + .init = decode_init, + .close = decode_end, + .decode = decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("4X Movie"), };