diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index c4d3ebd10..c4cdd4d9c 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -45,6 +45,7 @@ void Encoder::WriteAudio(AudioParams pcm_info, const QString &pcm_filename) EncodingParams::EncodingParams() : video_enabled_(false), video_bit_rate_(0), + video_min_bit_rate_(0), video_max_bit_rate_(0), video_buffer_size_(0), video_threads_(0), @@ -82,6 +83,11 @@ void EncodingParams::set_video_bit_rate(const int64_t &rate) video_bit_rate_ = rate; } +void EncodingParams::set_video_min_bit_rate(const int64_t &rate) +{ + video_min_bit_rate_ = rate; +} + void EncodingParams::set_video_max_bit_rate(const int64_t &rate) { video_max_bit_rate_ = rate; @@ -132,6 +138,11 @@ const int64_t &EncodingParams::video_bit_rate() const return video_bit_rate_; } +const int64_t &EncodingParams::video_min_bit_rate() const +{ + return video_min_bit_rate_; +} + const int64_t &EncodingParams::video_max_bit_rate() const { return video_max_bit_rate_; @@ -193,6 +204,7 @@ void EncodingParams::Save(QXmlStreamWriter *writer) const writer->writeTextElement(QStringLiteral("timebase"), video_params_.time_base().toString()); writer->writeTextElement(QStringLiteral("divider"), QString::number(video_params_.divider())); writer->writeTextElement(QStringLiteral("bitrate"), QString::number(video_bit_rate_)); + writer->writeTextElement(QStringLiteral("minbitrate"), QString::number(video_max_bit_rate_)); writer->writeTextElement(QStringLiteral("maxbitrate"), QString::number(video_max_bit_rate_)); writer->writeTextElement(QStringLiteral("bufsize"), QString::number(video_buffer_size_)); writer->writeTextElement(QStringLiteral("threads"), QString::number(video_threads_)); diff --git a/app/codec/encoder.h b/app/codec/encoder.h index f34c618d1..840728f1b 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -48,6 +48,7 @@ public: void set_video_option(const QString& key, const QString& value); void set_video_bit_rate(const int64_t& rate); + void set_video_min_bit_rate(const int64_t& rate); void set_video_max_bit_rate(const int64_t& rate); void set_video_buffer_size(const int64_t& sz); void set_video_threads(const int& threads); @@ -60,6 +61,7 @@ public: const VideoParams& video_params() const; const QHash& video_opts() const; const int64_t& video_bit_rate() const; + const int64_t& video_min_bit_rate() const; const int64_t& video_max_bit_rate() const; const int64_t& video_buffer_size() const; const int& video_threads() const; @@ -92,6 +94,7 @@ private: VideoParams video_params_; QHash video_opts_; int64_t video_bit_rate_; + int64_t video_min_bit_rate_; int64_t video_max_bit_rate_; int64_t video_buffer_size_; int video_threads_; diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index bc38958c6..31dc63198 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -517,6 +517,10 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, AVStream** stream_ptr, AV codec_ctx->bit_rate = params().video_bit_rate(); } + if (params().video_min_bit_rate() > 0) { + codec_ctx->rc_min_rate = params().video_min_bit_rate(); + } + if (params().video_max_bit_rate() > 0) { codec_ctx->rc_max_rate = params().video_max_bit_rate(); } diff --git a/app/dialog/export/codec/h264section.cpp b/app/dialog/export/codec/h264section.cpp index ac4dcda78..cb3e0c713 100644 --- a/app/dialog/export/codec/h264section.cpp +++ b/app/dialog/export/codec/h264section.cpp @@ -82,15 +82,17 @@ void H264Section::AddOpts(EncodingParams *params) } else { - int64_t target_rate, max_rate; + int64_t target_rate, max_rate, min_rate; if (method == kTargetBitRate) { // Use user-supplied values for the bit rate target_rate = bitrate_section_->GetTargetBitRate(); + min_rate = 0; max_rate = bitrate_section_->GetMaximumBitRate(); } else { // Calculate the bit rate from the file size divided by the sequence length in seconds (bits per second) target_rate = qRound64(static_cast(filesize_section_->GetFileSize()) / params->GetExportLength().toDouble()); + min_rate = target_rate; max_rate = target_rate; } @@ -98,6 +100,7 @@ void H264Section::AddOpts(EncodingParams *params) params->set_video_option(QStringLiteral("crf"), QStringLiteral("-1")); params->set_video_bit_rate(target_rate); + params->set_video_min_bit_rate(min_rate); params->set_video_max_bit_rate(max_rate); params->set_video_buffer_size(2000000);