X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Feacmv.c;h=085e2d81774f6b0022932942c589fd1eda1ea83d;hb=323b9da9691acfac5dbd5c13f99f8010a882003e;hp=7f6c2a4577467b58903b9e3a0dd21f5ee72e86b0;hpb=737eb5976f6a37703923ce3c3d5e6ca8eeabb43a;p=ffmpeg diff --git a/libavcodec/eacmv.c b/libavcodec/eacmv.c index 7f6c2a45774..085e2d81774 100644 --- a/libavcodec/eacmv.c +++ b/libavcodec/eacmv.c @@ -2,20 +2,20 @@ * 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 */ @@ -52,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; @@ -84,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=buf_end) { + if(buf_end - buf < 16) { av_log(s->avctx, AV_LOG_WARNING, "truncated header\n"); return; } @@ -135,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; } @@ -153,6 +153,9 @@ static int cmv_decode_frame(AVCodecContext *avctx, 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; @@ -180,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); } @@ -206,14 +209,13 @@ static av_cold int cmv_decode_end(AVCodecContext *avctx){ } AVCodec ff_eacmv_decoder = { - "eacmv", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_CMV, - sizeof(CmvContext), - cmv_decode_init, - NULL, - cmv_decode_end, - cmv_decode_frame, - CODEC_CAP_DR1, + .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"), };