| 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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |