| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 paced_sender_(paced_sender), | 85 paced_sender_(paced_sender), |
| 86 transport_sequence_number_allocator_(sequence_number_allocator), | 86 transport_sequence_number_allocator_(sequence_number_allocator), |
| 87 transport_feedback_observer_(transport_feedback_observer), | 87 transport_feedback_observer_(transport_feedback_observer), |
| 88 last_capture_time_ms_sent_(0), | 88 last_capture_time_ms_sent_(0), |
| 89 transport_(transport), | 89 transport_(transport), |
| 90 sending_media_(true), // Default to sending media. | 90 sending_media_(true), // Default to sending media. |
| 91 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 91 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
| 92 payload_type_(-1), | 92 payload_type_(-1), |
| 93 payload_type_map_(), | 93 payload_type_map_(), |
| 94 rtp_header_extension_map_(), | 94 rtp_header_extension_map_(), |
| 95 video_rotation_active_(false), | |
| 96 playout_delay_active_(false), | |
| 97 packet_history_(clock), | 95 packet_history_(clock), |
| 98 // Statistics | 96 // Statistics |
| 99 rtp_stats_callback_(nullptr), | 97 rtp_stats_callback_(nullptr), |
| 100 total_bitrate_sent_(kBitrateStatisticsWindowMs, | 98 total_bitrate_sent_(kBitrateStatisticsWindowMs, |
| 101 RateStatistics::kBpsScale), | 99 RateStatistics::kBpsScale), |
| 102 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), | 100 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), |
| 103 frame_count_observer_(frame_count_observer), | 101 frame_count_observer_(frame_count_observer), |
| 104 send_side_delay_observer_(send_side_delay_observer), | 102 send_side_delay_observer_(send_side_delay_observer), |
| 105 event_log_(event_log), | 103 event_log_(event_log), |
| 106 send_packet_observer_(send_packet_observer), | 104 send_packet_observer_(send_packet_observer), |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 uint32_t RTPSender::NackOverheadRate() const { | 176 uint32_t RTPSender::NackOverheadRate() const { |
| 179 rtc::CritScope cs(&statistics_crit_); | 177 rtc::CritScope cs(&statistics_crit_); |
| 180 return nack_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0); | 178 return nack_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0); |
| 181 } | 179 } |
| 182 | 180 |
| 183 int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type, | 181 int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type, |
| 184 uint8_t id) { | 182 uint8_t id) { |
| 185 rtc::CritScope lock(&send_critsect_); | 183 rtc::CritScope lock(&send_critsect_); |
| 186 switch (type) { | 184 switch (type) { |
| 187 case kRtpExtensionVideoRotation: | 185 case kRtpExtensionVideoRotation: |
| 188 video_rotation_active_ = false; | |
| 189 return rtp_header_extension_map_.RegisterInactive(type, id); | |
| 190 case kRtpExtensionPlayoutDelay: | 186 case kRtpExtensionPlayoutDelay: |
| 191 playout_delay_active_ = false; | |
| 192 return rtp_header_extension_map_.RegisterInactive(type, id); | |
| 193 case kRtpExtensionTransmissionTimeOffset: | 187 case kRtpExtensionTransmissionTimeOffset: |
| 194 case kRtpExtensionAbsoluteSendTime: | 188 case kRtpExtensionAbsoluteSendTime: |
| 195 case kRtpExtensionAudioLevel: | 189 case kRtpExtensionAudioLevel: |
| 196 case kRtpExtensionTransportSequenceNumber: | 190 case kRtpExtensionTransportSequenceNumber: |
| 197 return rtp_header_extension_map_.Register(type, id); | 191 return rtp_header_extension_map_.Register(type, id); |
| 198 case kRtpExtensionNone: | 192 case kRtpExtensionNone: |
| 199 case kRtpExtensionNumberOfExtensions: | 193 case kRtpExtensionNumberOfExtensions: |
| 200 LOG(LS_ERROR) << "Invalid RTP extension type for registration"; | 194 LOG(LS_ERROR) << "Invalid RTP extension type for registration"; |
| 201 return -1; | 195 return -1; |
| 202 } | 196 } |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 SetSendPayloadType(payload_type); | 365 SetSendPayloadType(payload_type); |
| 372 RtpUtility::Payload* payload = it->second; | 366 RtpUtility::Payload* payload = it->second; |
| 373 assert(payload); | 367 assert(payload); |
| 374 if (!payload->audio && !audio_configured_) { | 368 if (!payload->audio && !audio_configured_) { |
| 375 video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); | 369 video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); |
| 376 *video_type = payload->typeSpecific.Video.videoCodecType; | 370 *video_type = payload->typeSpecific.Video.videoCodecType; |
| 377 } | 371 } |
| 378 return 0; | 372 return 0; |
| 379 } | 373 } |
| 380 | 374 |
| 381 bool RTPSender::ActivateCVORtpHeaderExtension() { | |
| 382 if (!video_rotation_active_) { | |
| 383 rtc::CritScope lock(&send_critsect_); | |
| 384 if (rtp_header_extension_map_.SetActive(kRtpExtensionVideoRotation, true)) { | |
| 385 video_rotation_active_ = true; | |
| 386 } | |
| 387 } | |
| 388 return video_rotation_active_; | |
| 389 } | |
| 390 | |
| 391 bool RTPSender::SendOutgoingData(FrameType frame_type, | 375 bool RTPSender::SendOutgoingData(FrameType frame_type, |
| 392 int8_t payload_type, | 376 int8_t payload_type, |
| 393 uint32_t capture_timestamp, | 377 uint32_t capture_timestamp, |
| 394 int64_t capture_time_ms, | 378 int64_t capture_time_ms, |
| 395 const uint8_t* payload_data, | 379 const uint8_t* payload_data, |
| 396 size_t payload_size, | 380 size_t payload_size, |
| 397 const RTPFragmentationHeader* fragmentation, | 381 const RTPFragmentationHeader* fragmentation, |
| 398 const RTPVideoHeader* rtp_header, | 382 const RTPVideoHeader* rtp_header, |
| 399 uint32_t* transport_frame_id_out) { | 383 uint32_t* transport_frame_id_out) { |
| 400 uint32_t ssrc; | 384 uint32_t ssrc; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 assert(frame_type != kAudioFrameSpeech && frame_type != kAudioFrameCN); | 417 assert(frame_type != kAudioFrameSpeech && frame_type != kAudioFrameCN); |
| 434 | 418 |
| 435 if (frame_type == kEmptyFrame) | 419 if (frame_type == kEmptyFrame) |
| 436 return true; | 420 return true; |
| 437 | 421 |
| 438 if (rtp_header) { | 422 if (rtp_header) { |
| 439 playout_delay_oracle_.UpdateRequest(ssrc, rtp_header->playout_delay, | 423 playout_delay_oracle_.UpdateRequest(ssrc, rtp_header->playout_delay, |
| 440 sequence_number); | 424 sequence_number); |
| 441 } | 425 } |
| 442 | 426 |
| 443 // Update the active/inactive status of playout delay extension based | |
| 444 // on what the oracle indicates. | |
| 445 { | |
| 446 rtc::CritScope lock(&send_critsect_); | |
| 447 bool send_playout_delay = playout_delay_oracle_.send_playout_delay(); | |
| 448 if (playout_delay_active_ != send_playout_delay) { | |
| 449 playout_delay_active_ = send_playout_delay; | |
| 450 rtp_header_extension_map_.SetActive(kRtpExtensionPlayoutDelay, | |
| 451 playout_delay_active_); | |
| 452 } | |
| 453 } | |
| 454 | |
| 455 result = video_->SendVideo(video_type, frame_type, payload_type, | 427 result = video_->SendVideo(video_type, frame_type, payload_type, |
| 456 rtp_timestamp, capture_time_ms, payload_data, | 428 rtp_timestamp, capture_time_ms, payload_data, |
| 457 payload_size, fragmentation, rtp_header); | 429 payload_size, fragmentation, rtp_header); |
| 458 } | 430 } |
| 459 | 431 |
| 460 rtc::CritScope cs(&statistics_crit_); | 432 rtc::CritScope cs(&statistics_crit_); |
| 461 // Note: This is currently only counting for video. | 433 // Note: This is currently only counting for video. |
| 462 if (frame_type == kVideoFrameKey) { | 434 if (frame_type == kVideoFrameKey) { |
| 463 ++frame_counts_.key_frames; | 435 ++frame_counts_.key_frames; |
| 464 } else if (frame_type == kVideoFrameDelta) { | 436 } else if (frame_type == kVideoFrameDelta) { |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 // Remember marker bit to determine if padding can be inserted with | 992 // Remember marker bit to determine if padding can be inserted with |
| 1021 // sequence number following |packet|. | 993 // sequence number following |packet|. |
| 1022 last_packet_marker_bit_ = packet->Marker(); | 994 last_packet_marker_bit_ = packet->Marker(); |
| 1023 // Save timestamps to generate timestamp field and extensions for the padding. | 995 // Save timestamps to generate timestamp field and extensions for the padding. |
| 1024 last_rtp_timestamp_ = packet->Timestamp(); | 996 last_rtp_timestamp_ = packet->Timestamp(); |
| 1025 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); | 997 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); |
| 1026 capture_time_ms_ = packet->capture_time_ms(); | 998 capture_time_ms_ = packet->capture_time_ms(); |
| 1027 return true; | 999 return true; |
| 1028 } | 1000 } |
| 1029 | 1001 |
| 1030 bool RTPSender::FindHeaderExtensionPosition(RTPExtensionType type, | |
| 1031 const uint8_t* rtp_packet, | |
| 1032 size_t rtp_packet_length, | |
| 1033 const RTPHeader& rtp_header, | |
| 1034 size_t* position) const { | |
| 1035 // Get length until start of header extension block. | |
| 1036 int extension_block_pos = | |
| 1037 rtp_header_extension_map_.GetLengthUntilBlockStartInBytes(type); | |
| 1038 if (extension_block_pos < 0) { | |
| 1039 LOG(LS_WARNING) << "Failed to find extension position for " << type | |
| 1040 << " as it is not registered."; | |
| 1041 return false; | |
| 1042 } | |
| 1043 | |
| 1044 HeaderExtension header_extension(type); | |
| 1045 | |
| 1046 size_t extension_pos = | |
| 1047 kRtpHeaderLength + rtp_header.numCSRCs * sizeof(uint32_t); | |
| 1048 size_t block_pos = extension_pos + extension_block_pos; | |
| 1049 if (rtp_packet_length < block_pos + header_extension.length || | |
| 1050 rtp_header.headerLength < block_pos + header_extension.length) { | |
| 1051 LOG(LS_WARNING) << "Failed to find extension position for " << type | |
| 1052 << " as the length is invalid."; | |
| 1053 return false; | |
| 1054 } | |
| 1055 | |
| 1056 // Verify that header contains extension. | |
| 1057 if (!(rtp_packet[extension_pos] == 0xBE && | |
| 1058 rtp_packet[extension_pos + 1] == 0xDE)) { | |
| 1059 LOG(LS_WARNING) << "Failed to find extension position for " << type | |
| 1060 << "as hdr extension not found."; | |
| 1061 return false; | |
| 1062 } | |
| 1063 | |
| 1064 *position = block_pos; | |
| 1065 return true; | |
| 1066 } | |
| 1067 | |
| 1068 bool RTPSender::UpdateTransportSequenceNumber(RtpPacketToSend* packet, | 1002 bool RTPSender::UpdateTransportSequenceNumber(RtpPacketToSend* packet, |
| 1069 int* packet_id) const { | 1003 int* packet_id) const { |
| 1070 RTC_DCHECK(packet); | 1004 RTC_DCHECK(packet); |
| 1071 RTC_DCHECK(packet_id); | 1005 RTC_DCHECK(packet_id); |
| 1072 rtc::CritScope lock(&send_critsect_); | 1006 rtc::CritScope lock(&send_critsect_); |
| 1073 if (!rtp_header_extension_map_.IsRegistered(TransportSequenceNumber::kId)) | 1007 if (!rtp_header_extension_map_.IsRegistered(TransportSequenceNumber::kId)) |
| 1074 return false; | 1008 return false; |
| 1075 | 1009 |
| 1076 if (!transport_sequence_number_allocator_) | 1010 if (!transport_sequence_number_allocator_) |
| 1077 return false; | 1011 return false; |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1313 rtc::CritScope lock(&send_critsect_); | 1247 rtc::CritScope lock(&send_critsect_); |
| 1314 | 1248 |
| 1315 RtpState state; | 1249 RtpState state; |
| 1316 state.sequence_number = sequence_number_rtx_; | 1250 state.sequence_number = sequence_number_rtx_; |
| 1317 state.start_timestamp = timestamp_offset_; | 1251 state.start_timestamp = timestamp_offset_; |
| 1318 | 1252 |
| 1319 return state; | 1253 return state; |
| 1320 } | 1254 } |
| 1321 | 1255 |
| 1322 } // namespace webrtc | 1256 } // namespace webrtc |
| OLD | NEW |