diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2008-09-18 05:20:54 +0000 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2008-09-18 05:20:54 +0000 |
commit | 44aa9771c98be64e33af605797c08e86ccfdfef0 (patch) | |
tree | 754540fb0257391229648e1ff6d40d1aa14fbea0 /libavcodec/aasc.c | |
parent | f7e5b0cc8fd330e1d8d55454dc97f04e2f31a447 (diff) | |
download | ffmpeg-44aa9771c98be64e33af605797c08e86ccfdfef0.tar.gz |
Factorize out code used for MS RLE format decoding in different decoders.
Originally committed as revision 15356 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/aasc.c')
-rw-r--r-- | libavcodec/aasc.c | 75 |
1 files changed, 2 insertions, 73 deletions
diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c index 01172018c7..77162f9e7d 100644 --- a/libavcodec/aasc.c +++ b/libavcodec/aasc.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "dsputil.h" +#include "msrledec.h" typedef struct AascContext { AVCodecContext *avctx; @@ -61,13 +62,6 @@ static int aasc_decode_frame(AVCodecContext *avctx, 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 @@ static int aasc_decode_frame(AVCodecContext *avctx, 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; |