| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 return; | 78 return; |
| 79 case kVideoCodecGeneric: | 79 case kVideoCodecGeneric: |
| 80 rtp->codec = kRtpVideoGeneric; | 80 rtp->codec = kRtpVideoGeneric; |
| 81 rtp->simulcastIdx = info->codecSpecific.generic.simulcast_idx; | 81 rtp->simulcastIdx = info->codecSpecific.generic.simulcast_idx; |
| 82 return; | 82 return; |
| 83 default: | 83 default: |
| 84 return; | 84 return; |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 VideoCodec DefaultCodec() { |
| 89 VideoCodec codec; |
| 90 memset(&codec, 0, sizeof(VideoCodec)); |
| 91 return codec; |
| 92 } |
| 93 |
| 88 } // namespace | 94 } // namespace |
| 89 | 95 |
| 90 PayloadRouter::PayloadRouter(const std::vector<RtpRtcp*>& rtp_modules, | 96 PayloadRouter::PayloadRouter(const std::vector<RtpRtcp*>& rtp_modules, |
| 91 int payload_type) | 97 int payload_type) |
| 92 : active_(false), | 98 : active_(false), |
| 93 num_sending_modules_(1), | 99 num_sending_modules_(1), |
| 100 simulcast_state_(DefaultCodec()), |
| 94 rtp_modules_(rtp_modules), | 101 rtp_modules_(rtp_modules), |
| 95 payload_type_(payload_type) { | 102 payload_type_(payload_type) { |
| 96 UpdateModuleSendingState(); | 103 UpdateModuleSendingState(); |
| 97 } | 104 } |
| 98 | 105 |
| 99 PayloadRouter::~PayloadRouter() {} | 106 PayloadRouter::~PayloadRouter() {} |
| 100 | 107 |
| 101 size_t PayloadRouter::DefaultMaxPayloadLength() { | 108 size_t PayloadRouter::DefaultMaxPayloadLength() { |
| 102 const size_t kIpUdpSrtpLength = 44; | 109 const size_t kIpUdpSrtpLength = 44; |
| 103 return IP_PACKET_SIZE - kIpUdpSrtpLength; | 110 return IP_PACKET_SIZE - kIpUdpSrtpLength; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 return rtp_modules_[stream_idx]->SendOutgoingData( | 170 return rtp_modules_[stream_idx]->SendOutgoingData( |
| 164 encoded_image._frameType, payload_type_, encoded_image._timeStamp, | 171 encoded_image._frameType, payload_type_, encoded_image._timeStamp, |
| 165 encoded_image.capture_time_ms_, encoded_image._buffer, | 172 encoded_image.capture_time_ms_, encoded_image._buffer, |
| 166 encoded_image._length, fragmentation, &rtp_video_header); | 173 encoded_image._length, fragmentation, &rtp_video_header); |
| 167 } | 174 } |
| 168 | 175 |
| 169 void PayloadRouter::SetTargetSendBitrate(uint32_t bitrate_bps) { | 176 void PayloadRouter::SetTargetSendBitrate(uint32_t bitrate_bps) { |
| 170 rtc::CritScope lock(&crit_); | 177 rtc::CritScope lock(&crit_); |
| 171 RTC_DCHECK_LE(streams_.size(), rtp_modules_.size()); | 178 RTC_DCHECK_LE(streams_.size(), rtp_modules_.size()); |
| 172 | 179 |
| 173 // TODO(sprang): Rebase https://codereview.webrtc.org/1913073002/ on top of | 180 if (simulcast_state_.NumStreams() > 0) { |
| 174 // this. | 181 simulcast_state_.AllocateBitrate(bitrate_bps); |
| 175 int bitrate_remainder = bitrate_bps; | 182 for (auto& stream : simulcast_state_.Streams()) |
| 176 for (size_t i = 0; i < streams_.size() && bitrate_remainder > 0; ++i) { | 183 rtp_modules_[stream.idx]->SetTargetSendBitrate(stream.allocated_rate_bps); |
| 177 int stream_bitrate = 0; | 184 } else { |
| 178 if (streams_[i].max_bitrate_bps > bitrate_remainder) { | 185 rtp_modules_[0]->SetTargetSendBitrate(bitrate_bps); |
| 179 stream_bitrate = bitrate_remainder; | |
| 180 } else { | |
| 181 stream_bitrate = streams_[i].max_bitrate_bps; | |
| 182 } | |
| 183 bitrate_remainder -= stream_bitrate; | |
| 184 rtp_modules_[i]->SetTargetSendBitrate(stream_bitrate); | |
| 185 } | 186 } |
| 186 } | 187 } |
| 187 | 188 |
| 189 void PayloadRouter::UpdateSimulcastState(const SimulcastState& state) { |
| 190 rtc::CritScope lock(&crit_); |
| 191 simulcast_state_ = state; |
| 192 } |
| 193 |
| 188 size_t PayloadRouter::MaxPayloadLength() const { | 194 size_t PayloadRouter::MaxPayloadLength() const { |
| 189 size_t min_payload_length = DefaultMaxPayloadLength(); | 195 size_t min_payload_length = DefaultMaxPayloadLength(); |
| 190 rtc::CritScope lock(&crit_); | 196 rtc::CritScope lock(&crit_); |
| 191 for (size_t i = 0; i < num_sending_modules_; ++i) { | 197 for (size_t i = 0; i < num_sending_modules_; ++i) { |
| 192 size_t module_payload_length = rtp_modules_[i]->MaxDataPayloadLength(); | 198 size_t module_payload_length = rtp_modules_[i]->MaxDataPayloadLength(); |
| 193 if (module_payload_length < min_payload_length) | 199 if (module_payload_length < min_payload_length) |
| 194 min_payload_length = module_payload_length; | 200 min_payload_length = module_payload_length; |
| 195 } | 201 } |
| 196 return min_payload_length; | 202 return min_payload_length; |
| 197 } | 203 } |
| 198 | 204 |
| 199 } // namespace webrtc | 205 } // namespace webrtc |
| OLD | NEW |