Commit 3c3704d2 authored by Vladimir Voroshilov's avatar Vladimir Voroshilov

Fix MJPEG decoder for AMV files.

Since decoding is doing from the end and aligned by 16
previous code worked correctly only when picture height was dividable by 16,
otherwise it provides garbage in top lines and truncates bottom.
New code adjusts data[] pointers taking in account alignment issue.

Originally committed as revision 10727 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 4d570f94
...@@ -671,7 +671,8 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int ss, i ...@@ -671,7 +671,8 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int ss, i
linesize[c]=s->linesize[c]; linesize[c]=s->linesize[c];
if(s->avctx->codec->id==CODEC_ID_AMV) { if(s->avctx->codec->id==CODEC_ID_AMV) {
//picture should be flipped upside-down for this codec //picture should be flipped upside-down for this codec
data[c] += (linesize[c] * (s->v_scount[i] * 8 * s->mb_height - 1)); assert(!(s->avctx->flags & CODEC_FLAG_EMU_EDGE));
data[c] += (linesize[c] * (s->v_scount[i] * (8 * s->mb_height -((s->height/s->v_max)&7)) - 1 ));
linesize[c] *= -1; linesize[c] *= -1;
} }
} }
......
...@@ -87,6 +87,7 @@ static int sp5x_decode_frame(AVCodecContext *avctx, ...@@ -87,6 +87,7 @@ static int sp5x_decode_frame(AVCodecContext *avctx,
recoded[j++] = 0xFF; recoded[j++] = 0xFF;
recoded[j++] = 0xD9; recoded[j++] = 0xD9;
avctx->flags &= ~CODEC_FLAG_EMU_EDGE;
i = ff_mjpeg_decode_frame(avctx, data, data_size, recoded, j); i = ff_mjpeg_decode_frame(avctx, data, data_size, recoded, j);
av_free(recoded); av_free(recoded);
...@@ -207,6 +208,5 @@ AVCodec amv_decoder = { ...@@ -207,6 +208,5 @@ AVCodec amv_decoder = {
ff_mjpeg_decode_init, ff_mjpeg_decode_init,
NULL, NULL,
ff_mjpeg_decode_end, ff_mjpeg_decode_end,
sp5x_decode_frame, sp5x_decode_frame
CODEC_CAP_DR1
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment