VCM/JB:Removing hybrid and setting a decodable state.
Review URL: https://webrtc-codereview.appspot.com/1283004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@3834 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 1a0967c..701f92b 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
@@ -106,7 +106,8 @@
nack_seq_nums_(),
max_nack_list_size_(0),
max_packet_age_to_nack_(0),
- waiting_for_key_frame_(false) {
+ waiting_for_key_frame_(false),
+ decode_with_errors_(false) {
memset(frame_buffers_, 0, sizeof(frame_buffers_));
memset(receive_statistics_, 0, sizeof(receive_statistics_));
@@ -151,6 +152,7 @@
first_packet_ = rhs.first_packet_;
last_decoded_state_ = rhs.last_decoded_state_;
num_not_decodable_packets_ = rhs.num_not_decodable_packets_;
+ decode_with_errors_ = rhs.decode_with_errors_;
assert(max_nack_list_size_ == rhs.max_nack_list_size_);
assert(max_packet_age_to_nack_ == rhs.max_packet_age_to_nack_);
memcpy(receive_statistics_, rhs.receive_statistics_,
@@ -445,7 +447,7 @@
waiting_for_key_frame_ = true;
}
- FrameList::iterator it = FindOldestCompleteContinuousFrame(false);
+ FrameList::iterator it = FindOldestCompleteContinuousFrame();
if (it == frame_list_.end()) {
if (max_wait_time_ms == 0) {
crit_sect_->Leave();
@@ -469,7 +471,7 @@
// Finding oldest frame ready for decoder, but check
// sequence number and size
CleanUpOldOrEmptyFrames();
- it = FindOldestCompleteContinuousFrame(false);
+ it = FindOldestCompleteContinuousFrame();
if (it == frame_list_.end()) {
wait_time_ms = end_wait_time_ms - clock_->TimeInMilliseconds();
} else {
@@ -749,7 +751,7 @@
// triggered, as the body of the function is empty.
// TODO(mikhal): Update when decodable is enabled.
buffer_return = frame->InsertPacket(packet, now_ms,
- nack_mode_ == kNackHybrid,
+ decode_with_errors_,
rtt_ms_);
ret = buffer_return;
if (buffer_return > 0) {
@@ -995,9 +997,7 @@
if (last_decoded_state_.in_initial_state()) {
waiting_for_key_frame_ = true;
}
- // Allow for a decodable frame when in Hybrid mode.
- bool enable_decodable = nack_mode_ == kNackHybrid ? true : false;
- FrameList::iterator it = FindOldestCompleteContinuousFrame(enable_decodable);
+ FrameList::iterator it = FindOldestCompleteContinuousFrame();
if (it == frame_list_.end()) {
// If we didn't find one we're good with a complete key/decodable frame.
it = find_if(frame_list_.begin(), frame_list_.end(),
@@ -1208,7 +1208,7 @@
assert(false);
}
}
- const FrameList::iterator it = FindOldestCompleteContinuousFrame(false);
+ const FrameList::iterator it = FindOldestCompleteContinuousFrame();
VCMFrameBuffer* old_frame = NULL;
if (it != frame_list_.end()) {
old_frame = *it;
@@ -1224,8 +1224,7 @@
// Find oldest complete frame used for getting next frame to decode
// Must be called under critical section
-FrameList::iterator VCMJitterBuffer::FindOldestCompleteContinuousFrame(
- bool enable_decodable) {
+FrameList::iterator VCMJitterBuffer::FindOldestCompleteContinuousFrame() {
// If we have more than one frame done since last time, pick oldest.
VCMFrameBuffer* oldest_frame = NULL;
FrameList::iterator it = frame_list_.begin();
@@ -1239,7 +1238,7 @@
VCMFrameBufferStateEnum state = oldest_frame->GetState();
// Is this frame complete or decodable and continuous?
if ((state == kStateComplete ||
- (enable_decodable && state == kStateDecodable)) &&
+ (decode_with_errors_ && state == kStateDecodable)) &&
last_decoded_state_.ContinuousFrame(oldest_frame)) {
break;
} else {
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.h b/webrtc/modules/video_coding/main/source/jitter_buffer.h
index 2bcf085..d8bee42 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.h
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.h
@@ -29,9 +29,6 @@
enum VCMNackMode {
kNack,
- // TODO(holmer): There is no longer a hybrid NACK mode. We should remove this
- // and replace it with a jitter buffer API for setting allowing decode errors.
- kNackHybrid,
kNoNack
};
@@ -161,6 +158,8 @@
// Returns a list of the sequence numbers currently missing.
uint16_t* GetNackList(uint16_t* nack_list_size, bool* request_key_frame);
+ // Enable/disable decoding with errors.
+ void DecodeWithErrors(bool enable) {decode_with_errors_ = enable;}
int64_t LastDecodedTimestamp() const;
private:
@@ -210,8 +209,8 @@
VCMFrameBufferEnum UpdateFrameState(VCMFrameBuffer* frame);
// Finds the oldest complete frame, used for getting next frame to decode.
- // Can return a decodable, incomplete frame if |enable_decodable| is true.
- FrameList::iterator FindOldestCompleteContinuousFrame(bool enable_decodable);
+ // Can return a decodable, incomplete frame when enabled.
+ FrameList::iterator FindOldestCompleteContinuousFrame();
void CleanUpOldOrEmptyFrames();
@@ -296,6 +295,7 @@
int max_packet_age_to_nack_; // Measured in sequence numbers.
bool waiting_for_key_frame_;
+ bool decode_with_errors_;
DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer);
};
} // namespace webrtc
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 f9005c9..08f78a9 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
@@ -375,8 +375,7 @@
TEST_F(TestJitterBufferNack, EmptyPackets) {
// Make sure empty packets doesn't clog the jitter buffer.
- jitter_buffer_->SetNackMode(kNackHybrid, media_optimization::kLowRttNackMs,
- -1);
+ jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kFrameEmpty), kNoError);
InsertFrame(kVideoFrameKey);
EXPECT_TRUE(DecodeCompleteFrame());
diff --git a/webrtc/modules/video_coding/main/source/video_coding_impl.cc b/webrtc/modules/video_coding/main/source/video_coding_impl.cc
index 1204fbc..64d00c1 100644
--- a/webrtc/modules/video_coding/main/source/video_coding_impl.cc
+++ b/webrtc/modules/video_coding/main/source/video_coding_impl.cc
@@ -637,7 +637,7 @@
// Enable hybrid NACK/FEC. Always wait for retransmissions
// and don't add extra delay when RTT is above
// kLowRttNackMs.
- _receiver.SetNackMode(kNackHybrid,
+ _receiver.SetNackMode(kNack,
media_optimization::kLowRttNackMs,
-1);
}
@@ -1392,7 +1392,7 @@
return VCM_NOT_IMPLEMENTED;
// Enable hybrid NACK/FEC. Always wait for retransmissions and don't add
// extra delay when RTT is above kLowRttNackMs.
- _receiver.SetNackMode(kNackHybrid, media_optimization::kLowRttNackMs, -1);
+ _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
_dualReceiver.SetNackMode(kNoNack, -1, -1);
_keyRequestMode = kKeyOnError;
break;