diff options
author | u-bo1b@0w.se <u-bo1b@0w.se> | 2013-02-18 20:47:45 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-02-20 04:14:04 +0100 |
commit | 8d1dd5bd5040bdea9770bd3f5ceb5aab670655d9 (patch) | |
tree | 7f0ac80cc6f04dc927603adf4c1f03dcbc6cb89a | |
parent | a3adbedf9b631554a5d0332805ea81313e5bc76f (diff) | |
download | ffmpeg-8d1dd5bd5040bdea9770bd3f5ceb5aab670655d9.tar.gz |
cinepak: More correct Cinepak decoder.
change the treatment of the strip y coordinates which previously did
not follow the description (nor did it behave like the binary decoder
on files with absolute strip offsets).
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/cinepak.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c index a88469a146..5bd3f1349b 100644 --- a/libavcodec/cinepak.c +++ b/libavcodec/cinepak.c @@ -366,10 +366,13 @@ static int cinepak_decode (CinepakContext *s) return AVERROR_INVALIDDATA; s->strips[i].id = s->data[0]; - s->strips[i].y1 = y0; - s->strips[i].x1 = 0; - s->strips[i].y2 = y0 + AV_RB16 (&s->data[8]); - s->strips[i].x2 = s->avctx->width; +/* zero y1 means "relative to the previous stripe" */ + if (!(s->strips[i].y1 = AV_RB16 (&s->data[4]))) + s->strips[i].y2 = (s->strips[i].y1 = y0) + AV_RB16 (&s->data[8]); + else + s->strips[i].y2 = AV_RB16 (&s->data[8]); + s->strips[i].x1 = AV_RB16 (&s->data[6]); + s->strips[i].x2 = AV_RB16 (&s->data[10]); if (s->strips[i].id == 0x10) s->frame.key_frame = 1; |