| 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..a3e0b2bc074d096369935c5a934bd3cfc3f94ce0 100644
|
| --- a/webrtc/modules/video_coding/jitter_buffer.cc
|
| +++ b/webrtc/modules/video_coding/jitter_buffer.cc
|
| @@ -12,6 +12,7 @@
|
| #include <assert.h>
|
|
|
| #include <algorithm>
|
| +#include <limits>
|
| #include <utility>
|
|
|
| #include "webrtc/base/checks.h"
|
| @@ -28,10 +29,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;
|
|
|
| @@ -214,8 +215,24 @@ void Vp9SsMap::UpdateFrames(FrameList* frames) {
|
| }
|
| }
|
|
|
| +static NackModule*
|
| +MaybeCreateNackModule(Clock* clock,
|
| + NackSender* nack_sender,
|
| + KeyFrameRequestSender* keyframe_request_sender) {
|
| +if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + // Only create a nack module if a nack sender is available.
|
| + if (nack_sender) {
|
| + RTC_DCHECK(keyframe_request_sender);
|
| + return new NackModule(clock, nack_sender, keyframe_request_sender);
|
| + }
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| 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()),
|
| @@ -249,7 +266,10 @@ 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),
|
| + nack_module_(MaybeCreateNackModule(clock,
|
| + nack_sender,
|
| + keyframe_request_sender)) {
|
| for (int i = 0; i < kStartNumberOfFrames; i++)
|
| free_frames_.push_back(new VCMFrameBuffer());
|
| }
|
| @@ -329,6 +349,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 +391,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_->Clear();
|
| }
|
|
|
| // Get received key and delta frames
|
| @@ -605,6 +629,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 +691,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 +956,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 +1077,14 @@ std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) {
|
| }
|
| }
|
| }
|
| + // The experiment is running, the nack module will send Nacks.
|
| + // The reason we allow the major part of the GetNackList function to
|
| + // run even if we are running the experiment is because this
|
| + // function is also used to signal that the jitter buffer wants to
|
| + // request a keyframe.
|
| + 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 +1382,15 @@ bool VCMJitterBuffer::WaitForRetransmissions() {
|
| }
|
| return true;
|
| }
|
| +
|
| +int64_t VCMJitterBuffer::TimeUntilNextProcess() {
|
| + if (nack_module_)
|
| + return nack_module_->TimeUntilNextProcess();
|
| + return std::numeric_limits<int64_t>::max();
|
| +}
|
| +
|
| +void VCMJitterBuffer::Process() {
|
| + if (nack_module_)
|
| + nack_module_->Process();
|
| +}
|
| } // namespace webrtc
|
|
|