[FFmpeg-cvslog] r20552 - trunk/libavcodec/mjpegdec.c

Reimar Döffinger Reimar.Doeffinger
Thu Nov 19 15:10:23 CET 2009


On Thu, Nov 19, 2009 at 12:49:03PM +0100, reimar wrote:
> Author: reimar
> Date: Thu Nov 19 12:49:03 2009
> New Revision: 20552
> 
> Log:
> Disable image flipping during JPEG decoding if CODEC_FLAG_EMU_EDGE is set
> instead of either aborting on the assert or crashing due to writing beyond
> the array due to insufficient padding.
> 
> Modified:
>    trunk/libavcodec/mjpegdec.c
> 
> Modified: trunk/libavcodec/mjpegdec.c
> ==============================================================================
> --- trunk/libavcodec/mjpegdec.c	Thu Nov 19 01:05:30 2009	(r20551)
> +++ trunk/libavcodec/mjpegdec.c	Thu Nov 19 12:49:03 2009	(r20552)
> @@ -770,6 +770,10 @@ static int mjpeg_decode_scan(MJpegDecode
>      uint8_t* data[MAX_COMPONENTS];
>      int linesize[MAX_COMPONENTS];
>  
> +    if(s->flipped && s->avctx->flags & CODEC_FLAG_EMU_EDGE) {
> +        av_log(s->avctx, AV_LOG_ERROR, "Can not flip image with CODEC_FLAG_EMU_EDGE set!\n");
> +        s->flipped = 0;
> +    }
>      for(i=0; i < nb_components; i++) {
>          int c = s->comp_index[i];
>          data[c] = s->picture.data[c];
> @@ -777,7 +781,6 @@ static int mjpeg_decode_scan(MJpegDecode
>          s->coefs_finished[c] |= 1;
>          if(s->flipped) {
>              //picture should be flipped upside-down for this codec
> -            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 ));

I just realize that this is more strict than necessary, it is only an
issue when the height does not match the block size, so the following one should
be ok, what do you think?
There is the additional issue that the check for flipped is not correct,
since only videos encoded with the Intel MJPEG VFW encoder are flipped,
wereas JPEGs generated by some cameras also use the Intel library, just
not the VFW codec and aren't flipped, sample here:
http://johannes.eventify.de/kiste-temp/Sample_slomo_kiste.avi
(hard see, but it plays flipped because s->flipped is incorrectly 1).

Index: libavcodec/mjpegdec.c
===================================================================
--- libavcodec/mjpegdec.c       (revision 20552)
+++ libavcodec/mjpegdec.c       (working copy)
@@ -770,7 +770,7 @@
     uint8_t* data[MAX_COMPONENTS];
     int linesize[MAX_COMPONENTS];
 
-    if(s->flipped && s->avctx->flags & CODEC_FLAG_EMU_EDGE) {
+    if(s->flipped && (s->avctx->flags & CODEC_FLAG_EMU_EDGE) && ((s->height/s->v_max)&7)) {
         av_log(s->avctx, AV_LOG_ERROR, "Can not flip image with CODEC_FLAG_EMU_EDGE set!\n");
         s->flipped = 0;
     }



More information about the ffmpeg-cvslog mailing list