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