diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index 642ece177d06d2c87a1d515cbf840e5c94907831..54b8db40956dd53d1bb3e040e290593cd644070d 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -59,6 +59,7 @@ extern "C" { #include "ffmpeg_codecs.hpp" +#include #include #ifdef WIN32 @@ -1114,6 +1115,12 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, c->codec_type = AVMEDIA_TYPE_VIDEO; + // Set per-codec defaults + AVCodecID c_id = c->codec_id; + avcodec_get_context_defaults3(c, codec); + // avcodec_get_context_defaults3 erases codec_id for some reason + c->codec_id = c_id; + /* put sample parameters */ int64_t lbit_rate = (int64_t)bitrate; lbit_rate += (bitrate / 2); @@ -1176,6 +1183,16 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, /* avoid FFMPEG warning 'clipping 1 dct coefficients...' */ c->mb_decision=2; } + /* Some settings for libx264 encoding, restore dummy values for gop_size + and qmin since they will be set to reasonable defaults by the libx264 + preset system. Also, use a crf encode with the default quality rating, + this seems easier than finding an appropriate default bitrate. */ + if (c->codec_id == AV_CODEC_ID_H264) { + c->gop_size = -1; + c->qmin = -1; + c->bit_rate = 0; + av_opt_set(c->priv_data,"crf","23", 0); + } #if LIBAVCODEC_VERSION_INT>0x000409 // some formats want stream headers to be seperate if(oc->oformat->flags & AVFMT_GLOBALHEADER)