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 |
(...skipping 29 matching lines...) Expand all Loading... | |
40 kRedForFecHeaderLength + media_packet.payload_size()); | 40 kRedForFecHeaderLength + media_packet.payload_size()); |
41 RTC_DCHECK(red_payload); | 41 RTC_DCHECK(red_payload); |
42 red_payload[0] = media_packet.PayloadType(); | 42 red_payload[0] = media_packet.PayloadType(); |
43 memcpy(&red_payload[kRedForFecHeaderLength], media_packet.payload(), | 43 memcpy(&red_payload[kRedForFecHeaderLength], media_packet.payload(), |
44 media_packet.payload_size()); | 44 media_packet.payload_size()); |
45 } | 45 } |
46 } // namespace | 46 } // namespace |
47 | 47 |
48 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSender* rtp_sender) | 48 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSender* rtp_sender) |
49 : rtp_sender_(rtp_sender), | 49 : rtp_sender_(rtp_sender), |
50 clock_(clock), | 50 clock_(clock), |
brandtr
2016/10/31 12:47:04
Please help me check that I correctly copy-pasted
stefan-webrtc
2016/11/03 13:52:26
Done.
| |
51 video_type_(kRtpVideoGeneric), | |
52 retransmission_settings_(kRetransmitBaseLayer), | |
53 last_rotation_(kVideoRotation_0), | |
54 fec_enabled_(false), | |
55 red_payload_type_(-1), | |
56 fec_payload_type_(-1), | |
57 delta_fec_params_{0, 1, kFecMaskRandom}, | |
58 key_fec_params_{0, 1, kFecMaskRandom}, | |
51 fec_bitrate_(1000, RateStatistics::kBpsScale), | 59 fec_bitrate_(1000, RateStatistics::kBpsScale), |
52 video_bitrate_(1000, RateStatistics::kBpsScale) { | 60 video_bitrate_(1000, RateStatistics::kBpsScale) { |
53 encoder_checker_.Detach(); | 61 encoder_checker_.Detach(); |
54 } | 62 } |
55 | 63 |
56 RTPSenderVideo::~RTPSenderVideo() {} | 64 RTPSenderVideo::~RTPSenderVideo() {} |
57 | 65 |
58 void RTPSenderVideo::SetVideoCodecType(RtpVideoCodecTypes video_type) { | 66 void RTPSenderVideo::SetVideoCodecType(RtpVideoCodecTypes video_type) { |
59 video_type_ = video_type; | 67 video_type_ = video_type; |
60 } | 68 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); | 173 fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); |
166 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 174 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
167 "Video::PacketFec", "timestamp", rtp_timestamp, | 175 "Video::PacketFec", "timestamp", rtp_timestamp, |
168 "seqnum", fec_sequence_number); | 176 "seqnum", fec_sequence_number); |
169 } else { | 177 } else { |
170 LOG(LS_WARNING) << "Failed to send FEC packet " << fec_sequence_number; | 178 LOG(LS_WARNING) << "Failed to send FEC packet " << fec_sequence_number; |
171 } | 179 } |
172 } | 180 } |
173 } | 181 } |
174 | 182 |
175 void RTPSenderVideo::SetGenericFECStatus(bool enable, | 183 void RTPSenderVideo::SetUlpfecConfig(bool enabled, |
176 uint8_t payload_type_red, | 184 int red_payload_type, |
177 uint8_t payload_type_fec) { | 185 int ulpfec_payload_type) { |
178 RTC_DCHECK(!enable || payload_type_red > 0); | 186 RTC_DCHECK(!enabled || red_payload_type > 0); |
187 RTC_DCHECK_LE(red_payload_type, 127); | |
188 RTC_DCHECK_LE(ulpfec_payload_type, 127); | |
189 | |
179 rtc::CritScope cs(&crit_); | 190 rtc::CritScope cs(&crit_); |
180 fec_enabled_ = enable; | 191 fec_enabled_ = enabled; |
181 red_payload_type_ = payload_type_red; | 192 red_payload_type_ = red_payload_type; |
182 fec_payload_type_ = payload_type_fec; | 193 fec_payload_type_ = ulpfec_payload_type; |
194 | |
195 // Reset FEC rates. | |
183 delta_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; | 196 delta_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; |
184 key_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; | 197 key_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; |
185 } | 198 } |
186 | 199 |
187 void RTPSenderVideo::GenericFECStatus(bool* enable, | 200 void RTPSenderVideo::GetUlpfecConfig(bool* enabled, |
188 uint8_t* payload_type_red, | 201 int* red_payload_type, |
189 uint8_t* payload_type_fec) const { | 202 int* ulpfec_payload_type) const { |
190 rtc::CritScope cs(&crit_); | 203 rtc::CritScope cs(&crit_); |
191 *enable = fec_enabled_; | 204 *enabled = fec_enabled_; |
192 *payload_type_red = red_payload_type_; | 205 *red_payload_type = red_payload_type_; |
193 *payload_type_fec = fec_payload_type_; | 206 *ulpfec_payload_type = fec_payload_type_; |
194 } | 207 } |
195 | 208 |
196 size_t RTPSenderVideo::FecPacketOverhead() const { | 209 size_t RTPSenderVideo::FecPacketOverhead() const { |
197 rtc::CritScope cs(&crit_); | 210 rtc::CritScope cs(&crit_); |
198 size_t overhead = 0; | 211 size_t overhead = 0; |
199 if (red_payload_type_ != 0) { | 212 if (red_payload_type_ != -1) { |
200 // Overhead is FEC headers plus RED for FEC header plus anything in RTP | 213 // Overhead is FEC headers plus RED for FEC header plus anything in RTP |
201 // header beyond the 12 bytes base header (CSRC list, extensions...) | 214 // header beyond the 12 bytes base header (CSRC list, extensions...) |
202 // This reason for the header extensions to be included here is that | 215 // This reason for the header extensions to be included here is that |
203 // from an FEC viewpoint, they are part of the payload to be protected. | 216 // from an FEC viewpoint, they are part of the payload to be protected. |
204 // (The base RTP header is already protected by the FEC header.) | 217 // (The base RTP header is already protected by the FEC header.) |
205 return producer_fec_.MaxPacketOverhead() + kRedForFecHeaderLength + | 218 return producer_fec_.MaxPacketOverhead() + kRedForFecHeaderLength + |
206 (rtp_sender_->RtpHeaderLength() - kRtpHeaderSize); | 219 (rtp_sender_->RtpHeaderLength() - kRtpHeaderSize); |
207 } | 220 } |
208 if (fec_enabled_) | 221 if (fec_enabled_) |
209 overhead += producer_fec_.MaxPacketOverhead(); | 222 overhead += producer_fec_.MaxPacketOverhead(); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
299 | 312 |
300 size_t payload_bytes_in_packet = 0; | 313 size_t payload_bytes_in_packet = 0; |
301 if (!packetizer->NextPacket(payload, &payload_bytes_in_packet, &last)) | 314 if (!packetizer->NextPacket(payload, &payload_bytes_in_packet, &last)) |
302 return false; | 315 return false; |
303 | 316 |
304 packet->SetPayloadSize(payload_bytes_in_packet); | 317 packet->SetPayloadSize(payload_bytes_in_packet); |
305 packet->SetMarker(last); | 318 packet->SetMarker(last); |
306 if (!rtp_sender_->AssignSequenceNumber(packet.get())) | 319 if (!rtp_sender_->AssignSequenceNumber(packet.get())) |
307 return false; | 320 return false; |
308 | 321 |
309 if (red_payload_type != 0) { | 322 if (red_payload_type != -1) { |
310 SendVideoPacketAsRed(std::move(packet), storage, | 323 SendVideoPacketAsRed(std::move(packet), storage, |
311 packetizer->GetProtectionType() == kProtectedPacket); | 324 packetizer->GetProtectionType() == kProtectedPacket); |
312 } else { | 325 } else { |
313 SendVideoPacket(std::move(packet), storage); | 326 SendVideoPacket(std::move(packet), storage); |
314 } | 327 } |
315 | 328 |
316 if (first_frame) { | 329 if (first_frame) { |
317 if (first) { | 330 if (first) { |
318 LOG(LS_INFO) | 331 LOG(LS_INFO) |
319 << "Sent first RTP packet of the first video frame (pre-pacer)"; | 332 << "Sent first RTP packet of the first video frame (pre-pacer)"; |
(...skipping 25 matching lines...) Expand all Loading... | |
345 rtc::CritScope cs(&crit_); | 358 rtc::CritScope cs(&crit_); |
346 return retransmission_settings_; | 359 return retransmission_settings_; |
347 } | 360 } |
348 | 361 |
349 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { | 362 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { |
350 rtc::CritScope cs(&crit_); | 363 rtc::CritScope cs(&crit_); |
351 retransmission_settings_ = settings; | 364 retransmission_settings_ = settings; |
352 } | 365 } |
353 | 366 |
354 } // namespace webrtc | 367 } // namespace webrtc |
OLD | NEW |