summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc')
-rw-r--r--chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc121
1 files changed, 25 insertions, 96 deletions
diff --git a/chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc
index f11f81b46f2..d8792f21afb 100644
--- a/chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc
+++ b/chromium/third_party/webrtc/modules/video_coding/main/source/jitter_buffer.cc
@@ -25,7 +25,6 @@
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/event_wrapper.h"
#include "webrtc/system_wrappers/interface/logging.h"
-#include "webrtc/system_wrappers/interface/trace.h"
#include "webrtc/system_wrappers/interface/trace_event.h"
namespace webrtc {
@@ -77,10 +76,6 @@ int FrameList::RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
FrameList::iterator it = begin();
while (!empty()) {
// Throw at least one frame.
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCoding, -1,
- "Recycling: type=%s, low seqnum=%u",
- it->second->FrameType() == kVideoFrameKey ?
- "key" : "delta", it->second->GetLowSeqNum());
it->second->Reset();
free_frames->push_back(it->second);
erase(it++);
@@ -128,16 +123,10 @@ void FrameList::Reset(UnorderedFrameList* free_frames) {
}
VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
- EventFactory* event_factory,
- int vcm_id,
- int receiver_id,
- bool master)
- : vcm_id_(vcm_id),
- receiver_id_(receiver_id),
- clock_(clock),
+ EventFactory* event_factory)
+ : clock_(clock),
running_(false),
crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
- master_(master),
frame_event_(event_factory->CreateEvent()),
packet_event_(event_factory->CreateEvent()),
max_number_of_frames_(kStartNumberOfFrames),
@@ -156,7 +145,7 @@ VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
num_consecutive_old_frames_(0),
num_consecutive_old_packets_(0),
num_discarded_packets_(0),
- jitter_estimate_(vcm_id, receiver_id),
+ jitter_estimate_(),
inter_frame_delay_(clock_->TimeInMilliseconds()),
rtt_ms_(kDefaultRtt),
nack_mode_(kNoNack),
@@ -192,10 +181,7 @@ void VCMJitterBuffer::CopyFrom(const VCMJitterBuffer& rhs) {
if (this != &rhs) {
crit_sect_->Enter();
rhs.crit_sect_->Enter();
- vcm_id_ = rhs.vcm_id_;
- receiver_id_ = rhs.receiver_id_;
running_ = rhs.running_;
- master_ = !rhs.master_;
max_number_of_frames_ = rhs.max_number_of_frames_;
incoming_frame_rate_ = rhs.incoming_frame_rate_;
incoming_frame_count_ = rhs.incoming_frame_count_;
@@ -276,10 +262,6 @@ void VCMJitterBuffer::Start() {
first_packet_since_reset_ = true;
rtt_ms_ = kDefaultRtt;
last_decoded_state_.Reset();
-
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: start",
- this);
}
void VCMJitterBuffer::Stop() {
@@ -300,9 +282,6 @@ void VCMJitterBuffer::Stop() {
// Make sure we wake up any threads waiting on these events.
frame_event_->Set();
packet_event_->Set();
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: stop",
- this);
}
bool VCMJitterBuffer::Running() const {
@@ -327,9 +306,6 @@ void VCMJitterBuffer::Flush() {
waiting_for_completion_.latest_packet_time = -1;
first_packet_since_reset_ = true;
missing_sequence_numbers_.clear();
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: flush",
- this);
}
// Get received key and delta frames
@@ -583,6 +559,8 @@ VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet,
DropPacketsFromNackList(last_decoded_state_.sequence_num());
if (num_consecutive_old_packets_ > kMaxConsecutiveOldPackets) {
+ LOG(LS_WARNING) << num_consecutive_old_packets_ << " consecutive old "
+ "packets received. Flushing the jitter buffer.";
Flush();
return kFlushIndicator;
}
@@ -602,13 +580,13 @@ VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet,
VCMFrameBufferEnum ret = kNoError;
if (!*frame) {
// No free frame! Try to reclaim some...
- LOG_F(LS_INFO) << "Unable to get empty frame; Recycling.";
+ LOG(LS_WARNING) << "Unable to get empty frame; Recycling.";
bool found_key_frame = RecycleFramesUntilKeyFrame();
*frame = GetEmptyFrame();
- if (!*frame)
- return kGeneralError;
- else if (!found_key_frame)
+ assert(*frame);
+ if (!found_key_frame) {
ret = kFlushIndicator;
+ }
}
(*frame)->Reset();
return ret;
@@ -650,6 +628,8 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
// Flush if this happens consistently.
num_consecutive_old_frames_++;
if (num_consecutive_old_frames_ > kMaxConsecutiveOldFrames) {
+ LOG(LS_WARNING) << num_consecutive_old_packets_ << " consecutive old "
+ "frames received. Flushing the jitter buffer.";
Flush();
return kFlushIndicator;
}
@@ -702,8 +682,8 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
if (IsPacketRetransmitted(packet)) {
frame->IncrementNackCount();
}
- if (!UpdateNackList(packet.seqNum)) {
- LOG_F(LS_INFO) << "Requesting key frame due to flushed NACK list.";
+ if (!UpdateNackList(packet.seqNum) &&
+ packet.frameType != kVideoFrameKey) {
buffer_return = kFlushIndicator;
}
latest_received_sequence_number_ = LatestSequenceNumber(
@@ -725,15 +705,6 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
}
case kCompleteSession: {
if (update_decodable_list) {
- if (master_) {
- // Only trace the primary jitter buffer to make it possible to parse
- // and plot the trace file.
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_),
- "JB(0x%x) FB(0x%x): Complete frame added to jitter"
- "buffer, size:%d type %d",
- this, frame, frame->Length(), frame->FrameType());
- }
CountFrame(*frame);
frame->SetCountedFrame(true);
if (continuous) {
@@ -960,8 +931,6 @@ uint16_t* VCMJitterBuffer::GetNackList(uint16_t* nack_list_size,
incomplete_frames_.begin(), incomplete_frames_.end(),
HasNonEmptyState);
}
- if (have_non_empty_frame)
- LOG_F(LS_INFO) << "First frame is not key; Recycling.";
bool found_key_frame = RecycleFramesUntilKeyFrame();
if (!found_key_frame) {
*request_key_frame = have_non_empty_frame;
@@ -977,9 +946,9 @@ uint16_t* VCMJitterBuffer::GetNackList(uint16_t* nack_list_size,
int non_continuous_incomplete_duration =
NonContinuousOrIncompleteDuration();
if (non_continuous_incomplete_duration > 90 * max_incomplete_time_ms_) {
- LOG_F(LS_INFO) << "Too long non-decodable duration: " <<
- non_continuous_incomplete_duration << " > " <<
- 90 * max_incomplete_time_ms_;
+ LOG_F(LS_WARNING) << "Too long non-decodable duration: "
+ << non_continuous_incomplete_duration << " > "
+ << 90 * max_incomplete_time_ms_;
FrameList::reverse_iterator rit = find_if(incomplete_frames_.rbegin(),
incomplete_frames_.rend(), IsKeyFrame);
if (rit == incomplete_frames_.rend()) {
@@ -1038,10 +1007,12 @@ bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) {
TRACE_EVENT_INSTANT1("webrtc", "AddNack", "seqnum", i);
}
if (TooLargeNackList() && !HandleTooLargeNackList()) {
+ LOG(LS_WARNING) << "Requesting key frame due to too large NACK list.";
return false;
}
if (MissingTooOldPacket(sequence_number) &&
!HandleTooOldPackets(sequence_number)) {
+ LOG(LS_WARNING) << "Requesting key frame due to missing too old packets";
return false;
}
} else {
@@ -1058,8 +1029,9 @@ bool VCMJitterBuffer::TooLargeNackList() const {
bool VCMJitterBuffer::HandleTooLargeNackList() {
// Recycle frames until the NACK list is small enough. It is likely cheaper to
// request a key frame than to retransmit this many missing packets.
- LOG_F(LS_INFO) << "NACK list has grown too large: " <<
- missing_sequence_numbers_.size() << " > " << max_nack_list_size_;
+ LOG_F(LS_WARNING) << "NACK list has grown too large: "
+ << missing_sequence_numbers_.size() << " > "
+ << max_nack_list_size_;
bool key_frame_found = false;
while (TooLargeNackList()) {
key_frame_found = RecycleFramesUntilKeyFrame();
@@ -1083,8 +1055,9 @@ bool VCMJitterBuffer::HandleTooOldPackets(uint16_t latest_sequence_number) {
bool key_frame_found = false;
const uint16_t age_of_oldest_missing_packet = latest_sequence_number -
*missing_sequence_numbers_.begin();
- LOG_F(LS_INFO) << "NACK list contains too old sequence numbers: " <<
- age_of_oldest_missing_packet << " > " << max_packet_age_to_nack_;
+ LOG_F(LS_WARNING) << "NACK list contains too old sequence numbers: "
+ << age_of_oldest_missing_packet << " > "
+ << max_packet_age_to_nack_;
while (MissingTooOldPacket(latest_sequence_number)) {
key_frame_found = RecycleFramesUntilKeyFrame();
}
@@ -1136,10 +1109,6 @@ bool VCMJitterBuffer::TryToIncreaseJitterBufferSize() {
frame_buffers_[max_number_of_frames_] = new_frame;
free_frames_.push_back(new_frame);
++max_number_of_frames_;
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_),
- "JB(0x%x) FB(0x%x): Jitter buffer increased to:%d frames",
- this, new_frame, max_number_of_frames_);
TRACE_COUNTER1("webrtc", "JBMaxFrames", max_number_of_frames_);
return true;
}
@@ -1161,13 +1130,9 @@ bool VCMJitterBuffer::RecycleFramesUntilKeyFrame() {
key_frame_found = key_frame_it != decodable_frames_.end();
}
drop_count_ += dropped_frames;
- if (dropped_frames) {
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_),
- "Jitter buffer drop count:%u", drop_count_);
- }
TRACE_EVENT_INSTANT0("webrtc", "JB::RecycleFramesUntilKeyFrame");
if (key_frame_found) {
+ LOG(LS_INFO) << "Found key frame while dropping frames.";
// Reset last decoded state to make sure the next frame decoded is a key
// frame, and start NACKing from here.
last_decoded_state_.Reset();
@@ -1246,19 +1211,6 @@ void VCMJitterBuffer::UpdateJitterEstimate(const VCMJitterSample& sample,
if (sample.latest_packet_time == -1) {
return;
}
- if (incomplete_frame) {
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "Received incomplete frame "
- "timestamp %u frame size %u at time %u",
- sample.timestamp, sample.frame_size,
- MaskWord64ToUWord32(sample.latest_packet_time));
- } else {
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "Received complete frame "
- "timestamp %u frame size %u at time %u",
- sample.timestamp, sample.frame_size,
- MaskWord64ToUWord32(sample.latest_packet_time));
- }
UpdateJitterEstimate(sample.latest_packet_time, sample.timestamp,
sample.frame_size, incomplete_frame);
}
@@ -1273,23 +1225,6 @@ void VCMJitterBuffer::UpdateJitterEstimate(const VCMFrameBuffer& frame,
}
// No retransmitted frames should be a part of the jitter
// estimate.
- if (incomplete_frame) {
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_),
- "Received incomplete frame timestamp %u frame type %d "
- "frame size %u at time %u, jitter estimate was %u",
- frame.TimeStamp(), frame.FrameType(), frame.Length(),
- MaskWord64ToUWord32(frame.LatestPacketTimeMs()),
- EstimatedJitterMs());
- } else {
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_), "Received complete frame "
- "timestamp %u frame type %d frame size %u at time %u, "
- "jitter estimate was %u",
- frame.TimeStamp(), frame.FrameType(), frame.Length(),
- MaskWord64ToUWord32(frame.LatestPacketTimeMs()),
- EstimatedJitterMs());
- }
UpdateJitterEstimate(frame.LatestPacketTimeMs(), frame.TimeStamp(),
frame.Length(), incomplete_frame);
}
@@ -1306,12 +1241,6 @@ void VCMJitterBuffer::UpdateJitterEstimate(
return;
}
int64_t frame_delay;
- // Calculate the delay estimate
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
- VCMId(vcm_id_, receiver_id_),
- "Packet received and sent to jitter estimate with: "
- "timestamp=%u wall_clock=%u", timestamp,
- MaskWord64ToUWord32(latest_packet_time_ms));
bool not_reordered = inter_frame_delay_.CalculateDelay(timestamp,
&frame_delay,
latest_packet_time_ms);