Index: webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc |
diff --git a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc |
index bef4e6397358850ba3fae5190e85792164a3ff6b..6b218423ecbad04edfbcc458700af442c5c25acc 100644 |
--- a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc |
+++ b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc |
@@ -14,6 +14,7 @@ |
#include <string.h> |
#include <time.h> |
#include <algorithm> |
+#include <string> |
// NOTE(ajm): Path provided by gyp. |
#include "libyuv/scale.h" // NOLINT |
@@ -38,6 +39,7 @@ namespace webrtc { |
namespace { |
const char kVp8PostProcArmFieldTrial[] = "WebRTC-VP8-Postproc-Arm"; |
+const char kVp8GfBoostFieldTrial[] = "WebRTC-VP8-GfBoost"; |
enum { kVp8ErrorPropagationTh = 30 }; |
enum { kVp832ByteAlign = 32 }; |
@@ -104,6 +106,20 @@ int NumStreamsDisabled(const std::vector<bool>& streams) { |
} |
return num_disabled; |
} |
+ |
+bool GetGfBoostPercentageFromFieldTrialGroup(int* boost_percentage) { |
+ std::string group = webrtc::field_trial::FindFullName(kVp8GfBoostFieldTrial); |
+ if (group.empty()) |
+ return false; |
+ |
+ if (sscanf(group.c_str(), "Enabled-%d", boost_percentage) != 1) |
+ return false; |
+ |
+ if (*boost_percentage < 0 || *boost_percentage > 100) |
+ return false; |
+ |
+ return true; |
+} |
} // namespace |
VP8Encoder* VP8Encoder::Create() { |
@@ -126,6 +142,7 @@ VP8EncoderImpl::VP8EncoderImpl() |
token_partitions_(VP8_ONE_TOKENPARTITION), |
down_scale_requested_(false), |
down_scale_bitrate_(0), |
+ use_gf_boost_(webrtc::field_trial::IsEnabled(kVp8GfBoostFieldTrial)), |
key_frame_request_(kMaxSimulcastStreams, false) { |
uint32_t seed = rtc::Time32(); |
srand(seed); |
@@ -634,6 +651,14 @@ int VP8EncoderImpl::InitAndSetControlSettings() { |
// rate control (drop frames on large target bitrate overshoot) |
vpx_codec_control(&(encoders_[i]), VP8E_SET_SCREEN_CONTENT_MODE, |
codec_.mode == kScreensharing ? 2 : 0); |
+ // Apply boost on golden frames (has only effect when resilience is off). |
+ if (use_gf_boost_ && codec_.VP8()->resilience == kResilienceOff) { |
+ int gf_boost_percent; |
+ if (GetGfBoostPercentageFromFieldTrialGroup(&gf_boost_percent)) { |
+ vpx_codec_control(&(encoders_[i]), VP8E_SET_GF_CBR_BOOST_PCT, |
+ gf_boost_percent); |
+ } |
+ } |
} |
inited_ = true; |
return WEBRTC_VIDEO_CODEC_OK; |