diff options
author | Paul B Mahol <onemda@gmail.com> | 2016-06-02 06:59:46 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2016-06-02 06:59:46 +0200 |
commit | a3c2a9c736dd43a99087a043bf0a53685d8f94fa (patch) | |
tree | c7da877141623cd4193679d81b0f1aba6389f8b3 | |
parent | 7e0623b70ba79df6b07e71a810f495ce7e5886f8 (diff) | |
download | ffmpeg-a3c2a9c736dd43a99087a043bf0a53685d8f94fa.tar.gz |
avcodec/magicyuv: fix decoding of raw slices
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavcodec/magicyuv.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c index 1af76710dc..d96084d2d6 100644 --- a/libavcodec/magicyuv.c +++ b/libavcodec/magicyuv.c @@ -124,26 +124,37 @@ static int decode_slice(AVCodecContext *avctx, void *tdata, int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]); int fake_stride = p->linesize[i] * (1 + interlaced); int stride = p->linesize[i]; - int pred; + int flags, pred; if ((ret = init_get_bits8(&b, s->buf + s->slices[i][j].start, s->slices[i][j].size)) < 0) return ret; - pred = get_bits(&b, 16); + flags = get_bits(&b, 8); + pred = get_bits(&b, 8); + dst = p->data[i] + j * sheight * stride; - for (k = 0; k < height; k++) { - for (x = 0; x < width; x++) { - int pix; - if (get_bits_left(&b) <= 0) { - return AVERROR_INVALIDDATA; + if (flags & 1) { + for (k = 0; k < height; k++) { + for (x = 0; x < width; x++) { + dst[x] = get_bits(&b, 8); } - pix = get_vlc2(&b, s->vlc[i].table, s->vlc[i].bits, 3); - if (pix < 0) { - return AVERROR_INVALIDDATA; + dst += stride; + } + } else { + for (k = 0; k < height; k++) { + for (x = 0; x < width; x++) { + int pix; + if (get_bits_left(&b) <= 0) { + return AVERROR_INVALIDDATA; + } + pix = get_vlc2(&b, s->vlc[i].table, s->vlc[i].bits, 3); + if (pix < 0) { + return AVERROR_INVALIDDATA; + } + dst[x] = 255 - pix; } - dst[x] = 255 - pix; + dst += stride; } - dst += stride; } if (pred == LEFT) { |