Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <string.h>
     12 
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "webrtc/modules/interface/module_common_types.h"
     15 #include "webrtc/modules/video_coding/main/source/packet.h"
     16 #include "webrtc/modules/video_coding/main/source/session_info.h"
     17 
     18 namespace webrtc {
     19 
     20 class TestSessionInfo : public ::testing::Test {
     21  protected:
     22   virtual void SetUp() {
     23     memset(packet_buffer_, 0, sizeof(packet_buffer_));
     24     memset(frame_buffer_, 0, sizeof(frame_buffer_));
     25     session_.Reset();
     26     packet_.Reset();
     27     packet_.frameType = kVideoFrameDelta;
     28     packet_.sizeBytes = packet_buffer_size();
     29     packet_.dataPtr = packet_buffer_;
     30     packet_.seqNum = 0;
     31     packet_.timestamp = 0;
     32     frame_data.rtt_ms = 0;
     33     frame_data.rolling_average_packets_per_frame = -1;
     34   }
     35 
     36   void FillPacket(uint8_t start_value) {
     37     for (int i = 0; i < packet_buffer_size(); ++i)
     38       packet_buffer_[i] = start_value + i;
     39   }
     40 
     41   void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
     42     for (int j = 0; j < packet_buffer_size(); ++j) {
     43       ASSERT_EQ(start_value + j, start_ptr[j]);
     44     }
     45   }
     46 
     47   int packet_buffer_size() const {
     48     return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
     49   }
     50   int frame_buffer_size() const {
     51     return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
     52   }
     53 
     54   enum { kPacketBufferSize = 10 };
     55 
     56   uint8_t packet_buffer_[kPacketBufferSize];
     57   uint8_t frame_buffer_[10 * kPacketBufferSize];
     58 
     59   VCMSessionInfo session_;
     60   VCMPacket packet_;
     61   FrameData frame_data;
     62 };
     63 
     64 class TestVP8Partitions : public TestSessionInfo {
     65  protected:
     66   enum { kMaxVP8Partitions = 9 };
     67 
     68   virtual void SetUp() {
     69     TestSessionInfo::SetUp();
     70     vp8_header_ = &packet_header_.type.Video.codecHeader.VP8;
     71     packet_header_.frameType = kVideoFrameDelta;
     72     packet_header_.type.Video.codec = kRtpVideoVp8;
     73     vp8_header_->InitRTPVideoHeaderVP8();
     74     fragmentation_.VerifyAndAllocateFragmentationHeader(kMaxVP8Partitions);
     75   }
     76 
     77   bool VerifyPartition(int partition_id,
     78                        int packets_expected,
     79                        int start_value) {
     80     EXPECT_EQ(static_cast<uint32_t>(packets_expected * packet_buffer_size()),
     81               fragmentation_.fragmentationLength[partition_id]);
     82     for (int i = 0; i < packets_expected; ++i) {
     83       int packet_index = fragmentation_.fragmentationOffset[partition_id] +
     84           i * packet_buffer_size();
     85       if (packet_index + packet_buffer_size() > frame_buffer_size())
     86         return false;
     87       VerifyPacket(frame_buffer_ + packet_index, start_value + i);
     88     }
     89     return true;
     90   }
     91 
     92   WebRtcRTPHeader packet_header_;
     93   RTPVideoHeaderVP8* vp8_header_;
     94   RTPFragmentationHeader fragmentation_;
     95 };
     96 
     97 class TestNalUnits : public TestSessionInfo {
     98  protected:
     99   virtual void SetUp() {
    100     TestSessionInfo::SetUp();
    101     packet_.codec = kVideoCodecVP8;
    102   }
    103 
    104   bool VerifyNalu(int offset, int packets_expected, int start_value) {
    105     EXPECT_GE(session_.SessionLength(),
    106               packets_expected * packet_buffer_size());
    107     for (int i = 0; i < packets_expected; ++i) {
    108       int packet_index = (offset + i) * packet_buffer_size();
    109       VerifyPacket(frame_buffer_ + packet_index, start_value + i);
    110     }
    111     return true;
    112   }
    113 };
    114 
    115 class TestNackList : public TestSessionInfo {
    116  protected:
    117   static const size_t kMaxSeqNumListLength = 30;
    118 
    119   virtual void SetUp() {
    120     TestSessionInfo::SetUp();
    121     seq_num_list_length_ = 0;
    122     memset(seq_num_list_, 0, sizeof(seq_num_list_));
    123   }
    124 
    125   void BuildSeqNumList(uint16_t low,
    126                        uint16_t high) {
    127     size_t i = 0;
    128     while (low != high + 1) {
    129       EXPECT_LT(i, kMaxSeqNumListLength);
    130       if (i >= kMaxSeqNumListLength) {
    131         seq_num_list_length_ = kMaxSeqNumListLength;
    132         return;
    133       }
    134       seq_num_list_[i] = low;
    135       low++;
    136       i++;
    137     }
    138     seq_num_list_length_ = i;
    139   }
    140 
    141   void VerifyAll(int value) {
    142     for (int i = 0; i < seq_num_list_length_; ++i)
    143       EXPECT_EQ(seq_num_list_[i], value);
    144   }
    145 
    146   int seq_num_list_[kMaxSeqNumListLength];
    147   int seq_num_list_length_;
    148 };
    149 
    150 TEST_F(TestSessionInfo, TestSimpleAPIs) {
    151   packet_.isFirstPacket = true;
    152   packet_.seqNum = 0xFFFE;
    153   packet_.sizeBytes = packet_buffer_size();
    154   packet_.frameType = kVideoFrameKey;
    155   FillPacket(0);
    156   EXPECT_EQ(packet_buffer_size(),
    157             session_.InsertPacket(packet_,
    158             frame_buffer_,
    159             kNoErrors,
    160             frame_data));
    161   EXPECT_FALSE(session_.HaveLastPacket());
    162   EXPECT_EQ(kVideoFrameKey, session_.FrameType());
    163 
    164   packet_.isFirstPacket = false;
    165   packet_.markerBit = true;
    166   packet_.seqNum += 1;
    167   EXPECT_EQ(packet_buffer_size(),
    168             session_.InsertPacket(packet_,
    169                                   frame_buffer_,
    170                                   kNoErrors,
    171                                   frame_data));
    172   EXPECT_TRUE(session_.HaveLastPacket());
    173   EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
    174   EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
    175 
    176   // Insert empty packet which will be the new high sequence number.
    177   // To make things more difficult we will make sure to have a wrap here.
    178   packet_.isFirstPacket = false;
    179   packet_.markerBit = true;
    180   packet_.seqNum  = 2;
    181   packet_.sizeBytes = 0;
    182   packet_.frameType = kFrameEmpty;
    183   EXPECT_EQ(0,
    184             session_.InsertPacket(packet_,
    185                                   frame_buffer_,
    186                                   kNoErrors,
    187                                   frame_data));
    188   EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
    189 }
    190 
    191 TEST_F(TestSessionInfo, NormalOperation) {
    192   packet_.seqNum = 0xFFFF;
    193   packet_.isFirstPacket = true;
    194   packet_.markerBit = false;
    195   FillPacket(0);
    196   EXPECT_EQ(session_.InsertPacket(packet_,
    197                                   frame_buffer_,
    198                                   kNoErrors,
    199                                   frame_data),
    200             packet_buffer_size());
    201 
    202   packet_.isFirstPacket = false;
    203   for (int i = 1; i < 9; ++i) {
    204     packet_.seqNum += 1;
    205     FillPacket(i);
    206     ASSERT_EQ(session_.InsertPacket(packet_,
    207                                     frame_buffer_,
    208                                     kNoErrors,
    209                                     frame_data),
    210               packet_buffer_size());
    211   }
    212 
    213   packet_.seqNum += 1;
    214   packet_.markerBit = true;
    215   FillPacket(9);
    216   EXPECT_EQ(session_.InsertPacket(packet_,
    217                                   frame_buffer_,
    218                                   kNoErrors,
    219                                   frame_data),
    220             packet_buffer_size());
    221 
    222   EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
    223   for (int i = 0; i < 10; ++i) {
    224     SCOPED_TRACE("Calling VerifyPacket");
    225     VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
    226   }
    227 }
    228 
    229 TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
    230   packet_.seqNum = 0xFFFF;
    231   packet_.isFirstPacket = false;
    232   packet_.markerBit = false;
    233   FillPacket(3);
    234   EXPECT_EQ(session_.InsertPacket(packet_,
    235                                   frame_buffer_,
    236                                   kWithErrors,
    237                                   frame_data),
    238             packet_buffer_size());
    239   EXPECT_TRUE(session_.decodable());
    240 }
    241 
    242 TEST_F(TestSessionInfo, SelectiveDecodableState) {
    243   packet_.seqNum = 0xFFFF;
    244   packet_.isFirstPacket = false;
    245   packet_.markerBit = false;
    246   FillPacket(1);
    247   frame_data.rolling_average_packets_per_frame = 11;
    248   frame_data.rtt_ms = 150;
    249   EXPECT_EQ(session_.InsertPacket(packet_,
    250                                   frame_buffer_,
    251                                   kSelectiveErrors,
    252                                   frame_data),
    253             packet_buffer_size());
    254   EXPECT_FALSE(session_.decodable());
    255 
    256   packet_.seqNum -= 1;
    257   FillPacket(0);
    258   packet_.isFirstPacket = true;
    259   EXPECT_EQ(session_.InsertPacket(packet_,
    260                                   frame_buffer_,
    261                                   kSelectiveErrors,
    262                                   frame_data),
    263             packet_buffer_size());
    264   EXPECT_TRUE(session_.decodable());
    265 
    266   packet_.isFirstPacket = false;
    267   packet_.seqNum += 1;
    268   for (int i = 2; i < 8; ++i) {
    269     packet_.seqNum += 1;
    270     FillPacket(i);
    271     EXPECT_EQ(session_.InsertPacket(packet_,
    272                                     frame_buffer_,
    273                                     kSelectiveErrors,
    274                                     frame_data),
    275               packet_buffer_size());
    276     EXPECT_TRUE(session_.decodable());
    277   }
    278 
    279   packet_.seqNum += 1;
    280   FillPacket(8);
    281   EXPECT_EQ(session_.InsertPacket(packet_,
    282                                   frame_buffer_,
    283                                   kSelectiveErrors,
    284                                   frame_data),
    285             packet_buffer_size());
    286   EXPECT_TRUE(session_.decodable());
    287 }
    288 
    289 TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
    290   packet_.seqNum = 0x0001;
    291   packet_.isFirstPacket = true;
    292   packet_.markerBit = true;
    293   FillPacket(1);
    294   EXPECT_EQ(session_.InsertPacket(packet_,
    295                                   frame_buffer_,
    296                                   kNoErrors,
    297                                   frame_data),
    298             packet_buffer_size());
    299 
    300   packet_.seqNum = 0x0004;
    301   packet_.isFirstPacket = true;
    302   packet_.markerBit = true;
    303   FillPacket(1);
    304   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    305                                       frame_buffer_,
    306                                       kNoErrors,
    307                                       frame_data));
    308   packet_.seqNum = 0x0000;
    309   packet_.isFirstPacket = false;
    310   packet_.markerBit = false;
    311   FillPacket(1);
    312   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    313                                       frame_buffer_,
    314                                       kNoErrors,
    315                                       frame_data));
    316 }
    317 
    318 TEST_F(TestSessionInfo, SetMarkerBitOnce) {
    319   packet_.seqNum = 0x0005;
    320   packet_.isFirstPacket = false;
    321   packet_.markerBit = true;
    322   FillPacket(1);
    323   EXPECT_EQ(session_.InsertPacket(packet_,
    324                                   frame_buffer_,
    325                                   kNoErrors,
    326                                   frame_data),
    327             packet_buffer_size());
    328   ++packet_.seqNum;
    329   packet_.isFirstPacket = true;
    330   packet_.markerBit = true;
    331   FillPacket(1);
    332   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    333                                       frame_buffer_,
    334                                       kNoErrors,
    335                                       frame_data));
    336 }
    337 
    338 TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
    339   // Allow packets in the range 5-6.
    340   packet_.seqNum = 0x0005;
    341   packet_.isFirstPacket = true;
    342   packet_.markerBit = false;
    343   FillPacket(1);
    344   EXPECT_EQ(packet_buffer_size(),
    345             session_.InsertPacket(packet_,
    346                                   frame_buffer_,
    347                                   kNoErrors,
    348                                   frame_data));
    349   // Insert an older packet with a first packet set.
    350   packet_.seqNum = 0x0004;
    351   packet_.isFirstPacket = true;
    352   packet_.markerBit = true;
    353   FillPacket(1);
    354   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    355                                       frame_buffer_,
    356                                       kNoErrors,
    357                                       frame_data));
    358   packet_.seqNum = 0x0006;
    359   packet_.isFirstPacket = true;
    360   packet_.markerBit = true;
    361   FillPacket(1);
    362   EXPECT_EQ(packet_buffer_size(),
    363             session_.InsertPacket(packet_,
    364                                   frame_buffer_,
    365                                   kNoErrors,
    366                                   frame_data));
    367   packet_.seqNum = 0x0008;
    368   packet_.isFirstPacket = false;
    369   packet_.markerBit = true;
    370   FillPacket(1);
    371   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    372                                       frame_buffer_,
    373                                       kNoErrors,
    374                                       frame_data));
    375 }
    376 
    377 TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
    378   packet_.seqNum = 0xFFFE;
    379   packet_.isFirstPacket = true;
    380   packet_.markerBit = false;
    381   FillPacket(1);
    382   EXPECT_EQ(packet_buffer_size(),
    383             session_.InsertPacket(packet_,
    384                                   frame_buffer_,
    385                                   kNoErrors,
    386                                   frame_data));
    387 
    388   packet_.seqNum = 0x0004;
    389   packet_.isFirstPacket = false;
    390   packet_.markerBit = true;
    391   FillPacket(1);
    392   EXPECT_EQ(packet_buffer_size(),
    393             session_.InsertPacket(packet_,
    394                                   frame_buffer_,
    395                                   kNoErrors,
    396                                   frame_data));
    397   packet_.seqNum = 0x0002;
    398   packet_.isFirstPacket = false;
    399   packet_.markerBit = false;
    400   FillPacket(1);
    401   ASSERT_EQ(packet_buffer_size(),
    402             session_.InsertPacket(packet_,
    403                                   frame_buffer_,
    404                                   kNoErrors,
    405                                   frame_data));
    406   packet_.seqNum = 0xFFF0;
    407   packet_.isFirstPacket = false;
    408   packet_.markerBit = false;
    409   FillPacket(1);
    410   EXPECT_EQ(-3,
    411             session_.InsertPacket(packet_,
    412                                   frame_buffer_,
    413                                   kNoErrors,
    414                                   frame_data));
    415   packet_.seqNum = 0x0006;
    416   packet_.isFirstPacket = false;
    417   packet_.markerBit = false;
    418   FillPacket(1);
    419   EXPECT_EQ(-3,
    420             session_.InsertPacket(packet_,
    421                                   frame_buffer_,
    422                                   kNoErrors,
    423                                   frame_data));
    424 }
    425 
    426 TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
    427   // Insert out of bound regular packets, and then the first and last packet.
    428   // Verify that correct bounds are maintained.
    429   packet_.seqNum = 0x0003;
    430   packet_.isFirstPacket = false;
    431   packet_.markerBit = false;
    432   FillPacket(1);
    433   EXPECT_EQ(packet_buffer_size(),
    434             session_.InsertPacket(packet_,
    435                                   frame_buffer_,
    436                                   kNoErrors,
    437                                   frame_data));
    438   // Insert an older packet with a first packet set.
    439   packet_.seqNum = 0x0005;
    440   packet_.isFirstPacket = true;
    441   packet_.markerBit = false;
    442   FillPacket(1);
    443   EXPECT_EQ(packet_buffer_size(),
    444             session_.InsertPacket(packet_,
    445                                   frame_buffer_,
    446                                   kNoErrors,
    447                                   frame_data));
    448   packet_.seqNum = 0x0004;
    449   packet_.isFirstPacket = false;
    450   packet_.markerBit = false;
    451   FillPacket(1);
    452   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    453                                       frame_buffer_,
    454                                       kNoErrors,
    455                                       frame_data));
    456   packet_.seqNum = 0x0010;
    457   packet_.isFirstPacket = false;
    458   packet_.markerBit = false;
    459   FillPacket(1);
    460   EXPECT_EQ(packet_buffer_size(),
    461             session_.InsertPacket(packet_,
    462                                   frame_buffer_,
    463                                   kNoErrors,
    464                                   frame_data));
    465   packet_.seqNum = 0x0008;
    466   packet_.isFirstPacket = false;
    467   packet_.markerBit = true;
    468   FillPacket(1);
    469   EXPECT_EQ(packet_buffer_size(),
    470             session_.InsertPacket(packet_,
    471                                   frame_buffer_,
    472                                   kNoErrors,
    473                                   frame_data));
    474 
    475   packet_.seqNum = 0x0009;
    476   packet_.isFirstPacket = false;
    477   packet_.markerBit = false;
    478   FillPacket(1);
    479   EXPECT_EQ(-3, session_.InsertPacket(packet_,
    480                                       frame_buffer_,
    481                                       kNoErrors,
    482                                       frame_data));
    483 }
    484 
    485 TEST_F(TestVP8Partitions, TwoPartitionsOneLoss) {
    486   // Partition 0 | Partition 1
    487   // [ 0 ] [ 2 ] | [ 3 ]
    488   packet_header_.type.Video.isFirstPacket = true;
    489   vp8_header_->beginningOfPartition = true;
    490   vp8_header_->partitionId = 0;
    491   packet_header_.header.markerBit = false;
    492   packet_header_.header.sequenceNumber = 0;
    493   FillPacket(0);
    494   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    495                                     packet_header_);
    496   EXPECT_EQ(session_.InsertPacket(*packet,
    497                                   frame_buffer_,
    498                                   kNoErrors,
    499                                   frame_data),
    500             packet_buffer_size());
    501   delete packet;
    502 
    503   packet_header_.type.Video.isFirstPacket = false;
    504   vp8_header_->partitionId = 0;
    505   vp8_header_->beginningOfPartition = false;
    506   packet_header_.header.markerBit = false;
    507   packet_header_.header.sequenceNumber += 2;
    508   FillPacket(2);
    509   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    510   EXPECT_EQ(session_.InsertPacket(*packet,
    511                                   frame_buffer_,
    512                                   kNoErrors,
    513                                   frame_data),
    514             packet_buffer_size());
    515   delete packet;
    516 
    517   packet_header_.type.Video.isFirstPacket = false;
    518   vp8_header_->partitionId = 1;
    519   vp8_header_->beginningOfPartition = true;
    520   packet_header_.header.markerBit = true;
    521   packet_header_.header.sequenceNumber += 1;
    522   FillPacket(3);
    523   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    524   EXPECT_EQ(session_.InsertPacket(*packet,
    525                                   frame_buffer_,
    526                                   kNoErrors,
    527                                   frame_data),
    528             packet_buffer_size());
    529   delete packet;
    530 
    531   // One packet should be removed (end of partition 0).
    532   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    533                                                  frame_buffer_size(),
    534                                                  &fragmentation_),
    535             2 * packet_buffer_size());
    536   SCOPED_TRACE("Calling VerifyPartition");
    537   EXPECT_TRUE(VerifyPartition(0, 1, 0));
    538   SCOPED_TRACE("Calling VerifyPartition");
    539   EXPECT_TRUE(VerifyPartition(1, 1, 3));
    540 }
    541 
    542 TEST_F(TestVP8Partitions, TwoPartitionsOneLoss2) {
    543   // Partition 0 | Partition 1
    544   // [ 1 ] [ 2 ] | [ 3 ] [ 5 ]
    545   packet_header_.type.Video.isFirstPacket = true;
    546   vp8_header_->beginningOfPartition = true;
    547   vp8_header_->partitionId = 0;
    548   packet_header_.header.markerBit = false;
    549   packet_header_.header.sequenceNumber = 1;
    550   FillPacket(1);
    551   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    552                                     packet_header_);
    553   EXPECT_EQ(session_.InsertPacket(*packet,
    554                                   frame_buffer_,
    555                                   kNoErrors,
    556                                   frame_data),
    557             packet_buffer_size());
    558   delete packet;
    559 
    560   packet_header_.type.Video.isFirstPacket = false;
    561   vp8_header_->partitionId = 0;
    562   vp8_header_->beginningOfPartition = false;
    563   packet_header_.header.markerBit = false;
    564   packet_header_.header.sequenceNumber += 1;
    565   FillPacket(2);
    566   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    567   EXPECT_EQ(session_.InsertPacket(*packet,
    568                                   frame_buffer_,
    569                                   kNoErrors,
    570                                   frame_data),
    571             packet_buffer_size());
    572   delete packet;
    573 
    574   packet_header_.type.Video.isFirstPacket = false;
    575   vp8_header_->partitionId = 1;
    576   vp8_header_->beginningOfPartition = true;
    577   packet_header_.header.markerBit = false;
    578   packet_header_.header.sequenceNumber += 1;
    579   FillPacket(3);
    580   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    581   EXPECT_EQ(session_.InsertPacket(*packet,
    582                                   frame_buffer_,
    583                                   kNoErrors,
    584                                   frame_data),
    585             packet_buffer_size());
    586   delete packet;
    587 
    588   packet_header_.type.Video.isFirstPacket = false;
    589   vp8_header_->partitionId = 1;
    590   vp8_header_->beginningOfPartition = false;
    591   packet_header_.header.markerBit = true;
    592   packet_header_.header.sequenceNumber += 2;
    593   FillPacket(5);
    594   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    595   EXPECT_EQ(session_.InsertPacket(*packet,
    596                                   frame_buffer_,
    597                                   kNoErrors,
    598                                   frame_data),
    599             packet_buffer_size());
    600   delete packet;
    601 
    602   // One packet should be removed (end of partition 2), 3 left.
    603   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    604                                                  frame_buffer_size(),
    605                                                  &fragmentation_),
    606             3 * packet_buffer_size());
    607   SCOPED_TRACE("Calling VerifyPartition");
    608   EXPECT_TRUE(VerifyPartition(0, 2, 1));
    609   SCOPED_TRACE("Calling VerifyPartition");
    610   EXPECT_TRUE(VerifyPartition(1, 1, 3));
    611 }
    612 
    613 TEST_F(TestVP8Partitions, TwoPartitionsNoLossWrap) {
    614   // Partition 0       | Partition 1
    615   // [ fffd ] [ fffe ] | [ ffff ] [ 0 ]
    616   packet_header_.type.Video.isFirstPacket = true;
    617   vp8_header_->beginningOfPartition = true;
    618   vp8_header_->partitionId = 0;
    619   packet_header_.header.markerBit = false;
    620   packet_header_.header.sequenceNumber = 0xfffd;
    621   FillPacket(0);
    622   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    623                                     packet_header_);
    624   EXPECT_EQ(session_.InsertPacket(*packet,
    625                                   frame_buffer_,
    626                                   kNoErrors,
    627                                   frame_data),
    628             packet_buffer_size());
    629   delete packet;
    630 
    631   packet_header_.type.Video.isFirstPacket = false;
    632   vp8_header_->partitionId = 0;
    633   vp8_header_->beginningOfPartition = false;
    634   packet_header_.header.markerBit = false;
    635   packet_header_.header.sequenceNumber += 1;
    636   FillPacket(1);
    637   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    638   EXPECT_EQ(session_.InsertPacket(*packet,
    639                                   frame_buffer_,
    640                                   kNoErrors,
    641                                   frame_data),
    642             packet_buffer_size());
    643   delete packet;
    644 
    645   packet_header_.type.Video.isFirstPacket = false;
    646   vp8_header_->partitionId = 1;
    647   vp8_header_->beginningOfPartition = true;
    648   packet_header_.header.markerBit = false;
    649   packet_header_.header.sequenceNumber += 1;
    650   FillPacket(2);
    651   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    652   EXPECT_EQ(session_.InsertPacket(*packet,
    653                                   frame_buffer_,
    654                                   kNoErrors,
    655                                   frame_data),
    656             packet_buffer_size());
    657   delete packet;
    658 
    659   packet_header_.type.Video.isFirstPacket = false;
    660   vp8_header_->partitionId = 1;
    661   vp8_header_->beginningOfPartition = false;
    662   packet_header_.header.markerBit = true;
    663   packet_header_.header.sequenceNumber += 1;
    664   FillPacket(3);
    665   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    666   EXPECT_EQ(session_.InsertPacket(*packet,
    667                                   frame_buffer_,
    668                                   kNoErrors,
    669                                   frame_data),
    670             packet_buffer_size());
    671   delete packet;
    672 
    673   // No packet should be removed.
    674   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    675                                                  frame_buffer_size(),
    676                                                  &fragmentation_),
    677             4 * packet_buffer_size());
    678   SCOPED_TRACE("Calling VerifyPartition");
    679   EXPECT_TRUE(VerifyPartition(0, 2, 0));
    680   SCOPED_TRACE("Calling VerifyPartition");
    681   EXPECT_TRUE(VerifyPartition(1, 2, 2));
    682 }
    683 
    684 TEST_F(TestVP8Partitions, TwoPartitionsLossWrap) {
    685   // Partition 0       | Partition 1
    686   // [ fffd ] [ fffe ] | [ ffff ] [ 1 ]
    687   packet_header_.type.Video.isFirstPacket = true;
    688   vp8_header_->beginningOfPartition = true;
    689   vp8_header_->partitionId = 0;
    690   packet_header_.header.markerBit = false;
    691   packet_header_.header.sequenceNumber = 0xfffd;
    692   FillPacket(0);
    693   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    694                                     packet_header_);
    695   EXPECT_EQ(session_.InsertPacket(*packet,
    696                                   frame_buffer_,
    697                                   kNoErrors,
    698                                   frame_data),
    699             packet_buffer_size());
    700   delete packet;
    701 
    702   packet_header_.type.Video.isFirstPacket = false;
    703   vp8_header_->partitionId = 0;
    704   vp8_header_->beginningOfPartition = false;
    705   packet_header_.header.markerBit = false;
    706   packet_header_.header.sequenceNumber += 1;
    707   FillPacket(1);
    708   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    709   EXPECT_EQ(session_.InsertPacket(*packet,
    710                                   frame_buffer_,
    711                                   kNoErrors,
    712                                   frame_data),
    713             packet_buffer_size());
    714   delete packet;
    715 
    716   packet_header_.type.Video.isFirstPacket = false;
    717   vp8_header_->partitionId = 1;
    718   vp8_header_->beginningOfPartition = true;
    719   packet_header_.header.markerBit = false;
    720   packet_header_.header.sequenceNumber += 1;
    721   FillPacket(2);
    722   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    723   EXPECT_EQ(session_.InsertPacket(*packet,
    724                                   frame_buffer_,
    725                                   kNoErrors,
    726                                   frame_data),
    727             packet_buffer_size());
    728   delete packet;
    729 
    730   packet_header_.type.Video.isFirstPacket = false;
    731   vp8_header_->partitionId = 1;
    732   vp8_header_->beginningOfPartition = false;
    733   packet_header_.header.markerBit = true;
    734   packet_header_.header.sequenceNumber += 2;
    735   FillPacket(3);
    736   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    737   EXPECT_EQ(session_.InsertPacket(*packet,
    738                                   frame_buffer_,
    739                                   kNoErrors,
    740                                   frame_data),
    741             packet_buffer_size());
    742   delete packet;
    743 
    744   // One packet should be removed from the last partition
    745   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    746                                                  frame_buffer_size(),
    747                                                  &fragmentation_),
    748             3 * packet_buffer_size());
    749   SCOPED_TRACE("Calling VerifyPartition");
    750   EXPECT_TRUE(VerifyPartition(0, 2, 0));
    751   SCOPED_TRACE("Calling VerifyPartition");
    752   EXPECT_TRUE(VerifyPartition(1, 1, 2));
    753 }
    754 
    755 
    756 TEST_F(TestVP8Partitions, ThreePartitionsOneMissing) {
    757   // Partition 1  |Partition 2    | Partition 3
    758   // [ 1 ] [ 2 ]  |               | [ 5 ] | [ 6 ]
    759   packet_header_.type.Video.isFirstPacket = true;
    760   vp8_header_->beginningOfPartition = true;
    761   vp8_header_->partitionId = 0;
    762   packet_header_.header.markerBit = false;
    763   packet_header_.header.sequenceNumber = 1;
    764   FillPacket(1);
    765   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    766                                     packet_header_);
    767   EXPECT_EQ(session_.InsertPacket(*packet,
    768                                   frame_buffer_,
    769                                   kNoErrors,
    770                                   frame_data),
    771             packet_buffer_size());
    772   delete packet;
    773 
    774   packet_header_.type.Video.isFirstPacket = false;
    775   vp8_header_->partitionId = 0;
    776   vp8_header_->beginningOfPartition = false;
    777   packet_header_.header.markerBit = false;
    778   packet_header_.header.sequenceNumber += 1;
    779   FillPacket(2);
    780   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    781   EXPECT_EQ(session_.InsertPacket(*packet,
    782                                   frame_buffer_,
    783                                   kNoErrors,
    784                                   frame_data),
    785             packet_buffer_size());
    786   delete packet;
    787 
    788   packet_header_.type.Video.isFirstPacket = false;
    789   vp8_header_->partitionId = 2;
    790   vp8_header_->beginningOfPartition = true;
    791   packet_header_.header.markerBit = false;
    792   packet_header_.header.sequenceNumber += 3;
    793   FillPacket(5);
    794   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    795   EXPECT_EQ(session_.InsertPacket(*packet,
    796                                   frame_buffer_,
    797                                   kNoErrors,
    798                                   frame_data),
    799             packet_buffer_size());
    800   delete packet;
    801 
    802   packet_header_.type.Video.isFirstPacket = false;
    803   vp8_header_->partitionId = 2;
    804   vp8_header_->beginningOfPartition = false;
    805   packet_header_.header.markerBit = true;
    806   packet_header_.header.sequenceNumber += 1;
    807   FillPacket(6);
    808   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    809   EXPECT_EQ(session_.InsertPacket(*packet,
    810                                   frame_buffer_,
    811                                   kNoErrors,
    812                                   frame_data),
    813             packet_buffer_size());
    814   delete packet;
    815 
    816   // No packet should be removed.
    817   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    818                                                  frame_buffer_size(),
    819                                                  &fragmentation_),
    820             4 * packet_buffer_size());
    821   SCOPED_TRACE("Calling VerifyPartition");
    822   EXPECT_TRUE(VerifyPartition(0, 2, 1));
    823   SCOPED_TRACE("Calling VerifyPartition");
    824   EXPECT_TRUE(VerifyPartition(2, 2, 5));
    825 }
    826 
    827 TEST_F(TestVP8Partitions, ThreePartitionsLossInSecond) {
    828   // Partition 0  |Partition 1          | Partition 2
    829   // [ 1 ] [ 2 ]  |        [ 4 ] [ 5 ]  | [ 6 ] [ 7 ]
    830   packet_header_.type.Video.isFirstPacket = true;
    831   vp8_header_->beginningOfPartition = true;
    832   vp8_header_->partitionId = 0;
    833   packet_header_.header.markerBit = false;
    834   packet_header_.header.sequenceNumber = 1;
    835   FillPacket(1);
    836   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    837                                     packet_header_);
    838   EXPECT_EQ(session_.InsertPacket(*packet,
    839                                   frame_buffer_,
    840                                   kNoErrors,
    841                                   frame_data),
    842             packet_buffer_size());
    843   delete packet;
    844 
    845   packet_header_.type.Video.isFirstPacket = false;
    846   vp8_header_->partitionId = 0;
    847   vp8_header_->beginningOfPartition = false;
    848   packet_header_.header.markerBit = false;
    849   packet_header_.header.sequenceNumber += 1;
    850   FillPacket(2);
    851   packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    852                          packet_header_);
    853   EXPECT_EQ(session_.InsertPacket(*packet,
    854                                   frame_buffer_,
    855                                   kNoErrors,
    856                                   frame_data),
    857             packet_buffer_size());
    858   delete packet;
    859 
    860   packet_header_.type.Video.isFirstPacket = false;
    861   vp8_header_->partitionId = 1;
    862   vp8_header_->beginningOfPartition = false;
    863   packet_header_.header.markerBit = false;
    864   packet_header_.header.sequenceNumber += 2;
    865   FillPacket(4);
    866   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    867   EXPECT_EQ(session_.InsertPacket(*packet,
    868                                   frame_buffer_,
    869                                   kNoErrors,
    870                                   frame_data),
    871             packet_buffer_size());
    872   delete packet;
    873 
    874   packet_header_.type.Video.isFirstPacket = false;
    875   vp8_header_->partitionId = 1;
    876   vp8_header_->beginningOfPartition = false;
    877   packet_header_.header.markerBit = false;
    878   packet_header_.header.sequenceNumber += 1;
    879   FillPacket(5);
    880   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    881   EXPECT_EQ(session_.InsertPacket(*packet,
    882                                   frame_buffer_,
    883                                   kNoErrors,
    884                                   frame_data),
    885             packet_buffer_size());
    886   delete packet;
    887 
    888   packet_header_.type.Video.isFirstPacket = false;
    889   vp8_header_->partitionId = 2;
    890   vp8_header_->beginningOfPartition = true;
    891   packet_header_.header.markerBit = false;
    892   packet_header_.header.sequenceNumber += 1;
    893   FillPacket(6);
    894   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    895   EXPECT_EQ(session_.InsertPacket(*packet,
    896                                   frame_buffer_,
    897                                   kNoErrors,
    898                                   frame_data),
    899             packet_buffer_size());
    900   delete packet;
    901 
    902   packet_header_.type.Video.isFirstPacket = false;
    903   vp8_header_->partitionId = 2;
    904   vp8_header_->beginningOfPartition = false;
    905   packet_header_.header.markerBit = true;
    906   packet_header_.header.sequenceNumber += 1;
    907   FillPacket(7);
    908   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    909   EXPECT_EQ(session_.InsertPacket(*packet,
    910                                   frame_buffer_,
    911                                   kNoErrors,
    912                                   frame_data),
    913             packet_buffer_size());
    914   delete packet;
    915 
    916   // 2 partitions left. 2 packets removed from second partition
    917   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    918                                                  frame_buffer_size(),
    919                                                  &fragmentation_),
    920             4 * packet_buffer_size());
    921   SCOPED_TRACE("Calling VerifyPartition");
    922   EXPECT_TRUE(VerifyPartition(0, 2, 1));
    923   SCOPED_TRACE("Calling VerifyPartition");
    924   EXPECT_TRUE(VerifyPartition(2, 2, 6));
    925 }
    926 
    927 TEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
    928   // Partition 0   | Partition 1         | Partition 2
    929   // [ 0           |           ]  [ 1 ]  | [ 2 ]
    930   packet_header_.type.Video.isFirstPacket = true;
    931   vp8_header_->beginningOfPartition = true;
    932   vp8_header_->partitionId = 0;
    933   packet_header_.header.markerBit = false;
    934   packet_header_.header.sequenceNumber = 0;
    935   FillPacket(0);
    936   VCMPacket* packet = new VCMPacket(packet_buffer_, packet_buffer_size(),
    937                                     packet_header_);
    938   EXPECT_EQ(session_.InsertPacket(*packet,
    939                                   frame_buffer_,
    940                                   kNoErrors,
    941                                   frame_data),
    942             packet_buffer_size());
    943   delete packet;
    944 
    945   packet_header_.type.Video.isFirstPacket = false;
    946   vp8_header_->partitionId = 1;
    947   vp8_header_->beginningOfPartition = false;
    948   packet_header_.header.markerBit = false;
    949   packet_header_.header.sequenceNumber += 1;
    950   FillPacket(1);
    951   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    952   EXPECT_EQ(session_.InsertPacket(*packet,
    953                                   frame_buffer_,
    954                                   kNoErrors,
    955                                   frame_data),
    956             packet_buffer_size());
    957   delete packet;
    958 
    959   packet_header_.type.Video.isFirstPacket = false;
    960   vp8_header_->partitionId = 2;
    961   vp8_header_->beginningOfPartition = true;
    962   packet_header_.header.markerBit = true;
    963   packet_header_.header.sequenceNumber += 1;
    964   FillPacket(2);
    965   packet = new VCMPacket(packet_buffer_, packet_buffer_size(), packet_header_);
    966   EXPECT_EQ(session_.InsertPacket(*packet,
    967                                   frame_buffer_,
    968                                   kNoErrors,
    969                                   frame_data),
    970             packet_buffer_size());
    971   delete packet;
    972 
    973   // No packets removed.
    974   EXPECT_EQ(session_.BuildVP8FragmentationHeader(frame_buffer_,
    975                                                  frame_buffer_size(),
    976                                                  &fragmentation_),
    977             3 * packet_buffer_size());
    978   SCOPED_TRACE("Calling VerifyPartition");
    979   EXPECT_TRUE(VerifyPartition(0, 2, 0));
    980   // This partition is aggregated in partition 0
    981   SCOPED_TRACE("Calling VerifyPartition");
    982   EXPECT_TRUE(VerifyPartition(1, 0, 0));
    983   SCOPED_TRACE("Calling VerifyPartition");
    984   EXPECT_TRUE(VerifyPartition(2, 1, 2));
    985 }
    986 
    987 TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
    988   packet_.isFirstPacket = false;
    989   packet_.completeNALU = kNaluComplete;
    990   packet_.frameType = kFrameEmpty;
    991   packet_.sizeBytes = 0;
    992   packet_.seqNum = 0;
    993   packet_.markerBit = false;
    994   EXPECT_EQ(0, session_.InsertPacket(packet_,
    995                                      frame_buffer_,
    996                                      kNoErrors,
    997                                      frame_data));
    998 
    999   EXPECT_EQ(0, session_.MakeDecodable());
   1000   EXPECT_EQ(0, session_.SessionLength());
   1001 }
   1002 
   1003 TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
   1004   packet_.isFirstPacket = true;
   1005   packet_.completeNALU = kNaluComplete;
   1006   packet_.seqNum = 0;
   1007   packet_.markerBit = false;
   1008   FillPacket(0);
   1009   EXPECT_EQ(session_.InsertPacket(packet_,
   1010                                   frame_buffer_,
   1011                                   kNoErrors,
   1012                                   frame_data),
   1013             packet_buffer_size());
   1014 
   1015   packet_.isFirstPacket = false;
   1016   packet_.completeNALU = kNaluComplete;
   1017   packet_.seqNum += 2;
   1018   packet_.markerBit = true;
   1019   FillPacket(2);
   1020   EXPECT_EQ(session_.InsertPacket(packet_,
   1021                                   frame_buffer_,
   1022                                   kNoErrors,
   1023                                   frame_data),
   1024             packet_buffer_size());
   1025 
   1026   EXPECT_EQ(0, session_.MakeDecodable());
   1027   EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
   1028   SCOPED_TRACE("Calling VerifyNalu");
   1029   EXPECT_TRUE(VerifyNalu(0, 1, 0));
   1030   SCOPED_TRACE("Calling VerifyNalu");
   1031   EXPECT_TRUE(VerifyNalu(1, 1, 2));
   1032 }
   1033 
   1034 TEST_F(TestNalUnits, LossInMiddleOfNalu) {
   1035   packet_.isFirstPacket = true;
   1036   packet_.completeNALU = kNaluComplete;
   1037   packet_.seqNum = 0;
   1038   packet_.markerBit = false;
   1039   FillPacket(0);
   1040   EXPECT_EQ(session_.InsertPacket(packet_,
   1041                                   frame_buffer_,
   1042                                   kNoErrors,
   1043                                   frame_data),
   1044             packet_buffer_size());
   1045 
   1046   packet_.isFirstPacket = false;
   1047   packet_.completeNALU = kNaluEnd;
   1048   packet_.seqNum += 2;
   1049   packet_.markerBit = true;
   1050   FillPacket(2);
   1051   EXPECT_EQ(session_.InsertPacket(packet_,
   1052                                   frame_buffer_,
   1053                                   kNoErrors,
   1054                                   frame_data),
   1055             packet_buffer_size());
   1056 
   1057   EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
   1058   EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
   1059   SCOPED_TRACE("Calling VerifyNalu");
   1060   EXPECT_TRUE(VerifyNalu(0, 1, 0));
   1061 }
   1062 
   1063 TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
   1064   packet_.isFirstPacket = true;
   1065   packet_.completeNALU = kNaluComplete;
   1066   packet_.seqNum = 0;
   1067   packet_.markerBit = false;
   1068   FillPacket(0);
   1069   EXPECT_EQ(session_.InsertPacket(packet_,
   1070                                   frame_buffer_,
   1071                                   kNoErrors,
   1072                                   frame_data),
   1073             packet_buffer_size());
   1074 
   1075   packet_.isFirstPacket = false;
   1076   packet_.completeNALU = kNaluIncomplete;
   1077   packet_.seqNum += 2;
   1078   packet_.markerBit = false;
   1079   FillPacket(1);
   1080   EXPECT_EQ(session_.InsertPacket(packet_,
   1081                                   frame_buffer_,
   1082                                   kNoErrors,
   1083                                   frame_data),
   1084             packet_buffer_size());
   1085 
   1086   EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
   1087   EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
   1088   SCOPED_TRACE("Calling VerifyNalu");
   1089   EXPECT_TRUE(VerifyNalu(0, 1, 0));
   1090 }
   1091 
   1092 TEST_F(TestNalUnits, ReorderWrapNoLoss) {
   1093   packet_.seqNum = 0xFFFF;
   1094   packet_.isFirstPacket = false;
   1095   packet_.completeNALU = kNaluIncomplete;
   1096   packet_.seqNum += 1;
   1097   packet_.markerBit = false;
   1098   FillPacket(1);
   1099   EXPECT_EQ(session_.InsertPacket(packet_,
   1100                                   frame_buffer_,
   1101                                   kNoErrors,
   1102                                   frame_data),
   1103             packet_buffer_size());
   1104 
   1105   packet_.isFirstPacket = true;
   1106   packet_.completeNALU = kNaluComplete;
   1107   packet_.seqNum -= 1;
   1108   packet_.markerBit = false;
   1109   FillPacket(0);
   1110   EXPECT_EQ(session_.InsertPacket(packet_,
   1111                                   frame_buffer_,
   1112                                   kNoErrors,
   1113                                   frame_data),
   1114             packet_buffer_size());
   1115 
   1116   packet_.isFirstPacket = false;
   1117   packet_.completeNALU = kNaluEnd;
   1118   packet_.seqNum += 2;
   1119   packet_.markerBit = true;
   1120   FillPacket(2);
   1121   EXPECT_EQ(session_.InsertPacket(packet_,
   1122                                   frame_buffer_,
   1123                                   kNoErrors,
   1124                                   frame_data),
   1125             packet_buffer_size());
   1126 
   1127   EXPECT_EQ(0, session_.MakeDecodable());
   1128   EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
   1129   SCOPED_TRACE("Calling VerifyNalu");
   1130   EXPECT_TRUE(VerifyNalu(0, 1, 0));
   1131 }
   1132 
   1133 TEST_F(TestNalUnits, WrapLosses) {
   1134   packet_.seqNum = 0xFFFF;
   1135   packet_.isFirstPacket = false;
   1136   packet_.completeNALU = kNaluIncomplete;
   1137   packet_.markerBit = false;
   1138   FillPacket(1);
   1139   EXPECT_EQ(session_.InsertPacket(packet_,
   1140                                   frame_buffer_,
   1141                                   kNoErrors,
   1142                                   frame_data),
   1143             packet_buffer_size());
   1144 
   1145   packet_.isFirstPacket = false;
   1146   packet_.completeNALU = kNaluEnd;
   1147   packet_.seqNum += 2;
   1148   packet_.markerBit = true;
   1149   FillPacket(2);
   1150   EXPECT_EQ(session_.InsertPacket(packet_,
   1151                                   frame_buffer_,
   1152                                   kNoErrors,
   1153                                   frame_data),
   1154             packet_buffer_size());
   1155 
   1156   EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
   1157   EXPECT_EQ(0, session_.SessionLength());
   1158 }
   1159 
   1160 TEST_F(TestNalUnits, ReorderWrapLosses) {
   1161   packet_.seqNum = 0xFFFF;
   1162 
   1163   packet_.isFirstPacket = false;
   1164   packet_.completeNALU = kNaluEnd;
   1165   packet_.seqNum += 2;
   1166   packet_.markerBit = true;
   1167   FillPacket(2);
   1168   EXPECT_EQ(session_.InsertPacket(packet_,
   1169                                   frame_buffer_,
   1170                                   kNoErrors,
   1171                                   frame_data),
   1172             packet_buffer_size());
   1173 
   1174   packet_.seqNum -= 2;
   1175   packet_.isFirstPacket = false;
   1176   packet_.completeNALU = kNaluIncomplete;
   1177   packet_.markerBit = false;
   1178   FillPacket(1);
   1179   EXPECT_EQ(session_.InsertPacket(packet_,
   1180                                   frame_buffer_,
   1181                                   kNoErrors,
   1182                                   frame_data),
   1183             packet_buffer_size());
   1184 
   1185   EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
   1186   EXPECT_EQ(0, session_.SessionLength());
   1187 }
   1188 
   1189 }  // namespace webrtc
   1190