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..afe282b5456552eb1641b00778d36ab8b58881f1 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,9 @@ void Vp9SsMap::UpdateFrames(FrameList* frames) { |
} |
VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
- std::unique_ptr<EventWrapper> event) |
+ std::unique_ptr<EventWrapper> event, |
+ NackSender* nack_sender, |
+ KeyFrameRequestSender* keyframe_request_sender) |
: clock_(clock), |
running_(false), |
crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), |
@@ -250,6 +252,17 @@ VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
decode_error_mode_(kNoErrors), |
average_packets_per_frame_(0.0f), |
frame_counter_(0) { |
+ if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") { |
+ // Still need to check if the nack module should be created since |
+ // a jitter buffer is created for the video send stream as well. |
stefan-webrtc
2016/03/10 17:06:29
Change this comment, since when the refactoring is
philipel
2016/03/11 09:24:14
Done.
|
+ if (nack_sender) { |
+ RTC_DCHECK(nack_sender); |
stefan-webrtc
2016/03/10 17:06:30
Indentation
philipel
2016/03/11 09:24:14
Done.
|
+ RTC_DCHECK(keyframe_request_sender); |
+ |
+ nack_module_.reset( |
+ new NackModule(clock, nack_sender, keyframe_request_sender)); |
+ } |
+ } |
for (int i = 0; i < kStartNumberOfFrames; i++) |
free_frames_.push_back(new VCMFrameBuffer()); |
} |
@@ -329,6 +342,8 @@ void VCMJitterBuffer::Stop() { |
UpdateHistograms(); |
running_ = false; |
last_decoded_state_.Reset(); |
+ if (nack_module_) |
+ nack_module_->Stop(); |
// Make sure all frames are free and reset. |
for (FrameList::iterator it = decodable_frames_.begin(); |
@@ -369,6 +384,8 @@ void VCMJitterBuffer::Flush() { |
waiting_for_completion_.latest_packet_time = -1; |
first_packet_since_reset_ = true; |
missing_sequence_numbers_.clear(); |
+ if (nack_module_) |
+ nack_module_->Flush(); |
} |
// Get received key and delta frames |
@@ -605,6 +622,8 @@ VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) { |
if ((*frame).IsSessionComplete()) |
UpdateAveragePacketsPerFrame(frame->NumPackets()); |
+ if (nack_module_) |
+ nack_module_->ClearUpTo(frame->GetHighSeqNum()); |
return frame; |
} |
@@ -665,6 +684,9 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, |
bool* retransmitted) { |
CriticalSectionScoped cs(crit_sect_); |
+ if (nack_module_) |
+ nack_module_->OnReceivedPacket(packet); |
+ |
++num_packets_; |
if (num_packets_ == 1) { |
time_first_packet_ms_ = clock_->TimeInMilliseconds(); |
@@ -927,6 +949,8 @@ void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { |
CriticalSectionScoped cs(crit_sect_); |
rtt_ms_ = rtt_ms; |
jitter_estimate_.UpdateRtt(rtt_ms); |
+ if (nack_module_) |
+ nack_module_->UpdateRtt(rtt_ms); |
} |
void VCMJitterBuffer::SetNackMode(VCMNackMode mode, |
@@ -1046,6 +1070,10 @@ std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) { |
} |
} |
} |
+ // The experiment is running, the nack module will send Nacks. |
+ if (nack_module_) |
+ return std::vector<uint16_t>(); |
+ |
std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), |
missing_sequence_numbers_.end()); |
return nack_list; |
@@ -1343,4 +1371,15 @@ bool VCMJitterBuffer::WaitForRetransmissions() { |
} |
return true; |
} |
+ |
+int64_t VCMJitterBuffer::TimeUntilNextProcess() { |
+ if (nack_module_) |
+ return nack_module_->TimeUntilNextProcess(); |
+ return 100000; |
stefan-webrtc
2016/03/10 17:06:29
This is a bit ugly, but it might be necessary. Is
philipel
2016/03/11 09:24:14
Changed to int64_t max. Just testing using video_l
|
+} |
+ |
+void VCMJitterBuffer::Process() { |
+ if (nack_module_) |
+ nack_module_->Process(); |
+} |
} // namespace webrtc |