Index: webrtc/modules/video_coding/jitter_buffer.cc |
diff --git a/webrtc/modules/video_coding/jitter_buffer.cc b/webrtc/modules/video_coding/jitter_buffer.cc |
index ca8c0d957148233f56ca07debc8dbf8aad155bb8..d38a5cfeca75fc01eb0f5a35bbddbca78d3bf4dc 100644 |
--- a/webrtc/modules/video_coding/jitter_buffer.cc |
+++ b/webrtc/modules/video_coding/jitter_buffer.cc |
@@ -28,10 +28,10 @@ |
#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
#include "webrtc/system_wrappers/include/event_wrapper.h" |
+#include "webrtc/system_wrappers/include/field_trial.h" |
#include "webrtc/system_wrappers/include/metrics.h" |
namespace webrtc { |
- |
// Interval for updating SS data. |
static const uint32_t kSsCleanupIntervalSec = 60; |
@@ -215,7 +215,10 @@ void Vp9SsMap::UpdateFrames(FrameList* frames) { |
} |
VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
- std::unique_ptr<EventWrapper> event) |
+ std::unique_ptr<EventWrapper> event, |
+ ProcessThread* module_process_thread, |
+ NackSender* nack_sender, |
+ KeyFrameRequestSender* keyframe_request_sender) |
: clock_(clock), |
running_(false), |
crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), |
@@ -249,7 +252,17 @@ VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
max_incomplete_time_ms_(0), |
decode_error_mode_(kNoErrors), |
average_packets_per_frame_(0.0f), |
- frame_counter_(0) { |
+ frame_counter_(0), |
+ module_process_thread_(module_process_thread) { |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") { |
+ RTC_DCHECK(module_process_thread); |
+ RTC_DCHECK(nack_sender); |
+ RTC_DCHECK(keyframe_request_sender); |
+ |
+ nack_module_.reset( |
+ new NackModule(clock, nack_sender, keyframe_request_sender)); |
stefan-webrtc
2016/03/10 14:20:40
Set in initializer list instead so that you can ma
philipel
2016/03/10 16:39:27
Can't do that since we have to check first if we a
stefan-webrtc
2016/03/10 17:06:29
You can still do it:
nack_module_(IsInExperiment(
philipel
2016/03/11 09:24:14
Ok, it is possible, but don't you think it would b
stefan-webrtc
2016/03/11 09:57:11
I think that's fine, just break it out to a static
philipel
2016/03/11 10:12:59
Done.
|
+ module_process_thread_->RegisterModule(nack_module_.get()); |
+ } |
for (int i = 0; i < kStartNumberOfFrames; i++) |
free_frames_.push_back(new VCMFrameBuffer()); |
} |
@@ -268,6 +281,8 @@ VCMJitterBuffer::~VCMJitterBuffer() { |
it != decodable_frames_.end(); ++it) { |
delete it->second; |
} |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") |
stefan-webrtc
2016/03/10 14:20:40
if (nack_module_) instead, here and all places bel
philipel
2016/03/10 16:39:27
Done.
|
+ module_process_thread_->DeRegisterModule(nack_module_.get()); |
delete crit_sect_; |
} |
@@ -329,6 +344,8 @@ void VCMJitterBuffer::Stop() { |
UpdateHistograms(); |
running_ = false; |
last_decoded_state_.Reset(); |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") |
+ nack_module_->Stop(); |
// Make sure all frames are free and reset. |
for (FrameList::iterator it = decodable_frames_.begin(); |
@@ -665,6 +682,9 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, |
bool* retransmitted) { |
CriticalSectionScoped cs(crit_sect_); |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") |
+ nack_module_->OnReceivedPacket(packet); |
+ |
++num_packets_; |
if (num_packets_ == 1) { |
time_first_packet_ms_ = clock_->TimeInMilliseconds(); |
@@ -927,6 +947,8 @@ void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { |
CriticalSectionScoped cs(crit_sect_); |
rtt_ms_ = rtt_ms; |
jitter_estimate_.UpdateRtt(rtt_ms); |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") |
+ nack_module_->UpdateRtt(rtt_ms); |
} |
void VCMJitterBuffer::SetNackMode(VCMNackMode mode, |
@@ -1046,6 +1068,10 @@ std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) { |
} |
} |
} |
stefan-webrtc
2016/03/10 14:20:40
Should we really run lines 1017-1070 if using the
philipel
2016/03/10 16:39:27
Yes, the GetNackList interface does more than just
stefan-webrtc
2016/03/10 17:06:29
Ok, comment on why we don't return earlier to avoi
philipel
2016/03/11 09:24:14
Expanded my comment.
This code won't be necessary
|
+ // The experiment is running, the nack module will send Nacks. |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") |
+ return std::vector<uint16_t>(); |
+ |
std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), |
missing_sequence_numbers_.end()); |
return nack_list; |