Index: webrtc/modules/video_coding/codecs/vp9/screenshare_layers.cc |
diff --git a/webrtc/modules/video_coding/codecs/vp9/screenshare_layers.cc b/webrtc/modules/video_coding/codecs/vp9/screenshare_layers.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ecf0ffe16f846aa429a7ac406105f95bc3cd172c |
--- /dev/null |
+++ b/webrtc/modules/video_coding/codecs/vp9/screenshare_layers.cc |
@@ -0,0 +1,64 @@ |
+/* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
sprang_webrtc
2015/09/15 15:41:21
2015
philipel
2015/09/16 09:35:53
Done.
|
+* |
+* Use of this source code is governed by a BSD-style license |
+* that can be found in the LICENSE file in the root of the source |
+* tree. An additional intellectual property rights grant can be found |
+* in the file PATENTS. All contributing project authors may |
+* be found in the AUTHORS file in the root of the source tree. |
+*/ |
+ |
+#include <algorithm> |
+#include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h" |
+#include "webrtc/base/checks.h" |
+ |
+namespace webrtc { |
+ |
+ScreenshareLayersVP9::ScreenshareLayersVP9() |
+ : threshold_kbps_(0.f), |
+ l0_bits_used_(0.f), |
+ last_ts_(0), |
+ current_layer_(0) {} |
+ |
+int ScreenshareLayersVP9::CurrentLayer() const { |
+ return current_layer_; |
+} |
+ |
+void ScreenshareLayersVP9::ConfigureBitrate(int threshold_kbps) { |
+ threshold_kbps_ = threshold_kbps; |
+} |
+ |
+void ScreenshareLayersVP9::LayerFrameEncoded(unsigned int size_bytes, |
+ int layer_id) { |
+ if (layer_id == 0) { |
+ l0_bits_used_ += size_bytes * 8; |
+ } |
sprang_webrtc
2015/09/15 15:41:21
remove {}
philipel
2015/09/16 09:35:53
Done.
|
+} |
+ |
+VP9EncoderImpl::SuperFrameRefSettings ScreenshareLayersVP9::SfSettings( |
+ uint32_t timestamp, |
+ bool is_keyframe) { |
+ VP9EncoderImpl::SuperFrameRefSettings res; |
+ res.stop_layer = 1; |
+ res.layer[0].upd_buf = 0; |
+ res.layer[0].ref_buf1 = 0; |
+ res.layer[1].upd_buf = 1; |
+ res.layer[1].ref_buf1 = 1; |
+ res.is_keyframe = is_keyframe; |
+ if (last_ts_ == 0 || is_keyframe) { |
+ res.start_layer = 0; |
+ } else { |
+ float diff = timestamp - last_ts_; |
+ l0_bits_used_ = |
+ std::max(0.f, l0_bits_used_ - diff / 90.f * threshold_kbps_); |
+ if (l0_bits_used_ > threshold_kbps_ * 1000 && !is_keyframe) { |
sprang_webrtc
2015/09/15 15:41:21
is_keyframe should always be false here?
philipel
2015/09/16 09:35:53
If it is a keyframe then we must encode both layer
sprang_webrtc
2015/09/25 09:53:15
I was more referring to the fact that if is_keyfra
|
+ res.start_layer = 1; |
+ } else { |
+ res.start_layer = 0; |
+ } |
+ } |
sprang_webrtc
2015/09/15 15:41:21
As noted in a previous comment, this measures aver
philipel
2015/09/16 09:35:53
It is NOT true that it measures the average bitrat
sprang_webrtc
2015/09/25 09:53:15
Ah, you're right.
|
+ current_layer_ = res.start_layer; |
+ last_ts_ = timestamp; |
+ return res; |
+} |
+ |
+} // namespace webrtc |