session_info_unittest.cc revision 3004c79c6ad0ca4b4df27d0ca76c2eb29735e267
1c3d891059e117357011e414263af0f519313d440stefan@webrtc.org/*
24ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *
4c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *  Use of this source code is governed by a BSD-style license
5c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *  that can be found in the LICENSE file in the root of the source
6c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *  tree. An additional intellectual property rights grant can be found
7c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *  in the file PATENTS.  All contributing project authors may
8c3d891059e117357011e414263af0f519313d440stefan@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9c3d891059e117357011e414263af0f519313d440stefan@webrtc.org */
10c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
11c3d891059e117357011e414263af0f519313d440stefan@webrtc.org#include <string.h>
12c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
13c3d891059e117357011e414263af0f519313d440stefan@webrtc.org#include "gtest/gtest.h"
14076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org#include "modules/interface/module_common_types.h"
15076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org#include "modules/video_coding/main/source/packet.h"
16076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org#include "modules/video_coding/main/source/session_info.h"
17c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
18076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgnamespace webrtc {
19c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
20076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgclass TestSessionInfo : public ::testing::Test {
21c3d891059e117357011e414263af0f519313d440stefan@webrtc.org protected:
22c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  virtual void SetUp() {
233004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    memset(packet_buffer_, 0, sizeof(packet_buffer_));
243004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    memset(frame_buffer_, 0, sizeof(frame_buffer_));
25076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    session_.Reset();
26076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.Reset();
27076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.frameType = kVideoFrameDelta;
283004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    packet_.sizeBytes = packet_buffer_size();
29076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.dataPtr = packet_buffer_;
30076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.seqNum = 0;
31076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.timestamp = 0;
32c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
33c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
34076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void FillPacket(uint8_t start_value) {
353004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    for (int i = 0; i < packet_buffer_size(); ++i)
36c3d891059e117357011e414263af0f519313d440stefan@webrtc.org      packet_buffer_[i] = start_value + i;
37c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
38c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
39076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
403004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    for (int j = 0; j < packet_buffer_size(); ++j) {
41076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      ASSERT_EQ(start_value + j, start_ptr[j]);
42076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
43076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
44076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
453004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  int packet_buffer_size() const {
463004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
473004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  }
483004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  int frame_buffer_size() const {
493004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
503004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  }
513004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
523004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  enum { kPacketBufferSize = 10 };
533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
54076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  uint8_t packet_buffer_[kPacketBufferSize];
553004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  uint8_t frame_buffer_[10 * kPacketBufferSize];
563004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
57076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  VCMSessionInfo session_;
58076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  VCMPacket packet_;
59076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
60076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
61076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgclass TestVP8Partitions : public TestSessionInfo {
62076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
63076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  enum { kMaxVP8Partitions = 9 };
64076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
65076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
66076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
67076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    vp8_header_ = &packet_header_.type.Video.codecHeader.VP8;
68076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_header_.frameType = kVideoFrameDelta;
69076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_header_.type.Video.codec = kRTPVideoVP8;
70076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    vp8_header_->InitRTPVideoHeaderVP8();
71076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    fragmentation_.VerifyAndAllocateFragmentationHeader(kMaxVP8Partitions);
72076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
73076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
74c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  bool VerifyPartition(int partition_id,
75c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                       int packets_expected,
76c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                       int start_value) {
773004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    EXPECT_EQ(static_cast<uint32_t>(packets_expected * packet_buffer_size()),
78c3d891059e117357011e414263af0f519313d440stefan@webrtc.org              fragmentation_.fragmentationLength[partition_id]);
79c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    for (int i = 0; i < packets_expected; ++i) {
80c3d891059e117357011e414263af0f519313d440stefan@webrtc.org      int packet_index = fragmentation_.fragmentationOffset[partition_id] +
813004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org          i * packet_buffer_size();
823004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org      if (packet_index + packet_buffer_size() > frame_buffer_size())
83076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        return false;
84076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      VerifyPacket(frame_buffer_ + packet_index, start_value + i);
85c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    }
86c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    return true;
87c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
88c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
89076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  WebRtcRTPHeader packet_header_;
90076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  RTPVideoHeaderVP8* vp8_header_;
91076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  RTPFragmentationHeader fragmentation_;
92076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
93076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
94076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgclass TestNalUnits : public TestSessionInfo {
95076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
96076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
97076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
9856210579563244f1decea42d52528f27f109c437pwestin@webrtc.org    packet_.codec = kVideoCodecVP8;
99076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
100076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
101076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  bool VerifyNalu(int offset, int packets_expected, int start_value) {
102076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    EXPECT_GE(session_.SessionLength(),
1033004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org              packets_expected * packet_buffer_size());
104076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    for (int i = 0; i < packets_expected; ++i) {
1053004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org      int packet_index = (offset + i) * packet_buffer_size();
106076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      VerifyPacket(frame_buffer_ + packet_index, start_value + i);
107076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
108076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    return true;
109076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
110076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
111076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
112cd64886a2fcdd688d2e2589e35a862d3f542e084mikhal@webrtc.orgclass TestNackList : public TestSessionInfo {
113076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
1143004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  static const size_t kMaxSeqNumListLength = 30;
115076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
116076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
117076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
118076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    seq_num_list_length_ = 0;
119076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    memset(seq_num_list_, 0, sizeof(seq_num_list_));
120076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
121076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
122076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void BuildSeqNumList(uint16_t low,
123076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org                       uint16_t high) {
1243004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    size_t i = 0;
125076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    while (low != high + 1) {
126076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      EXPECT_LT(i, kMaxSeqNumListLength);
127076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      if (i >= kMaxSeqNumListLength) {
128076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        seq_num_list_length_ = kMaxSeqNumListLength;
129076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        return;
130076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      }
131076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      seq_num_list_[i] = low;
132076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      low++;
133076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      i++;
134076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
135076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    seq_num_list_length_ = i;
136076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
137076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
138076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void VerifyAll(int value) {
139076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    for (int i = 0; i < seq_num_list_length_; ++i)
140076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      EXPECT_EQ(seq_num_list_[i], value);
141076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
142076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
143076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  int seq_num_list_[kMaxSeqNumListLength];
144076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  int seq_num_list_length_;
145c3d891059e117357011e414263af0f519313d440stefan@webrtc.org};
146c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
147076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestSessionInfo, TestSimpleAPIs) {
148076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
149076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFE;
1503004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet_.sizeBytes = packet_buffer_size();
151076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.frameType = kVideoFrameKey;
152076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
1533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  ASSERT_EQ(packet_buffer_size(),
154076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org            session_.InsertPacket(packet_, frame_buffer_, false, 0));
155d1a860b4159cf3386e46c2f578c3df0d8111212aphoglund@webrtc.org  EXPECT_FALSE(session_.HaveLastPacket());
156076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(kVideoFrameKey, session_.FrameType());
157076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
158076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
159076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
160076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
1613004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  ASSERT_EQ(packet_buffer_size(),
162076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org            session_.InsertPacket(packet_, frame_buffer_, false, 0));
163d1a860b4159cf3386e46c2f578c3df0d8111212aphoglund@webrtc.org  EXPECT_TRUE(session_.HaveLastPacket());
164076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
165076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
166076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
167076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // Insert empty packet which will be the new high sequence number.
168076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // To make things more difficult we will make sure to have a wrap here.
169076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
170076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
171076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum  = 2;
172076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.sizeBytes = 0;
173076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.frameType = kFrameEmpty;
174076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(0,
175076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org            session_.InsertPacket(packet_, frame_buffer_, false, 0));
176076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
177076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
178076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
179076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestSessionInfo, NormalOperation) {
180076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
181076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
182076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
183076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
184076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
1853004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
186076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
187076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
188076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  for (int i = 1; i < 9; ++i) {
189076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.seqNum += 1;
190076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    FillPacket(i);
191076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
1923004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org              packet_buffer_size());
193076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
194076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
195076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
196076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
197076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(9);
198076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
1993004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
200076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
201076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
2023004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
203076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  for (int i = 0; i < 10; ++i) {
204076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    SCOPED_TRACE("Calling VerifyPacket");
2053004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
206076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
207076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
208076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
209076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsOneLoss) {
210c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0 | Partition 1
211c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 0 ] [ 2 ] | [ 3 ]
212c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
213c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
214c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
215c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
216c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0;
217c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
2183004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
219c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
2202b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2213004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
222c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
223c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
224c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
225c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
226c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
227c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
228c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
229c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
2303004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
2312b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2323004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
233c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
234c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
235c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
236c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
237c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
238c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
239c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
240c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
2413004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
2422b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2433004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
244c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
245c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
246c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed (end of partition 0).
247076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
2483004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
249c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
2503004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            2 * packet_buffer_size());
251c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
252c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 1, 0));
253c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
254c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 3));
255c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
256c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
257076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsOneLoss2) {
258c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0 | Partition 1
259c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ] | [ 3 ] [ 5 ]
260c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
261c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
262c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
263c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
264c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
265c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
2663004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
267c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
2683004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2693004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
270c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
271c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
272c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
273c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
274c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
275c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
276c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
277c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
2783004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
2792b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2803004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
281c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
282c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
283c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
284c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
285c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
286c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
287c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
288c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
2893004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
2902b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
2913004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
292c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
293c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
294c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
295c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
296c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
297c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
298c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
299c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
3003004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
3012b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3023004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
303c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
304c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
305c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed (end of partition 2), 3 left.
306076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
3073004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
308c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
3093004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            3 * packet_buffer_size());
310c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
311c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
312c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
313c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 3));
314076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(1, session_.packets_not_decodable());
315c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
316c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
317076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsNoLossWrap) {
318c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0       | Partition 1
319c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ fffd ] [ fffe ] | [ ffff ] [ 0 ]
320c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
321c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
322c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
323c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
324c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0xfffd;
325c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
3263004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
327c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
3282b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3293004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
330c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
331c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
332c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
333c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
334c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
335c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
336c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
337c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
3383004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
3392b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3403004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
341c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
342c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
343c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
344c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
345c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
346c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
347c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
348c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
3493004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
3502b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3513004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
352c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
353c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
354c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
355c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
356c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
357c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
358c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
359c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
3603004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
3612b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3623004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
363c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
364c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
365c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // No packet should be removed.
366076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
3673004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
368c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
3693004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            4 * packet_buffer_size());
370c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
371c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
372c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
373c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 2, 2));
374076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
375c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
376c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
377076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsLossWrap) {
378c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0       | Partition 1
379c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ fffd ] [ fffe ] | [ ffff ] [ 1 ]
380c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
381c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
382c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
383c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
384c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0xfffd;
385c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
3863004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
387c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
3882b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
3893004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
390c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
391c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
392c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
393c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
394c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
395c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
396c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
397c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
3983004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
3992b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4003004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
401c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
402c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
403c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
404c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
405c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
406c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
407c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
408c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
4093004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4102b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4113004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
412c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
413c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
414c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
415c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
416c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
417c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
418c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
419c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
4203004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4212b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4223004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
423c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
424c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
425c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed from the last partition
426076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
4273004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
428c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
4293004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            3 * packet_buffer_size());
430c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
431c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
432c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
433c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 2));
434076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(1, session_.packets_not_decodable());
435c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
436c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
437c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
438076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, ThreePartitionsOneMissing) {
439c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 1  |Partition 2    | Partition 3
440c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ]  |               | [ 5 ] | [ 6 ]
441c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
442c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
443c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
444c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
445c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
446c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
4473004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
448c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
4492b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4503004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
451c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
452c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
453c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
454c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
455c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
456c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
457c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
458c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
4593004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4602b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4613004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
462c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
463c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
464c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
465c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
466c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
467c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
468c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 3;
469c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
4703004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4712b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4723004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
473c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
474c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
475c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
476c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
477c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
478c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
479c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
480c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(6);
4813004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4822b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
4833004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
484c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
485c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
486c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // No packet should be removed.
487076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
4883004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
489c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
4903004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            4 * packet_buffer_size());
491c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
492c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
493c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
494c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 2, 5));
495076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
496c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
497c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
498076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, ThreePartitionsLossInSecond) {
499c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0  |Partition 1          | Partition 2
500c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ]  |        [ 4 ] [ 5 ]  | [ 6 ] [ 7 ]
501c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
502c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
503c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
504c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
505c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
506c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
5073004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
508c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                    packet_header_);
5092b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5103004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
511c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
512c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
513c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
514c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
515c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
516c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
517c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
518c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
5193004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
5203004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                         packet_header_);
5212b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5223004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
523c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
524c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
525c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
526c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
527c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
528c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
529c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
530c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(4);
5313004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5322b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5333004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
534c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
535c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
536c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
537c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
538c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
539c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
540c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
541c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
5423004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5432b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5443004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
545c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
546c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
547c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
548c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
549c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
550c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
551c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
552c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(6);
5533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5542b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5553004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
556c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
557c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
558c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
559c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
560c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
561c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
562c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
563c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(7);
5643004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5652b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5663004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
567c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
568c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
569c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // 2 partitions left. 2 packets removed from second partition
570076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
5713004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
572c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                                                 &fragmentation_),
5733004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            4 * packet_buffer_size());
574c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
575c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
576c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
577c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 2, 6));
578076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(2, session_.packets_not_decodable());
579c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
5805b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
581076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
5825b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // Partition 0   | Partition 1         | Partition 2
5835b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // [ 0           |           ]  [ 1 ]  | [ 2 ]
5845b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
5855b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
5865b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 0;
5875b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = false;
5885b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber = 0;
5895b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(0);
5903004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
5915b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org                                    packet_header_);
5922b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
5933004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
5945b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
5955b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
5965b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
5975b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 1;
5985b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
5995b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = false;
6005b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
6015b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(1);
6023004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6032b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
6043004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
6055b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
6065b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
6075b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
6085b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 2;
6095b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
6105b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = true;
6115b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
6125b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(2);
6133004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6142b838b412176520eb23bb62b17993ef54d669aebmikhal@webrtc.org  ASSERT_EQ(session_.InsertPacket(*packet, frame_buffer_, false, 0),
6153004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
6165b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
6175b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
618076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // No packets removed.
619076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
6203004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org                                                 frame_buffer_size(),
6215b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org                                                 &fragmentation_),
6223004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            3 * packet_buffer_size());
623076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
6245b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
6255b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
6265b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // This partition is aggregated in partition 0
6275b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
6285b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 0, 0));
6295b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
6305b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 1, 2));
6315b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org}
632076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
6334ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.orgTEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
6344ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.isFirstPacket = false;
6354ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.completeNALU = kNaluComplete;
6364ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.frameType = kFrameEmpty;
6374ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.sizeBytes = 0;
6384ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.seqNum = 0;
6394ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.markerBit = false;
6404ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  ASSERT_EQ(0, session_.InsertPacket(packet_, frame_buffer_, false, 0));
6414ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org
6424ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  EXPECT_EQ(0, session_.MakeDecodable());
6434ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  EXPECT_EQ(0, session_.SessionLength());
6444ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
6454ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org}
6464ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org
647076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, OneIsolatedNaluLoss) {
648076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
649076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
650076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
651076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
652076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
653076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
6543004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
655076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
656076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
657076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
658076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
659076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
660076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
661076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
6623004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
663076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
664076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.MakeDecodable());
6653004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
666076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
667076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
668076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
669076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
670076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(1, 1, 2));
671076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
672076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
673076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, LossInMiddleOfNalu) {
674076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
675076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
676076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
677076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
678076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
679076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
6803004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
681076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
682076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
683076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
684076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
685076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
686076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
687076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
6883004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
689076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
6903004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
6913004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
692076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(1, session_.packets_not_decodable());
693076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
694076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
695076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
696076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
697076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
698076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
699076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
700076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
701076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
702076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
703076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7043004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
705076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
706076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
707076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
708076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
709076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
710076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
711076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7123004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
713076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
7143004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
7153004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
716076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(1, session_.packets_not_decodable());
717076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
718076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
719076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
720076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
721076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, ReorderWrapNoLoss) {
722076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
723076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
724076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
725076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
726076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
727076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
728076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7293004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
730076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
731076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
732076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
733076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum -= 1;
734076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
735076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
736076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7373004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
738076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
739076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
740076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
741076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
742076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
743076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
744076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7453004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
746076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
747076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.MakeDecodable());
748076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.packets_not_decodable());
7493004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
750076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
751076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
752076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
753076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
754076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, WrapLosses) {
755076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
756076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
757076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
758076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
759076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
760076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7613004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
762076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
763076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
764076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
765076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
766076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
767076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
768076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7693004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
770076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
7713004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
772076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.SessionLength());
773076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(2, session_.packets_not_decodable());
774076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
775076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
776076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, ReorderWrapLosses) {
777076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
778076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
779076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
780076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
781076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
782076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
783076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
784076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7853004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
786076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
787076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum -= 2;
788076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
789076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
790076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
791076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
792076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0),
7933004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org            packet_buffer_size());
794076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
7953004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
796076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0, session_.SessionLength());
797076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(2, session_.packets_not_decodable());
798076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
799076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}  // namespace webrtc
800