diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-12-24 15:42:52 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-12-24 15:48:02 +0100 |
commit | 9dbedf331eca9903230368f28716f29e7375450a (patch) | |
tree | e74d461ecc2c8d5d58e8270e42e9391b89b3dd30 /libavcodec/yop.c | |
parent | ba8e909c825164a74a4fc580286200a9165e019c (diff) | |
parent | c6303f8d70c25dd6c6e6486c78bf99c9924e2b6b (diff) | |
download | ffmpeg-9dbedf331eca9903230368f28716f29e7375450a.tar.gz |
Merge commit 'c6303f8d70c25dd6c6e6486c78bf99c9924e2b6b'
* commit 'c6303f8d70c25dd6c6e6486c78bf99c9924e2b6b':
yop: simplify/sanitize the decoding loop
c93: set palette_has_changed.
bmp: cosmetics, reformat
hlsenc: Don't duplicate a string constant
Conflicts:
libavcodec/bmp.c
tests/ref/fate/yop
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/yop.c')
-rw-r--r-- | libavcodec/yop.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/libavcodec/yop.c b/libavcodec/yop.c index 16a2db13e4..337fb88365 100644 --- a/libavcodec/yop.c +++ b/libavcodec/yop.c @@ -36,7 +36,6 @@ typedef struct YopDecContext { int num_pal_colors; int first_color[2]; int frame_data_length; - int row_pos; uint8_t *low_nibble; uint8_t *srcptr; @@ -177,27 +176,12 @@ static uint8_t yop_get_next_nibble(YopDecContext *s) return ret; } -/** - * Take s->dstptr to the next macroblock in sequence. - */ -static void yop_next_macroblock(YopDecContext *s) -{ - // If we are advancing to the next row of macroblocks - if (s->row_pos == s->frame.linesize[0] - 2) { - s->dstptr += s->frame.linesize[0]; - s->row_pos = 0; - }else { - s->row_pos += 2; - } - s->dstptr += 2; -} - static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { YopDecContext *s = avctx->priv_data; int tag, firstcolor, is_odd_frame; - int ret, i; + int ret, i, x, y; uint32_t *palette; if (s->frame.data[0]) @@ -214,12 +198,9 @@ static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return ret; } - s->frame.linesize[0] = avctx->width; - s->dstbuf = s->frame.data[0]; s->dstptr = s->frame.data[0]; s->srcptr = avpkt->data + 4; - s->row_pos = 0; s->low_nibble = NULL; is_odd_frame = avpkt->data[0]; @@ -240,23 +221,28 @@ static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, s->frame.palette_has_changed = 1; - while (s->dstptr - s->dstbuf < - avctx->width * avctx->height && - s->srcptr - avpkt->data < avpkt->size) { - - tag = yop_get_next_nibble(s); + for (y = 0; y < avctx->height; y += 2) { + for (x = 0; x < avctx->width; x += 2) { + if (s->srcptr - avpkt->data >= avpkt->size) { + av_log(avctx, AV_LOG_ERROR, "Packet too small.\n"); + return AVERROR_INVALIDDATA; + } - if (tag != 0xf) { - yop_paint_block(s, tag); - }else { tag = yop_get_next_nibble(s); - ret = yop_copy_previous_block(s, tag); - if (ret < 0) { - avctx->release_buffer(avctx, &s->frame); - return ret; + + if (tag != 0xf) { + yop_paint_block(s, tag); + } else { + tag = yop_get_next_nibble(s); + ret = yop_copy_previous_block(s, tag); + if (ret < 0) { + avctx->release_buffer(avctx, &s->frame); + return ret; + } } + s->dstptr += 2; } - yop_next_macroblock(s); + s->dstptr += 2*s->frame.linesize[0] - x; } *got_frame = 1; |