Home | History | Annotate | Download | only in framer
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/test/simple_test_tick_clock.h"
      6 #include "media/cast/framer/framer.h"
      7 #include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 namespace media {
     11 namespace cast {
     12 
     13 class FramerTest : public ::testing::Test {
     14  protected:
     15   FramerTest()
     16       : mock_rtp_payload_feedback_(),
     17         framer_(&testing_clock_, &mock_rtp_payload_feedback_, 0, true, 0) {
     18     payload_.assign(kMaxIpPacketSize, 0);
     19 
     20     EXPECT_CALL(mock_rtp_payload_feedback_, CastFeedback(testing::_))
     21         .WillRepeatedly(testing::Return());
     22   }
     23 
     24   virtual ~FramerTest() {}
     25 
     26   std::vector<uint8> payload_;
     27   RtpCastHeader rtp_header_;
     28   MockRtpPayloadFeedback mock_rtp_payload_feedback_;
     29   Framer framer_;
     30   base::SimpleTestTickClock testing_clock_;
     31 
     32   DISALLOW_COPY_AND_ASSIGN(FramerTest);
     33 };
     34 
     35 TEST_F(FramerTest, EmptyState) {
     36   transport::EncodedFrame frame;
     37   bool next_frame = false;
     38   bool multiple = false;
     39   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
     40 }
     41 
     42 TEST_F(FramerTest, AlwaysStartWithKey) {
     43   transport::EncodedFrame frame;
     44   bool next_frame = false;
     45   bool complete = false;
     46   bool multiple = false;
     47   bool duplicate = false;
     48 
     49   // Insert non key first frame.
     50   complete = framer_.InsertPacket(
     51       payload_.data(), payload_.size(), rtp_header_, &duplicate);
     52   EXPECT_TRUE(complete);
     53   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
     54   rtp_header_.frame_id = 1;
     55   rtp_header_.reference_frame_id = 1;
     56   rtp_header_.is_key_frame = true;
     57   complete = framer_.InsertPacket(
     58       payload_.data(), payload_.size(), rtp_header_, &duplicate);
     59   EXPECT_TRUE(complete);
     60   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
     61   EXPECT_TRUE(next_frame);
     62   EXPECT_TRUE(multiple);
     63   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
     64   EXPECT_EQ(1u, frame.frame_id);
     65   EXPECT_EQ(1u, frame.referenced_frame_id);
     66   framer_.ReleaseFrame(frame.frame_id);
     67 }
     68 
     69 TEST_F(FramerTest, CompleteFrame) {
     70   transport::EncodedFrame frame;
     71   bool next_frame = false;
     72   bool complete = false;
     73   bool multiple = false;
     74   bool duplicate = false;
     75 
     76   // Start with a complete key frame.
     77   rtp_header_.is_key_frame = true;
     78   complete = framer_.InsertPacket(
     79       payload_.data(), payload_.size(), rtp_header_, &duplicate);
     80   EXPECT_TRUE(complete);
     81   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
     82   EXPECT_TRUE(next_frame);
     83   EXPECT_FALSE(multiple);
     84   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
     85   EXPECT_EQ(0u, frame.frame_id);
     86   EXPECT_EQ(0u, frame.referenced_frame_id);
     87   framer_.ReleaseFrame(frame.frame_id);
     88 
     89   // Incomplete delta.
     90   ++rtp_header_.frame_id;
     91   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
     92   rtp_header_.is_key_frame = false;
     93   rtp_header_.max_packet_id = 2;
     94   complete = framer_.InsertPacket(
     95       payload_.data(), payload_.size(), rtp_header_, &duplicate);
     96   EXPECT_FALSE(complete);
     97   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
     98 
     99   // Complete delta - can't skip, as incomplete sequence.
    100   ++rtp_header_.frame_id;
    101   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
    102   rtp_header_.max_packet_id = 0;
    103   complete = framer_.InsertPacket(
    104       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    105   EXPECT_TRUE(complete);
    106   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    107 }
    108 
    109 TEST_F(FramerTest, DuplicatePackets) {
    110   transport::EncodedFrame frame;
    111   bool next_frame = false;
    112   bool complete = false;
    113   bool multiple = false;
    114   bool duplicate = false;
    115 
    116   // Start with an incomplete key frame.
    117   rtp_header_.is_key_frame = true;
    118   rtp_header_.max_packet_id = 1;
    119   duplicate = true;
    120   complete = framer_.InsertPacket(
    121       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    122   EXPECT_FALSE(complete);
    123   EXPECT_FALSE(duplicate);
    124   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    125 
    126   // Add same packet again in incomplete key frame.
    127   duplicate = false;
    128   complete = framer_.InsertPacket(
    129       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    130   EXPECT_FALSE(complete);
    131   EXPECT_TRUE(duplicate);
    132   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    133 
    134   // Complete key frame.
    135   rtp_header_.packet_id = 1;
    136   duplicate = true;
    137   complete = framer_.InsertPacket(
    138       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    139   EXPECT_TRUE(complete);
    140   EXPECT_FALSE(duplicate);
    141   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    142   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    143   EXPECT_FALSE(multiple);
    144   EXPECT_EQ(0u, frame.referenced_frame_id);
    145 
    146   // Add same packet again in complete key frame.
    147   duplicate = false;
    148   complete = framer_.InsertPacket(
    149       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    150   EXPECT_FALSE(complete);
    151   EXPECT_TRUE(duplicate);
    152   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    153   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    154   EXPECT_EQ(0u, frame.frame_id);
    155   EXPECT_FALSE(multiple);
    156   EXPECT_EQ(0u, frame.referenced_frame_id);
    157   framer_.ReleaseFrame(frame.frame_id);
    158 
    159   // Incomplete delta frame.
    160   ++rtp_header_.frame_id;
    161   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
    162   rtp_header_.packet_id = 0;
    163   rtp_header_.is_key_frame = false;
    164   duplicate = true;
    165   complete = framer_.InsertPacket(
    166       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    167   EXPECT_FALSE(complete);
    168   EXPECT_FALSE(duplicate);
    169   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    170 
    171   // Add same packet again in incomplete delta frame.
    172   duplicate = false;
    173   complete = framer_.InsertPacket(
    174       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    175   EXPECT_FALSE(complete);
    176   EXPECT_TRUE(duplicate);
    177   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    178 
    179   // Complete delta frame.
    180   rtp_header_.packet_id = 1;
    181   duplicate = true;
    182   complete = framer_.InsertPacket(
    183       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    184   EXPECT_TRUE(complete);
    185   EXPECT_FALSE(duplicate);
    186   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    187   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    188   EXPECT_EQ(1u, frame.frame_id);
    189   EXPECT_EQ(0u, frame.referenced_frame_id);
    190   EXPECT_FALSE(multiple);
    191 
    192   // Add same packet again in complete delta frame.
    193   duplicate = false;
    194   complete = framer_.InsertPacket(
    195       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    196   EXPECT_FALSE(complete);
    197   EXPECT_TRUE(duplicate);
    198   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    199   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    200   EXPECT_EQ(1u, frame.frame_id);
    201   EXPECT_EQ(0u, frame.referenced_frame_id);
    202   EXPECT_FALSE(multiple);
    203 }
    204 
    205 TEST_F(FramerTest, ContinuousSequence) {
    206   transport::EncodedFrame frame;
    207   bool next_frame = false;
    208   bool complete = false;
    209   bool multiple = false;
    210   bool duplicate = false;
    211 
    212   // Start with a complete key frame.
    213   rtp_header_.is_key_frame = true;
    214   complete = framer_.InsertPacket(
    215       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    216   EXPECT_TRUE(complete);
    217   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    218   EXPECT_TRUE(next_frame);
    219   EXPECT_FALSE(multiple);
    220   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    221   EXPECT_EQ(0u, frame.frame_id);
    222   EXPECT_EQ(0u, frame.referenced_frame_id);
    223   framer_.ReleaseFrame(frame.frame_id);
    224 
    225   // Complete - not continuous.
    226   rtp_header_.frame_id = 2;
    227   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
    228   rtp_header_.is_key_frame = false;
    229   complete = framer_.InsertPacket(
    230       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    231   EXPECT_TRUE(complete);
    232   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    233 }
    234 
    235 TEST_F(FramerTest, Wrap) {
    236   // Insert key frame, frame_id = 255 (will jump to that)
    237   transport::EncodedFrame frame;
    238   bool next_frame = false;
    239   bool multiple = true;
    240   bool duplicate = false;
    241 
    242   // Start with a complete key frame.
    243   rtp_header_.is_key_frame = true;
    244   rtp_header_.frame_id = 255;
    245   rtp_header_.reference_frame_id = 255;
    246   framer_.InsertPacket(
    247       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    248   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    249   EXPECT_TRUE(next_frame);
    250   EXPECT_FALSE(multiple);
    251   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    252   EXPECT_EQ(255u, frame.frame_id);
    253   EXPECT_EQ(255u, frame.referenced_frame_id);
    254   framer_.ReleaseFrame(frame.frame_id);
    255 
    256   // Insert wrapped delta frame - should be continuous.
    257   rtp_header_.is_key_frame = false;
    258   rtp_header_.frame_id = 256;
    259   framer_.InsertPacket(
    260       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    261   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    262   EXPECT_TRUE(next_frame);
    263   EXPECT_FALSE(multiple);
    264   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    265   EXPECT_EQ(256u, frame.frame_id);
    266   EXPECT_EQ(255u, frame.referenced_frame_id);
    267   framer_.ReleaseFrame(frame.frame_id);
    268 }
    269 
    270 TEST_F(FramerTest, Reset) {
    271   transport::EncodedFrame frame;
    272   bool next_frame = false;
    273   bool complete = false;
    274   bool multiple = true;
    275   bool duplicate = false;
    276 
    277   // Start with a complete key frame.
    278   rtp_header_.is_key_frame = true;
    279   complete = framer_.InsertPacket(
    280       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    281   EXPECT_TRUE(complete);
    282   framer_.Reset();
    283   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    284 }
    285 
    286 TEST_F(FramerTest, RequireKeyAfterReset) {
    287   transport::EncodedFrame frame;
    288   bool next_frame = false;
    289   bool multiple = false;
    290   bool duplicate = false;
    291 
    292   framer_.Reset();
    293 
    294   // Start with a complete key frame.
    295   rtp_header_.is_key_frame = false;
    296   rtp_header_.frame_id = 0;
    297   framer_.InsertPacket(
    298       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    299   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    300   rtp_header_.frame_id = 1;
    301   rtp_header_.reference_frame_id = 1;
    302   rtp_header_.is_key_frame = true;
    303   framer_.InsertPacket(
    304       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    305   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    306   EXPECT_TRUE(next_frame);
    307   EXPECT_TRUE(multiple);
    308 }
    309 
    310 TEST_F(FramerTest, BasicNonLastReferenceId) {
    311   transport::EncodedFrame frame;
    312   bool next_frame = false;
    313   bool multiple = false;
    314   bool duplicate = false;
    315 
    316   rtp_header_.is_key_frame = true;
    317   rtp_header_.frame_id = 0;
    318   framer_.InsertPacket(
    319       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    320 
    321   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    322   EXPECT_FALSE(multiple);
    323   framer_.ReleaseFrame(frame.frame_id);
    324 
    325   rtp_header_.is_key_frame = false;
    326   rtp_header_.reference_frame_id = 0;
    327   rtp_header_.frame_id = 5;
    328   framer_.InsertPacket(
    329       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    330 
    331   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    332   EXPECT_FALSE(next_frame);
    333   EXPECT_FALSE(multiple);
    334 }
    335 
    336 TEST_F(FramerTest, InOrderReferenceFrameSelection) {
    337   // Create pattern: 0, 1, 4, 5.
    338   transport::EncodedFrame frame;
    339   bool next_frame = false;
    340   bool multiple = false;
    341   bool duplicate = false;
    342 
    343   rtp_header_.is_key_frame = true;
    344   rtp_header_.frame_id = 0;
    345   framer_.InsertPacket(
    346       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    347   rtp_header_.is_key_frame = false;
    348   rtp_header_.frame_id = 1;
    349   framer_.InsertPacket(
    350       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    351 
    352   // Insert frame #2 partially.
    353   rtp_header_.frame_id = 2;
    354   rtp_header_.max_packet_id = 1;
    355   framer_.InsertPacket(
    356       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    357   rtp_header_.frame_id = 4;
    358   rtp_header_.max_packet_id = 0;
    359   rtp_header_.reference_frame_id = 0;
    360   framer_.InsertPacket(
    361       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    362   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    363   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    364   EXPECT_EQ(0u, frame.frame_id);
    365   EXPECT_EQ(0u, frame.referenced_frame_id);
    366   EXPECT_FALSE(multiple);
    367   framer_.ReleaseFrame(frame.frame_id);
    368   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    369   EXPECT_TRUE(next_frame);
    370   EXPECT_TRUE(multiple);
    371   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    372   EXPECT_EQ(1u, frame.frame_id);
    373   EXPECT_EQ(0u, frame.referenced_frame_id);
    374   framer_.ReleaseFrame(frame.frame_id);
    375   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    376   EXPECT_FALSE(next_frame);
    377   EXPECT_FALSE(multiple);
    378   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    379   EXPECT_EQ(4u, frame.frame_id);
    380   EXPECT_EQ(0u, frame.referenced_frame_id);
    381   framer_.ReleaseFrame(frame.frame_id);
    382   // Insert remaining packet of frame #2 - should no be continuous.
    383   rtp_header_.frame_id = 2;
    384   rtp_header_.packet_id = 1;
    385   framer_.InsertPacket(
    386       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    387   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    388   rtp_header_.frame_id = 5;
    389   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
    390   rtp_header_.packet_id = 0;
    391   rtp_header_.max_packet_id = 0;
    392   framer_.InsertPacket(
    393       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    394   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    395   EXPECT_TRUE(next_frame);
    396   EXPECT_FALSE(multiple);
    397   EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
    398   EXPECT_EQ(5u, frame.frame_id);
    399   EXPECT_EQ(4u, frame.referenced_frame_id);
    400 }
    401 
    402 TEST_F(FramerTest, AudioWrap) {
    403   // All audio frames are marked as key frames.
    404   transport::EncodedFrame frame;
    405   bool next_frame = false;
    406   bool multiple = false;
    407   bool duplicate = false;
    408 
    409   rtp_header_.is_key_frame = true;
    410   rtp_header_.frame_id = 254;
    411   rtp_header_.reference_frame_id = 254;
    412 
    413   framer_.InsertPacket(
    414       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    415   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    416   EXPECT_TRUE(next_frame);
    417   EXPECT_FALSE(multiple);
    418   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    419   EXPECT_EQ(254u, frame.frame_id);
    420   EXPECT_EQ(254u, frame.referenced_frame_id);
    421   framer_.ReleaseFrame(frame.frame_id);
    422 
    423   rtp_header_.frame_id = 255;
    424   rtp_header_.reference_frame_id = 255;
    425   framer_.InsertPacket(
    426       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    427 
    428   // Insert wrapped frame - should be continuous.
    429   rtp_header_.frame_id = 256;
    430   rtp_header_.reference_frame_id = 256;
    431   framer_.InsertPacket(
    432       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    433 
    434   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    435   EXPECT_TRUE(next_frame);
    436   EXPECT_TRUE(multiple);
    437   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    438   EXPECT_EQ(255u, frame.frame_id);
    439   EXPECT_EQ(255u, frame.referenced_frame_id);
    440   framer_.ReleaseFrame(frame.frame_id);
    441 
    442   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    443   EXPECT_TRUE(next_frame);
    444   EXPECT_FALSE(multiple);
    445   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    446   EXPECT_EQ(256u, frame.frame_id);
    447   EXPECT_EQ(256u, frame.referenced_frame_id);
    448   framer_.ReleaseFrame(frame.frame_id);
    449 }
    450 
    451 TEST_F(FramerTest, AudioWrapWithMissingFrame) {
    452   // All audio frames are marked as key frames.
    453   transport::EncodedFrame frame;
    454   bool next_frame = false;
    455   bool multiple = true;
    456   bool duplicate = false;
    457 
    458   // Insert and get first packet.
    459   rtp_header_.is_key_frame = true;
    460   rtp_header_.frame_id = 253;
    461   rtp_header_.reference_frame_id = 253;
    462   framer_.InsertPacket(
    463       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    464   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    465   EXPECT_TRUE(next_frame);
    466   EXPECT_FALSE(multiple);
    467   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    468   EXPECT_EQ(253u, frame.frame_id);
    469   EXPECT_EQ(253u, frame.referenced_frame_id);
    470   framer_.ReleaseFrame(frame.frame_id);
    471 
    472   // Insert third and fourth packets.
    473   rtp_header_.frame_id = 255;
    474   rtp_header_.reference_frame_id = 255;
    475   framer_.InsertPacket(
    476       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    477   rtp_header_.frame_id = 256;
    478   rtp_header_.reference_frame_id = 256;
    479   framer_.InsertPacket(
    480       payload_.data(), payload_.size(), rtp_header_, &duplicate);
    481 
    482   // Get third and fourth packets.
    483   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    484   EXPECT_FALSE(next_frame);
    485   EXPECT_TRUE(multiple);
    486   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    487   EXPECT_EQ(255u, frame.frame_id);
    488   EXPECT_EQ(255u, frame.referenced_frame_id);
    489   framer_.ReleaseFrame(frame.frame_id);
    490   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
    491   EXPECT_TRUE(next_frame);
    492   EXPECT_FALSE(multiple);
    493   EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
    494   EXPECT_EQ(256u, frame.frame_id);
    495   EXPECT_EQ(256u, frame.referenced_frame_id);
    496   framer_.ReleaseFrame(frame.frame_id);
    497 }
    498 
    499 }  // namespace cast
    500 }  // namespace media
    501