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

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

Issue 1677003002: Fix null-pointer dereference in RTPSenderVideo. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rename video_header Created 4 years, 10 months 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
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 } 223 }
224 224
225 int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType, 225 int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType,
226 const FrameType frameType, 226 const FrameType frameType,
227 const int8_t payloadType, 227 const int8_t payloadType,
228 const uint32_t captureTimeStamp, 228 const uint32_t captureTimeStamp,
229 int64_t capture_time_ms, 229 int64_t capture_time_ms,
230 const uint8_t* payloadData, 230 const uint8_t* payloadData,
231 const size_t payloadSize, 231 const size_t payloadSize,
232 const RTPFragmentationHeader* fragmentation, 232 const RTPFragmentationHeader* fragmentation,
233 const RTPVideoHeader* rtpHdr) { 233 const RTPVideoHeader* video_header) {
234 if (payloadSize == 0) { 234 if (payloadSize == 0) {
235 return -1; 235 return -1;
236 } 236 }
237 237
238 rtc::scoped_ptr<RtpPacketizer> packetizer( 238 rtc::scoped_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create(
239 RtpPacketizer::Create(videoType, _rtpSender.MaxDataPayloadLength(), 239 videoType, _rtpSender.MaxDataPayloadLength(),
240 &(rtpHdr->codecHeader), frameType)); 240 video_header ? &(video_header->codecHeader) : nullptr, 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 = fec_enabled_; 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 (video_header && video_header->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();
261 size_t payload_bytes_to_send = payloadSize; 261 size_t payload_bytes_to_send = payloadSize;
262 const uint8_t* data = payloadData; 262 const uint8_t* data = payloadData;
263 263
264 // TODO(changbin): we currently don't support to configure the codec to 264 // TODO(changbin): we currently don't support to configure the codec to
265 // output multiple partitions for VP8. Should remove below check after the 265 // output multiple partitions for VP8. Should remove below check after the
266 // issue is fixed. 266 // issue is fixed.
(...skipping 18 matching lines...) Expand all
285 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ 285 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
286 // ts_126114v120700p.pdf Section 7.4.5: 286 // ts_126114v120700p.pdf Section 7.4.5:
287 // The MTSI client shall add the payload bytes as defined in this clause 287 // The MTSI client shall add the payload bytes as defined in this clause
288 // onto the last RTP packet in each group of packets which make up a key 288 // onto the last RTP packet in each group of packets which make up a key
289 // frame (I-frame or IDR frame in H.264 (AVC), or an IRAP picture in H.265 289 // frame (I-frame or IDR frame in H.264 (AVC), or an IRAP picture in H.265
290 // (HEVC)). The MTSI client may also add the payload bytes onto the last RTP 290 // (HEVC)). The MTSI client may also add the payload bytes onto the last RTP
291 // packet in each group of packets which make up another type of frame 291 // packet in each group of packets which make up another type of frame
292 // (e.g. a P-Frame) only if the current value is different from the previous 292 // (e.g. a P-Frame) only if the current value is different from the previous
293 // value sent. 293 // value sent.
294 // Here we are adding it to every packet of every frame at this point. 294 // Here we are adding it to every packet of every frame at this point.
295 if (!rtpHdr) { 295 if (!video_header) {
296 RTC_DCHECK(!_rtpSender.IsRtpHeaderExtensionRegistered( 296 RTC_DCHECK(!_rtpSender.IsRtpHeaderExtensionRegistered(
297 kRtpExtensionVideoRotation)); 297 kRtpExtensionVideoRotation));
298 } else if (cvo_mode == RTPSenderInterface::kCVOActivated) { 298 } else if (cvo_mode == RTPSenderInterface::kCVOActivated) {
299 // Checking whether CVO header extension is registered will require taking 299 // Checking whether CVO header extension is registered will require taking
300 // a lock. It'll be a no-op if it's not registered. 300 // a lock. It'll be a no-op if it's not registered.
301 // TODO(guoweis): For now, all packets sent will carry the CVO such that 301 // TODO(guoweis): For now, all packets sent will carry the CVO such that
302 // the RTP header length is consistent, although the receiver side will 302 // the RTP header length is consistent, although the receiver side will
303 // only exam the packets with marker bit set. 303 // only exam the packets with marker bit set.
304 size_t packetSize = payloadSize + rtp_header_length; 304 size_t packetSize = payloadSize + rtp_header_length;
305 RtpUtility::RtpHeaderParser rtp_parser(dataBuffer, packetSize); 305 RtpUtility::RtpHeaderParser rtp_parser(dataBuffer, packetSize);
306 RTPHeader rtp_header; 306 RTPHeader rtp_header;
307 rtp_parser.Parse(&rtp_header); 307 rtp_parser.Parse(&rtp_header);
308 _rtpSender.UpdateVideoRotation(dataBuffer, packetSize, rtp_header, 308 _rtpSender.UpdateVideoRotation(dataBuffer, packetSize, rtp_header,
309 rtpHdr->rotation); 309 video_header->rotation);
310 } 310 }
311 if (fec_enabled) { 311 if (fec_enabled) {
312 SendVideoPacketAsRed(dataBuffer, payload_bytes_in_packet, 312 SendVideoPacketAsRed(dataBuffer, payload_bytes_in_packet,
313 rtp_header_length, _rtpSender.SequenceNumber(), 313 rtp_header_length, _rtpSender.SequenceNumber(),
314 captureTimeStamp, capture_time_ms, storage, 314 captureTimeStamp, capture_time_ms, storage,
315 packetizer->GetProtectionType() == kProtectedPacket); 315 packetizer->GetProtectionType() == kProtectedPacket);
316 } else { 316 } else {
317 SendVideoPacket(dataBuffer, payload_bytes_in_packet, rtp_header_length, 317 SendVideoPacket(dataBuffer, payload_bytes_in_packet, rtp_header_length,
318 _rtpSender.SequenceNumber(), captureTimeStamp, 318 _rtpSender.SequenceNumber(), captureTimeStamp,
319 capture_time_ms, storage); 319 capture_time_ms, storage);
(...skipping 30 matching lines...) Expand all
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') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698