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

Side by Side Diff: webrtc/modules/video_coding/jitter_buffer.cc

Issue 2123913002: Remove old WebRTC-NewVideoJitterBuffer used for testing the NackModule. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 5 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
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 #include "webrtc/modules/video_coding/jitter_buffer.h" 10 #include "webrtc/modules/video_coding/jitter_buffer.h"
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 SsMap::iterator ss_it; 208 SsMap::iterator ss_it;
209 if (Find(frame_it.second->TimeStamp(), &ss_it)) { 209 if (Find(frame_it.second->TimeStamp(), &ss_it)) {
210 if (gof_idx >= ss_it->second.num_frames_in_gof) { 210 if (gof_idx >= ss_it->second.num_frames_in_gof) {
211 continue; // Assume corresponding SS not yet received. 211 continue; // Assume corresponding SS not yet received.
212 } 212 }
213 frame_it.second->SetGofInfo(ss_it->second, gof_idx); 213 frame_it.second->SetGofInfo(ss_it->second, gof_idx);
214 } 214 }
215 } 215 }
216 } 216 }
217 217
218 static NackModule*
219 MaybeCreateNackModule(Clock* clock,
220 NackSender* nack_sender,
221 KeyFrameRequestSender* keyframe_request_sender) {
222 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
223 // Only create a nack module if a nack sender is available.
224 if (nack_sender) {
225 RTC_DCHECK(keyframe_request_sender);
226 return new NackModule(clock, nack_sender, keyframe_request_sender);
227 }
228 }
229 return nullptr;
230 }
231
232 VCMJitterBuffer::VCMJitterBuffer(Clock* clock, 218 VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
233 std::unique_ptr<EventWrapper> event, 219 std::unique_ptr<EventWrapper> event,
234 NackSender* nack_sender, 220 NackSender* nack_sender,
235 KeyFrameRequestSender* keyframe_request_sender) 221 KeyFrameRequestSender* keyframe_request_sender)
236 : clock_(clock), 222 : clock_(clock),
237 running_(false), 223 running_(false),
238 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), 224 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
239 frame_event_(std::move(event)), 225 frame_event_(std::move(event)),
240 max_number_of_frames_(kStartNumberOfFrames), 226 max_number_of_frames_(kStartNumberOfFrames),
241 free_frames_(), 227 free_frames_(),
(...skipping 17 matching lines...) Expand all
259 rtt_ms_(kDefaultRtt), 245 rtt_ms_(kDefaultRtt),
260 nack_mode_(kNoNack), 246 nack_mode_(kNoNack),
261 low_rtt_nack_threshold_ms_(-1), 247 low_rtt_nack_threshold_ms_(-1),
262 high_rtt_nack_threshold_ms_(-1), 248 high_rtt_nack_threshold_ms_(-1),
263 missing_sequence_numbers_(SequenceNumberLessThan()), 249 missing_sequence_numbers_(SequenceNumberLessThan()),
264 max_nack_list_size_(0), 250 max_nack_list_size_(0),
265 max_packet_age_to_nack_(0), 251 max_packet_age_to_nack_(0),
266 max_incomplete_time_ms_(0), 252 max_incomplete_time_ms_(0),
267 decode_error_mode_(kNoErrors), 253 decode_error_mode_(kNoErrors),
268 average_packets_per_frame_(0.0f), 254 average_packets_per_frame_(0.0f),
269 frame_counter_(0), 255 frame_counter_(0) {
270 nack_module_(MaybeCreateNackModule(clock,
271 nack_sender,
272 keyframe_request_sender)) {
273 for (int i = 0; i < kStartNumberOfFrames; i++) 256 for (int i = 0; i < kStartNumberOfFrames; i++)
274 free_frames_.push_back(new VCMFrameBuffer()); 257 free_frames_.push_back(new VCMFrameBuffer());
275 } 258 }
276 259
277 VCMJitterBuffer::~VCMJitterBuffer() { 260 VCMJitterBuffer::~VCMJitterBuffer() {
278 Stop(); 261 Stop();
279 for (UnorderedFrameList::iterator it = free_frames_.begin(); 262 for (UnorderedFrameList::iterator it = free_frames_.begin();
280 it != free_frames_.end(); ++it) { 263 it != free_frames_.end(); ++it) {
281 delete *it; 264 delete *it;
282 } 265 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 first_packet_since_reset_ = true; 325 first_packet_since_reset_ = true;
343 rtt_ms_ = kDefaultRtt; 326 rtt_ms_ = kDefaultRtt;
344 last_decoded_state_.Reset(); 327 last_decoded_state_.Reset();
345 } 328 }
346 329
347 void VCMJitterBuffer::Stop() { 330 void VCMJitterBuffer::Stop() {
348 crit_sect_->Enter(); 331 crit_sect_->Enter();
349 UpdateHistograms(); 332 UpdateHistograms();
350 running_ = false; 333 running_ = false;
351 last_decoded_state_.Reset(); 334 last_decoded_state_.Reset();
352 if (nack_module_)
353 nack_module_->Stop();
354 335
355 // Make sure all frames are free and reset. 336 // Make sure all frames are free and reset.
356 for (FrameList::iterator it = decodable_frames_.begin(); 337 for (FrameList::iterator it = decodable_frames_.begin();
357 it != decodable_frames_.end(); ++it) { 338 it != decodable_frames_.end(); ++it) {
358 free_frames_.push_back(it->second); 339 free_frames_.push_back(it->second);
359 } 340 }
360 for (FrameList::iterator it = incomplete_frames_.begin(); 341 for (FrameList::iterator it = incomplete_frames_.begin();
361 it != incomplete_frames_.end(); ++it) { 342 it != incomplete_frames_.end(); ++it) {
362 free_frames_.push_back(it->second); 343 free_frames_.push_back(it->second);
363 } 344 }
(...skipping 20 matching lines...) Expand all
384 last_decoded_state_.Reset(); // TODO(mikhal): sync reset. 365 last_decoded_state_.Reset(); // TODO(mikhal): sync reset.
385 num_consecutive_old_packets_ = 0; 366 num_consecutive_old_packets_ = 0;
386 // Also reset the jitter and delay estimates 367 // Also reset the jitter and delay estimates
387 jitter_estimate_.Reset(); 368 jitter_estimate_.Reset();
388 inter_frame_delay_.Reset(clock_->TimeInMilliseconds()); 369 inter_frame_delay_.Reset(clock_->TimeInMilliseconds());
389 waiting_for_completion_.frame_size = 0; 370 waiting_for_completion_.frame_size = 0;
390 waiting_for_completion_.timestamp = 0; 371 waiting_for_completion_.timestamp = 0;
391 waiting_for_completion_.latest_packet_time = -1; 372 waiting_for_completion_.latest_packet_time = -1;
392 first_packet_since_reset_ = true; 373 first_packet_since_reset_ = true;
393 missing_sequence_numbers_.clear(); 374 missing_sequence_numbers_.clear();
394 if (nack_module_)
395 nack_module_->Clear();
396 } 375 }
397 376
398 // Get received key and delta frames 377 // Get received key and delta frames
399 FrameCounts VCMJitterBuffer::FrameStatistics() const { 378 FrameCounts VCMJitterBuffer::FrameStatistics() const {
400 CriticalSectionScoped cs(crit_sect_); 379 CriticalSectionScoped cs(crit_sect_);
401 return receive_statistics_; 380 return receive_statistics_;
402 } 381 }
403 382
404 int VCMJitterBuffer::num_packets() const { 383 int VCMJitterBuffer::num_packets() const {
405 CriticalSectionScoped cs(crit_sect_); 384 CriticalSectionScoped cs(crit_sect_);
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 // decoder. Propagates the missing_frame bit. 581 // decoder. Propagates the missing_frame bit.
603 frame->PrepareForDecode(continuous); 582 frame->PrepareForDecode(continuous);
604 583
605 // We have a frame - update the last decoded state and nack list. 584 // We have a frame - update the last decoded state and nack list.
606 last_decoded_state_.SetState(frame); 585 last_decoded_state_.SetState(frame);
607 DropPacketsFromNackList(last_decoded_state_.sequence_num()); 586 DropPacketsFromNackList(last_decoded_state_.sequence_num());
608 587
609 if ((*frame).IsSessionComplete()) 588 if ((*frame).IsSessionComplete())
610 UpdateAveragePacketsPerFrame(frame->NumPackets()); 589 UpdateAveragePacketsPerFrame(frame->NumPackets());
611 590
612 if (nack_module_)
613 nack_module_->ClearUpTo(frame->GetHighSeqNum());
614 return frame; 591 return frame;
615 } 592 }
616 593
617 // Release frame when done with decoding. Should never be used to release 594 // Release frame when done with decoding. Should never be used to release
618 // frames from within the jitter buffer. 595 // frames from within the jitter buffer.
619 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) { 596 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) {
620 CriticalSectionScoped cs(crit_sect_); 597 CriticalSectionScoped cs(crit_sect_);
621 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame); 598 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame);
622 if (frame_buffer) { 599 if (frame_buffer) {
623 free_frames_.push_back(frame_buffer); 600 free_frames_.push_back(frame_buffer);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 const VCMFrameBuffer* frame_buffer = 641 const VCMFrameBuffer* frame_buffer =
665 static_cast<const VCMFrameBuffer*>(frame); 642 static_cast<const VCMFrameBuffer*>(frame);
666 *retransmitted = (frame_buffer->GetNackCount() > 0); 643 *retransmitted = (frame_buffer->GetNackCount() > 0);
667 return frame_buffer->LatestPacketTimeMs(); 644 return frame_buffer->LatestPacketTimeMs();
668 } 645 }
669 646
670 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, 647 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
671 bool* retransmitted) { 648 bool* retransmitted) {
672 CriticalSectionScoped cs(crit_sect_); 649 CriticalSectionScoped cs(crit_sect_);
673 650
674 if (nack_module_)
675 nack_module_->OnReceivedPacket(packet);
676
677 ++num_packets_; 651 ++num_packets_;
678 if (num_packets_ == 1) { 652 if (num_packets_ == 1) {
679 time_first_packet_ms_ = clock_->TimeInMilliseconds(); 653 time_first_packet_ms_ = clock_->TimeInMilliseconds();
680 } 654 }
681 // Does this packet belong to an old frame? 655 // Does this packet belong to an old frame?
682 if (last_decoded_state_.IsOldPacket(&packet)) { 656 if (last_decoded_state_.IsOldPacket(&packet)) {
683 // Account only for media packets. 657 // Account only for media packets.
684 if (packet.sizeBytes > 0) { 658 if (packet.sizeBytes > 0) {
685 num_discarded_packets_++; 659 num_discarded_packets_++;
686 num_consecutive_old_packets_++; 660 num_consecutive_old_packets_++;
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 // when waiting for retransmissions. 903 // when waiting for retransmissions.
930 rtt_mult = 0.0f; 904 rtt_mult = 0.0f;
931 } 905 }
932 return jitter_estimate_.GetJitterEstimate(rtt_mult); 906 return jitter_estimate_.GetJitterEstimate(rtt_mult);
933 } 907 }
934 908
935 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { 909 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) {
936 CriticalSectionScoped cs(crit_sect_); 910 CriticalSectionScoped cs(crit_sect_);
937 rtt_ms_ = rtt_ms; 911 rtt_ms_ = rtt_ms;
938 jitter_estimate_.UpdateRtt(rtt_ms); 912 jitter_estimate_.UpdateRtt(rtt_ms);
939 if (nack_module_)
940 nack_module_->UpdateRtt(rtt_ms);
941 if (!WaitForRetransmissions()) 913 if (!WaitForRetransmissions())
942 jitter_estimate_.ResetNackCount(); 914 jitter_estimate_.ResetNackCount();
943 } 915 }
944 916
945 void VCMJitterBuffer::SetNackMode(VCMNackMode mode, 917 void VCMJitterBuffer::SetNackMode(VCMNackMode mode,
946 int64_t low_rtt_nack_threshold_ms, 918 int64_t low_rtt_nack_threshold_ms,
947 int64_t high_rtt_nack_threshold_ms) { 919 int64_t high_rtt_nack_threshold_ms) {
948 CriticalSectionScoped cs(crit_sect_); 920 CriticalSectionScoped cs(crit_sect_);
949 nack_mode_ = mode; 921 nack_mode_ = mode;
950 if (mode == kNoNack) { 922 if (mode == kNoNack) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 } else { 1024 } else {
1053 // Skip to the last key frame. If it's incomplete we will start 1025 // Skip to the last key frame. If it's incomplete we will start
1054 // NACKing it. 1026 // NACKing it.
1055 // Note that the estimated low sequence number is correct for VP8 1027 // Note that the estimated low sequence number is correct for VP8
1056 // streams because only the first packet of a key frame is marked. 1028 // streams because only the first packet of a key frame is marked.
1057 last_decoded_state_.Reset(); 1029 last_decoded_state_.Reset();
1058 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second)); 1030 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second));
1059 } 1031 }
1060 } 1032 }
1061 } 1033 }
1062 // The experiment is running, the nack module will send Nacks.
1063 // The reason we allow the major part of the GetNackList function to
1064 // run even if we are running the experiment is because this
1065 // function is also used to signal that the jitter buffer wants to
1066 // request a keyframe.
1067 if (nack_module_)
1068 return std::vector<uint16_t>();
1069
1070 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), 1034 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(),
1071 missing_sequence_numbers_.end()); 1035 missing_sequence_numbers_.end());
1072 return nack_list; 1036 return nack_list;
1073 } 1037 }
1074 1038
1075 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) { 1039 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) {
1076 CriticalSectionScoped cs(crit_sect_); 1040 CriticalSectionScoped cs(crit_sect_);
1077 decode_error_mode_ = error_mode; 1041 decode_error_mode_ = error_mode;
1078 } 1042 }
1079 1043
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 } 1308 }
1345 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in 1309 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in
1346 // that case we don't wait for retransmissions. 1310 // that case we don't wait for retransmissions.
1347 if (high_rtt_nack_threshold_ms_ >= 0 && 1311 if (high_rtt_nack_threshold_ms_ >= 0 &&
1348 rtt_ms_ >= high_rtt_nack_threshold_ms_) { 1312 rtt_ms_ >= high_rtt_nack_threshold_ms_) {
1349 return false; 1313 return false;
1350 } 1314 }
1351 return true; 1315 return true;
1352 } 1316 }
1353 1317
1354 int64_t VCMJitterBuffer::TimeUntilNextProcess() {
1355 if (nack_module_)
1356 return nack_module_->TimeUntilNextProcess();
1357 return std::numeric_limits<int64_t>::max();
1358 }
1359
1360 void VCMJitterBuffer::Process() {
1361 if (nack_module_)
1362 nack_module_->Process();
1363 }
1364 } // namespace webrtc 1318 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/jitter_buffer.h ('k') | webrtc/modules/video_coding/jitter_buffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698