1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h> 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 13a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h" 15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/decoding_state.h" 16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/frame_buffer.h" 17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/jitter_buffer_common.h" 18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/packet.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, Sanity) { 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.Reset(); 25bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org EXPECT_TRUE(dec_state.in_initial_state()); 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, FrameContinuity) { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check that makes decision based on correct method. 328f97f022220cbe847c3407df6b1b649db824e532andrew@webrtc.org VCMFrameBuffer frame; 33b47b7e077c86e3b02c4db99bdb4a2d2c0722b52bmikhal@webrtc.org VCMFrameBuffer frame_key; 34991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMPacket packet; 35991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = true; 36991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 37991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 0xffff; 38991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 39991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codec = kRtpVideoVp8; 40991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0x007F; 4199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com FrameData frame_data; 4299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rtt_ms = 0; 4399199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rolling_average_packets_per_frame = -1; 44991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 45b47b7e077c86e3b02c4db99bdb4a2d2c0722b52bmikhal@webrtc.org // Always start with a key frame. 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.Reset(); 47b47b7e077c86e3b02c4db99bdb4a2d2c0722b52bmikhal@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 48991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameKey; 49991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame_key.InsertPacket(packet, 0, kNoErrors, frame_data)); 50b47b7e077c86e3b02c4db99bdb4a2d2c0722b52bmikhal@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame_key)); 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 53991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Use pictureId 55991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = false; 56991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0x0002; 57991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 60991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 61991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 10; 62991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Use sequence numbers. 66991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = kNoPictureId; 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 68991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = dec_state.sequence_num() - 1u; 69991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 72991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = dec_state.sequence_num() + 1u; 73991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert another packet to this frame 75991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum++; 76991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Verify wrap. 78d9416e60745ee0d91fac637eb7b43bd2c9765391mikhal@webrtc.org EXPECT_LE(dec_state.sequence_num(), 0xffff); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert packet with temporal info. 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.Reset(); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 85991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 86991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 87991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 88991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 1; 89991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 91991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 1 layer up - still good. 96991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 97991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 1; 98991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 1; 99991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 2; 100991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 2; 101991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Lost non-base layer packet => should update sync parameter. 107991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 108991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 3; 109991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 3; 110991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 4; 111991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 4; 112991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Now insert the next non-base layer (belonging to a next tl0PicId). 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 116991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 1; 117991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 2; 118991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 4; 119991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 5; 120991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 5; 121991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Checking continuity and not updating the state - this should not trigger 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // an update of sync state. 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Next base layer (dropped interim non-base layers) - should update sync. 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 128991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 1; 129991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 130991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 5; 131991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 6; 132991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 6; 133991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check wrap for temporal layers. 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 140991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0x00FF; 141991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 142991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 6; 143991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 7; 144991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 7; 145991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 149991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0x0000; 150991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 151991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 7; 152991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 8; 153991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 8; 154991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The current frame is not continuous 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, UpdateOldPacket) { 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Update only if zero size and newer than previous. 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Should only update if the timeStamp match. 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMFrameBuffer frame; 166991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMPacket packet; 167991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 168991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 1; 169991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 17099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com FrameData frame_data; 17199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rtt_ms = 0; 17299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rolling_average_packets_per_frame = -1; 173991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(dec_state.sequence_num(), 1); 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert an empty packet that does not belong to the same frame. 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // => Sequence num should be the same. 178991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 2; 179991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org dec_state.UpdateOldPacket(&packet); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(dec_state.sequence_num(), 1); 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Now insert empty packet belonging to the same frame. 182991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 183991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 2; 184991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kFrameEmpty; 185991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.sizeBytes = 0; 186991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org dec_state.UpdateOldPacket(&packet); 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(dec_state.sequence_num(), 2); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Now insert delta packet belonging to the same frame. 189991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 190991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 3; 191991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 192991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.sizeBytes = 1400; 193991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org dec_state.UpdateOldPacket(&packet); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(dec_state.sequence_num(), 3); 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert a packet belonging to an older timestamp - should not update the 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // sequence number. 197991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 0; 198991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 4; 199991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kFrameEmpty; 200991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.sizeBytes = 0; 201991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org dec_state.UpdateOldPacket(&packet); 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(dec_state.sequence_num(), 3); 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, MultiLayerBehavior) { 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Identify sync/non-sync when more than one layer. 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Identify packets belonging to old frames/packets. 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set state for current frames. 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // tl0PicIdx 0, temporal id 0. 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMFrameBuffer frame; 212991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMPacket packet; 213991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 214991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codec = kRtpVideoVp8; 215991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 0; 216991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 0; 217991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 218991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 219991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 22099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com FrameData frame_data; 22199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rtt_ms = 0; 22299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rolling_average_packets_per_frame = -1; 223991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // tl0PicIdx 0, temporal id 1. 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 227991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 228991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 1; 229991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 230991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 1; 231991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 1; 232991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Lost tl0PicIdx 0, temporal id 2. 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert tl0PicIdx 0, temporal id 3. 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 239991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 3; 240991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 3; 241991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 242991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 3; 243991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 3; 244991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert next base layer 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 250991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 4; 251991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 4; 252991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 1; 253991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 254991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 4; 255991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert key frame - should update sync value. 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // A key frame is always a base layer. 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 262991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameKey; 263991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 264991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 5; 265991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 5; 266991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 2; 267991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 268991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 5; 269991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // After sync, a continuous PictureId is required 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // (continuous base layer is not enough ) 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 276991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 277991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 6; 278991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 6; 279991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 3; 280991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 281991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 6; 282991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 286991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 287991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 288991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 8; 289991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 8; 290991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 4; 291991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 292991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 8; 293991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Insert a non-ref frame - should update sync value. 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 301991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 302991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 303991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 9; 304991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 9; 305991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 4; 306991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 2; 307991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 9; 308991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.layerSync = true; 309991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The following test will verify the sync flag behavior after a loss. 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create the following pattern: 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Update base layer, lose packet 1 (sync flag on, layer 2), insert packet 3 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // (sync flag on, layer 2) check continuity and sync flag after inserting 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // packet 2 (sync flag on, layer 1). 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Base layer. 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.Reset(); 321991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 322991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 323991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.markerBit = 1; 324991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 0; 325991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 0; 326991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 327991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 328991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 329991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.layerSync = false; 330991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Layer 2 - 2 packets (insert one, lose one). 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 335991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 336991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 337991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.markerBit = 0; 338991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 1; 339991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 1; 340991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 341991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 2; 342991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 1; 343991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.layerSync = true; 344991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Layer 1 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 348991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 349991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.isFirstPacket = 1; 350991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.markerBit = 1; 351991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 2; 352991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 3; 353991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 354991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 1; 355991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 2; 356991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.layerSync = true; 357991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, DiscontinuousPicIdContinuousSeqNum) { 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMFrameBuffer frame; 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMPacket packet; 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.frameType = kVideoFrameKey; 3687fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org packet.codecSpecificHeader.codec = kRtpVideoVp8; 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.timestamp = 0; 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.seqNum = 0; 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 37499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com FrameData frame_data; 37599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rtt_ms = 0; 37699199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rolling_average_packets_per_frame = -1; 377d9416e60745ee0d91fac637eb7b43bd2c9765391mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.full_sync()); 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Continuous sequence number but discontinuous picture id. This implies a 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // a loss and we have to fall back to only decoding the base layer. 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.frameType = kVideoFrameDelta; 385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.timestamp += 3000; 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ++packet.seqNum; 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 1; 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 2; 389d9416e60745ee0d91fac637eb7b43bd2c9765391mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(dec_state.full_sync()); 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(TestDecodingState, OldInput) { 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodingState dec_state; 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Identify packets belonging to old frames/packets. 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set state for current frames. 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMFrameBuffer frame; 400991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMPacket packet; 401991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 10; 402991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 1; 40399199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com FrameData frame_data; 40499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rtt_ms = 0; 40599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data.rolling_average_packets_per_frame = -1; 406991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dec_state.SetState(&frame); 408991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 9; 409991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_TRUE(dec_state.IsOldPacket(&packet)); 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check for old frame 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame.Reset(); 412991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org frame.InsertPacket(packet, 0, kNoErrors, frame_data); 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(dec_state.IsOldFrame(&frame)); 414991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org} 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 416991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.orgTEST(TestDecodingState, PictureIdRepeat) { 417991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMDecodingState dec_state; 418991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMFrameBuffer frame; 419991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org VCMPacket packet; 420991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.frameType = kVideoFrameDelta; 421991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codec = kRtpVideoVp8; 422991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.timestamp = 0; 423991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.seqNum = 0; 424991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0; 425991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = 0; 426991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId = 0; 427991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org FrameData frame_data; 428991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org frame_data.rtt_ms = 0; 429991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org frame_data.rolling_average_packets_per_frame = -1; 430991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 431991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org dec_state.SetState(&frame); 432991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org // tl0PicIdx 0, temporal id 1. 433991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org frame.Reset(); 434991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org ++packet.timestamp; 435991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org ++packet.seqNum; 436991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx++; 437991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.pictureId++; 438991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 439991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_TRUE(dec_state.ContinuousFrame(&frame)); 440991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org frame.Reset(); 441991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org // Testing only gap in tl0PicIdx when tl0PicIdx in continuous. 442991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx += 3; 443991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.temporalIdx++; 444991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 1; 445991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data)); 446991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org EXPECT_FALSE(dec_state.ContinuousFrame(&frame)); 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 448991d66abe94107b866c29ede42602d2169e16739mikhal@webrtc.org 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 450