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