OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/video_engine/vie_encoder.h" | 11 #include "webrtc/video_engine/vie_encoder.h" |
12 | 12 |
13 #include <assert.h> | 13 #include <assert.h> |
14 | 14 |
15 #include <algorithm> | 15 #include <algorithm> |
16 | 16 |
17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
18 #include "webrtc/common_video/interface/video_image.h" | 18 #include "webrtc/common_video/interface/video_image.h" |
19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
20 #include "webrtc/frame_callback.h" | 20 #include "webrtc/frame_callback.h" |
| 21 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
21 #include "webrtc/modules/pacing/include/paced_sender.h" | 22 #include "webrtc/modules/pacing/include/paced_sender.h" |
22 #include "webrtc/modules/utility/interface/process_thread.h" | 23 #include "webrtc/modules/utility/interface/process_thread.h" |
23 #include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" | 24 #include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" |
24 #include "webrtc/modules/video_coding/main/interface/video_coding.h" | 25 #include "webrtc/modules/video_coding/main/interface/video_coding.h" |
25 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" | 26 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" |
26 #include "webrtc/modules/video_coding/main/source/encoded_frame.h" | 27 #include "webrtc/modules/video_coding/main/source/encoded_frame.h" |
27 #include "webrtc/system_wrappers/interface/clock.h" | 28 #include "webrtc/system_wrappers/interface/clock.h" |
28 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" | 29 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
29 #include "webrtc/system_wrappers/interface/logging.h" | 30 #include "webrtc/system_wrappers/interface/logging.h" |
30 #include "webrtc/system_wrappers/interface/metrics.h" | 31 #include "webrtc/system_wrappers/interface/metrics.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 owner_->OnNetworkChanged(bitrate_bps, fraction_lost, rtt); | 99 owner_->OnNetworkChanged(bitrate_bps, fraction_lost, rtt); |
99 } | 100 } |
100 private: | 101 private: |
101 ViEEncoder* owner_; | 102 ViEEncoder* owner_; |
102 }; | 103 }; |
103 | 104 |
104 ViEEncoder::ViEEncoder(int32_t channel_id, | 105 ViEEncoder::ViEEncoder(int32_t channel_id, |
105 uint32_t number_of_cores, | 106 uint32_t number_of_cores, |
106 ProcessThread& module_process_thread, | 107 ProcessThread& module_process_thread, |
107 PacedSender* pacer, | 108 PacedSender* pacer, |
108 BitrateAllocator* bitrate_allocator, | 109 BitrateAllocator* bitrate_allocator) |
109 BitrateController* bitrate_controller) | |
110 : channel_id_(channel_id), | 110 : channel_id_(channel_id), |
111 number_of_cores_(number_of_cores), | 111 number_of_cores_(number_of_cores), |
112 vpm_(VideoProcessingModule::Create(ViEModuleId(-1, channel_id))), | 112 vpm_(VideoProcessingModule::Create(ViEModuleId(-1, channel_id))), |
113 qm_callback_(new QMVideoSettingsCallback(vpm_.get())), | 113 qm_callback_(new QMVideoSettingsCallback(vpm_.get())), |
114 vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(), | 114 vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(), |
115 this, | 115 this, |
116 qm_callback_.get())), | 116 qm_callback_.get())), |
117 send_payload_router_(NULL), | 117 send_payload_router_(NULL), |
118 callback_cs_(CriticalSectionWrapper::CreateCriticalSection()), | 118 callback_cs_(CriticalSectionWrapper::CreateCriticalSection()), |
119 data_cs_(CriticalSectionWrapper::CreateCriticalSection()), | 119 data_cs_(CriticalSectionWrapper::CreateCriticalSection()), |
120 pacer_(pacer), | 120 pacer_(pacer), |
121 bitrate_allocator_(bitrate_allocator), | 121 bitrate_allocator_(bitrate_allocator), |
122 bitrate_controller_(bitrate_controller), | |
123 time_of_last_frame_activity_ms_(0), | 122 time_of_last_frame_activity_ms_(0), |
124 simulcast_enabled_(false), | 123 simulcast_enabled_(false), |
125 min_transmit_bitrate_kbps_(0), | 124 min_transmit_bitrate_kbps_(0), |
126 last_observed_bitrate_bps_(0), | 125 last_observed_bitrate_bps_(0), |
127 target_delay_ms_(0), | 126 target_delay_ms_(0), |
128 network_is_transmitting_(true), | 127 network_is_transmitting_(true), |
129 encoder_paused_(false), | 128 encoder_paused_(false), |
130 encoder_paused_and_dropped_frame_(false), | 129 encoder_paused_and_dropped_frame_(false), |
131 fec_enabled_(false), | 130 fec_enabled_(false), |
132 nack_enabled_(false), | 131 nack_enabled_(false), |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 return -1; | 261 return -1; |
263 } | 262 } |
264 | 263 |
265 { | 264 { |
266 CriticalSectionScoped cs(data_cs_.get()); | 265 CriticalSectionScoped cs(data_cs_.get()); |
267 simulcast_enabled_ = video_codec.numberOfSimulcastStreams > 1; | 266 simulcast_enabled_ = video_codec.numberOfSimulcastStreams > 1; |
268 } | 267 } |
269 | 268 |
270 // Add a bitrate observer to the allocator and update the start, max and | 269 // Add a bitrate observer to the allocator and update the start, max and |
271 // min bitrates of the bitrate controller as needed. | 270 // min bitrates of the bitrate controller as needed. |
272 int allocated_bitrate_bps; | 271 int allocated_bitrate_bps = bitrate_allocator_->AddBitrateObserver( |
273 int new_bwe_candidate_bps = bitrate_allocator_->AddBitrateObserver( | 272 bitrate_observer_.get(), video_codec.minBitrate * 1000, |
274 bitrate_observer_.get(), video_codec.startBitrate * 1000, | 273 video_codec.maxBitrate * 1000); |
275 video_codec.minBitrate * 1000, video_codec.maxBitrate * 1000, | |
276 &allocated_bitrate_bps); | |
277 | |
278 // Only set the start/min/max bitrate of the bitrate controller if the start | |
279 // bitrate is greater than zero. The new API sets these via the channel group | |
280 // and passes a zero start bitrate to SetSendCodec. | |
281 // TODO(holmer): Remove this when the new API has been launched. | |
282 if (video_codec.startBitrate > 0) { | |
283 if (new_bwe_candidate_bps > 0) { | |
284 uint32_t current_bwe_bps = 0; | |
285 bitrate_controller_->AvailableBandwidth(¤t_bwe_bps); | |
286 bitrate_controller_->SetStartBitrate(std::max( | |
287 static_cast<uint32_t>(new_bwe_candidate_bps), current_bwe_bps)); | |
288 } | |
289 | |
290 int new_bwe_min_bps = 0; | |
291 int new_bwe_max_bps = 0; | |
292 bitrate_allocator_->GetMinMaxBitrateSumBps(&new_bwe_min_bps, | |
293 &new_bwe_max_bps); | |
294 bitrate_controller_->SetMinMaxBitrate(new_bwe_min_bps, new_bwe_max_bps); | |
295 } | |
296 | 274 |
297 webrtc::VideoCodec modified_video_codec = video_codec; | 275 webrtc::VideoCodec modified_video_codec = video_codec; |
298 modified_video_codec.startBitrate = allocated_bitrate_bps / 1000; | 276 modified_video_codec.startBitrate = allocated_bitrate_bps / 1000; |
299 | 277 |
300 size_t max_data_payload_length = send_payload_router_->MaxPayloadLength(); | 278 size_t max_data_payload_length = send_payload_router_->MaxPayloadLength(); |
301 if (vcm_->RegisterSendCodec(&modified_video_codec, number_of_cores_, | 279 if (vcm_->RegisterSendCodec(&modified_video_codec, number_of_cores_, |
302 static_cast<uint32_t>(max_data_payload_length)) != | 280 static_cast<uint32_t>(max_data_payload_length)) != |
303 VCM_OK) { | 281 VCM_OK) { |
304 return -1; | 282 return -1; |
305 } | 283 } |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 const uint32_t width, | 787 const uint32_t width, |
810 const uint32_t height) { | 788 const uint32_t height) { |
811 return vpm_->SetTargetResolution(width, height, frame_rate); | 789 return vpm_->SetTargetResolution(width, height, frame_rate); |
812 } | 790 } |
813 | 791 |
814 void QMVideoSettingsCallback::SetTargetFramerate(int frame_rate) { | 792 void QMVideoSettingsCallback::SetTargetFramerate(int frame_rate) { |
815 vpm_->SetTargetFramerate(frame_rate); | 793 vpm_->SetTargetFramerate(frame_rate); |
816 } | 794 } |
817 | 795 |
818 } // namespace webrtc | 796 } // namespace webrtc |
OLD | NEW |