Chromium Code Reviews| 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 |
| 11 #include "webrtc/video/rtp_stream_receiver.h" | 11 #include "webrtc/video/rtp_stream_receiver.h" |
| 12 | 12 |
| 13 #include <vector> | 13 #include <vector> |
| 14 #include <utility> | |
| 14 | 15 |
| 15 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 16 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
| 17 #include "webrtc/common_types.h" | 18 #include "webrtc/common_types.h" |
| 18 #include "webrtc/config.h" | 19 #include "webrtc/config.h" |
| 19 #include "webrtc/modules/pacing/packet_router.h" | 20 #include "webrtc/modules/pacing/packet_router.h" |
| 20 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimat or.h" | 21 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimat or.h" |
| 21 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" | 22 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
| 22 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 23 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
| 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 24 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
| 24 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" | 25 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
| 25 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
| 26 #include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h" | 27 #include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h" |
| 28 #include "webrtc/modules/video_coding/frame_object.h" | |
| 29 #include "webrtc/modules/video_coding/h264_sps_pps_tracker.h" | |
| 30 #include "webrtc/modules/video_coding/packet_buffer.h" | |
| 27 #include "webrtc/modules/video_coding/video_coding_impl.h" | 31 #include "webrtc/modules/video_coding/video_coding_impl.h" |
| 32 #include "webrtc/system_wrappers/include/field_trial.h" | |
| 28 #include "webrtc/system_wrappers/include/metrics.h" | 33 #include "webrtc/system_wrappers/include/metrics.h" |
| 29 #include "webrtc/system_wrappers/include/timestamp_extrapolator.h" | 34 #include "webrtc/system_wrappers/include/timestamp_extrapolator.h" |
| 30 #include "webrtc/system_wrappers/include/trace.h" | 35 #include "webrtc/system_wrappers/include/trace.h" |
| 31 #include "webrtc/video/receive_statistics_proxy.h" | 36 #include "webrtc/video/receive_statistics_proxy.h" |
| 32 #include "webrtc/video/vie_remb.h" | 37 #include "webrtc/video/vie_remb.h" |
| 33 | 38 |
| 34 namespace webrtc { | 39 namespace webrtc { |
| 35 | 40 |
| 41 namespace { | |
| 42 constexpr int kPacketBufferStartSize = 32; | |
| 43 constexpr int kPacketBufferMaxSixe = 2048; | |
| 44 } | |
| 45 | |
| 36 std::unique_ptr<RtpRtcp> CreateRtpRtcpModule( | 46 std::unique_ptr<RtpRtcp> CreateRtpRtcpModule( |
| 37 ReceiveStatistics* receive_statistics, | 47 ReceiveStatistics* receive_statistics, |
| 38 Transport* outgoing_transport, | 48 Transport* outgoing_transport, |
| 39 RtcpRttStats* rtt_stats, | 49 RtcpRttStats* rtt_stats, |
| 40 RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer, | 50 RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer, |
| 41 RemoteBitrateEstimator* remote_bitrate_estimator, | 51 RemoteBitrateEstimator* remote_bitrate_estimator, |
| 42 RtpPacketSender* paced_sender, | 52 RtpPacketSender* paced_sender, |
| 43 TransportSequenceNumberAllocator* transport_sequence_number_allocator, | 53 TransportSequenceNumberAllocator* transport_sequence_number_allocator, |
| 44 RateLimiter* retransmission_rate_limiter) { | 54 RateLimiter* retransmission_rate_limiter) { |
| 45 RtpRtcp::Configuration configuration; | 55 RtpRtcp::Configuration configuration; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 76 vcm::VideoReceiver* video_receiver, | 86 vcm::VideoReceiver* video_receiver, |
| 77 RemoteBitrateEstimator* remote_bitrate_estimator, | 87 RemoteBitrateEstimator* remote_bitrate_estimator, |
| 78 Transport* transport, | 88 Transport* transport, |
| 79 RtcpRttStats* rtt_stats, | 89 RtcpRttStats* rtt_stats, |
| 80 PacedSender* paced_sender, | 90 PacedSender* paced_sender, |
| 81 PacketRouter* packet_router, | 91 PacketRouter* packet_router, |
| 82 VieRemb* remb, | 92 VieRemb* remb, |
| 83 const VideoReceiveStream::Config* config, | 93 const VideoReceiveStream::Config* config, |
| 84 ReceiveStatisticsProxy* receive_stats_proxy, | 94 ReceiveStatisticsProxy* receive_stats_proxy, |
| 85 ProcessThread* process_thread, | 95 ProcessThread* process_thread, |
| 86 RateLimiter* retransmission_rate_limiter) | 96 RateLimiter* retransmission_rate_limiter, |
| 97 NackSender* nack_sender, | |
| 98 KeyFrameRequestSender* keyframe_request_sender, | |
| 99 video_coding::OnCompleteFrameCallback* complete_frame_callback, | |
| 100 VCMTiming* timing) | |
| 87 : clock_(Clock::GetRealTimeClock()), | 101 : clock_(Clock::GetRealTimeClock()), |
| 88 config_(*config), | 102 config_(*config), |
| 89 video_receiver_(video_receiver), | 103 video_receiver_(video_receiver), |
| 90 remote_bitrate_estimator_(remote_bitrate_estimator), | 104 remote_bitrate_estimator_(remote_bitrate_estimator), |
| 91 packet_router_(packet_router), | 105 packet_router_(packet_router), |
| 92 remb_(remb), | 106 remb_(remb), |
| 93 process_thread_(process_thread), | 107 process_thread_(process_thread), |
| 94 ntp_estimator_(clock_), | 108 ntp_estimator_(clock_), |
| 95 rtp_payload_registry_(RTPPayloadStrategy::CreateStrategy(false)), | 109 rtp_payload_registry_(RTPPayloadStrategy::CreateStrategy(false)), |
| 96 rtp_header_parser_(RtpHeaderParser::Create()), | 110 rtp_header_parser_(RtpHeaderParser::Create()), |
| 97 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_, | 111 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_, |
| 98 this, | 112 this, |
| 99 this, | 113 this, |
| 100 &rtp_payload_registry_)), | 114 &rtp_payload_registry_)), |
| 101 rtp_receive_statistics_(ReceiveStatistics::Create(clock_)), | 115 rtp_receive_statistics_(ReceiveStatistics::Create(clock_)), |
| 102 ulpfec_receiver_(UlpfecReceiver::Create(this)), | 116 ulpfec_receiver_(UlpfecReceiver::Create(this)), |
| 103 receiving_(false), | 117 receiving_(false), |
| 104 restored_packet_in_use_(false), | 118 restored_packet_in_use_(false), |
| 105 last_packet_log_ms_(-1), | 119 last_packet_log_ms_(-1), |
| 106 rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_.get(), | 120 rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_.get(), |
| 107 transport, | 121 transport, |
| 108 rtt_stats, | 122 rtt_stats, |
| 109 receive_stats_proxy, | 123 receive_stats_proxy, |
| 110 remote_bitrate_estimator_, | 124 remote_bitrate_estimator_, |
| 111 paced_sender, | 125 paced_sender, |
| 112 packet_router, | 126 packet_router, |
| 113 retransmission_rate_limiter)) { | 127 retransmission_rate_limiter)), |
| 128 complete_frame_callback_(complete_frame_callback), | |
| 129 keyframe_request_sender_(keyframe_request_sender), | |
| 130 timing_(timing) { | |
| 114 packet_router_->AddRtpModule(rtp_rtcp_.get()); | 131 packet_router_->AddRtpModule(rtp_rtcp_.get()); |
| 115 rtp_receive_statistics_->RegisterRtpStatisticsCallback(receive_stats_proxy); | 132 rtp_receive_statistics_->RegisterRtpStatisticsCallback(receive_stats_proxy); |
| 116 rtp_receive_statistics_->RegisterRtcpStatisticsCallback(receive_stats_proxy); | 133 rtp_receive_statistics_->RegisterRtcpStatisticsCallback(receive_stats_proxy); |
| 117 | 134 |
| 118 RTC_DCHECK(config_.rtp.rtcp_mode != RtcpMode::kOff) | 135 RTC_DCHECK(config_.rtp.rtcp_mode != RtcpMode::kOff) |
| 119 << "A stream should not be configured with RTCP disabled. This value is " | 136 << "A stream should not be configured with RTCP disabled. This value is " |
| 120 "reserved for internal usage."; | 137 "reserved for internal usage."; |
| 121 RTC_DCHECK(config_.rtp.remote_ssrc != 0); | 138 RTC_DCHECK(config_.rtp.remote_ssrc != 0); |
| 122 // TODO(pbos): What's an appropriate local_ssrc for receive-only streams? | 139 // TODO(pbos): What's an appropriate local_ssrc for receive-only streams? |
| 123 RTC_DCHECK(config_.rtp.local_ssrc != 0); | 140 RTC_DCHECK(config_.rtp.local_ssrc != 0); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 config_.rtp.ulpfec.ulpfec_payload_type); | 202 config_.rtp.ulpfec.ulpfec_payload_type); |
| 186 } | 203 } |
| 187 | 204 |
| 188 if (config_.rtp.rtcp_xr.receiver_reference_time_report) | 205 if (config_.rtp.rtcp_xr.receiver_reference_time_report) |
| 189 rtp_rtcp_->SetRtcpXrRrtrStatus(true); | 206 rtp_rtcp_->SetRtcpXrRrtrStatus(true); |
| 190 | 207 |
| 191 // Stats callback for CNAME changes. | 208 // Stats callback for CNAME changes. |
| 192 rtp_rtcp_->RegisterRtcpStatisticsCallback(receive_stats_proxy); | 209 rtp_rtcp_->RegisterRtcpStatisticsCallback(receive_stats_proxy); |
| 193 | 210 |
| 194 process_thread_->RegisterModule(rtp_rtcp_.get()); | 211 process_thread_->RegisterModule(rtp_rtcp_.get()); |
| 212 | |
| 213 jitter_buffer_experiment_ = | |
| 214 field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled"; | |
| 215 | |
| 216 if (jitter_buffer_experiment_) { | |
| 217 nack_module_.reset( | |
| 218 new NackModule(clock_, nack_sender, keyframe_request_sender)); | |
| 219 process_thread_->RegisterModule(nack_module_.get()); | |
| 220 | |
| 221 packet_buffer_ = video_coding::PacketBuffer::Create( | |
| 222 clock_, kPacketBufferStartSize, kPacketBufferMaxSixe, this); | |
| 223 reference_finder_.reset(new video_coding::RtpFrameReferenceFinder(this)); | |
| 224 } | |
| 195 } | 225 } |
| 196 | 226 |
| 197 RtpStreamReceiver::~RtpStreamReceiver() { | 227 RtpStreamReceiver::~RtpStreamReceiver() { |
| 198 process_thread_->DeRegisterModule(rtp_rtcp_.get()); | 228 process_thread_->DeRegisterModule(rtp_rtcp_.get()); |
| 199 | 229 |
| 230 if (jitter_buffer_experiment_) | |
| 231 process_thread_->DeRegisterModule(nack_module_.get()); | |
| 232 | |
| 200 packet_router_->RemoveRtpModule(rtp_rtcp_.get()); | 233 packet_router_->RemoveRtpModule(rtp_rtcp_.get()); |
| 201 rtp_rtcp_->SetREMBStatus(false); | 234 rtp_rtcp_->SetREMBStatus(false); |
| 202 remb_->RemoveReceiveChannel(rtp_rtcp_.get()); | 235 remb_->RemoveReceiveChannel(rtp_rtcp_.get()); |
| 203 UpdateHistograms(); | 236 UpdateHistograms(); |
| 204 } | 237 } |
| 205 | 238 |
| 206 bool RtpStreamReceiver::SetReceiveCodec(const VideoCodec& video_codec) { | 239 bool RtpStreamReceiver::SetReceiveCodec(const VideoCodec& video_codec) { |
| 207 int8_t old_pltype = -1; | 240 int8_t old_pltype = -1; |
| 208 if (rtp_payload_registry_.ReceivePayloadType( | 241 if (rtp_payload_registry_.ReceivePayloadType( |
| 209 video_codec.plName, kVideoPayloadTypeFrequency, 0, | 242 video_codec.plName, kVideoPayloadTypeFrequency, 0, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 229 } | 262 } |
| 230 | 263 |
| 231 int32_t RtpStreamReceiver::OnReceivedPayloadData( | 264 int32_t RtpStreamReceiver::OnReceivedPayloadData( |
| 232 const uint8_t* payload_data, | 265 const uint8_t* payload_data, |
| 233 size_t payload_size, | 266 size_t payload_size, |
| 234 const WebRtcRTPHeader* rtp_header) { | 267 const WebRtcRTPHeader* rtp_header) { |
| 235 RTC_DCHECK(video_receiver_); | 268 RTC_DCHECK(video_receiver_); |
| 236 WebRtcRTPHeader rtp_header_with_ntp = *rtp_header; | 269 WebRtcRTPHeader rtp_header_with_ntp = *rtp_header; |
| 237 rtp_header_with_ntp.ntp_time_ms = | 270 rtp_header_with_ntp.ntp_time_ms = |
| 238 ntp_estimator_.Estimate(rtp_header->header.timestamp); | 271 ntp_estimator_.Estimate(rtp_header->header.timestamp); |
| 239 if (video_receiver_->IncomingPacket(payload_data, payload_size, | 272 if (jitter_buffer_experiment_) { |
| 240 rtp_header_with_ntp) != 0) { | 273 VCMPacket packet(payload_data, payload_size, rtp_header_with_ntp); |
| 241 // Check this... | 274 timing_->IncomingTimestamp(packet.timestamp, clock_->TimeInMilliseconds()); |
| 242 return -1; | 275 packet.timesNacked = nack_module_->OnReceivedPacket(packet); |
| 276 | |
| 277 if (packet.codec == kVideoCodecH264) { | |
| 278 switch (tracker_.CopyAndFixBitstream(&packet)) { | |
| 279 case video_coding::H264SpsPpsTracker::kRequestKeyframe: | |
| 280 keyframe_request_sender_->RequestKeyFrame(); | |
| 281 FALLTHROUGH(); | |
| 282 case video_coding::H264SpsPpsTracker::kDrop: | |
| 283 return 0; | |
| 284 case video_coding::H264SpsPpsTracker::kInsert: | |
| 285 break; | |
| 286 } | |
| 287 } else { | |
| 288 uint8_t* data = new uint8_t[packet.sizeBytes]; | |
| 289 memcpy(data, packet.dataPtr, packet.sizeBytes); | |
| 290 packet.dataPtr = data; | |
| 291 } | |
| 292 | |
| 293 packet_buffer_->InsertPacket(packet); | |
| 294 } else { | |
| 295 if (video_receiver_->IncomingPacket(payload_data, payload_size, | |
| 296 rtp_header_with_ntp) != 0) { | |
| 297 // Check this... | |
| 298 return -1; | |
| 299 } | |
| 243 } | 300 } |
| 244 return 0; | 301 return 0; |
| 245 } | 302 } |
| 246 | 303 |
| 247 bool RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet, | 304 bool RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet, |
| 248 size_t rtp_packet_length) { | 305 size_t rtp_packet_length) { |
| 249 RTPHeader header; | 306 RTPHeader header; |
| 250 if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) { | 307 if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) { |
| 251 return false; | 308 return false; |
| 252 } | 309 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 void RtpStreamReceiver::RequestPacketRetransmit( | 407 void RtpStreamReceiver::RequestPacketRetransmit( |
| 351 const std::vector<uint16_t>& sequence_numbers) { | 408 const std::vector<uint16_t>& sequence_numbers) { |
| 352 rtp_rtcp_->SendNack(sequence_numbers); | 409 rtp_rtcp_->SendNack(sequence_numbers); |
| 353 } | 410 } |
| 354 | 411 |
| 355 int32_t RtpStreamReceiver::ResendPackets(const uint16_t* sequence_numbers, | 412 int32_t RtpStreamReceiver::ResendPackets(const uint16_t* sequence_numbers, |
| 356 uint16_t length) { | 413 uint16_t length) { |
| 357 return rtp_rtcp_->SendNACK(sequence_numbers, length); | 414 return rtp_rtcp_->SendNACK(sequence_numbers, length); |
| 358 } | 415 } |
| 359 | 416 |
| 417 void RtpStreamReceiver::OnReceivedFrame( | |
|
philipel
2016/11/08 09:27:13
When the PacketBuffer finds a complete frame this
stefan-webrtc
2016/11/08 10:41:34
Can't we have RtpFrameReferenceFinder implement On
nisse-webrtc
2016/11/08 11:56:30
I think explanations like this belong in comments
philipel
2016/11/08 12:28:39
I don't think it makes sense to modify the RtpFram
philipel
2016/11/08 12:28:39
These comments were added to make reviewing easier
nisse-webrtc
2016/11/08 12:58:12
The code comment should explain the purpose of the
philipel
2016/11/08 13:35:51
There are comments for OnReceivedFrameCallback (pa
| |
| 418 std::unique_ptr<video_coding::RtpFrameObject> frame) { | |
| 419 reference_finder_->ManageFrame(std::move(frame)); | |
| 420 } | |
| 421 | |
| 422 void RtpStreamReceiver::OnCompleteFrame( | |
|
philipel
2016/11/08 09:27:13
When the RtpFrameReferenceFinder has found all the
| |
| 423 std::unique_ptr<video_coding::FrameObject> frame) { | |
| 424 { | |
| 425 rtc::CritScope lock(&last_seq_num_cs_); | |
| 426 video_coding::RtpFrameObject* rtp_frame = | |
| 427 static_cast<video_coding::RtpFrameObject*>(frame.get()); | |
| 428 last_seq_num_for_pic_id_[rtp_frame->picture_id] = rtp_frame->last_seq_num(); | |
| 429 } | |
| 430 complete_frame_callback_->OnCompleteFrame(std::move(frame)); | |
| 431 } | |
| 432 | |
| 433 void RtpStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | |
| 434 if (jitter_buffer_experiment_) | |
| 435 nack_module_->UpdateRtt(max_rtt_ms); | |
| 436 } | |
| 437 | |
| 360 bool RtpStreamReceiver::ReceivePacket(const uint8_t* packet, | 438 bool RtpStreamReceiver::ReceivePacket(const uint8_t* packet, |
| 361 size_t packet_length, | 439 size_t packet_length, |
| 362 const RTPHeader& header, | 440 const RTPHeader& header, |
| 363 bool in_order) { | 441 bool in_order) { |
| 364 if (rtp_payload_registry_.IsEncapsulated(header)) { | 442 if (rtp_payload_registry_.IsEncapsulated(header)) { |
| 365 return ParseAndHandleEncapsulatingHeader(packet, packet_length, header); | 443 return ParseAndHandleEncapsulatingHeader(packet, packet_length, header); |
| 366 } | 444 } |
| 367 const uint8_t* payload = packet + header.headerLength; | 445 const uint8_t* payload = packet + header.headerLength; |
| 368 assert(packet_length >= header.headerLength); | 446 assert(packet_length >= header.headerLength); |
| 369 size_t payload_length = packet_length - header.headerLength; | 447 size_t payload_length = packet_length - header.headerLength; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 474 if (rtp_rtcp_->RemoteNTP(&ntp_secs, &ntp_frac, nullptr, nullptr, | 552 if (rtp_rtcp_->RemoteNTP(&ntp_secs, &ntp_frac, nullptr, nullptr, |
| 475 &rtp_timestamp) != 0) { | 553 &rtp_timestamp) != 0) { |
| 476 // Waiting for RTCP. | 554 // Waiting for RTCP. |
| 477 return true; | 555 return true; |
| 478 } | 556 } |
| 479 ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp); | 557 ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp); |
| 480 | 558 |
| 481 return true; | 559 return true; |
| 482 } | 560 } |
| 483 | 561 |
| 562 void RtpStreamReceiver::FrameContinuous(uint16_t picture_id) { | |
|
philipel
2016/11/08 09:27:13
This function is called from VideoReceiveStream::O
| |
| 563 if (jitter_buffer_experiment_) { | |
| 564 int seq_num = -1; | |
| 565 { | |
| 566 rtc::CritScope lock(&last_seq_num_cs_); | |
| 567 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id); | |
| 568 if (seq_num_it != last_seq_num_for_pic_id_.end()) | |
| 569 seq_num = seq_num_it->second; | |
| 570 } | |
| 571 if (seq_num != -1) | |
| 572 nack_module_->ClearUpTo(seq_num); | |
| 573 } | |
| 574 } | |
| 575 | |
| 576 void RtpStreamReceiver::FrameDecoded(uint16_t picture_id) { | |
|
philipel
2016/11/08 09:27:13
Called from VideoReceiveStream::Decode when a fram
| |
| 577 if (jitter_buffer_experiment_) { | |
| 578 int seq_num = -1; | |
| 579 { | |
| 580 rtc::CritScope lock(&last_seq_num_cs_); | |
| 581 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id); | |
| 582 if (seq_num_it != last_seq_num_for_pic_id_.end()) { | |
| 583 seq_num = seq_num_it->second; | |
| 584 last_seq_num_for_pic_id_.erase(last_seq_num_for_pic_id_.begin(), | |
| 585 ++seq_num_it); | |
| 586 } | |
| 587 } | |
| 588 if (seq_num != -1) { | |
| 589 packet_buffer_->ClearTo(seq_num); | |
| 590 reference_finder_->ClearTo(seq_num); | |
| 591 } | |
| 592 } | |
| 593 } | |
| 594 | |
| 484 void RtpStreamReceiver::SignalNetworkState(NetworkState state) { | 595 void RtpStreamReceiver::SignalNetworkState(NetworkState state) { |
| 485 rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode | 596 rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode |
| 486 : RtcpMode::kOff); | 597 : RtcpMode::kOff); |
| 487 } | 598 } |
| 488 | 599 |
| 489 void RtpStreamReceiver::StartReceive() { | 600 void RtpStreamReceiver::StartReceive() { |
| 490 rtc::CritScope lock(&receive_cs_); | 601 rtc::CritScope lock(&receive_cs_); |
| 491 receiving_ = true; | 602 receiving_ = true; |
| 492 } | 603 } |
| 493 | 604 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 538 const std::string& extension, int id) { | 649 const std::string& extension, int id) { |
| 539 // One-byte-extension local identifiers are in the range 1-14 inclusive. | 650 // One-byte-extension local identifiers are in the range 1-14 inclusive. |
| 540 RTC_DCHECK_GE(id, 1); | 651 RTC_DCHECK_GE(id, 1); |
| 541 RTC_DCHECK_LE(id, 14); | 652 RTC_DCHECK_LE(id, 14); |
| 542 RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension)); | 653 RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension)); |
| 543 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension( | 654 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension( |
| 544 StringToRtpExtensionType(extension), id)); | 655 StringToRtpExtensionType(extension), id)); |
| 545 } | 656 } |
| 546 | 657 |
| 547 } // namespace webrtc | 658 } // namespace webrtc |
| OLD | NEW |