X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmmvideo.c;h=b65335e6cb428ee05c67d562a70e89eadde8ef6b;hb=f75e3da535f297ddbe501ce866e57ccca7645455;hp=6dc95589c6df3a79bc80f0aa45dfc4708cda677f;hpb=7a00bbad2100367481240e62876b941b5c4befdc;p=ffmpeg diff --git a/libavcodec/mmvideo.c b/libavcodec/mmvideo.c index 6dc95589c6d..b65335e6cb4 100644 --- a/libavcodec/mmvideo.c +++ b/libavcodec/mmvideo.c @@ -2,27 +2,27 @@ * American Laser Games MM Video Decoder * Copyright (c) 2006,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 Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file libavcodec/mmvideo.c + * @file * American Laser Games MM Video Decoder - * by Peter Ross (suxen_drol at hotmail dot com) + * by Peter Ross (pross@xvid.org) * * The MM format was used by IBM-PC ports of ALG's "arcade shooter" games, * including Mad Dog McCree and Crime Patrol. @@ -58,14 +58,7 @@ static av_cold int mm_decode_init(AVCodecContext *avctx) avctx->pix_fmt = PIX_FMT_PAL8; - if (avcodec_check_dimensions(avctx, avctx->width, avctx->height)) - return -1; - s->frame.reference = 1; - if (avctx->get_buffer(avctx, &s->frame)) { - av_log(s->avctx, AV_LOG_ERROR, "mmvideo: get_buffer() failed\n"); - return -1; - } return 0; } @@ -81,6 +74,10 @@ static void mm_decode_pal(MmContext *s, const uint8_t *buf, const uint8_t *buf_e } } +/** + * @param half_horiz Half horizontal resolution (0 or 1) + * @param half_vert Half vertical resolution (0 or 1) + */ static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const uint8_t *buf, int buf_size) { int i, x, y; @@ -89,6 +86,9 @@ static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const while(i= s->avctx->height) + return; + if (buf[i] & 0x80) { run_length = 1; color = buf[i]; @@ -111,11 +111,15 @@ static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const if (x >= s->avctx->width) { x=0; - y += half_vert ? 2 : 1; + y += 1 + half_vert; } } } +/* + * @param half_horiz Half horizontal resolution (0 or 1) + * @param half_vert Half vertical resolution (0 or 1) + */ static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const uint8_t *buf, int buf_size) { const int data_ptr = 2 + AV_RL16(&buf[0]); @@ -133,6 +137,9 @@ static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const continue; } + if (y + half_vert >= s->avctx->height) + return; + for(i=0; i> (7-j)) & 1; @@ -148,12 +155,12 @@ static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const } d++; } - x += half_horiz ? 2 : 1; + x += 1 + half_horiz; } } r += length; - y += half_vert ? 2 : 1; + y += 1 + half_vert; } } @@ -171,6 +178,11 @@ static int mm_decode_frame(AVCodecContext *avctx, buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; + if (avctx->reget_buffer(avctx, &s->frame) < 0) { + av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); + return -1; + } + switch(type) { case MM_TYPE_PALETTE : mm_decode_pal(s, buf, buf_end); return buf_size; case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; @@ -201,9 +213,9 @@ static av_cold int mm_decode_end(AVCodecContext *avctx) return 0; } -AVCodec mmvideo_decoder = { +AVCodec ff_mmvideo_decoder = { "mmvideo", - CODEC_TYPE_VIDEO, + AVMEDIA_TYPE_VIDEO, CODEC_ID_MMVIDEO, sizeof(MmContext), mm_decode_init,