Browse Source

avcodec/magicyuv: fix decoding of raw slices

Signed-off-by: Paul B Mahol <onemda@gmail.com>
tags/n3.1
Paul B Mahol 9 years ago
parent
commit
a3c2a9c736
1 changed files with 23 additions and 12 deletions
  1. +23
    -12
      libavcodec/magicyuv.c

+ 23
- 12
libavcodec/magicyuv.c View File

@@ -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) {


Loading…
Cancel
Save