diff aasc.c @ 7885:f874e1d5cf07 libavcodec

Factorize out code used for MS RLE format decoding in different decoders.
author kostya
date Thu, 18 Sep 2008 05:20:54 +0000
parents e943e1409077
children 48dcf657f897
line wrap: on
line diff
--- a/aasc.c	Thu Sep 18 03:08:33 2008 +0000
+++ b/aasc.c	Thu Sep 18 05:20:54 2008 +0000
@@ -30,6 +30,7 @@
 
 #include "avcodec.h"
 #include "dsputil.h"
+#include "msrledec.h"
 
 typedef struct AascContext {
     AVCodecContext *avctx;
@@ -61,13 +62,6 @@
                               const uint8_t *buf, int buf_size)
 {
     AascContext *s = avctx->priv_data;
-    int stream_ptr = 4;
-    unsigned char rle_code;
-    unsigned char stream_byte;
-    int pixel_ptr = 0;
-    int row_dec, row_ptr;
-    int frame_size;
-    int i;
 
     s->frame.reference = 1;
     s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
@@ -76,72 +70,7 @@
         return -1;
     }
 
-    row_dec = s->frame.linesize[0];
-    row_ptr = (s->avctx->height - 1) * row_dec;
-    frame_size = row_dec * s->avctx->height;
-
-    while (row_ptr >= 0) {
-        FETCH_NEXT_STREAM_BYTE();
-        rle_code = stream_byte;
-        if (rle_code == 0) {
-            /* fetch the next byte to see how to handle escape code */
-            FETCH_NEXT_STREAM_BYTE();
-            if (stream_byte == 0) {
-                /* line is done, goto the next one */
-                row_ptr -= row_dec;
-                pixel_ptr = 0;
-            } else if (stream_byte == 1) {
-                /* decode is done */
-                break;
-            } else if (stream_byte == 2) {
-                /* reposition frame decode coordinates */
-                FETCH_NEXT_STREAM_BYTE();
-                pixel_ptr += stream_byte;
-                FETCH_NEXT_STREAM_BYTE();
-                row_ptr -= stream_byte * row_dec;
-            } else {
-                /* copy pixels from encoded stream */
-                if ((pixel_ptr + stream_byte > avctx->width * 3) ||
-                    (row_ptr < 0)) {
-                    av_log(s->avctx, AV_LOG_ERROR, " AASC: frame ptr just went out of bounds (copy1)\n");
-                    break;
-                }
-
-                rle_code = stream_byte;
-                if (stream_ptr + rle_code > buf_size) {
-                    av_log(s->avctx, AV_LOG_ERROR, " AASC: stream ptr just went out of bounds (copy2)\n");
-                    break;
-                }
-
-                for (i = 0; i < rle_code; i++) {
-                    FETCH_NEXT_STREAM_BYTE();
-                    s->frame.data[0][row_ptr + pixel_ptr] = stream_byte;
-                    pixel_ptr++;
-                }
-                if (rle_code & 1)
-                    stream_ptr++;
-            }
-        } else {
-            /* decode a run of data */
-            if ((pixel_ptr + rle_code > avctx->width * 3) ||
-                (row_ptr < 0)) {
-                av_log(s->avctx, AV_LOG_ERROR, " AASC: frame ptr just went out of bounds (run1)\n");
-                break;
-            }
-
-            FETCH_NEXT_STREAM_BYTE();
-
-            while(rle_code--) {
-                s->frame.data[0][row_ptr + pixel_ptr] = stream_byte;
-                pixel_ptr++;
-            }
-        }
-    }
-
-    /* one last sanity check on the way out */
-    if (stream_ptr < buf_size)
-        av_log(s->avctx, AV_LOG_ERROR, " AASC: ended frame decode with bytes left over (%d < %d)\n",
-            stream_ptr, buf_size);
+    ff_msrle_decode(avctx, &s->frame, 8, buf, buf_size);
 
     *data_size = sizeof(AVFrame);
     *(AVFrame*)data = s->frame;