Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc

Issue 1506863002: Add test which verifies that the RTP header extensions are set correctly for FEC packets. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix type. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.h ('k') | webrtc/video/video_send_stream_tests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698