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

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

Issue 2954503002: Implement FrameMarking header extension support
Patch Set: fix fuzzer Created 3 years, 3 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
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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 if (flexfec_enabled()) 344 if (flexfec_enabled())
345 flexfec_sender_->SetFecParameters(fec_params); 345 flexfec_sender_->SetFecParameters(fec_params);
346 if (ulpfec_enabled()) 346 if (ulpfec_enabled())
347 ulpfec_generator_.SetFecParameters(fec_params); 347 ulpfec_generator_.SetFecParameters(fec_params);
348 348
349 fec_packet_overhead = CalculateFecPacketOverhead(); 349 fec_packet_overhead = CalculateFecPacketOverhead();
350 red_enabled = this->red_enabled(); 350 red_enabled = this->red_enabled();
351 retransmission_settings = retransmission_settings_; 351 retransmission_settings = retransmission_settings_;
352 } 352 }
353 353
354 // Set Frame Marks.
355 FrameMarks frame_marks;
356 bool frame_marking_enabled = true;
357
358 // Common info
359 frame_marks.start_of_frame = true;
360 frame_marks.end_of_frame = false;
361 frame_marks.independent = (frame_type == kVideoFrameKey);
362
363 // Codec specific.
364 switch (video_type) {
365 case kRtpVideoH264:
366 // Nothing to add
367 frame_marks.discardable = false;
368 frame_marks.temporal_layer_id = kNoTemporalIdx;
369 frame_marks.layer_id = kNoSpatialIdx;
370 frame_marks.tl0_pic_idx = static_cast<uint8_t>(kNoTl0PicIdx);
371 break;
372 case kRtpVideoVp8:
373 frame_marks.discardable = video_header->codecHeader.VP8.nonReference;
374 frame_marks.base_layer_sync = video_header->codecHeader.VP8.layerSync;
375 frame_marks.temporal_layer_id = video_header->codecHeader.VP8.temporalIdx;
376 frame_marks.layer_id = kNoSpatialIdx;
377 frame_marks.tl0_pic_idx = video_header->codecHeader.VP8.tl0PicIdx;
378 break;
379 case kRtpVideoVp9:
380 frame_marks.discardable = false;
381 // Layer id format is codec dependant.
382 frame_marks.temporal_layer_id =
383 video_header->codecHeader.VP9.temporal_idx;
384 frame_marks.layer_id =
385 FrameMarking::CreateLayerId(video_header->codecHeader.VP9);
386 frame_marks.tl0_pic_idx = video_header->codecHeader.VP9.tl0_pic_idx;
387 break;
388 default:
389 // Do not use frame marking.
390 frame_marking_enabled = false;
391 }
392
393 // Only add frame marking for known codecs.
394 if (frame_marking_enabled)
395 // Add extension header for frame marking.
396 rtp_header->SetExtension<FrameMarking>(frame_marks);
397
354 size_t packet_capacity = rtp_sender_->MaxRtpPacketSize() - 398 size_t packet_capacity = rtp_sender_->MaxRtpPacketSize() -
355 fec_packet_overhead - 399 fec_packet_overhead -
356 (rtp_sender_->RtxStatus() ? kRtxHeaderSize : 0); 400 (rtp_sender_->RtxStatus() ? kRtxHeaderSize : 0);
357 RTC_DCHECK_LE(packet_capacity, rtp_header->capacity()); 401 RTC_DCHECK_LE(packet_capacity, rtp_header->capacity());
358 RTC_DCHECK_GT(packet_capacity, rtp_header->headers_size()); 402 RTC_DCHECK_GT(packet_capacity, rtp_header->headers_size());
359 RTC_DCHECK_GT(packet_capacity, last_packet->headers_size()); 403 RTC_DCHECK_GT(packet_capacity, last_packet->headers_size());
360 size_t max_data_payload_length = packet_capacity - rtp_header->headers_size(); 404 size_t max_data_payload_length = packet_capacity - rtp_header->headers_size();
361 RTC_DCHECK_GE(last_packet->headers_size(), rtp_header->headers_size()); 405 RTC_DCHECK_GE(last_packet->headers_size(), rtp_header->headers_size());
362 size_t last_packet_reduction_len = 406 size_t last_packet_reduction_len =
363 last_packet->headers_size() - rtp_header->headers_size(); 407 last_packet->headers_size() - rtp_header->headers_size();
(...skipping 10 matching lines...) Expand all
374 const RTPFragmentationHeader* frag = 418 const RTPFragmentationHeader* frag =
375 (video_type == kRtpVideoVp8) ? nullptr : fragmentation; 419 (video_type == kRtpVideoVp8) ? nullptr : fragmentation;
376 size_t num_packets = 420 size_t num_packets =
377 packetizer->SetPayloadData(payload_data, payload_size, frag); 421 packetizer->SetPayloadData(payload_data, payload_size, frag);
378 422
379 if (num_packets == 0) 423 if (num_packets == 0)
380 return false; 424 return false;
381 425
382 bool first_frame = first_frame_sent_(); 426 bool first_frame = first_frame_sent_();
383 for (size_t i = 0; i < num_packets; ++i) { 427 for (size_t i = 0; i < num_packets; ++i) {
428 bool first = (i == 0);
384 bool last = (i + 1) == num_packets; 429 bool last = (i + 1) == num_packets;
385 auto packet = last ? std::move(last_packet) 430 auto packet = last ? std::move(last_packet)
386 : rtc::MakeUnique<RtpPacketToSend>(*rtp_header); 431 : rtc::MakeUnique<RtpPacketToSend>(*rtp_header);
387 if (!packetizer->NextPacket(packet.get())) 432 if (!packetizer->NextPacket(packet.get()))
388 return false; 433 return false;
389 RTC_DCHECK_LE(packet->payload_size(), 434 RTC_DCHECK_LE(packet->payload_size(),
390 last ? max_data_payload_length - last_packet_reduction_len 435 last ? max_data_payload_length - last_packet_reduction_len
391 : max_data_payload_length); 436 : max_data_payload_length);
437
438 // Only add frame marking for known codecs.
439 if (frame_marking_enabled) {
440 // Update start and end marks.
441 frame_marks.start_of_frame = first;
442 frame_marks.end_of_frame = last;
443 // Update extension header for frame marking.
444 packet->SetExtension<FrameMarking>(frame_marks);
445 }
446
392 if (!rtp_sender_->AssignSequenceNumber(packet.get())) 447 if (!rtp_sender_->AssignSequenceNumber(packet.get()))
393 return false; 448 return false;
394 449
395 bool protect_packet = (packetizer->GetProtectionType() == kProtectedPacket); 450 bool protect_packet = (packetizer->GetProtectionType() == kProtectedPacket);
396 // Put packetization finish timestamp into extension. 451 // Put packetization finish timestamp into extension.
397 if (packet->HasExtension<VideoTimingExtension>()) { 452 if (packet->HasExtension<VideoTimingExtension>()) {
398 packet->set_packetization_finish_time_ms(clock_->TimeInMilliseconds()); 453 packet->set_packetization_finish_time_ms(clock_->TimeInMilliseconds());
399 // TODO(ilnik): Due to webrtc:7859, packets with timing extensions are not 454 // TODO(ilnik): Due to webrtc:7859, packets with timing extensions are not
400 // protected by FEC. It reduces FEC efficiency a bit. When FEC is moved 455 // protected by FEC. It reduces FEC efficiency a bit. When FEC is moved
401 // below the pacer, it can be re-enabled for these packets. 456 // below the pacer, it can be re-enabled for these packets.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 rtc::CritScope cs(&crit_); 502 rtc::CritScope cs(&crit_);
448 return retransmission_settings_; 503 return retransmission_settings_;
449 } 504 }
450 505
451 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { 506 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) {
452 rtc::CritScope cs(&crit_); 507 rtc::CritScope cs(&crit_);
453 retransmission_settings_ = settings; 508 retransmission_settings_ = settings;
454 } 509 }
455 510
456 } // namespace webrtc 511 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_utility.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698