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
13a4407329d4e16eab3d2e87cde0824188c06acb5apbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
152557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/packet.h"
162557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/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;
32d818dcb939b713dc7a83726812de7aafa275cab4agalusza@google.com    frame_data.rtt_ms = 0;
33d818dcb939b713dc7a83726812de7aafa275cab4agalusza@google.com    frame_data.rolling_average_packets_per_frame = -1;
34c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
35c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
36076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void FillPacket(uint8_t start_value) {
374591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    for (size_t i = 0; i < packet_buffer_size(); ++i)
38c3d891059e117357011e414263af0f519313d440stefan@webrtc.org      packet_buffer_[i] = start_value + i;
39c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
40c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
41076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    for (size_t j = 0; j < packet_buffer_size(); ++j) {
43076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      ASSERT_EQ(start_value + j, start_ptr[j]);
44076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
45076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
46076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
474591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t packet_buffer_size() const {
483004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
493004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  }
504591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t frame_buffer_size() const {
513004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
523004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  }
533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
543004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  enum { kPacketBufferSize = 10 };
553004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
56076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  uint8_t packet_buffer_[kPacketBufferSize];
573004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  uint8_t frame_buffer_[10 * kPacketBufferSize];
583004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org
59076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  VCMSessionInfo session_;
60076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  VCMPacket packet_;
61d818dcb939b713dc7a83726812de7aafa275cab4agalusza@google.com  FrameData frame_data;
62076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
63076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
64076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgclass TestVP8Partitions : public TestSessionInfo {
65076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
66076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  enum { kMaxVP8Partitions = 9 };
67076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
68076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
69076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
70076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    vp8_header_ = &packet_header_.type.Video.codecHeader.VP8;
71076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_header_.frameType = kVideoFrameDelta;
72822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org    packet_header_.type.Video.codec = kRtpVideoVp8;
73076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    vp8_header_->InitRTPVideoHeaderVP8();
74076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    fragmentation_.VerifyAndAllocateFragmentationHeader(kMaxVP8Partitions);
75076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
76076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
77c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  bool VerifyPartition(int partition_id,
78c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                       int packets_expected,
79c3d891059e117357011e414263af0f519313d440stefan@webrtc.org                       int start_value) {
804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    EXPECT_EQ(packets_expected * packet_buffer_size(),
81c3d891059e117357011e414263af0f519313d440stefan@webrtc.org              fragmentation_.fragmentationLength[partition_id]);
82c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    for (int i = 0; i < packets_expected; ++i) {
834591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org      size_t packet_index = fragmentation_.fragmentationOffset[partition_id] +
849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                            i * packet_buffer_size();
853004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org      if (packet_index + packet_buffer_size() > frame_buffer_size())
86076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        return false;
87076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      VerifyPacket(frame_buffer_ + packet_index, start_value + i);
88c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    }
89c3d891059e117357011e414263af0f519313d440stefan@webrtc.org    return true;
90c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  }
91c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
92076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  WebRtcRTPHeader packet_header_;
93076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  RTPVideoHeaderVP8* vp8_header_;
94076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  RTPFragmentationHeader fragmentation_;
95076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
96076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
97076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgclass TestNalUnits : public TestSessionInfo {
98076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
99076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
100076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
10156210579563244f1decea42d52528f27f109c437pwestin@webrtc.org    packet_.codec = kVideoCodecVP8;
102076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
103076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
104076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  bool VerifyNalu(int offset, int packets_expected, int start_value) {
105076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    EXPECT_GE(session_.SessionLength(),
1063004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org              packets_expected * packet_buffer_size());
107076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    for (int i = 0; i < packets_expected; ++i) {
1083004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org      int packet_index = (offset + i) * packet_buffer_size();
109076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      VerifyPacket(frame_buffer_ + packet_index, start_value + i);
110076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
111076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    return true;
112076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
113076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org};
114076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
115cd64886a2fcdd688d2e2589e35a862d3f542e084mikhal@webrtc.orgclass TestNackList : public TestSessionInfo {
116076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org protected:
1173004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  static const size_t kMaxSeqNumListLength = 30;
118076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
119076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  virtual void SetUp() {
120076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    TestSessionInfo::SetUp();
121076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    seq_num_list_length_ = 0;
122076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    memset(seq_num_list_, 0, sizeof(seq_num_list_));
123076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
124076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
1259d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  void BuildSeqNumList(uint16_t low, uint16_t high) {
1263004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    size_t i = 0;
127076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    while (low != high + 1) {
128076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      EXPECT_LT(i, kMaxSeqNumListLength);
129076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      if (i >= kMaxSeqNumListLength) {
130076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        seq_num_list_length_ = kMaxSeqNumListLength;
131076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org        return;
132076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      }
133076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      seq_num_list_[i] = low;
134076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      low++;
135076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      i++;
136076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    }
137076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    seq_num_list_length_ = i;
138076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
139076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
140076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  void VerifyAll(int value) {
141076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    for (int i = 0; i < seq_num_list_length_; ++i)
142076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org      EXPECT_EQ(seq_num_list_[i], value);
143076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
144076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
145076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  int seq_num_list_[kMaxSeqNumListLength];
146076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  int seq_num_list_length_;
147c3d891059e117357011e414263af0f519313d440stefan@webrtc.org};
148c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
149076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestSessionInfo, TestSimpleAPIs) {
150076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
151076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFE;
1523004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet_.sizeBytes = packet_buffer_size();
153076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.frameType = kVideoFrameKey;
154076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
155f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
1564591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1574591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
158d1a860b4159cf3386e46c2f578c3df0d8111212aphoglund@webrtc.org  EXPECT_FALSE(session_.HaveLastPacket());
159076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(kVideoFrameKey, session_.FrameType());
160076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
161076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
162076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
163076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
164f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
1654591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1664591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
167d1a860b4159cf3386e46c2f578c3df0d8111212aphoglund@webrtc.org  EXPECT_TRUE(session_.HaveLastPacket());
168076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
169076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
170076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
171076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // Insert empty packet which will be the new high sequence number.
172076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // To make things more difficult we will make sure to have a wrap here.
173076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
174076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
1759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  packet_.seqNum = 2;
176076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.sizeBytes = 0;
17722993e1a0c114122fc1b9de0fc74d4096ec868bdpbos  packet_.frameType = kEmptyFrame;
1789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
1799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
180076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
181076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
182076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
183076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestSessionInfo, NormalOperation) {
184076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
185076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
186076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
187076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
1884591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
1894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
1904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
191076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
192076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
193076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  for (int i = 1; i < 9; ++i) {
194076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    packet_.seqNum += 1;
195076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    FillPacket(i);
1964591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    ASSERT_EQ(packet_buffer_size(),
1979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel              static_cast<size_t>(session_.InsertPacket(
1989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                  packet_, frame_buffer_, kNoErrors, frame_data)));
199076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
200076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
201076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
202076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
203076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(9);
2044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2054591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
2064591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
207076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
2083004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
209076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  for (int i = 0; i < 10; ++i) {
210076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org    SCOPED_TRACE("Calling VerifyPacket");
2113004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org    VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
212076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  }
213076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
214076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
215d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.comTEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
216d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.seqNum = 0xFFFF;
217d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.isFirstPacket = false;
218d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.markerBit = false;
219d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  FillPacket(3);
2204591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2219d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel            static_cast<size_t>(session_.InsertPacket(
2229d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                packet_, frame_buffer_, kWithErrors, frame_data)));
223d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  EXPECT_TRUE(session_.decodable());
224d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com}
225d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
226d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.comTEST_F(TestSessionInfo, SelectiveDecodableState) {
227d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.seqNum = 0xFFFF;
228d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.isFirstPacket = false;
229d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.markerBit = false;
230d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  FillPacket(1);
231d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  frame_data.rolling_average_packets_per_frame = 11;
232d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  frame_data.rtt_ms = 150;
2334591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2349d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel            static_cast<size_t>(session_.InsertPacket(
2359d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
236d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  EXPECT_FALSE(session_.decodable());
237d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
238d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.seqNum -= 1;
239d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  FillPacket(0);
240d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.isFirstPacket = true;
2414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2429d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel            static_cast<size_t>(session_.InsertPacket(
2439d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
244d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  EXPECT_TRUE(session_.decodable());
245d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
246d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.isFirstPacket = false;
247d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.seqNum += 1;
248d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  for (int i = 2; i < 8; ++i) {
249d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com    packet_.seqNum += 1;
250d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com    FillPacket(i);
2519d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel    EXPECT_EQ(packet_buffer_size(),
2529d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel              static_cast<size_t>(session_.InsertPacket(
2539d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                  packet_, frame_buffer_, kSelectiveErrors, frame_data)));
254d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com    EXPECT_TRUE(session_.decodable());
255d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  }
256d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
257d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  packet_.seqNum += 1;
258d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  FillPacket(8);
2594591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel            static_cast<size_t>(session_.InsertPacket(
2619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
262d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com  EXPECT_TRUE(session_.decodable());
263d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com}
264d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
265f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.orgTEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
266f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0001;
267f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
268f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
269f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
2704591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2714591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
2724591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
273f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
274f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0004;
275f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
276f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
277f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
2789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
2799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
280f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0000;
281f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
282f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
283f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
2849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
2859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
286f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org}
287f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
288f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.orgTEST_F(TestSessionInfo, SetMarkerBitOnce) {
289f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0005;
290f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
291f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
292f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
2934591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
2944591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
2954591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
296f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  ++packet_.seqNum;
297f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
298f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
299f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
302f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org}
303f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
304f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.orgTEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
305f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  // Allow packets in the range 5-6.
306f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0005;
307f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
308f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
309f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
310f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3114591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3124591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
313f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  // Insert an older packet with a first packet set.
314f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0004;
315f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
316f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
317f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3189d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
320f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0006;
321f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
322f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
323f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
324f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3254591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3264591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
327f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0008;
328f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
329f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
330f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3319d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3329d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
333f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org}
334f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
335f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.orgTEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
336f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0xFFFE;
337f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
338f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
339f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
340f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
343f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
344f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0004;
345f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
346f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
347f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
348f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3494591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3504591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
351f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0002;
352f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
353f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
354f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
355f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  ASSERT_EQ(packet_buffer_size(),
3564591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3574591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
358f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0xFFF0;
359f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
360f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
361f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
364f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0006;
365f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
366f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
367f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
370f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org}
371f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
372f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.orgTEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
373f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  // Insert out of bound regular packets, and then the first and last packet.
374f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  // Verify that correct bounds are maintained.
375f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0003;
376f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
377f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
378f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
379f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3814591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
382f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  // Insert an older packet with a first packet set.
383f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0005;
384f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = true;
385f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
386f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
387f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
3884591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
3894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
390f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0004;
391f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
392f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
393f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
3949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
3959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
396f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0010;
397f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
398f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
399f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
400f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
4014591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
4024591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
403f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0008;
404f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
405f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = true;
406f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
407f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  EXPECT_EQ(packet_buffer_size(),
4084591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
4094591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
410f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
411f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.seqNum = 0x0009;
412f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.isFirstPacket = false;
413f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  packet_.markerBit = false;
414f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org  FillPacket(1);
4159d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
4169d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
417f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org}
418f31a47abdc413221e4869a9e24f9b208c7d2cc4amikhal@webrtc.org
419076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsOneLoss) {
420c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0 | Partition 1
421c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 0 ] [ 2 ] | [ 3 ]
422c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
423c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
424c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
425c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
426c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0;
427c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
4289d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
4299d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
4314591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
4324591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
433c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
434c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
435c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
436c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
437c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
438c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
439c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
440c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
4413004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
4434591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
4444591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
445c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
446c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
447c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
448c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
449c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
450c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
451c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
452c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
4533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4544591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
4554591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
4564591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
457c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
458c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
459c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed (end of partition 0).
4604591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(2 * packet_buffer_size(),
4614591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
4624591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
463c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
464c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 1, 0));
465c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
466c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 3));
467c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
468c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
469076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsOneLoss2) {
470c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0 | Partition 1
471c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ] | [ 3 ] [ 5 ]
472c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
473c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
474c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
475c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
476c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
477c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
4789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
4799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
4814591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
4824591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
483c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
484c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
485c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
486c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
487c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
488c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
489c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
490c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
4913004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
4924591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
4934591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
4944591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
495c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
496c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
497c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
498c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
499c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
500c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
501c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
502c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
5033004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5054591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5064591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
507c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
508c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
509c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
510c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
511c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
512c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
513c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
514c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
5153004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5164591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5174591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5184591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
519c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
520c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
521c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed (end of partition 2), 3 left.
5224591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(3 * packet_buffer_size(),
5234591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
5244591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
525c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
526c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
527c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
528c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 3));
529c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
530c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
531076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsNoLossWrap) {
532c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0       | Partition 1
533c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ fffd ] [ fffe ] | [ ffff ] [ 0 ]
534c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
535c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
536c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
537c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
538c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0xfffd;
539c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
5409d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
5419d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5434591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5444591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
545c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
546c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
547c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
548c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
549c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
550c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
551c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
552c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
5533004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5544591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5554591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5564591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
557c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
558c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
559c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
560c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
561c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
562c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
563c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
564c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
5653004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5664591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5674591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5684591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
569c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
570c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
571c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
572c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
573c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
574c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
575c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
576c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
5773004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
5784591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
5794591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
5804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
581c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
582c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
583c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // No packet should be removed.
5844591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(4 * packet_buffer_size(),
5854591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
5864591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
587c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
588c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
589c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
590c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 2, 2));
591c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
592c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
593076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, TwoPartitionsLossWrap) {
594c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0       | Partition 1
595c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ fffd ] [ fffe ] | [ ffff ] [ 1 ]
596c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
597c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
598c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
599c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
600c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 0xfffd;
601c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(0);
6029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
6039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6054591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6064591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
607c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
608c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
609c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
610c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
611c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
612c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
613c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
614c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
6153004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6164591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6174591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6184591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
619c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
620c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
621c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
622c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
623c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
624c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
625c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
626c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
6273004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6284591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6294591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
631c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
632c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
633c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
634c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
635c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
636c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
637c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
638c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(3);
6393004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
643c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
644c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
645c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // One packet should be removed from the last partition
6464591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(3 * packet_buffer_size(),
6474591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
6484591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
649c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
650c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
651c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
652c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 1, 2));
653c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
654c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
655076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, ThreePartitionsOneMissing) {
656c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 1  |Partition 2    | Partition 3
657c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ]  |               | [ 5 ] | [ 6 ]
658c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
659c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
660c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
661c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
662c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
663c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
6649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
6659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6664591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6674591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6684591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
669c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
670c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
671c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
672c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
673c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
674c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
675c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
676c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
6773004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6784591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6794591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
681c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
682c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
683c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
684c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
685c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
686c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
687c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 3;
688c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
6893004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
6904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
6914591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
6924591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
693c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
694c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
695c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
696c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
697c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
698c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
699c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
700c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(6);
7013004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7024591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7034591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
705c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
706c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
707c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // No packet should be removed.
7084591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(4 * packet_buffer_size(),
7094591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
7104591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
711c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
712c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
713c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
714c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 2, 5));
715c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
716c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
717076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, ThreePartitionsLossInSecond) {
718c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // Partition 0  |Partition 1          | Partition 2
719c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // [ 1 ] [ 2 ]  |        [ 4 ] [ 5 ]  | [ 6 ] [ 7 ]
720c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
721c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
722c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
723c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
724c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber = 1;
725c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(1);
7269d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
7279d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7284591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7294591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
731c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
732c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
733c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
734c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 0;
735c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
736c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
737c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
738c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(2);
7399d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
743c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
744c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
745c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
746c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
747c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
748c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
749c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 2;
750c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(4);
7513004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7524591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7534591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7544591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
755c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
756c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
757c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
758c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 1;
759c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
760c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
761c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
762c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(5);
7633004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7644591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7654591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7664591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
767c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
768c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
769c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
770c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
771c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
772c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = false;
773c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
774c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(6);
7753004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7764591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7774591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7784591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
779c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
780c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
781c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
782c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->partitionId = 2;
783c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
784c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.markerBit = true;
785c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
786c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  FillPacket(7);
7873004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
7884591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
7894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
7904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
791c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  delete packet;
792c3d891059e117357011e414263af0f519313d440stefan@webrtc.org
793c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  // 2 partitions left. 2 packets removed from second partition
7944591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(4 * packet_buffer_size(),
7954591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
7964591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
797c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
798c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 1));
799c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
800c3d891059e117357011e414263af0f519313d440stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 2, 6));
801c3d891059e117357011e414263af0f519313d440stefan@webrtc.org}
8025b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
803076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
8045b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // Partition 0   | Partition 1         | Partition 2
8055b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // [ 0           |           ]  [ 1 ]  | [ 2 ]
8065b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = true;
8075b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
8085b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 0;
8095b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = false;
8105b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber = 0;
8115b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(0);
8129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  VCMPacket* packet =
8139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
8144591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
8154591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
8164591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
8175b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
8185b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
8195b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
8205b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 1;
8215b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = false;
8225b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = false;
8235b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
8245b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(1);
8253004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
8264591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
8274591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
8284591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
8295b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
8305b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
8315b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.type.Video.isFirstPacket = false;
8325b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->partitionId = 2;
8335b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  vp8_header_->beginningOfPartition = true;
8345b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.markerBit = true;
8355b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  packet_header_.header.sequenceNumber += 1;
8365b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  FillPacket(2);
8373004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
8384591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
8394591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(*packet, frame_buffer_,
8404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
8415b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  delete packet;
8425b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org
843076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  // No packets removed.
8444591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(3 * packet_buffer_size(),
8454591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            session_.BuildVP8FragmentationHeader(
8464591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                frame_buffer_, frame_buffer_size(), &fragmentation_));
8475b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
8485b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(0, 2, 0));
8495b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  // This partition is aggregated in partition 0
8505b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
8515b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(1, 0, 0));
8525b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  SCOPED_TRACE("Calling VerifyPartition");
8535b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org  EXPECT_TRUE(VerifyPartition(2, 1, 2));
8545b91464edf51354dd3f4475b8e0bb23357bd8511stefan@webrtc.org}
855076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
8564ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.orgTEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
8574ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.isFirstPacket = false;
8584ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.completeNALU = kNaluComplete;
85922993e1a0c114122fc1b9de0fc74d4096ec868bdpbos  packet_.frameType = kEmptyFrame;
8604ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.sizeBytes = 0;
8614ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.seqNum = 0;
8624ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org  packet_.markerBit = false;
8639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel  EXPECT_EQ(
8649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel      0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
8654ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org
8664591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.MakeDecodable());
8674591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.SessionLength());
8684ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org}
8694ce0ba00de6004673f484083a6bd2b8f4597be2astefan@webrtc.org
870076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, OneIsolatedNaluLoss) {
871076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
872076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
873076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
874076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
875076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
8764591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
8774591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
8784591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
879076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
880076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
881076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
882076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
883076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
884076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
8854591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
8864591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
8874591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
888076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
8894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.MakeDecodable());
8903004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
891076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
892076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
893076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
894076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(1, 1, 2));
895076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
896076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
897076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, LossInMiddleOfNalu) {
898076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
899076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
900076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
901076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
902076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
9034591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9054591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
906076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
907076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
908076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
909076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
910076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
911076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
9124591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9134591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9144591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
915076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
9163004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
9173004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
918076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
919076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
920076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
921076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
922076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
923076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
924076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
925076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0;
926076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
927076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
9284591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9294591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
931076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
932076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
933076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
934076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
935076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
936076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
9374591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9384591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9394591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
940076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
9413004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
9423004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
943076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
944076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
945076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
946076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
947076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, ReorderWrapNoLoss) {
948076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
949076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
950076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
951076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 1;
952076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
953076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
9544591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9554591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9564591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
957076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
958076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = true;
959076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluComplete;
960076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum -= 1;
961076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
962076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(0);
9634591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9644591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9654591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
966076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
967076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
968076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
969076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
970076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
971076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
9724591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9734591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9744591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
975076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
9764591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.MakeDecodable());
9773004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
978076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  SCOPED_TRACE("Calling VerifyNalu");
979076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  EXPECT_TRUE(VerifyNalu(0, 1, 0));
980076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
981076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
982076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, WrapLosses) {
983076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
984076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
985076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
986076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
987076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
9884591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
991076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
992076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
993076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
994076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
995076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
996076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
9974591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
9984591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
9994591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
1000076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
10013004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
10024591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.SessionLength());
1003076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
1004076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
1005076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.orgTEST_F(TestNalUnits, ReorderWrapLosses) {
1006076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum = 0xFFFF;
1007076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
1008076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
1009076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluEnd;
1010076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum += 2;
1011076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = true;
1012076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(2);
10134591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
10144591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
10154591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
1016076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
1017076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.seqNum -= 2;
1018076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.isFirstPacket = false;
1019076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.completeNALU = kNaluIncomplete;
1020076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  packet_.markerBit = false;
1021076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org  FillPacket(1);
10224591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(packet_buffer_size(),
10234591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
10244591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                                                      kNoErrors, frame_data)));
1025076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org
10263004c79c6ad0ca4b4df27d0ca76c2eb29735e267pbos@webrtc.org  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
10274591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(0U, session_.SessionLength());
1028076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}
1029d177c10e2de490cfa001a00ca4d0ae654292afc7agalusza@google.com
1030076fa6e674f0feb2cf3393c44ed845aef8b52f06stefan@webrtc.org}  // namespace webrtc
1031