summaryrefslogtreecommitdiff
path: root/libavcodec/magicyuv.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2016-06-02 06:59:46 +0200
committerPaul B Mahol <onemda@gmail.com>2016-06-02 06:59:46 +0200
commita3c2a9c736dd43a99087a043bf0a53685d8f94fa (patch)
treec7da877141623cd4193679d81b0f1aba6389f8b3 /libavcodec/magicyuv.c
parent7e0623b70ba79df6b07e71a810f495ce7e5886f8 (diff)
avcodec/magicyuv: fix decoding of raw slices
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/magicyuv.c')
-rw-r--r--libavcodec/magicyuv.c35
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) {