X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Feacmv.c;h=085e2d81774f6b0022932942c589fd1eda1ea83d;hb=02e7dbf5adc6aa702472010c33aec9bfd904702f;hp=ffd8f462de274f8460a27c835eaa90919ccfa5df;hpb=6a5d31ac25f55248af5725287833d007ff78b188;p=ffmpeg diff --git a/libavcodec/eacmv.c b/libavcodec/eacmv.c index ffd8f462de2..085e2d81774 100644 --- a/libavcodec/eacmv.c +++ b/libavcodec/eacmv.c @@ -2,33 +2,34 @@ * Electronic Arts CMV Video Decoder * Copyright (c) 2007-2008 Peter Ross * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file eacmv.c + * @file * Electronic Arts CMV Video Decoder - * by Peter Ross (suxen_drol at hotmail dot com) + * by Peter Ross (pross@xvid.org) * * Technical details here: * http://wiki.multimedia.cx/index.php?title=Electronic_Arts_CMV */ #include "libavutil/intreadwrite.h" +#include "libavutil/imgutils.h" #include "avcodec.h" typedef struct CmvContext { @@ -51,7 +52,7 @@ static void cmv_decode_intra(CmvContext * s, const uint8_t *buf, const uint8_t * unsigned char *dst = s->frame.data[0]; int i; - for (i=0; i < s->avctx->height && buf+s->avctx->width<=buf_end; i++) { + for (i=0; i < s->avctx->height && buf_end - buf >= s->avctx->width; i++) { memcpy(dst, buf, s->avctx->width); dst += s->frame.linesize[0]; buf += s->avctx->width; @@ -83,7 +84,7 @@ static void cmv_decode_inter(CmvContext * s, const uint8_t *buf, const uint8_t * i = 0; for(y=0; yavctx->height/4; y++) - for(x=0; xavctx->width/4 && buf+iavctx->width/4 && buf_end - buf > i; x++) { if (buf[i]==0xFF) { unsigned char *dst = s->frame.data[0] + (y*4)*s->frame.linesize[0] + x*4; if (raw+16> 4)) - 7; - cmv_motcomp(s->frame.data[0], s->frame.linesize[0], - s->last2_frame.data[0], s->last2_frame.linesize[0], - x*4, y*4, xoffset, yoffset, s->avctx->width, s->avctx->height); + if (s->last2_frame.data[0]) + cmv_motcomp(s->frame.data[0], s->frame.linesize[0], + s->last2_frame.data[0], s->last2_frame.linesize[0], + x*4, y*4, xoffset, yoffset, s->avctx->width, s->avctx->height); raw++; } }else{ /* inter using last frame as reference */ @@ -116,7 +118,7 @@ static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t { int pal_start, pal_count, i; - if(buf+16>=buf_end) { + if(buf_end - buf < 16) { av_log(s->avctx, AV_LOG_WARNING, "truncated header\n"); return; } @@ -133,7 +135,7 @@ static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t pal_count = AV_RL16(&buf[14]); buf += 16; - for (i=pal_start; i= 3; i++) { s->palette[i] = AV_RB24(buf); buf += 3; } @@ -144,17 +146,22 @@ static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t static int cmv_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - const uint8_t *buf, int buf_size) + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; CmvContext *s = avctx->priv_data; const uint8_t *buf_end = buf + buf_size; + if (buf_end - buf < EA_PREAMBLE_SIZE) + return AVERROR_INVALIDDATA; + if (AV_RL32(buf)==MVIh_TAG||AV_RB32(buf)==MVIh_TAG) { cmv_process_header(s, buf+EA_PREAMBLE_SIZE, buf_end); return buf_size; } - if (avcodec_check_dimensions(s->avctx, s->width, s->height)) + if (av_image_check_size(s->width, s->height, 0, s->avctx)) return -1; /* shuffle */ @@ -176,10 +183,10 @@ static int cmv_decode_frame(AVCodecContext *avctx, if ((buf[0]&1)) { // subtype cmv_decode_inter(s, buf+2, buf_end); s->frame.key_frame = 0; - s->frame.pict_type = FF_P_TYPE; + s->frame.pict_type = AV_PICTURE_TYPE_P; }else{ s->frame.key_frame = 1; - s->frame.pict_type = FF_I_TYPE; + s->frame.pict_type = AV_PICTURE_TYPE_I; cmv_decode_intra(s, buf+2, buf_end); } @@ -201,15 +208,14 @@ static av_cold int cmv_decode_end(AVCodecContext *avctx){ return 0; } -AVCodec eacmv_decoder = { - "eacmv", - CODEC_TYPE_VIDEO, - CODEC_ID_CMV, - sizeof(CmvContext), - cmv_decode_init, - NULL, - cmv_decode_end, - cmv_decode_frame, - CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("Electronic Arts CMV Video"), +AVCodec ff_eacmv_decoder = { + .name = "eacmv", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_CMV, + .priv_data_size = sizeof(CmvContext), + .init = cmv_decode_init, + .close = cmv_decode_end, + .decode = cmv_decode_frame, + .capabilities = CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Electronic Arts CMV video"), };