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 |