]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mmvideo.c
alsa: add support for more formats.
[ffmpeg] / libavcodec / mmvideo.c
index 0b45b77474a29e58a05fd58b04bcf2dc9cccf143..b65335e6cb428ee05c67d562a70e89eadde8ef6b 100644 (file)
@@ -2,25 +2,25 @@
  * 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 (pross@xvid.org)
  *
@@ -59,10 +59,6 @@ static av_cold int mm_decode_init(AVCodecContext *avctx)
     avctx->pix_fmt = PIX_FMT_PAL8;
 
     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;
 }
@@ -78,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;
@@ -86,6 +86,9 @@ static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const
     while(i<buf_size) {
         int run_length, color;
 
+        if (y >= s->avctx->height)
+            return;
+
         if (buf[i] & 0x80) {
             run_length = 1;
             color = buf[i];
@@ -108,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]);
@@ -130,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<length; i++) {
             for(j=0; j<8; j++) {
                 int replace = (buf[r+i] >> (7-j)) & 1;
@@ -145,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;
     }
 }
 
@@ -168,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;
@@ -198,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,