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 24 matching lines...) Expand all Loading... |
35 }; | 35 }; |
36 | 36 |
37 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) | 37 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) |
38 : _rtpSender(*rtpSender), | 38 : _rtpSender(*rtpSender), |
39 crit_(CriticalSectionWrapper::CreateCriticalSection()), | 39 crit_(CriticalSectionWrapper::CreateCriticalSection()), |
40 _videoType(kRtpVideoGeneric), | 40 _videoType(kRtpVideoGeneric), |
41 _maxBitrate(0), | 41 _maxBitrate(0), |
42 _retransmissionSettings(kRetransmitBaseLayer), | 42 _retransmissionSettings(kRetransmitBaseLayer), |
43 | 43 |
44 // Generic FEC | 44 // Generic FEC |
45 _fec(), | 45 fec_(), |
46 _fecEnabled(false), | 46 fec_enabled_(false), |
47 _payloadTypeRED(-1), | 47 red_payload_type_(-1), |
48 _payloadTypeFEC(-1), | 48 fec_payload_type_(-1), |
49 delta_fec_params_(), | 49 delta_fec_params_(), |
50 key_fec_params_(), | 50 key_fec_params_(), |
51 producer_fec_(&_fec), | 51 producer_fec_(&fec_), |
52 _fecOverheadRate(clock, NULL), | 52 _fecOverheadRate(clock, NULL), |
53 _videoBitrate(clock, NULL) { | 53 _videoBitrate(clock, NULL) { |
54 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 54 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); |
55 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 55 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); |
56 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 56 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; |
57 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = | 57 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = |
58 kFecMaskRandom; | 58 kFecMaskRandom; |
59 } | 59 } |
60 | 60 |
61 RTPSenderVideo::~RTPSenderVideo() { | 61 RTPSenderVideo::~RTPSenderVideo() { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 StorageType media_packet_storage, | 123 StorageType media_packet_storage, |
124 bool protect) { | 124 bool protect) { |
125 rtc::scoped_ptr<RedPacket> red_packet; | 125 rtc::scoped_ptr<RedPacket> red_packet; |
126 std::vector<RedPacket*> fec_packets; | 126 std::vector<RedPacket*> fec_packets; |
127 StorageType fec_storage = kDontRetransmit; | 127 StorageType fec_storage = kDontRetransmit; |
128 uint16_t next_fec_sequence_number = 0; | 128 uint16_t next_fec_sequence_number = 0; |
129 { | 129 { |
130 // Only protect while creating RED and FEC packets, not when sending. | 130 // Only protect while creating RED and FEC packets, not when sending. |
131 CriticalSectionScoped cs(crit_.get()); | 131 CriticalSectionScoped cs(crit_.get()); |
132 red_packet.reset(producer_fec_.BuildRedPacket( | 132 red_packet.reset(producer_fec_.BuildRedPacket( |
133 data_buffer, payload_length, rtp_header_length, _payloadTypeRED)); | 133 data_buffer, payload_length, rtp_header_length, red_payload_type_)); |
134 if (protect) { | 134 if (protect) { |
135 producer_fec_.AddRtpPacketAndGenerateFec(data_buffer, payload_length, | 135 producer_fec_.AddRtpPacketAndGenerateFec(data_buffer, payload_length, |
136 rtp_header_length); | 136 rtp_header_length); |
137 } | 137 } |
138 uint16_t num_fec_packets = producer_fec_.NumAvailableFecPackets(); | 138 uint16_t num_fec_packets = producer_fec_.NumAvailableFecPackets(); |
139 if (num_fec_packets > 0) { | 139 if (num_fec_packets > 0) { |
140 next_fec_sequence_number = | 140 next_fec_sequence_number = |
141 _rtpSender.AllocateSequenceNumber(num_fec_packets); | 141 _rtpSender.AllocateSequenceNumber(num_fec_packets); |
142 fec_packets = producer_fec_.GetFecPackets( | 142 fec_packets = producer_fec_.GetFecPackets( |
143 _payloadTypeRED, _payloadTypeFEC, next_fec_sequence_number, | 143 red_payload_type_, fec_payload_type_, next_fec_sequence_number, |
144 rtp_header_length); | 144 rtp_header_length); |
145 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); | 145 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); |
146 if (_retransmissionSettings & kRetransmitFECPackets) | 146 if (_retransmissionSettings & kRetransmitFECPackets) |
147 fec_storage = kAllowRetransmission; | 147 fec_storage = kAllowRetransmission; |
148 } | 148 } |
149 } | 149 } |
150 if (_rtpSender.SendToNetwork( | 150 if (_rtpSender.SendToNetwork( |
151 red_packet->data(), red_packet->length() - rtp_header_length, | 151 red_packet->data(), red_packet->length() - rtp_header_length, |
152 rtp_header_length, capture_time_ms, media_packet_storage, | 152 rtp_header_length, capture_time_ms, media_packet_storage, |
153 RtpPacketSender::kLowPriority) == 0) { | 153 RtpPacketSender::kLowPriority) == 0) { |
(...skipping 19 matching lines...) Expand all Loading... |
173 } | 173 } |
174 delete fec_packet; | 174 delete fec_packet; |
175 ++next_fec_sequence_number; | 175 ++next_fec_sequence_number; |
176 } | 176 } |
177 } | 177 } |
178 | 178 |
179 void RTPSenderVideo::SetGenericFECStatus(const bool enable, | 179 void RTPSenderVideo::SetGenericFECStatus(const bool enable, |
180 const uint8_t payloadTypeRED, | 180 const uint8_t payloadTypeRED, |
181 const uint8_t payloadTypeFEC) { | 181 const uint8_t payloadTypeFEC) { |
182 CriticalSectionScoped cs(crit_.get()); | 182 CriticalSectionScoped cs(crit_.get()); |
183 _fecEnabled = enable; | 183 fec_enabled_ = enable; |
184 _payloadTypeRED = payloadTypeRED; | 184 red_payload_type_ = payloadTypeRED; |
185 _payloadTypeFEC = payloadTypeFEC; | 185 fec_payload_type_ = payloadTypeFEC; |
186 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 186 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); |
187 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 187 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); |
188 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 188 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; |
189 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = | 189 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = |
190 kFecMaskRandom; | 190 kFecMaskRandom; |
191 } | 191 } |
192 | 192 |
193 void RTPSenderVideo::GenericFECStatus(bool& enable, | 193 void RTPSenderVideo::GenericFECStatus(bool& enable, |
194 uint8_t& payloadTypeRED, | 194 uint8_t& payloadTypeRED, |
195 uint8_t& payloadTypeFEC) const { | 195 uint8_t& payloadTypeFEC) const { |
196 CriticalSectionScoped cs(crit_.get()); | 196 CriticalSectionScoped cs(crit_.get()); |
197 enable = _fecEnabled; | 197 enable = fec_enabled_; |
198 payloadTypeRED = _payloadTypeRED; | 198 payloadTypeRED = red_payload_type_; |
199 payloadTypeFEC = _payloadTypeFEC; | 199 payloadTypeFEC = fec_payload_type_; |
200 } | 200 } |
201 | 201 |
202 size_t RTPSenderVideo::FECPacketOverhead() const { | 202 size_t RTPSenderVideo::FECPacketOverhead() const { |
203 CriticalSectionScoped cs(crit_.get()); | 203 CriticalSectionScoped cs(crit_.get()); |
204 if (_fecEnabled) { | 204 if (fec_enabled_) { |
205 // Overhead is FEC headers plus RED for FEC header plus anything in RTP | 205 // Overhead is FEC headers plus RED for FEC header plus anything in RTP |
206 // header beyond the 12 bytes base header (CSRC list, extensions...) | 206 // header beyond the 12 bytes base header (CSRC list, extensions...) |
207 // This reason for the header extensions to be included here is that | 207 // This reason for the header extensions to be included here is that |
208 // from an FEC viewpoint, they are part of the payload to be protected. | 208 // from an FEC viewpoint, they are part of the payload to be protected. |
209 // (The base RTP header is already protected by the FEC header.) | 209 // (The base RTP header is already protected by the FEC header.) |
210 return ForwardErrorCorrection::PacketOverhead() + REDForFECHeaderLength + | 210 return ForwardErrorCorrection::PacketOverhead() + REDForFECHeaderLength + |
211 (_rtpSender.RTPHeaderLength() - kRtpHeaderSize); | 211 (_rtpSender.RTPHeaderLength() - kRtpHeaderSize); |
212 } | 212 } |
213 return 0; | 213 return 0; |
214 } | 214 } |
(...skipping 25 matching lines...) Expand all Loading... |
240 &(rtpHdr->codecHeader), frameType)); | 240 &(rtpHdr->codecHeader), frameType)); |
241 | 241 |
242 StorageType storage; | 242 StorageType storage; |
243 bool fec_enabled; | 243 bool fec_enabled; |
244 { | 244 { |
245 CriticalSectionScoped cs(crit_.get()); | 245 CriticalSectionScoped cs(crit_.get()); |
246 FecProtectionParams* fec_params = | 246 FecProtectionParams* fec_params = |
247 frameType == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; | 247 frameType == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; |
248 producer_fec_.SetFecParameters(fec_params, 0); | 248 producer_fec_.SetFecParameters(fec_params, 0); |
249 storage = packetizer->GetStorageType(_retransmissionSettings); | 249 storage = packetizer->GetStorageType(_retransmissionSettings); |
250 fec_enabled = _fecEnabled; | 250 fec_enabled = fec_enabled_; |
251 } | 251 } |
252 | 252 |
253 // Register CVO rtp header extension at the first time when we receive a frame | 253 // Register CVO rtp header extension at the first time when we receive a frame |
254 // with pending rotation. | 254 // with pending rotation. |
255 RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone; | 255 RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone; |
256 if (rtpHdr && rtpHdr->rotation != kVideoRotation_0) { | 256 if (rtpHdr && rtpHdr->rotation != kVideoRotation_0) { |
257 cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension(); | 257 cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension(); |
258 } | 258 } |
259 | 259 |
260 uint16_t rtp_header_length = _rtpSender.RTPHeaderLength(); | 260 uint16_t rtp_header_length = _rtpSender.RTPHeaderLength(); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 CriticalSectionScoped cs(crit_.get()); | 350 CriticalSectionScoped cs(crit_.get()); |
351 return _retransmissionSettings; | 351 return _retransmissionSettings; |
352 } | 352 } |
353 | 353 |
354 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { | 354 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { |
355 CriticalSectionScoped cs(crit_.get()); | 355 CriticalSectionScoped cs(crit_.get()); |
356 _retransmissionSettings = settings; | 356 _retransmissionSettings = settings; |
357 } | 357 } |
358 | 358 |
359 } // namespace webrtc | 359 } // namespace webrtc |
OLD | NEW |