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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 ProcessThread* process_thread, | 91 ProcessThread* process_thread, |
92 NackSender* nack_sender, | 92 NackSender* nack_sender, |
93 KeyFrameRequestSender* keyframe_request_sender, | 93 KeyFrameRequestSender* keyframe_request_sender, |
94 video_coding::OnCompleteFrameCallback* complete_frame_callback, | 94 video_coding::OnCompleteFrameCallback* complete_frame_callback, |
95 VCMTiming* timing) | 95 VCMTiming* timing) |
96 : clock_(Clock::GetRealTimeClock()), | 96 : clock_(Clock::GetRealTimeClock()), |
97 config_(*config), | 97 config_(*config), |
98 packet_router_(packet_router), | 98 packet_router_(packet_router), |
99 process_thread_(process_thread), | 99 process_thread_(process_thread), |
100 ntp_estimator_(clock_), | 100 ntp_estimator_(clock_), |
101 rtp_header_parser_(RtpHeaderParser::Create()), | 101 rtp_header_extensions_(config_.rtp.extensions), |
102 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_, | 102 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_, |
103 this, | 103 this, |
104 this, | 104 this, |
105 &rtp_payload_registry_)), | 105 &rtp_payload_registry_)), |
106 rtp_receive_statistics_(rtp_receive_statistics), | 106 rtp_receive_statistics_(rtp_receive_statistics), |
107 ulpfec_receiver_(UlpfecReceiver::Create(config->rtp.remote_ssrc, this)), | 107 ulpfec_receiver_(UlpfecReceiver::Create(config->rtp.remote_ssrc, this)), |
108 receiving_(false), | 108 receiving_(false), |
109 last_packet_log_ms_(-1), | 109 last_packet_log_ms_(-1), |
110 rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_, | 110 rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_, |
111 transport, | 111 transport, |
(...skipping 15 matching lines...) Expand all Loading... |
127 RTC_DCHECK(config_.rtp.remote_ssrc != 0); | 127 RTC_DCHECK(config_.rtp.remote_ssrc != 0); |
128 // TODO(pbos): What's an appropriate local_ssrc for receive-only streams? | 128 // TODO(pbos): What's an appropriate local_ssrc for receive-only streams? |
129 RTC_DCHECK(config_.rtp.local_ssrc != 0); | 129 RTC_DCHECK(config_.rtp.local_ssrc != 0); |
130 RTC_DCHECK(config_.rtp.remote_ssrc != config_.rtp.local_ssrc); | 130 RTC_DCHECK(config_.rtp.remote_ssrc != config_.rtp.local_ssrc); |
131 | 131 |
132 rtp_rtcp_->SetRTCPStatus(config_.rtp.rtcp_mode); | 132 rtp_rtcp_->SetRTCPStatus(config_.rtp.rtcp_mode); |
133 rtp_rtcp_->SetSSRC(config_.rtp.local_ssrc); | 133 rtp_rtcp_->SetSSRC(config_.rtp.local_ssrc); |
134 rtp_rtcp_->SetRemoteSSRC(config_.rtp.remote_ssrc); | 134 rtp_rtcp_->SetRemoteSSRC(config_.rtp.remote_ssrc); |
135 rtp_rtcp_->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); | 135 rtp_rtcp_->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); |
136 | 136 |
137 for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { | |
138 EnableReceiveRtpHeaderExtension(config_.rtp.extensions[i].uri, | |
139 config_.rtp.extensions[i].id); | |
140 } | |
141 | |
142 static const int kMaxPacketAgeToNack = 450; | 137 static const int kMaxPacketAgeToNack = 450; |
143 const int max_reordering_threshold = (config_.rtp.nack.rtp_history_ms > 0) | 138 const int max_reordering_threshold = (config_.rtp.nack.rtp_history_ms > 0) |
144 ? kMaxPacketAgeToNack | 139 ? kMaxPacketAgeToNack |
145 : kDefaultMaxReorderingThreshold; | 140 : kDefaultMaxReorderingThreshold; |
146 rtp_receive_statistics_->SetMaxReorderingThreshold(max_reordering_threshold); | 141 rtp_receive_statistics_->SetMaxReorderingThreshold(max_reordering_threshold); |
147 | 142 |
148 if (config_.rtp.rtx_ssrc) { | 143 if (config_.rtp.rtx_ssrc) { |
149 // Needed for rtp_payload_registry_.RtxEnabled(). | 144 // Needed for rtp_payload_registry_.RtxEnabled(). |
150 rtp_payload_registry_.SetRtxSsrc(config_.rtp.rtx_ssrc); | 145 rtp_payload_registry_.SetRtxSsrc(config_.rtp.rtx_ssrc); |
151 } | 146 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 | 269 |
275 packet_buffer_->InsertPacket(&packet); | 270 packet_buffer_->InsertPacket(&packet); |
276 return 0; | 271 return 0; |
277 } | 272 } |
278 | 273 |
279 // TODO(nisse): Try to delete this method. Obstacles: It is used by | 274 // TODO(nisse): Try to delete this method. Obstacles: It is used by |
280 // ParseAndHandleEncapsulatingHeader, for handling Rtx packets, and | 275 // ParseAndHandleEncapsulatingHeader, for handling Rtx packets, and |
281 // for callbacks from |ulpfec_receiver_|. | 276 // for callbacks from |ulpfec_receiver_|. |
282 void RtpVideoStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet, | 277 void RtpVideoStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet, |
283 size_t rtp_packet_length) { | 278 size_t rtp_packet_length) { |
| 279 RtpPacketReceived packet; |
| 280 if (!packet.Parse(rtp_packet, rtp_packet_length)) |
| 281 return; |
| 282 packet.IdentifyExtensions(rtp_header_extensions_); |
| 283 packet.set_payload_type_frequency(kVideoPayloadTypeFrequency); |
| 284 |
284 RTPHeader header; | 285 RTPHeader header; |
285 if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) { | 286 packet.GetHeader(&header); |
286 return; | |
287 } | |
288 header.payload_type_frequency = kVideoPayloadTypeFrequency; | |
289 bool in_order = IsPacketInOrder(header); | 287 bool in_order = IsPacketInOrder(header); |
290 ReceivePacket(rtp_packet, rtp_packet_length, header, in_order); | 288 ReceivePacket(rtp_packet, rtp_packet_length, header, in_order); |
291 } | 289 } |
292 | 290 |
293 // TODO(pbos): Remove as soon as audio can handle a changing payload type | 291 // TODO(pbos): Remove as soon as audio can handle a changing payload type |
294 // without this callback. | 292 // without this callback. |
295 int32_t RtpVideoStreamReceiver::OnInitializeDecoder( | 293 int32_t RtpVideoStreamReceiver::OnInitializeDecoder( |
296 const int8_t payload_type, | 294 const int8_t payload_type, |
297 const char payload_name[RTP_PAYLOAD_NAME_SIZE], | 295 const char payload_name[RTP_PAYLOAD_NAME_SIZE], |
298 const int frequency, | 296 const int frequency, |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 "WebRTC.Video.ReceivedFecPacketsInPercent", | 640 "WebRTC.Video.ReceivedFecPacketsInPercent", |
643 static_cast<int>(counter.num_fec_packets * 100 / counter.num_packets)); | 641 static_cast<int>(counter.num_fec_packets * 100 / counter.num_packets)); |
644 } | 642 } |
645 if (counter.num_fec_packets > 0) { | 643 if (counter.num_fec_packets > 0) { |
646 RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.RecoveredMediaPacketsInPercentOfFec", | 644 RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.RecoveredMediaPacketsInPercentOfFec", |
647 static_cast<int>(counter.num_recovered_packets * | 645 static_cast<int>(counter.num_recovered_packets * |
648 100 / counter.num_fec_packets)); | 646 100 / counter.num_fec_packets)); |
649 } | 647 } |
650 } | 648 } |
651 | 649 |
652 void RtpVideoStreamReceiver::EnableReceiveRtpHeaderExtension( | |
653 const std::string& extension, int id) { | |
654 // One-byte-extension local identifiers are in the range 1-14 inclusive. | |
655 RTC_DCHECK_GE(id, 1); | |
656 RTC_DCHECK_LE(id, 14); | |
657 RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension)); | |
658 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension( | |
659 StringToRtpExtensionType(extension), id)); | |
660 } | |
661 | |
662 void RtpVideoStreamReceiver::InsertSpsPpsIntoTracker(uint8_t payload_type) { | 650 void RtpVideoStreamReceiver::InsertSpsPpsIntoTracker(uint8_t payload_type) { |
663 auto codec_params_it = pt_codec_params_.find(payload_type); | 651 auto codec_params_it = pt_codec_params_.find(payload_type); |
664 if (codec_params_it == pt_codec_params_.end()) | 652 if (codec_params_it == pt_codec_params_.end()) |
665 return; | 653 return; |
666 | 654 |
667 LOG(LS_INFO) << "Found out of band supplied codec parameters for" | 655 LOG(LS_INFO) << "Found out of band supplied codec parameters for" |
668 << " payload type: " << static_cast<int>(payload_type); | 656 << " payload type: " << static_cast<int>(payload_type); |
669 | 657 |
670 H264SpropParameterSets sprop_decoder; | 658 H264SpropParameterSets sprop_decoder; |
671 auto sprop_base64_it = | 659 auto sprop_base64_it = |
672 codec_params_it->second.find(cricket::kH264FmtpSpropParameterSets); | 660 codec_params_it->second.find(cricket::kH264FmtpSpropParameterSets); |
673 | 661 |
674 if (sprop_base64_it == codec_params_it->second.end()) | 662 if (sprop_base64_it == codec_params_it->second.end()) |
675 return; | 663 return; |
676 | 664 |
677 if (!sprop_decoder.DecodeSprop(sprop_base64_it->second.c_str())) | 665 if (!sprop_decoder.DecodeSprop(sprop_base64_it->second.c_str())) |
678 return; | 666 return; |
679 | 667 |
680 tracker_.InsertSpsPpsNalus(sprop_decoder.sps_nalu(), | 668 tracker_.InsertSpsPpsNalus(sprop_decoder.sps_nalu(), |
681 sprop_decoder.pps_nalu()); | 669 sprop_decoder.pps_nalu()); |
682 } | 670 } |
683 | 671 |
684 } // namespace webrtc | 672 } // namespace webrtc |
OLD | NEW |