Home | History | Annotate | Download | only in rtp_parser
      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/memory/scoped_ptr.h"
      6 #include "base/rand_util.h"
      7 #include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h"
      8 #include "media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h"
      9 #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 
     12 namespace media {
     13 namespace cast {
     14 
     15 static const size_t kPacketLength = 1500;
     16 static const int kTestPayloadType = 127;
     17 static const uint32 kTestSsrc = 1234;
     18 static const uint32 kTestTimestamp = 111111;
     19 static const uint16 kTestSeqNum = 4321;
     20 static const uint8 kRefFrameId = 17;
     21 
     22 class RtpParserTest : public ::testing::Test {
     23  protected:
     24   RtpParserTest() : rtp_parser_(kTestSsrc, kTestPayloadType) {
     25     packet_builder_.SetSsrc(kTestSsrc);
     26     packet_builder_.SetSequenceNumber(kTestSeqNum);
     27     packet_builder_.SetTimestamp(kTestTimestamp);
     28     packet_builder_.SetPayloadType(kTestPayloadType);
     29     packet_builder_.SetMarkerBit(true);  // Only one packet.
     30     cast_header_.sender_ssrc = kTestSsrc;
     31     cast_header_.sequence_number = kTestSeqNum;
     32     cast_header_.rtp_timestamp = kTestTimestamp;
     33     cast_header_.payload_type = kTestPayloadType;
     34     cast_header_.marker = true;
     35   }
     36 
     37   virtual ~RtpParserTest() {}
     38 
     39   void ExpectParsesPacket() {
     40     RtpCastHeader parsed_header;
     41     const uint8* payload = NULL;
     42     size_t payload_size = -1;
     43     EXPECT_TRUE(rtp_parser_.ParsePacket(
     44         packet_, kPacketLength, &parsed_header, &payload, &payload_size));
     45 
     46     EXPECT_EQ(cast_header_.marker, parsed_header.marker);
     47     EXPECT_EQ(cast_header_.payload_type, parsed_header.payload_type);
     48     EXPECT_EQ(cast_header_.sequence_number, parsed_header.sequence_number);
     49     EXPECT_EQ(cast_header_.rtp_timestamp, parsed_header.rtp_timestamp);
     50     EXPECT_EQ(cast_header_.sender_ssrc, parsed_header.sender_ssrc);
     51 
     52     EXPECT_EQ(cast_header_.is_key_frame, parsed_header.is_key_frame);
     53     EXPECT_EQ(cast_header_.frame_id, parsed_header.frame_id);
     54     EXPECT_EQ(cast_header_.packet_id, parsed_header.packet_id);
     55     EXPECT_EQ(cast_header_.max_packet_id, parsed_header.max_packet_id);
     56     EXPECT_EQ(cast_header_.reference_frame_id,
     57               parsed_header.reference_frame_id);
     58 
     59     EXPECT_TRUE(!!payload);
     60     EXPECT_NE(static_cast<size_t>(-1), payload_size);
     61   }
     62 
     63   void ExpectDoesNotParsePacket() {
     64     RtpCastHeader parsed_header;
     65     const uint8* payload = NULL;
     66     size_t payload_size = -1;
     67     EXPECT_FALSE(rtp_parser_.ParsePacket(
     68         packet_, kPacketLength, &parsed_header, &payload, &payload_size));
     69   }
     70 
     71   RtpPacketBuilder packet_builder_;
     72   uint8 packet_[kPacketLength];
     73   RtpParser rtp_parser_;
     74   RtpCastHeader cast_header_;
     75 };
     76 
     77 TEST_F(RtpParserTest, ParseDefaultCastPacket) {
     78   packet_builder_.BuildHeader(packet_, kPacketLength);
     79   ExpectParsesPacket();
     80 }
     81 
     82 TEST_F(RtpParserTest, ParseNonDefaultCastPacket) {
     83   packet_builder_.SetKeyFrame(true);
     84   packet_builder_.SetFrameIds(10, 10);
     85   packet_builder_.SetPacketId(5);
     86   packet_builder_.SetMaxPacketId(15);
     87   packet_builder_.SetMarkerBit(false);
     88   packet_builder_.BuildHeader(packet_, kPacketLength);
     89   cast_header_.is_key_frame = true;
     90   cast_header_.frame_id = 10;
     91   cast_header_.reference_frame_id = 10;
     92   cast_header_.packet_id = 5;
     93   cast_header_.max_packet_id = 15;
     94   cast_header_.marker = false;
     95   ExpectParsesPacket();
     96 }
     97 
     98 TEST_F(RtpParserTest, TooBigPacketId) {
     99   packet_builder_.SetKeyFrame(true);
    100   packet_builder_.SetFrameIds(10, 10);
    101   packet_builder_.SetPacketId(15);
    102   packet_builder_.SetMaxPacketId(5);
    103   packet_builder_.BuildHeader(packet_, kPacketLength);
    104   cast_header_.is_key_frame = true;
    105   cast_header_.frame_id = 10;
    106   cast_header_.reference_frame_id = 10;
    107   cast_header_.packet_id = 15;
    108   cast_header_.max_packet_id = 5;
    109   ExpectDoesNotParsePacket();
    110 }
    111 
    112 TEST_F(RtpParserTest, MaxPacketId) {
    113   packet_builder_.SetKeyFrame(true);
    114   packet_builder_.SetFrameIds(10, 10);
    115   packet_builder_.SetPacketId(65535);
    116   packet_builder_.SetMaxPacketId(65535);
    117   packet_builder_.BuildHeader(packet_, kPacketLength);
    118   cast_header_.is_key_frame = true;
    119   cast_header_.frame_id = 10;
    120   cast_header_.reference_frame_id = 10;
    121   cast_header_.packet_id = 65535;
    122   cast_header_.max_packet_id = 65535;
    123   ExpectParsesPacket();
    124 }
    125 
    126 TEST_F(RtpParserTest, InvalidPayloadType) {
    127   packet_builder_.SetKeyFrame(true);
    128   packet_builder_.SetFrameIds(10, 10);
    129   packet_builder_.SetPacketId(65535);
    130   packet_builder_.SetMaxPacketId(65535);
    131   packet_builder_.SetPayloadType(kTestPayloadType - 1);
    132   packet_builder_.BuildHeader(packet_, kPacketLength);
    133   cast_header_.is_key_frame = true;
    134   cast_header_.frame_id = 10;
    135   cast_header_.reference_frame_id = 10;
    136   cast_header_.packet_id = 65535;
    137   cast_header_.max_packet_id = 65535;
    138   cast_header_.payload_type = kTestPayloadType - 1;
    139   ExpectDoesNotParsePacket();
    140 }
    141 
    142 TEST_F(RtpParserTest, InvalidSsrc) {
    143   packet_builder_.SetKeyFrame(true);
    144   packet_builder_.SetFrameIds(10, 10);
    145   packet_builder_.SetPacketId(65535);
    146   packet_builder_.SetMaxPacketId(65535);
    147   packet_builder_.SetSsrc(kTestSsrc - 1);
    148   packet_builder_.BuildHeader(packet_, kPacketLength);
    149   cast_header_.is_key_frame = true;
    150   cast_header_.frame_id = 10;
    151   cast_header_.reference_frame_id = 10;
    152   cast_header_.packet_id = 65535;
    153   cast_header_.max_packet_id = 65535;
    154   cast_header_.sender_ssrc = kTestSsrc - 1;
    155   ExpectDoesNotParsePacket();
    156 }
    157 
    158 TEST_F(RtpParserTest, ParseCastPacketWithSpecificFrameReference) {
    159   packet_builder_.SetFrameIds(kRefFrameId + 3, kRefFrameId);
    160   packet_builder_.BuildHeader(packet_, kPacketLength);
    161   cast_header_.frame_id = kRefFrameId + 3;
    162   cast_header_.reference_frame_id = kRefFrameId;
    163   ExpectParsesPacket();
    164 }
    165 
    166 TEST_F(RtpParserTest, ParseExpandingFrameIdTo32Bits) {
    167   const uint32 kMaxFrameId = 1000;
    168   packet_builder_.SetKeyFrame(true);
    169   cast_header_.is_key_frame = true;
    170   for (uint32 frame_id = 0; frame_id <= kMaxFrameId; ++frame_id) {
    171     packet_builder_.SetFrameIds(frame_id, frame_id);
    172     packet_builder_.BuildHeader(packet_, kPacketLength);
    173     cast_header_.frame_id = frame_id;
    174     cast_header_.reference_frame_id = frame_id;
    175     ExpectParsesPacket();
    176   }
    177 }
    178 
    179 TEST_F(RtpParserTest, ParseExpandingReferenceFrameIdTo32Bits) {
    180   const uint32 kMaxFrameId = 1000;
    181   const uint32 kMaxBackReferenceOffset = 10;
    182   packet_builder_.SetKeyFrame(false);
    183   cast_header_.is_key_frame = false;
    184   for (uint32 frame_id = kMaxBackReferenceOffset;
    185        frame_id <= kMaxFrameId; ++frame_id) {
    186     const uint32 reference_frame_id =
    187         frame_id - base::RandInt(1, kMaxBackReferenceOffset);
    188     packet_builder_.SetFrameIds(frame_id, reference_frame_id);
    189     packet_builder_.BuildHeader(packet_, kPacketLength);
    190     cast_header_.frame_id = frame_id;
    191     cast_header_.reference_frame_id = reference_frame_id;
    192     ExpectParsesPacket();
    193   }
    194 }
    195 
    196 }  //  namespace cast
    197 }  //  namespace media
    198