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