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
This commit is contained in:
mikhal@webrtc.org
2013-04-11 18:49:13 +00:00
parent 7bc465bd21
commit 9da751715f
4 changed files with 18 additions and 20 deletions

View File

@ -106,7 +106,8 @@ VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
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 @@ void VCMJitterBuffer::CopyFrom(const VCMJitterBuffer& rhs) {
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 @@ VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
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 @@ VCMEncodedFrame* VCMJitterBuffer::GetCompleteFrameForDecoding(
// 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 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(VCMEncodedFrame* encoded_frame,
// 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 @@ VCMEncodedFrame* VCMJitterBuffer::GetFrameForDecodingNACK() {
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 @@ VCMFrameBufferEnum VCMJitterBuffer::UpdateFrameState(VCMFrameBuffer* frame) {
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 @@ VCMFrameBufferEnum VCMJitterBuffer::UpdateFrameState(VCMFrameBuffer* frame) {
// 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 @@ FrameList::iterator VCMJitterBuffer::FindOldestCompleteContinuousFrame(
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 {

View File

@ -29,9 +29,6 @@ namespace webrtc {
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 @@ class VCMJitterBuffer {
// 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 @@ class VCMJitterBuffer {
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 @@ class VCMJitterBuffer {
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

View File

@ -375,8 +375,7 @@ TEST_F(TestRunningJitterBuffer, StatisticsTest) {
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());

View File

@ -637,7 +637,7 @@ VideoCodingModuleImpl::SetVideoProtection(VCMVideoProtection videoProtection,
// 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 @@ int VideoCodingModuleImpl::SetReceiverRobustnessMode(
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;