video_coding: updates to jitter buffer logic: Make sure that every frame is inserted only once to the list.
Review URL: http://webrtc-codereview.appspot.com/165001 git-svn-id: http://webrtc.googlecode.com/svn/trunk@648 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
		| @@ -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); | ||||
|   | ||||
| @@ -14,6 +14,8 @@ | ||||
| #include <string.h> | ||||
| #include <cassert> | ||||
|  | ||||
| #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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 mikhal@webrtc.org
					mikhal@webrtc.org