Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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/modules/audio_coding/audio_network_adaptor/controller_manager.h " | 11 #include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h " |
| 12 | 12 |
| 13 #include <cmath> | 13 #include <cmath> |
| 14 #include <utility> | 14 #include <utility> |
| 15 | 15 |
| 16 #include "webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller.h " | |
| 17 #include "webrtc/modules/audio_coding/audio_network_adaptor/channel_controller.h " | |
| 18 #include "webrtc/modules/audio_coding/audio_network_adaptor/dtx_controller.h" | |
| 19 #include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller.h" | |
| 20 #include "webrtc/modules/audio_coding/audio_network_adaptor/frame_length_control ler.h" | |
| 16 #include "webrtc/system_wrappers/include/clock.h" | 21 #include "webrtc/system_wrappers/include/clock.h" |
| 17 | 22 |
| 23 #ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP | |
| 24 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | |
| 25 #include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/conf ig.pb.h" | |
| 26 #else | |
| 27 #include "webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h" | |
| 28 #endif | |
| 29 #endif | |
| 30 | |
| 18 namespace webrtc { | 31 namespace webrtc { |
| 19 | 32 |
| 33 namespace { | |
| 34 | |
| 35 #ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP | |
| 36 | |
| 37 std::unique_ptr<FecController> CreateFecController( | |
| 38 const audio_network_adaptor::config::FecController& config, | |
| 39 bool initial_fec_enabled, | |
| 40 const Clock* clock) { | |
| 41 RTC_DCHECK(config.has_fec_enabling_threshold() && | |
| 42 config.has_fec_disabling_threshold() && | |
| 43 config.has_time_constant_ms()); | |
|
kwiberg-webrtc
2016/09/28 08:59:22
Perfer to do
CHECK(a);
CHECK(b);
instead of
minyue-webrtc
2016/09/28 12:47:26
Done.
| |
| 44 | |
| 45 auto fec_enabling_threshold = config.fec_enabling_threshold(); | |
|
hlundin-webrtc
2016/09/27 20:21:15
Why create this copy?
minyue-webrtc
2016/09/27 20:50:20
right. should be auto&
| |
| 46 RTC_DCHECK(fec_enabling_threshold.has_low_bandwidth_bps() && | |
| 47 fec_enabling_threshold.has_low_bandwidth_packet_loss() && | |
| 48 fec_enabling_threshold.has_high_bandwidth_bps() && | |
| 49 fec_enabling_threshold.has_high_bandwidth_packet_loss()); | |
|
kwiberg-webrtc
2016/09/28 08:59:22
What will happen if you read a protobuf variable t
minyue-webrtc
2016/09/29 11:56:26
Done.
| |
| 50 | |
| 51 auto fec_disabling_threshold = config.fec_disabling_threshold(); | |
| 52 RTC_DCHECK(fec_disabling_threshold.has_low_bandwidth_bps() && | |
| 53 fec_disabling_threshold.has_low_bandwidth_packet_loss() && | |
| 54 fec_disabling_threshold.has_high_bandwidth_bps() && | |
| 55 fec_disabling_threshold.has_high_bandwidth_packet_loss()); | |
| 56 | |
| 57 return std::unique_ptr<FecController>(new FecController(FecController::Config( | |
| 58 initial_fec_enabled, | |
| 59 FecController::Config::Threshold( | |
|
hlundin-webrtc
2016/09/27 20:21:15
What is the type for fec_enabling_threshold? Isn't
minyue-webrtc
2016/09/27 20:50:20
because this functions are mainly converting from
kwiberg-webrtc
2016/09/28 08:59:22
Why do you convert?
minyue-webrtc
2016/09/28 12:47:26
Any better ideas?
kwiberg-webrtc
2016/09/28 13:10:24
Using protobuf directly, instead of converting it
minyue-webrtc
2016/09/28 16:32:34
We thought about using protobuf for all Controller
| |
| 60 fec_enabling_threshold.low_bandwidth_bps(), | |
| 61 fec_enabling_threshold.low_bandwidth_packet_loss(), | |
| 62 fec_enabling_threshold.high_bandwidth_bps(), | |
| 63 fec_enabling_threshold.high_bandwidth_packet_loss()), | |
| 64 FecController::Config::Threshold( | |
| 65 fec_disabling_threshold.low_bandwidth_bps(), | |
| 66 fec_disabling_threshold.low_bandwidth_packet_loss(), | |
| 67 fec_disabling_threshold.high_bandwidth_bps(), | |
| 68 fec_disabling_threshold.high_bandwidth_packet_loss()), | |
| 69 config.has_time_constant_ms(), clock))); | |
| 70 } | |
| 71 | |
| 72 std::unique_ptr<FrameLengthController> CreateFrameLengthController( | |
| 73 const audio_network_adaptor::config::FrameLengthController& config, | |
| 74 const std::vector<int>& encoder_frame_lengths_ms, | |
| 75 int initial_frame_length_ms) { | |
| 76 RTC_DCHECK(config.has_fl_increasing_packet_loss_fraction() && | |
| 77 config.has_fl_decreasing_packet_loss_fraction() && | |
| 78 config.has_fl_20ms_to_60ms_bandwidth_bps() && | |
| 79 config.has_fl_60ms_to_20ms_bandwidth_bps()); | |
| 80 | |
| 81 return std::unique_ptr<FrameLengthController>( | |
| 82 new FrameLengthController(FrameLengthController::Config( | |
| 83 encoder_frame_lengths_ms, initial_frame_length_ms, | |
| 84 config.fl_increasing_packet_loss_fraction(), | |
| 85 config.fl_decreasing_packet_loss_fraction(), | |
| 86 config.fl_20ms_to_60ms_bandwidth_bps(), | |
| 87 config.fl_60ms_to_20ms_bandwidth_bps()))); | |
| 88 } | |
| 89 | |
| 90 std::unique_ptr<ChannelController> CreateChannelController( | |
| 91 const audio_network_adaptor::config::ChannelController& config, | |
| 92 size_t num_encoder_channels, | |
| 93 size_t intial_channels_to_encode) { | |
| 94 RTC_DCHECK(config.has_channel_1_to_2_bandwidth_bps() && | |
| 95 config.has_channel_2_to_1_bandwidth_bps()); | |
| 96 | |
| 97 return std::unique_ptr<ChannelController>(new ChannelController( | |
| 98 ChannelController::Config(num_encoder_channels, intial_channels_to_encode, | |
| 99 config.channel_1_to_2_bandwidth_bps(), | |
| 100 config.channel_2_to_1_bandwidth_bps()))); | |
| 101 } | |
| 102 | |
| 103 std::unique_ptr<DtxController> CreateDtxController( | |
| 104 const audio_network_adaptor::config::DtxController& dtx_config, | |
| 105 bool initial_dtx_enabled) { | |
| 106 RTC_DCHECK(dtx_config.has_dtx_enabling_bandwidth_bps() && | |
| 107 dtx_config.has_dtx_disabling_bandwidth_bps()); | |
| 108 | |
| 109 return std::unique_ptr<DtxController>(new DtxController(DtxController::Config( | |
| 110 initial_dtx_enabled, dtx_config.dtx_enabling_bandwidth_bps(), | |
| 111 dtx_config.dtx_disabling_bandwidth_bps()))); | |
| 112 } | |
| 113 | |
| 114 using audio_network_adaptor::BitrateController; | |
| 115 std::unique_ptr<BitrateController> CreateBitrateController( | |
| 116 int initial_bitrate_bps, | |
| 117 int initial_frame_length_ms) { | |
| 118 return std::unique_ptr<BitrateController>(new BitrateController( | |
| 119 BitrateController::Config(initial_bitrate_bps, initial_frame_length_ms))); | |
| 120 } | |
| 121 #endif // WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP | |
| 122 | |
| 123 } // namespace | |
| 124 | |
| 20 ControllerManagerImpl::Config::Config(int min_reordering_time_ms, | 125 ControllerManagerImpl::Config::Config(int min_reordering_time_ms, |
| 21 float min_reordering_squared_distance, | 126 float min_reordering_squared_distance, |
| 22 const Clock* clock) | 127 const Clock* clock) |
| 23 : min_reordering_time_ms(min_reordering_time_ms), | 128 : min_reordering_time_ms(min_reordering_time_ms), |
| 24 min_reordering_squared_distance(min_reordering_squared_distance), | 129 min_reordering_squared_distance(min_reordering_squared_distance), |
| 25 clock(clock) {} | 130 clock(clock) {} |
| 26 | 131 |
| 27 ControllerManagerImpl::Config::~Config() = default; | 132 ControllerManagerImpl::Config::~Config() = default; |
| 28 | 133 |
| 134 std::unique_ptr<ControllerManager> ControllerManagerImpl::Create( | |
| 135 const std::string& config_string, | |
| 136 size_t num_encoder_channels, | |
| 137 const std::vector<int>& encoder_frame_lengths_ms, | |
| 138 size_t intial_channels_to_encode, | |
| 139 int initial_frame_length_ms, | |
| 140 int initial_bitrate_bps, | |
| 141 bool initial_fec_enabled, | |
| 142 bool initial_dtx_enabled, | |
| 143 const Clock* clock) { | |
| 144 #ifdef WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP | |
| 145 audio_network_adaptor::config::ControllerManager controller_manager_config; | |
| 146 controller_manager_config.ParseFromString(config_string); | |
| 147 | |
| 148 std::vector<std::unique_ptr<Controller>> controllers; | |
| 149 std::map<const Controller*, std::pair<int, float>> chracteristic_points; | |
| 150 | |
| 151 for (int i = 0; i < controller_manager_config.controllers_size(); ++i) { | |
| 152 auto controller_config = controller_manager_config.controllers(i); | |
| 153 std::unique_ptr<Controller> controller; | |
| 154 switch (controller_config.controller_case()) { | |
| 155 case audio_network_adaptor::config::Controller::kFecController: | |
| 156 controller = CreateFecController(controller_config.fec_controller(), | |
| 157 initial_fec_enabled, clock); | |
| 158 break; | |
| 159 case audio_network_adaptor::config::Controller::kFrameLengthController: | |
| 160 controller = CreateFrameLengthController( | |
| 161 controller_config.frame_length_controller(), | |
| 162 encoder_frame_lengths_ms, initial_frame_length_ms); | |
| 163 break; | |
| 164 case audio_network_adaptor::config::Controller::kChannelController: | |
| 165 controller = CreateChannelController( | |
| 166 controller_config.channel_controller(), num_encoder_channels, | |
| 167 intial_channels_to_encode); | |
| 168 break; | |
| 169 case audio_network_adaptor::config::Controller::kDtxController: | |
| 170 controller = CreateDtxController(controller_config.dtx_controller(), | |
| 171 initial_dtx_enabled); | |
| 172 break; | |
| 173 case audio_network_adaptor::config::Controller::kBitrateController: | |
| 174 controller = CreateBitrateController(initial_bitrate_bps, | |
| 175 initial_frame_length_ms); | |
| 176 break; | |
| 177 default: | |
|
hlundin-webrtc
2016/09/27 20:21:15
What is controller_config.controller_case()? Is it
minyue-webrtc
2016/09/27 20:50:20
yes, it is enum generated by protobuf. It has an a
hlundin-webrtc
2016/09/29 09:31:52
Then I think RTC_NOTREACHED() is the correct way.
minyue-webrtc
2016/09/29 11:56:26
Done.
| |
| 178 RTC_DCHECK(false); | |
|
kwiberg-webrtc
2016/09/28 08:59:22
RTC_NOTREACHED?
minyue-webrtc
2016/09/29 11:56:26
Done.
| |
| 179 } | |
| 180 if (controller_config.has_scoring_point()) { | |
| 181 auto characteristic_point = controller_config.scoring_point(); | |
| 182 RTC_DCHECK(characteristic_point.has_uplink_bandwidth_bps()); | |
| 183 RTC_DCHECK(characteristic_point.has_uplink_packet_loss_fraction()); | |
| 184 chracteristic_points[controller.get()] = std::make_pair<int, float>( | |
| 185 characteristic_point.uplink_bandwidth_bps(), | |
| 186 characteristic_point.uplink_packet_loss_fraction()); | |
| 187 } | |
| 188 controllers.push_back(std::move(controller)); | |
| 189 } | |
| 190 | |
| 191 RTC_DCHECK(controller_manager_config.has_min_reordering_time_ms()); | |
| 192 RTC_DCHECK(controller_manager_config.has_min_reordering_squared_distance()); | |
| 193 return std::unique_ptr<ControllerManagerImpl>(new ControllerManagerImpl( | |
| 194 ControllerManagerImpl::Config( | |
| 195 controller_manager_config.min_reordering_time_ms(), | |
| 196 controller_manager_config.min_reordering_squared_distance(), clock), | |
| 197 std::move(controllers), chracteristic_points)); | |
| 198 #else | |
| 199 RTC_DCHECK(false); | |
|
hlundin-webrtc
2016/09/27 20:21:15
RTC_NOTREACHED?
minyue-webrtc
2016/09/27 20:50:20
ok, will do.
| |
| 200 return nullptr; | |
| 201 #endif // WEBRTC_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP | |
| 202 } | |
| 203 | |
| 29 ControllerManagerImpl::ControllerManagerImpl(const Config& config) | 204 ControllerManagerImpl::ControllerManagerImpl(const Config& config) |
| 30 : ControllerManagerImpl( | 205 : ControllerManagerImpl( |
| 31 config, | 206 config, |
| 32 std::vector<std::unique_ptr<Controller>>(), | 207 std::vector<std::unique_ptr<Controller>>(), |
| 33 std::map<const Controller*, std::pair<int, float>>()) {} | 208 std::map<const Controller*, std::pair<int, float>>()) {} |
| 34 | 209 |
| 35 ControllerManagerImpl::ControllerManagerImpl( | 210 ControllerManagerImpl::ControllerManagerImpl( |
| 36 const Config& config, | 211 const Config& config, |
| 37 std::vector<std::unique_ptr<Controller>>&& controllers, | 212 std::vector<std::unique_ptr<Controller>>&& controllers, |
| 38 const std::map<const Controller*, std::pair<int, float>>& | 213 const std::map<const Controller*, std::pair<int, float>>& |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 NormalizeUplinkBandwidth(scoring_point.uplink_bandwidth_bps) - | 317 NormalizeUplinkBandwidth(scoring_point.uplink_bandwidth_bps) - |
| 143 NormalizeUplinkBandwidth(uplink_bandwidth_bps); | 318 NormalizeUplinkBandwidth(uplink_bandwidth_bps); |
| 144 float diff_normalized_packet_loss = | 319 float diff_normalized_packet_loss = |
| 145 NormalizePacketLossFraction(scoring_point.uplink_packet_loss_fraction) - | 320 NormalizePacketLossFraction(scoring_point.uplink_packet_loss_fraction) - |
| 146 NormalizePacketLossFraction(uplink_packet_loss_fraction); | 321 NormalizePacketLossFraction(uplink_packet_loss_fraction); |
| 147 return std::pow(diff_normalized_bitrate_bps, 2) + | 322 return std::pow(diff_normalized_bitrate_bps, 2) + |
| 148 std::pow(diff_normalized_packet_loss, 2); | 323 std::pow(diff_normalized_packet_loss, 2); |
| 149 } | 324 } |
| 150 | 325 |
| 151 } // namespace webrtc | 326 } // namespace webrtc |
| OLD | NEW |