Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: webrtc/video/rtp_stream_receiver.cc

Issue 2704183002: Revert of Revert Make the new jitter buffer the default jitter buffer. (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video/rtp_stream_receiver.h ('k') | webrtc/video/rtp_stream_receiver_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 rtp_rtcp->SetSendingStatus(false); 75 rtp_rtcp->SetSendingStatus(false);
76 rtp_rtcp->SetSendingMediaStatus(false); 76 rtp_rtcp->SetSendingMediaStatus(false);
77 rtp_rtcp->SetRTCPStatus(RtcpMode::kCompound); 77 rtp_rtcp->SetRTCPStatus(RtcpMode::kCompound);
78 78
79 return rtp_rtcp; 79 return rtp_rtcp;
80 } 80 }
81 81
82 static const int kPacketLogIntervalMs = 10000; 82 static const int kPacketLogIntervalMs = 10000;
83 83
84 RtpStreamReceiver::RtpStreamReceiver( 84 RtpStreamReceiver::RtpStreamReceiver(
85 vcm::VideoReceiver* video_receiver,
86 Transport* transport, 85 Transport* transport,
87 RtcpRttStats* rtt_stats, 86 RtcpRttStats* rtt_stats,
88 PacketRouter* packet_router, 87 PacketRouter* packet_router,
89 VieRemb* remb, 88 VieRemb* remb,
90 const VideoReceiveStream::Config* config, 89 const VideoReceiveStream::Config* config,
91 ReceiveStatisticsProxy* receive_stats_proxy, 90 ReceiveStatisticsProxy* receive_stats_proxy,
92 ProcessThread* process_thread, 91 ProcessThread* process_thread,
93 NackSender* nack_sender, 92 NackSender* nack_sender,
94 KeyFrameRequestSender* keyframe_request_sender, 93 KeyFrameRequestSender* keyframe_request_sender,
95 video_coding::OnCompleteFrameCallback* complete_frame_callback, 94 video_coding::OnCompleteFrameCallback* complete_frame_callback,
96 VCMTiming* timing) 95 VCMTiming* timing)
97 : clock_(Clock::GetRealTimeClock()), 96 : clock_(Clock::GetRealTimeClock()),
98 config_(*config), 97 config_(*config),
99 video_receiver_(video_receiver),
100 packet_router_(packet_router), 98 packet_router_(packet_router),
101 remb_(remb), 99 remb_(remb),
102 process_thread_(process_thread), 100 process_thread_(process_thread),
103 ntp_estimator_(clock_), 101 ntp_estimator_(clock_),
104 rtp_header_parser_(RtpHeaderParser::Create()), 102 rtp_header_parser_(RtpHeaderParser::Create()),
105 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_, 103 rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_,
106 this, 104 this,
107 this, 105 this,
108 &rtp_payload_registry_)), 106 &rtp_payload_registry_)),
109 rtp_receive_statistics_(ReceiveStatistics::Create(clock_)), 107 rtp_receive_statistics_(ReceiveStatistics::Create(clock_)),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 } 179 }
182 180
183 if (config_.rtp.rtcp_xr.receiver_reference_time_report) 181 if (config_.rtp.rtcp_xr.receiver_reference_time_report)
184 rtp_rtcp_->SetRtcpXrRrtrStatus(true); 182 rtp_rtcp_->SetRtcpXrRrtrStatus(true);
185 183
186 // Stats callback for CNAME changes. 184 // Stats callback for CNAME changes.
187 rtp_rtcp_->RegisterRtcpStatisticsCallback(receive_stats_proxy); 185 rtp_rtcp_->RegisterRtcpStatisticsCallback(receive_stats_proxy);
188 186
189 process_thread_->RegisterModule(rtp_rtcp_.get()); 187 process_thread_->RegisterModule(rtp_rtcp_.get());
190 188
191 jitter_buffer_experiment_ = 189 nack_module_.reset(
192 field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled"; 190 new NackModule(clock_, nack_sender, keyframe_request_sender));
191 if (config_.rtp.nack.rtp_history_ms == 0)
192 nack_module_->Stop();
193 process_thread_->RegisterModule(nack_module_.get());
193 194
194 if (jitter_buffer_experiment_) { 195 packet_buffer_ = video_coding::PacketBuffer::Create(
195 nack_module_.reset( 196 clock_, kPacketBufferStartSize, kPacketBufferMaxSixe, this);
196 new NackModule(clock_, nack_sender, keyframe_request_sender)); 197 reference_finder_.reset(new video_coding::RtpFrameReferenceFinder(this));
197 process_thread_->RegisterModule(nack_module_.get());
198
199 packet_buffer_ = video_coding::PacketBuffer::Create(
200 clock_, kPacketBufferStartSize, kPacketBufferMaxSixe, this);
201 reference_finder_.reset(new video_coding::RtpFrameReferenceFinder(this));
202 }
203 } 198 }
204 199
205 RtpStreamReceiver::~RtpStreamReceiver() { 200 RtpStreamReceiver::~RtpStreamReceiver() {
206 process_thread_->DeRegisterModule(rtp_rtcp_.get()); 201 process_thread_->DeRegisterModule(rtp_rtcp_.get());
207 202
208 if (jitter_buffer_experiment_) 203 process_thread_->DeRegisterModule(nack_module_.get());
209 process_thread_->DeRegisterModule(nack_module_.get());
210 204
211 packet_router_->RemoveRtpModule(rtp_rtcp_.get()); 205 packet_router_->RemoveRtpModule(rtp_rtcp_.get());
212 rtp_rtcp_->SetREMBStatus(false); 206 rtp_rtcp_->SetREMBStatus(false);
213 if (config_.rtp.remb) { 207 if (config_.rtp.remb) {
214 remb_->RemoveReceiveChannel(rtp_rtcp_.get()); 208 remb_->RemoveReceiveChannel(rtp_rtcp_.get());
215 } 209 }
216 UpdateHistograms(); 210 UpdateHistograms();
217 } 211 }
218 212
219 bool RtpStreamReceiver::AddReceiveCodec( 213 bool RtpStreamReceiver::AddReceiveCodec(
(...skipping 24 matching lines...) Expand all
244 return rtp_receiver_.get(); 238 return rtp_receiver_.get();
245 } 239 }
246 240
247 int32_t RtpStreamReceiver::OnReceivedPayloadData( 241 int32_t RtpStreamReceiver::OnReceivedPayloadData(
248 const uint8_t* payload_data, 242 const uint8_t* payload_data,
249 size_t payload_size, 243 size_t payload_size,
250 const WebRtcRTPHeader* rtp_header) { 244 const WebRtcRTPHeader* rtp_header) {
251 WebRtcRTPHeader rtp_header_with_ntp = *rtp_header; 245 WebRtcRTPHeader rtp_header_with_ntp = *rtp_header;
252 rtp_header_with_ntp.ntp_time_ms = 246 rtp_header_with_ntp.ntp_time_ms =
253 ntp_estimator_.Estimate(rtp_header->header.timestamp); 247 ntp_estimator_.Estimate(rtp_header->header.timestamp);
254 if (jitter_buffer_experiment_) { 248 VCMPacket packet(payload_data, payload_size, rtp_header_with_ntp);
255 VCMPacket packet(payload_data, payload_size, rtp_header_with_ntp); 249 packet.timesNacked = nack_module_->OnReceivedPacket(packet);
256 packet.timesNacked = nack_module_->OnReceivedPacket(packet);
257 250
258 if (packet.codec == kVideoCodecH264) { 251 if (packet.codec == kVideoCodecH264) {
259 // Only when we start to receive packets will we know what payload type 252 // Only when we start to receive packets will we know what payload type
260 // that will be used. When we know the payload type insert the correct 253 // that will be used. When we know the payload type insert the correct
261 // sps/pps into the tracker. 254 // sps/pps into the tracker.
262 if (packet.payloadType != last_payload_type_) { 255 if (packet.payloadType != last_payload_type_) {
263 last_payload_type_ = packet.payloadType; 256 last_payload_type_ = packet.payloadType;
264 InsertSpsPpsIntoTracker(packet.payloadType); 257 InsertSpsPpsIntoTracker(packet.payloadType);
265 }
266
267 switch (tracker_.CopyAndFixBitstream(&packet)) {
268 case video_coding::H264SpsPpsTracker::kRequestKeyframe:
269 keyframe_request_sender_->RequestKeyFrame();
270 FALLTHROUGH();
271 case video_coding::H264SpsPpsTracker::kDrop:
272 return 0;
273 case video_coding::H264SpsPpsTracker::kInsert:
274 break;
275 }
276 } else {
277 uint8_t* data = new uint8_t[packet.sizeBytes];
278 memcpy(data, packet.dataPtr, packet.sizeBytes);
279 packet.dataPtr = data;
280 } 258 }
281 259
282 packet_buffer_->InsertPacket(&packet); 260 switch (tracker_.CopyAndFixBitstream(&packet)) {
261 case video_coding::H264SpsPpsTracker::kRequestKeyframe:
262 keyframe_request_sender_->RequestKeyFrame();
263 FALLTHROUGH();
264 case video_coding::H264SpsPpsTracker::kDrop:
265 return 0;
266 case video_coding::H264SpsPpsTracker::kInsert:
267 break;
268 }
269
283 } else { 270 } else {
284 RTC_DCHECK(video_receiver_); 271 uint8_t* data = new uint8_t[packet.sizeBytes];
285 if (video_receiver_->IncomingPacket(payload_data, payload_size, 272 memcpy(data, packet.dataPtr, packet.sizeBytes);
286 rtp_header_with_ntp) != 0) { 273 packet.dataPtr = data;
287 // Check this...
288 return -1;
289 }
290 } 274 }
275
276 packet_buffer_->InsertPacket(&packet);
291 return 0; 277 return 0;
292 } 278 }
293 279
294 bool RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet, 280 bool RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet,
295 size_t rtp_packet_length) { 281 size_t rtp_packet_length) {
296 RTPHeader header; 282 RTPHeader header;
297 if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) { 283 if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) {
298 return false; 284 return false;
299 } 285 }
300 header.payload_type_frequency = kVideoPayloadTypeFrequency; 286 header.payload_type_frequency = kVideoPayloadTypeFrequency;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 { 398 {
413 rtc::CritScope lock(&last_seq_num_cs_); 399 rtc::CritScope lock(&last_seq_num_cs_);
414 video_coding::RtpFrameObject* rtp_frame = 400 video_coding::RtpFrameObject* rtp_frame =
415 static_cast<video_coding::RtpFrameObject*>(frame.get()); 401 static_cast<video_coding::RtpFrameObject*>(frame.get());
416 last_seq_num_for_pic_id_[rtp_frame->picture_id] = rtp_frame->last_seq_num(); 402 last_seq_num_for_pic_id_[rtp_frame->picture_id] = rtp_frame->last_seq_num();
417 } 403 }
418 complete_frame_callback_->OnCompleteFrame(std::move(frame)); 404 complete_frame_callback_->OnCompleteFrame(std::move(frame));
419 } 405 }
420 406
421 void RtpStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { 407 void RtpStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
422 if (jitter_buffer_experiment_) 408 nack_module_->UpdateRtt(max_rtt_ms);
423 nack_module_->UpdateRtt(max_rtt_ms);
424 } 409 }
425 410
426 // TODO(nisse): Drop return value. 411 // TODO(nisse): Drop return value.
427 bool RtpStreamReceiver::ReceivePacket(const uint8_t* packet, 412 bool RtpStreamReceiver::ReceivePacket(const uint8_t* packet,
428 size_t packet_length, 413 size_t packet_length,
429 const RTPHeader& header, 414 const RTPHeader& header,
430 bool in_order) { 415 bool in_order) {
431 if (rtp_payload_registry_.IsEncapsulated(header)) { 416 if (rtp_payload_registry_.IsEncapsulated(header)) {
432 return ParseAndHandleEncapsulatingHeader(packet, packet_length, header); 417 return ParseAndHandleEncapsulatingHeader(packet, packet_length, header);
433 } 418 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 &rtp_timestamp) != 0) { 527 &rtp_timestamp) != 0) {
543 // Waiting for RTCP. 528 // Waiting for RTCP.
544 return true; 529 return true;
545 } 530 }
546 ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp); 531 ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp);
547 532
548 return true; 533 return true;
549 } 534 }
550 535
551 void RtpStreamReceiver::FrameContinuous(uint16_t picture_id) { 536 void RtpStreamReceiver::FrameContinuous(uint16_t picture_id) {
552 if (jitter_buffer_experiment_) { 537 int seq_num = -1;
553 int seq_num = -1; 538 {
554 { 539 rtc::CritScope lock(&last_seq_num_cs_);
555 rtc::CritScope lock(&last_seq_num_cs_); 540 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id);
556 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id); 541 if (seq_num_it != last_seq_num_for_pic_id_.end())
557 if (seq_num_it != last_seq_num_for_pic_id_.end()) 542 seq_num = seq_num_it->second;
558 seq_num = seq_num_it->second;
559 }
560 if (seq_num != -1)
561 nack_module_->ClearUpTo(seq_num);
562 } 543 }
544 if (seq_num != -1)
545 nack_module_->ClearUpTo(seq_num);
563 } 546 }
564 547
565 void RtpStreamReceiver::FrameDecoded(uint16_t picture_id) { 548 void RtpStreamReceiver::FrameDecoded(uint16_t picture_id) {
566 if (jitter_buffer_experiment_) { 549 int seq_num = -1;
567 int seq_num = -1; 550 {
568 { 551 rtc::CritScope lock(&last_seq_num_cs_);
569 rtc::CritScope lock(&last_seq_num_cs_); 552 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id);
570 auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id); 553 if (seq_num_it != last_seq_num_for_pic_id_.end()) {
571 if (seq_num_it != last_seq_num_for_pic_id_.end()) { 554 seq_num = seq_num_it->second;
572 seq_num = seq_num_it->second; 555 last_seq_num_for_pic_id_.erase(last_seq_num_for_pic_id_.begin(),
573 last_seq_num_for_pic_id_.erase(last_seq_num_for_pic_id_.begin(), 556 ++seq_num_it);
574 ++seq_num_it);
575 }
576 } 557 }
577 if (seq_num != -1) { 558 }
578 packet_buffer_->ClearTo(seq_num); 559 if (seq_num != -1) {
579 reference_finder_->ClearTo(seq_num); 560 packet_buffer_->ClearTo(seq_num);
580 } 561 reference_finder_->ClearTo(seq_num);
581 } 562 }
582 } 563 }
583 564
584 void RtpStreamReceiver::SignalNetworkState(NetworkState state) { 565 void RtpStreamReceiver::SignalNetworkState(NetworkState state) {
585 rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode 566 rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode
586 : RtcpMode::kOff); 567 : RtcpMode::kOff);
587 } 568 }
588 569
589 void RtpStreamReceiver::StartReceive() { 570 void RtpStreamReceiver::StartReceive() {
590 rtc::CritScope lock(&receive_cs_); 571 rtc::CritScope lock(&receive_cs_);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 return; 649 return;
669 650
670 if (!sprop_decoder.DecodeSprop(sprop_base64_it->second.c_str())) 651 if (!sprop_decoder.DecodeSprop(sprop_base64_it->second.c_str()))
671 return; 652 return;
672 653
673 tracker_.InsertSpsPpsNalus(sprop_decoder.sps_nalu(), 654 tracker_.InsertSpsPpsNalus(sprop_decoder.sps_nalu(),
674 sprop_decoder.pps_nalu()); 655 sprop_decoder.pps_nalu());
675 } 656 }
676 657
677 } // namespace webrtc 658 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/rtp_stream_receiver.h ('k') | webrtc/video/rtp_stream_receiver_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698