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 18 matching lines...) Expand all Loading... | |
29 namespace webrtc { | 29 namespace webrtc { |
30 enum { REDForFECHeaderLength = 1 }; | 30 enum { REDForFECHeaderLength = 1 }; |
31 | 31 |
32 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) | 32 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) |
33 : _rtpSender(*rtpSender), | 33 : _rtpSender(*rtpSender), |
34 _videoType(kRtpVideoGeneric), | 34 _videoType(kRtpVideoGeneric), |
35 _retransmissionSettings(kRetransmitBaseLayer), | 35 _retransmissionSettings(kRetransmitBaseLayer), |
36 // Generic FEC | 36 // Generic FEC |
37 fec_(), | 37 fec_(), |
38 fec_enabled_(false), | 38 fec_enabled_(false), |
39 red_payload_type_(-1), | 39 red_payload_type_(0), |
40 fec_payload_type_(-1), | 40 fec_payload_type_(0), |
41 delta_fec_params_(), | 41 delta_fec_params_(), |
42 key_fec_params_(), | 42 key_fec_params_(), |
43 producer_fec_(&fec_), | 43 producer_fec_(&fec_), |
44 _fecOverheadRate(clock, NULL), | 44 _fecOverheadRate(clock, NULL), |
45 _videoBitrate(clock, NULL) { | 45 _videoBitrate(clock, NULL) { |
46 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 46 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); |
47 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 47 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); |
48 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 48 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; |
49 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = | 49 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = |
50 kFecMaskRandom; | 50 kFecMaskRandom; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
163 } | 163 } |
164 delete fec_packet; | 164 delete fec_packet; |
165 ++next_fec_sequence_number; | 165 ++next_fec_sequence_number; |
166 } | 166 } |
167 } | 167 } |
168 | 168 |
169 void RTPSenderVideo::SetGenericFECStatus(const bool enable, | 169 void RTPSenderVideo::SetGenericFECStatus(const bool enable, |
170 const uint8_t payloadTypeRED, | 170 const uint8_t payloadTypeRED, |
171 const uint8_t payloadTypeFEC) { | 171 const uint8_t payloadTypeFEC) { |
172 rtc::CritScope cs(&crit_); | 172 rtc::CritScope cs(&crit_); |
173 fec_enabled_ = enable; | 173 fec_enabled_ = enable; |
mflodman
2016/06/03 07:28:16
I think we should DCHECK the pl types != 0 here, o
| |
174 red_payload_type_ = payloadTypeRED; | 174 red_payload_type_ = payloadTypeRED; |
175 fec_payload_type_ = payloadTypeFEC; | 175 fec_payload_type_ = payloadTypeFEC; |
176 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 176 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); |
177 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 177 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); |
178 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 178 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; |
179 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = | 179 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = |
180 kFecMaskRandom; | 180 kFecMaskRandom; |
181 } | 181 } |
182 | 182 |
183 void RTPSenderVideo::GenericFECStatus(bool* enable, | 183 void RTPSenderVideo::GenericFECStatus(bool* enable, |
184 uint8_t* payloadTypeRED, | 184 uint8_t* payloadTypeRED, |
185 uint8_t* payloadTypeFEC) const { | 185 uint8_t* payloadTypeFEC) const { |
186 rtc::CritScope cs(&crit_); | 186 rtc::CritScope cs(&crit_); |
187 *enable = fec_enabled_; | 187 *enable = fec_enabled_; |
188 *payloadTypeRED = red_payload_type_; | 188 *payloadTypeRED = red_payload_type_; |
189 *payloadTypeFEC = fec_payload_type_; | 189 *payloadTypeFEC = fec_payload_type_; |
190 } | 190 } |
191 | 191 |
192 size_t RTPSenderVideo::FECPacketOverhead() const { | 192 size_t RTPSenderVideo::FECPacketOverhead() const { |
193 rtc::CritScope cs(&crit_); | 193 rtc::CritScope cs(&crit_); |
194 if (fec_enabled_) { | 194 size_t overhead = 0; |
195 if (red_payload_type_ != 0) { | |
195 // Overhead is FEC headers plus RED for FEC header plus anything in RTP | 196 // Overhead is FEC headers plus RED for FEC header plus anything in RTP |
196 // header beyond the 12 bytes base header (CSRC list, extensions...) | 197 // header beyond the 12 bytes base header (CSRC list, extensions...) |
197 // This reason for the header extensions to be included here is that | 198 // This reason for the header extensions to be included here is that |
198 // from an FEC viewpoint, they are part of the payload to be protected. | 199 // from an FEC viewpoint, they are part of the payload to be protected. |
199 // (The base RTP header is already protected by the FEC header.) | 200 // (The base RTP header is already protected by the FEC header.) |
200 return ForwardErrorCorrection::PacketOverhead() + REDForFECHeaderLength + | 201 overhead = REDForFECHeaderLength + (_rtpSender.RTPHeaderLength() - |
201 (_rtpSender.RTPHeaderLength() - kRtpHeaderSize); | 202 kRtpHeaderSize); |
202 } | 203 } |
203 return 0; | 204 if (fec_enabled_) |
205 overhead += ForwardErrorCorrection::PacketOverhead(); | |
206 return overhead; | |
204 } | 207 } |
205 | 208 |
206 void RTPSenderVideo::SetFecParameters(const FecProtectionParams* delta_params, | 209 void RTPSenderVideo::SetFecParameters(const FecProtectionParams* delta_params, |
207 const FecProtectionParams* key_params) { | 210 const FecProtectionParams* key_params) { |
208 rtc::CritScope cs(&crit_); | 211 rtc::CritScope cs(&crit_); |
209 RTC_DCHECK(delta_params); | 212 RTC_DCHECK(delta_params); |
210 RTC_DCHECK(key_params); | 213 RTC_DCHECK(key_params); |
211 delta_fec_params_ = *delta_params; | 214 if (fec_enabled_) { |
212 key_fec_params_ = *key_params; | 215 delta_fec_params_ = *delta_params; |
216 key_fec_params_ = *key_params; | |
217 } | |
213 } | 218 } |
214 | 219 |
215 int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType, | 220 int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType, |
216 const FrameType frameType, | 221 const FrameType frameType, |
217 const int8_t payloadType, | 222 const int8_t payloadType, |
218 const uint32_t captureTimeStamp, | 223 const uint32_t captureTimeStamp, |
219 int64_t capture_time_ms, | 224 int64_t capture_time_ms, |
220 const uint8_t* payloadData, | 225 const uint8_t* payloadData, |
221 const size_t payloadSize, | 226 const size_t payloadSize, |
222 const RTPFragmentationHeader* fragmentation, | 227 const RTPFragmentationHeader* fragmentation, |
223 const RTPVideoHeader* video_header) { | 228 const RTPVideoHeader* video_header) { |
224 if (payloadSize == 0) { | 229 if (payloadSize == 0) { |
225 return -1; | 230 return -1; |
226 } | 231 } |
227 | 232 |
228 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( | 233 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( |
229 videoType, _rtpSender.MaxDataPayloadLength(), | 234 videoType, _rtpSender.MaxDataPayloadLength(), |
230 video_header ? &(video_header->codecHeader) : nullptr, frameType)); | 235 video_header ? &(video_header->codecHeader) : nullptr, frameType)); |
231 | 236 |
232 StorageType storage; | 237 StorageType storage; |
233 bool fec_enabled; | 238 int red_payload_type; |
234 bool first_frame = first_frame_sent_(); | 239 bool first_frame = first_frame_sent_(); |
235 { | 240 { |
236 rtc::CritScope cs(&crit_); | 241 rtc::CritScope cs(&crit_); |
237 FecProtectionParams* fec_params = | 242 FecProtectionParams* fec_params = |
238 frameType == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; | 243 frameType == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; |
239 producer_fec_.SetFecParameters(fec_params, 0); | 244 producer_fec_.SetFecParameters(fec_params, 0); |
240 storage = packetizer->GetStorageType(_retransmissionSettings); | 245 storage = packetizer->GetStorageType(_retransmissionSettings); |
241 fec_enabled = fec_enabled_; | 246 red_payload_type = red_payload_type_; |
242 } | 247 } |
243 | 248 |
244 // Register CVO rtp header extension at the first time when we receive a frame | 249 // Register CVO rtp header extension at the first time when we receive a frame |
245 // with pending rotation. | 250 // with pending rotation. |
246 RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone; | 251 RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone; |
247 if (video_header && video_header->rotation != kVideoRotation_0) { | 252 if (video_header && video_header->rotation != kVideoRotation_0) { |
248 cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension(); | 253 cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension(); |
249 } | 254 } |
250 | 255 |
251 uint16_t rtp_header_length = _rtpSender.RTPHeaderLength(); | 256 uint16_t rtp_header_length = _rtpSender.RTPHeaderLength(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 // TODO(guoweis): For now, all packets sent will carry the CVO such that | 299 // TODO(guoweis): For now, all packets sent will carry the CVO such that |
295 // the RTP header length is consistent, although the receiver side will | 300 // the RTP header length is consistent, although the receiver side will |
296 // only exam the packets with marker bit set. | 301 // only exam the packets with marker bit set. |
297 size_t packetSize = payloadSize + rtp_header_length; | 302 size_t packetSize = payloadSize + rtp_header_length; |
298 RtpUtility::RtpHeaderParser rtp_parser(dataBuffer, packetSize); | 303 RtpUtility::RtpHeaderParser rtp_parser(dataBuffer, packetSize); |
299 RTPHeader rtp_header; | 304 RTPHeader rtp_header; |
300 rtp_parser.Parse(&rtp_header); | 305 rtp_parser.Parse(&rtp_header); |
301 _rtpSender.UpdateVideoRotation(dataBuffer, packetSize, rtp_header, | 306 _rtpSender.UpdateVideoRotation(dataBuffer, packetSize, rtp_header, |
302 video_header->rotation); | 307 video_header->rotation); |
303 } | 308 } |
304 if (fec_enabled) { | 309 if (red_payload_type != 0) { |
305 SendVideoPacketAsRed(dataBuffer, payload_bytes_in_packet, | 310 SendVideoPacketAsRed(dataBuffer, payload_bytes_in_packet, |
306 rtp_header_length, _rtpSender.SequenceNumber(), | 311 rtp_header_length, _rtpSender.SequenceNumber(), |
307 captureTimeStamp, capture_time_ms, storage, | 312 captureTimeStamp, capture_time_ms, storage, |
308 packetizer->GetProtectionType() == kProtectedPacket); | 313 packetizer->GetProtectionType() == kProtectedPacket); |
309 } else { | 314 } else { |
310 SendVideoPacket(dataBuffer, payload_bytes_in_packet, rtp_header_length, | 315 SendVideoPacket(dataBuffer, payload_bytes_in_packet, rtp_header_length, |
311 _rtpSender.SequenceNumber(), captureTimeStamp, | 316 _rtpSender.SequenceNumber(), captureTimeStamp, |
312 capture_time_ms, storage); | 317 capture_time_ms, storage); |
313 } | 318 } |
314 | 319 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 rtc::CritScope cs(&crit_); | 352 rtc::CritScope cs(&crit_); |
348 return _retransmissionSettings; | 353 return _retransmissionSettings; |
349 } | 354 } |
350 | 355 |
351 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { | 356 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { |
352 rtc::CritScope cs(&crit_); | 357 rtc::CritScope cs(&crit_); |
353 _retransmissionSettings = settings; | 358 _retransmissionSettings = settings; |
354 } | 359 } |
355 | 360 |
356 } // namespace webrtc | 361 } // namespace webrtc |
OLD | NEW |