From e3803f9985af65978ab044e06cd2fd571ac23723 Mon Sep 17 00:00:00 2001 From: gferry Date: Wed, 20 Feb 2013 14:19:55 +0100 Subject: [PATCH] fix for OpenCV issue #2815 - 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 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index 0c9c950f02..e590cd2784 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -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();