video_coding: Checking/updating seq num for an old packet regardless of size.
Review URL: http://webrtc-codereview.appspot.com/330028 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1318 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
c00f91d62d
commit
77c425b976
@ -94,10 +94,11 @@ void VCMDecodingState::SetStateOneBack(const VCMFrameBuffer* frame) {
|
|||||||
init_ = false;
|
init_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VCMDecodingState::UpdateZeroSizePacket(const VCMPacket* packet) {
|
void VCMDecodingState::UpdateOldPacket(const VCMPacket* packet) {
|
||||||
assert(packet != NULL);
|
assert(packet != NULL);
|
||||||
if (packet->sizeBytes == 0 && packet->timestamp == time_stamp_) {
|
if (packet->timestamp == time_stamp_) {
|
||||||
// Zero size packet - make sure we update the last decoded sequence number.
|
// Late packet belonging to the last decoded frame - make sure we update the
|
||||||
|
// last decoded sequence number.
|
||||||
sequence_num_ = LatestSequenceNumber(packet->seqNum, sequence_num_, NULL);
|
sequence_num_ = LatestSequenceNumber(packet->seqNum, sequence_num_, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,8 +34,9 @@ class VCMDecodingState {
|
|||||||
// Set the decoding state one frame back.
|
// Set the decoding state one frame back.
|
||||||
void SetStateOneBack(const VCMFrameBuffer* frame);
|
void SetStateOneBack(const VCMFrameBuffer* frame);
|
||||||
// Update the sequence number if the timestamp matches current state and the
|
// Update the sequence number if the timestamp matches current state and the
|
||||||
// packet is of zero size.
|
// sequence number is higher than the current one. This accounts for packets
|
||||||
void UpdateZeroSizePacket(const VCMPacket* packet);
|
// arriving late.
|
||||||
|
void UpdateOldPacket(const VCMPacket* packet);
|
||||||
void SetSeqNum(uint16_t new_seq_num);
|
void SetSeqNum(uint16_t new_seq_num);
|
||||||
void Reset();
|
void Reset();
|
||||||
uint32_t time_stamp() const;
|
uint32_t time_stamp() const;
|
||||||
|
@ -194,7 +194,7 @@ TEST(TestDecodingState, SetStateOneBack) {
|
|||||||
delete packet;
|
delete packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(TestDecodingState, UpdateZeroSizePacket) {
|
TEST(TestDecodingState, UpdateOldPacket) {
|
||||||
VCMDecodingState dec_state;
|
VCMDecodingState dec_state;
|
||||||
// Update only if zero size and newer than previous.
|
// Update only if zero size and newer than previous.
|
||||||
// Should only update if the timeStamp match.
|
// Should only update if the timeStamp match.
|
||||||
@ -210,15 +210,30 @@ TEST(TestDecodingState, UpdateZeroSizePacket) {
|
|||||||
// Insert an empty packet that does not belong to the same frame.
|
// Insert an empty packet that does not belong to the same frame.
|
||||||
// => Sequence num should be the same.
|
// => Sequence num should be the same.
|
||||||
packet->timestamp = 2;
|
packet->timestamp = 2;
|
||||||
dec_state.UpdateZeroSizePacket(packet);
|
dec_state.UpdateOldPacket(packet);
|
||||||
EXPECT_EQ(dec_state.sequence_num(), 1);
|
EXPECT_EQ(dec_state.sequence_num(), 1);
|
||||||
// Now insert empty packet belonging to the same frame.
|
// Now insert empty packet belonging to the same frame.
|
||||||
packet->timestamp = 1;
|
packet->timestamp = 1;
|
||||||
packet->seqNum = 2;
|
packet->seqNum = 2;
|
||||||
packet->frameType = kFrameEmpty;
|
packet->frameType = kFrameEmpty;
|
||||||
packet->sizeBytes = 0;
|
packet->sizeBytes = 0;
|
||||||
dec_state.UpdateZeroSizePacket(packet);
|
dec_state.UpdateOldPacket(packet);
|
||||||
EXPECT_EQ(dec_state.sequence_num(), 2);
|
EXPECT_EQ(dec_state.sequence_num(), 2);
|
||||||
|
// Now insert delta packet belonging to the same frame.
|
||||||
|
packet->timestamp = 1;
|
||||||
|
packet->seqNum = 3;
|
||||||
|
packet->frameType = kVideoFrameDelta;
|
||||||
|
packet->sizeBytes = 1400;
|
||||||
|
dec_state.UpdateOldPacket(packet);
|
||||||
|
EXPECT_EQ(dec_state.sequence_num(), 3);
|
||||||
|
// Insert a packet belonging to an older timestamp - should not update the
|
||||||
|
// sequence number.
|
||||||
|
packet->timestamp = 0;
|
||||||
|
packet->seqNum = 4;
|
||||||
|
packet->frameType = kFrameEmpty;
|
||||||
|
packet->sizeBytes = 0;
|
||||||
|
dec_state.UpdateOldPacket(packet);
|
||||||
|
EXPECT_EQ(dec_state.sequence_num(), 3);
|
||||||
|
|
||||||
delete packet;
|
delete packet;
|
||||||
}
|
}
|
||||||
|
@ -445,12 +445,10 @@ VCMJitterBuffer::GetFrame(const VCMPacket& packet, VCMEncodedFrame*& frame)
|
|||||||
_discardedPackets++;
|
_discardedPackets++;
|
||||||
_numConsecutiveOldPackets++;
|
_numConsecutiveOldPackets++;
|
||||||
}
|
}
|
||||||
else
|
// Update last decoded sequence number if the packet arrived late and
|
||||||
{
|
// belongs to a frame with a timestamp equal to the last decoded
|
||||||
// Update last decoded sequence number if packet belongs to a zero
|
// timestamp.
|
||||||
// size frame with a timestamp equal to the last decoded timestamp.
|
_lastDecodedState.UpdateOldPacket(&packet);
|
||||||
_lastDecodedState.UpdateZeroSizePacket(&packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_numConsecutiveOldPackets > kMaxConsecutiveOldPackets)
|
if (_numConsecutiveOldPackets > kMaxConsecutiveOldPackets)
|
||||||
{
|
{
|
||||||
@ -1570,7 +1568,7 @@ VCMJitterBuffer::InsertPacket(VCMEncodedFrame* buffer, const VCMPacket& packet)
|
|||||||
if (frame != NULL)
|
if (frame != NULL)
|
||||||
{
|
{
|
||||||
VCMFrameBufferStateEnum state = frame->GetState();
|
VCMFrameBufferStateEnum state = frame->GetState();
|
||||||
_lastDecodedState.UpdateZeroSizePacket(&packet);
|
_lastDecodedState.UpdateOldPacket(&packet);
|
||||||
// Insert packet
|
// Insert packet
|
||||||
// Check for first packet
|
// Check for first packet
|
||||||
// High sequence number will be -1 if neither an empty packet nor
|
// High sequence number will be -1 if neither an empty packet nor
|
||||||
|
Loading…
Reference in New Issue
Block a user