fix for OpenCV issue #2815
authorgferry <guiluge@gmail.com>
Wed, 20 Feb 2013 13:19:55 +0000 (14:19 +0100)
committerAndrey Kamaev <andrey.kamaev@itseez.com>
Thu, 21 Feb 2013 13:37:24 +0000 (17:37 +0400)
- libavcodec issue
- some decoders alter AVCodecContext width/height values, in a wrong way
- eg. in issue 2815, vp6f decoder changes these values, resulting in distorted / invalid frames
- this patch forces default AVCodecContext values

modules/highgui/src/cap_ffmpeg_impl.hpp

index 0c9c950..e590cd2 100644 (file)
@@ -560,6 +560,10 @@ bool CvCapture_FFMPEG::open( const char* _filename )
 
         if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0)
         {
+            // backup encoder' width/height
+            int enc_width = enc->width;
+            int enc_height = enc->height;
+
             AVCodec *codec = avcodec_find_decoder(enc->codec_id);
             if (!codec ||
 #if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
@@ -570,6 +574,10 @@ bool CvCapture_FFMPEG::open( const char* _filename )
                 < 0)
                 goto exit_func;
 
+            // checking width/height (since decoder can sometimes alter it, eg. vp6f)
+            if (enc_width && (enc->width != enc_width)) { enc->width = enc_width; }
+            if (enc_height && (enc->height != enc_height)) { enc->height = enc_height; }
+
             video_stream = i;
             video_st = ic->streams[i];
             picture = avcodec_alloc_frame();