VCM: Setting buffering delay in timing
Review URL: https://webrtc-codereview.appspot.com/1338004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@3921 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
index 6f133b3..64ca6a1 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
@@ -793,9 +793,9 @@
return ret;
}
-void VCMJitterBuffer::SetMaxJitterEstimate(uint32_t initial_delay_ms) {
+void VCMJitterBuffer::SetMaxJitterEstimate(bool enable) {
CriticalSectionScoped cs(crit_sect_);
- jitter_estimate_.SetMaxJitterEstimate(initial_delay_ms);
+ jitter_estimate_.SetMaxJitterEstimate(enable);
}
uint32_t VCMJitterBuffer::EstimatedJitterMs() {
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.h b/webrtc/modules/video_coding/main/source/jitter_buffer.h
index 81a637a..21f3db8 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.h
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.h
@@ -135,7 +135,7 @@
// Enable a max filter on the jitter estimate by setting an initial
// non-zero delay. When set to zero (default), the last jitter
// estimate will be used.
- void SetMaxJitterEstimate(uint32_t initial_delay_ms);
+ void SetMaxJitterEstimate(bool enable);
// Returns the estimated jitter in milliseconds.
uint32_t EstimatedJitterMs();
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
index 7971fae..d2b5a76 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
@@ -177,12 +177,9 @@
InsertFrame(kVideoFrameDelta);
EXPECT_FALSE(request_key_frame);
EXPECT_GT(20u, jitter_buffer_->EstimatedJitterMs());
- // Set kMaxEstimate with a 2 seconds initial delay.
- jitter_buffer_->SetMaxJitterEstimate(2000u);
- EXPECT_EQ(2000u, jitter_buffer_->EstimatedJitterMs());
+ jitter_buffer_->SetMaxJitterEstimate(true);
InsertFrame(kVideoFrameDelta);
EXPECT_FALSE(request_key_frame);
- EXPECT_EQ(2000u, jitter_buffer_->EstimatedJitterMs());
// Jitter cannot decrease.
InsertFrames(2, kVideoFrameDelta);
EXPECT_FALSE(request_key_frame);
diff --git a/webrtc/modules/video_coding/main/source/jitter_estimator.cc b/webrtc/modules/video_coding/main/source/jitter_estimator.cc
index 191102a..45b5422 100644
--- a/webrtc/modules/video_coding/main/source/jitter_estimator.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_estimator.cc
@@ -20,8 +20,6 @@
namespace webrtc {
-enum { kInitialMaxJitterEstimate = 0 };
-
VCMJitterEstimator::VCMJitterEstimator(int32_t vcmId, int32_t receiverId) :
_vcmId(vcmId),
_receiverId(receiverId),
@@ -37,7 +35,7 @@
_noiseStdDevOffset(30.0), // ...of getting 30 ms freezes
_rttFilter(vcmId, receiverId),
_jitterEstimateMode(kLastEstimate),
-_maxJitterEstimateMs(kInitialMaxJitterEstimate)
+_maxJitterEstimateMs(0)
{
Reset();
}
@@ -407,15 +405,12 @@
}
}
-void VCMJitterEstimator::SetMaxJitterEstimate(uint32_t initial_delay_ms)
-{
- if (initial_delay_ms > 0) {
- _maxJitterEstimateMs = initial_delay_ms;
- _jitterEstimateMode = kMaxEstimate;
- } else {
- _maxJitterEstimateMs = kInitialMaxJitterEstimate;
- _jitterEstimateMode = kLastEstimate;
- }
+void VCMJitterEstimator::SetMaxJitterEstimate(bool enable) {
+ if (enable) {
+ _jitterEstimateMode = kMaxEstimate;
+ } else {
+ _jitterEstimateMode = kLastEstimate;
+ }
}
// Returns the current filtered estimate if available,
diff --git a/webrtc/modules/video_coding/main/source/jitter_estimator.h b/webrtc/modules/video_coding/main/source/jitter_estimator.h
index f896c6f..ad09277 100644
--- a/webrtc/modules/video_coding/main/source/jitter_estimator.h
+++ b/webrtc/modules/video_coding/main/source/jitter_estimator.h
@@ -64,10 +64,9 @@
void UpdateMaxFrameSize(uint32_t frameSizeBytes);
- // Set a max filter on the jitter estimate by setting an initial
- // non-zero delay. When set to zero (default), the last jitter
- // estimate will be used.
- void SetMaxJitterEstimate(uint32_t initial_delay_ms);
+ // Set a max filter on the jitter estimate. When disabled (default), the
+ // last jitter estimate will be used.
+ void SetMaxJitterEstimate(bool enable);
// A constant describing the delay from the jitter buffer
// to the delay on the receiving side which is not accounted
diff --git a/webrtc/modules/video_coding/main/source/receiver.cc b/webrtc/modules/video_coding/main/source/receiver.cc
index ae0f1ce..c77936c 100644
--- a/webrtc/modules/video_coding/main/source/receiver.cc
+++ b/webrtc/modules/video_coding/main/source/receiver.cc
@@ -430,11 +430,11 @@
if (desired_delay_ms < 0 || desired_delay_ms > kMaxReceiverDelayMs) {
return -1;
}
- jitter_buffer_.SetMaxJitterEstimate(desired_delay_ms);
+ // Enable a max filter on the jitter estimate for non-zero delays.
+ jitter_buffer_.SetMaxJitterEstimate(desired_delay_ms > 0);
max_video_delay_ms_ = desired_delay_ms + kMaxVideoDelayMs;
- timing_->SetMaxVideoDelay(max_video_delay_ms_);
// Initializing timing to the desired delay.
- timing_->SetRequiredDelay(desired_delay_ms);
+ timing_->SetMinimumTotalDelay(desired_delay_ms);
return 0;
}
diff --git a/webrtc/modules/video_coding/main/source/timing.cc b/webrtc/modules/video_coding/main/source/timing.cc
index 1146223..1e0475b 100644
--- a/webrtc/modules/video_coding/main/source/timing.cc
+++ b/webrtc/modules/video_coding/main/source/timing.cc
@@ -120,12 +120,6 @@
CriticalSectionScoped cs(_critSect);
uint32_t targetDelayMs = TargetDelayInternal();
- // Make sure we try to sync with audio
- if (targetDelayMs < _minTotalDelayMs)
- {
- targetDelayMs = _minTotalDelayMs;
- }
-
if (_currentDelayMs == 0)
{
// Not initialized, set current delay to target.
@@ -159,14 +153,9 @@
// to reordering and should be ignored.
return;
}
- else if (delayDiffMs < -maxChangeMs)
- {
- delayDiffMs = -maxChangeMs;
- }
- else if (delayDiffMs > maxChangeMs)
- {
- delayDiffMs = maxChangeMs;
- }
+ delayDiffMs = std::max(delayDiffMs, -maxChangeMs);
+ delayDiffMs = std::min(delayDiffMs, maxChangeMs);
+
_currentDelayMs = _currentDelayMs + static_cast<int32_t>(delayDiffMs);
}
_prevFrameTimestamp = frameTimestamp;
@@ -177,18 +166,14 @@
{
CriticalSectionScoped cs(_critSect);
uint32_t targetDelayMs = TargetDelayInternal();
- // Make sure we try to sync with audio
- if (targetDelayMs < _minTotalDelayMs)
- {
- targetDelayMs = _minTotalDelayMs;
- }
+
int64_t delayedMs = actualDecodeTimeMs -
(renderTimeMs - MaxDecodeTimeMs() - _renderDelayMs);
if (delayedMs < 0)
{
return;
}
- else if (_currentDelayMs + delayedMs <= targetDelayMs)
+ if (_currentDelayMs + delayedMs <= targetDelayMs)
{
_currentDelayMs += static_cast<uint32_t>(delayedMs);
}
@@ -274,7 +259,10 @@
{
estimatedCompleteTimeMs = nowMs;
}
- return estimatedCompleteTimeMs + _currentDelayMs;
+
+ // Make sure that we have at least the total minimum delay.
+ uint32_t actual_delay = std::max(_currentDelayMs, _minTotalDelayMs);
+ return estimatedCompleteTimeMs + actual_delay;
}
// Must be called from inside a critical section