aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/aasc.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2008-09-18 05:20:54 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2008-09-18 05:20:54 +0000
commit44aa9771c98be64e33af605797c08e86ccfdfef0 (patch)
tree754540fb0257391229648e1ff6d40d1aa14fbea0 /libavcodec/aasc.c
parentf7e5b0cc8fd330e1d8d55454dc97f04e2f31a447 (diff)
downloadffmpeg-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.c75
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;