diff --git a/src/modules/video_coding/main/source/jitter_buffer.cc b/src/modules/video_coding/main/source/jitter_buffer.cc index 80b41f124..9642ccb47 100644 --- a/src/modules/video_coding/main/source/jitter_buffer.cc +++ b/src/modules/video_coding/main/source/jitter_buffer.cc @@ -1685,6 +1685,9 @@ VCMJitterBuffer::InsertPacket(VCMEncodedFrame* buffer, const VCMPacket& packet) } // Insert packet + // check for first packet + // high sequence number will not be set + bool first = frame->GetHighSeqNum() == -1; bufferReturn = frame->InsertPacket(packet, nowMs); ret = bufferReturn; @@ -1700,8 +1703,7 @@ VCMJitterBuffer::InsertPacket(VCMEncodedFrame* buffer, const VCMPacket& packet) // Insert each frame once on the arrival of the first packet // belonging to that frame (media or empty) - if (state == kStateEmpty && - frame->GetHighSeqNum() == packet.seqNum) + if (state == kStateEmpty && first) { ret = kFirstPacket; _frameBuffersTSOrder.Insert(frame); diff --git a/src/modules/video_coding/main/source/session_info.cc b/src/modules/video_coding/main/source/session_info.cc index aa5f99af8..ebe7f440e 100644 --- a/src/modules/video_coding/main/source/session_info.cc +++ b/src/modules/video_coding/main/source/session_info.cc @@ -14,6 +14,8 @@ #include #include +#include "internal_defines.h" + namespace webrtc { VCMSessionInfo::VCMSessionInfo(): @@ -52,11 +54,7 @@ VCMSessionInfo::GetLowSeqNum() const WebRtc_Word32 VCMSessionInfo::GetHighSeqNum() const { - if (_emptySeqNumHigh != -1) - { - return _emptySeqNumHigh; - } - return _highSeqNum; + return VCM_MAX(_emptySeqNumHigh, _highSeqNum); } void diff --git a/src/modules/video_coding/main/test/jitter_buffer_test.cc b/src/modules/video_coding/main/test/jitter_buffer_test.cc index 3bd1261a9..af14d91b4 100644 --- a/src/modules/video_coding/main/test/jitter_buffer_test.cc +++ b/src/modules/video_coding/main/test/jitter_buffer_test.cc @@ -1895,7 +1895,7 @@ int JitterBufferTest(CmdArgs& args) packet.seqNum = seqNum; packet.timestamp = timeStamp; packet.frameType = kFrameEmpty; - TEST(kFirstPacket == jb.InsertPacket(frameIn, packet)); + TEST(kIncomplete == jb.InsertPacket(frameIn, packet)); // now insert the first data packet seqNum = 1; packet.isFirstPacket = true; @@ -1955,13 +1955,39 @@ int JitterBufferTest(CmdArgs& args) TEST(frameIn != 0); jb.SetNackMode(kNoNack); + jb.Flush(); + + // Testing that 1 empty packet inserted last will not be set for decoding + seqNum = 3; + // Insert one empty packet per frame, should never return the last timestamp + // inserted. Only return empty frames in the presence of subsequent frames. + maxSize = 1000; + for (int i = 0; i < maxSize + 10; i++) + { + timeStamp += 33 * 90; + seqNum++; + packet.isFirstPacket = false; + packet.markerBit = false; + packet.seqNum = seqNum; + packet.timestamp = timeStamp; + packet.frameType = kFrameEmpty; + testFrame = jb.GetFrameForDecoding(); + // timestamp should bever be the last TS inserted + if (testFrame != NULL) + { + TEST(testFrame->TimeStamp() < timeStamp); + printf("Not null TS = %d\n",testFrame->TimeStamp()); + } + } + + jb.Flush(); // printf(DONE testing inserting empty packets to the JB) // H.264 tests - //Test incomplete NALU frames + // Test incomplete NALU frames jb.Flush(); jb.SetNackMode(kNoNack);