summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-05-14 12:00:47 +0000
committerstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-05-14 12:00:47 +0000
commit5ba433cad0d4ab117ce24862c4f0cd30015ab096 (patch)
tree424152d02e6f2d7e0cdafbe9dfa1d77fed160344
parent1fc08d3ea04de5616b9070115f0b66f5827de7f3 (diff)
downloadwebrtc-5ba433cad0d4ab117ce24862c4f0cd30015ab096.tar.gz
Fixes a bug where the render buffer size (and indirectly the non-continuous duration) was computed incorrectly.
BUG=1769 R=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/1473004 git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4026 4adac7df-926f-26a2-2b94-8c16560cd09d
-rw-r--r--modules/video_coding/main/source/jitter_buffer.cc9
-rw-r--r--modules/video_coding/main/source/receiver_unittest.cc35
2 files changed, 37 insertions, 7 deletions
diff --git a/modules/video_coding/main/source/jitter_buffer.cc b/modules/video_coding/main/source/jitter_buffer.cc
index ea26032b..ebfd0946 100644
--- a/modules/video_coding/main/source/jitter_buffer.cc
+++ b/modules/video_coding/main/source/jitter_buffer.cc
@@ -1000,15 +1000,10 @@ FrameList::iterator VCMJitterBuffer::FindLastContinuousAndComplete(
// Search for a complete and continuous sequence (starting from the last
// decoded state or current frame if in initial state).
VCMDecodingState previous_state;
- if (last_decoded_state_.in_initial_state()) {
- previous_state.SetState(*start_it);
- } else {
- previous_state.CopyFrom(last_decoded_state_);
- }
- bool continuous_complete = true;
+ previous_state.SetState(*start_it);
FrameList::iterator previous_it = start_it;
++start_it;
- while (start_it != frame_list_.end() && continuous_complete) {
+ while (start_it != frame_list_.end()) {
start_it = FindOldestCompleteContinuousFrame(start_it, &previous_state);
if (start_it == frame_list_.end())
break;
diff --git a/modules/video_coding/main/source/receiver_unittest.cc b/modules/video_coding/main/source/receiver_unittest.cc
index 40d0de1f..62b7a99c 100644
--- a/modules/video_coding/main/source/receiver_unittest.cc
+++ b/modules/video_coding/main/source/receiver_unittest.cc
@@ -263,6 +263,41 @@ TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) {
EXPECT_EQ(kNackOk, ret);
}
+TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) {
+ // Enable NACK and with no RTT thresholds for disabling retransmission delay.
+ receiver_.SetNackMode(kNack, -1, -1);
+ const size_t kMaxNackListSize = 1000;
+ const int kMaxPacketAgeToNack = 1000;
+ const int kMaxNonDecodableDuration = 500;
+ const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate *
+ kMaxNonDecodableDuration + 500) / 1000;
+ const int kMinDelayMs = 500;
+ receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
+ kMaxNonDecodableDuration);
+ receiver_.SetMinReceiverDelay(kMinDelayMs);
+ int64_t key_frame_inserted = clock_->TimeInMilliseconds();
+ EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
+ // Insert enough frames to have too long non-decodable sequence, except that
+ // we don't have any losses.
+ for (int i = 0; i < kMaxNonDecodableDurationFrames;
+ ++i) {
+ EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
+ }
+ // Insert an incomplete frame.
+ EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
+ // Advance time until it's time to decode the key frame.
+ clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
+ key_frame_inserted);
+ EXPECT_TRUE(DecodeNextFrame());
+ // Make sure we don't get a key frame request since the non-decodable duration
+ // is only one frame.
+ uint16_t nack_list[kMaxNackListSize];
+ uint16_t nack_list_length = 0;
+ VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
+ &nack_list_length);
+ EXPECT_EQ(kNackOk, ret);
+}
+
TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) {
// Enable NACK and with no RTT thresholds for disabling retransmission delay.
receiver_.SetNackMode(kNack, -1, -1);