OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); | 141 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); |
142 RTPHeader header; | 142 RTPHeader header; |
143 | 143 |
144 EXPECT_TRUE(parser.Parse(&header, &extensions)); | 144 EXPECT_TRUE(parser.Parse(&header, &extensions)); |
145 | 145 |
146 // Parse should ignore extension. | 146 // Parse should ignore extension. |
147 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); | 147 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); |
148 EXPECT_EQ(sizeof(kPacket), header.headerLength); | 148 EXPECT_EQ(sizeof(kPacket), header.headerLength); |
149 } | 149 } |
150 | 150 |
151 TEST(RtpHeaderParser, ParseAll6Extensions) { | 151 TEST(RtpHeaderParser, ParseAll8Extensions) { |
152 const uint8_t kAudioLevel = 0x5a; | 152 const uint8_t kAudioLevel = 0x5a; |
153 // clang-format off | 153 // clang-format off |
154 const uint8_t kPacket[] = { | 154 const uint8_t kPacket[] = { |
155 0x90, kPayloadType, 0x00, kSeqNum, | 155 0x90, kPayloadType, 0x00, kSeqNum, |
156 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 156 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
157 0x12, 0x34, 0x56, 0x78, // kSsrc. | 157 0x12, 0x34, 0x56, 0x78, // kSsrc. |
158 0xbe, 0xde, 0x00, 0x05, // Extension of size 5x32bit word. | 158 0xbe, 0xde, 0x00, 0x08, // Extension of size 8x32bit words. |
159 0x40, 0x80|kAudioLevel, // AudioLevel. | 159 0x40, 0x80|kAudioLevel, // AudioLevel. |
160 0x22, 0x01, 0x56, 0xce, // TransmissionOffset. | 160 0x22, 0x01, 0x56, 0xce, // TransmissionOffset. |
161 0x62, 0x12, 0x34, 0x56, // AbsoluteSendTime. | 161 0x62, 0x12, 0x34, 0x56, // AbsoluteSendTime. |
162 0x81, 0xce, 0xab, // TransportSequenceNumber. | 162 0x81, 0xce, 0xab, // TransportSequenceNumber. |
163 0xa0, 0x03, // VideoRotation. | 163 0xa0, 0x03, // VideoRotation. |
164 0xb2, 0x12, 0x48, 0x76, // PlayoutDelayLimits. | 164 0xb2, 0x12, 0x48, 0x76, // PlayoutDelayLimits. |
165 0x00, // Padding to 32bit boundary. | 165 0xc2, 'r', 't', 'x', // RtpStreamId |
| 166 0xd5, 's', 't', 'r', 'e', 'a', 'm', // RepairedRtpStreamId |
| 167 0x00, 0x00, // Padding to 32bit boundary. |
166 }; | 168 }; |
167 // clang-format on | 169 // clang-format on |
168 ASSERT_EQ(sizeof(kPacket) % 4, 0u); | 170 ASSERT_EQ(sizeof(kPacket) % 4, 0u); |
169 | 171 |
170 RtpHeaderExtensionMap extensions; | 172 RtpHeaderExtensionMap extensions; |
171 extensions.Register<TransmissionOffset>(2); | 173 extensions.Register<TransmissionOffset>(2); |
172 extensions.Register<AudioLevel>(4); | 174 extensions.Register<AudioLevel>(4); |
173 extensions.Register<AbsoluteSendTime>(6); | 175 extensions.Register<AbsoluteSendTime>(6); |
174 extensions.Register<TransportSequenceNumber>(8); | 176 extensions.Register<TransportSequenceNumber>(8); |
175 extensions.Register<VideoOrientation>(0xa); | 177 extensions.Register<VideoOrientation>(0xa); |
176 extensions.Register<PlayoutDelayLimits>(0xb); | 178 extensions.Register<PlayoutDelayLimits>(0xb); |
| 179 extensions.Register<RtpStreamId>(0xc); |
| 180 extensions.Register<RepairedRtpStreamId>(0xd); |
177 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); | 181 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); |
178 RTPHeader header; | 182 RTPHeader header; |
179 | 183 |
180 EXPECT_TRUE(parser.Parse(&header, &extensions)); | 184 EXPECT_TRUE(parser.Parse(&header, &extensions)); |
181 | 185 |
182 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); | 186 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); |
183 EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset); | 187 EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset); |
184 | 188 |
185 EXPECT_TRUE(header.extension.hasAudioLevel); | 189 EXPECT_TRUE(header.extension.hasAudioLevel); |
186 EXPECT_TRUE(header.extension.voiceActivity); | 190 EXPECT_TRUE(header.extension.voiceActivity); |
187 EXPECT_EQ(kAudioLevel, header.extension.audioLevel); | 191 EXPECT_EQ(kAudioLevel, header.extension.audioLevel); |
188 | 192 |
189 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); | 193 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
190 EXPECT_EQ(0x123456U, header.extension.absoluteSendTime); | 194 EXPECT_EQ(0x123456U, header.extension.absoluteSendTime); |
191 | 195 |
192 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); | 196 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
193 EXPECT_EQ(0xceab, header.extension.transportSequenceNumber); | 197 EXPECT_EQ(0xceab, header.extension.transportSequenceNumber); |
194 | 198 |
195 EXPECT_TRUE(header.extension.hasVideoRotation); | 199 EXPECT_TRUE(header.extension.hasVideoRotation); |
196 EXPECT_EQ(kVideoRotation_270, header.extension.videoRotation); | 200 EXPECT_EQ(kVideoRotation_270, header.extension.videoRotation); |
197 | 201 |
198 EXPECT_EQ(0x124 * PlayoutDelayLimits::kGranularityMs, | 202 EXPECT_EQ(0x124 * PlayoutDelayLimits::kGranularityMs, |
199 header.extension.playout_delay.min_ms); | 203 header.extension.playout_delay.min_ms); |
200 EXPECT_EQ(0x876 * PlayoutDelayLimits::kGranularityMs, | 204 EXPECT_EQ(0x876 * PlayoutDelayLimits::kGranularityMs, |
201 header.extension.playout_delay.max_ms); | 205 header.extension.playout_delay.max_ms); |
| 206 EXPECT_EQ(header.extension.stream_id, StreamId("rtx")); |
| 207 EXPECT_EQ(header.extension.repaired_stream_id, StreamId("stream")); |
| 208 } |
| 209 |
| 210 TEST(RtpHeaderParser, ParseMalformedRsidExtensions) { |
| 211 // clang-format off |
| 212 const uint8_t kPacket[] = { |
| 213 0x90, kPayloadType, 0x00, kSeqNum, |
| 214 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
| 215 0x12, 0x34, 0x56, 0x78, // kSsrc. |
| 216 0xbe, 0xde, 0x00, 0x03, // Extension of size 3x32bit words. |
| 217 0xc2, '\0', 't', 'x', // empty RtpStreamId |
| 218 0xd5, 's', 't', 'r', '\0', 'a', 'm', // RepairedRtpStreamId |
| 219 0x00, // Padding to 32bit boundary. |
| 220 }; |
| 221 // clang-format on |
| 222 ASSERT_EQ(sizeof(kPacket) % 4, 0u); |
| 223 |
| 224 RtpHeaderExtensionMap extensions; |
| 225 extensions.Register<RtpStreamId>(0xc); |
| 226 extensions.Register<RepairedRtpStreamId>(0xd); |
| 227 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); |
| 228 RTPHeader header; |
| 229 |
| 230 EXPECT_TRUE(parser.Parse(&header, &extensions)); |
| 231 EXPECT_TRUE(header.extension.stream_id.empty()); |
| 232 EXPECT_EQ(header.extension.repaired_stream_id, StreamId("str")); |
202 } | 233 } |
203 | 234 |
204 TEST(RtpHeaderParser, ParseWithCsrcsExtensionAndPadding) { | 235 TEST(RtpHeaderParser, ParseWithCsrcsExtensionAndPadding) { |
205 const uint8_t kPacketPaddingSize = 8; | 236 const uint8_t kPacketPaddingSize = 8; |
206 const uint32_t kCsrcs[] = {0x34567890, 0x32435465}; | 237 const uint32_t kCsrcs[] = {0x34567890, 0x32435465}; |
207 const size_t kPayloadSize = 7; | 238 const size_t kPayloadSize = 7; |
208 // clang-format off | 239 // clang-format off |
209 const uint8_t kPacket[] = { | 240 const uint8_t kPacket[] = { |
210 0xb2, kPayloadType, 0x00, kSeqNum, | 241 0xb2, kPayloadType, 0x00, kSeqNum, |
211 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 242 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
(...skipping 19 matching lines...) Expand all Loading... |
231 EXPECT_THAT(make_tuple(header.arrOfCSRCs, header.numCSRCs), | 262 EXPECT_THAT(make_tuple(header.arrOfCSRCs, header.numCSRCs), |
232 ElementsAreArray(kCsrcs)); | 263 ElementsAreArray(kCsrcs)); |
233 EXPECT_EQ(kPacketPaddingSize, header.paddingLength); | 264 EXPECT_EQ(kPacketPaddingSize, header.paddingLength); |
234 EXPECT_THAT(sizeof(kPacket) - kPayloadSize - kPacketPaddingSize, | 265 EXPECT_THAT(sizeof(kPacket) - kPayloadSize - kPacketPaddingSize, |
235 header.headerLength); | 266 header.headerLength); |
236 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); | 267 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); |
237 EXPECT_EQ(0x56ce, header.extension.transmissionTimeOffset); | 268 EXPECT_EQ(0x56ce, header.extension.transmissionTimeOffset); |
238 } | 269 } |
239 | 270 |
240 } // namespace webrtc | 271 } // namespace webrtc |
OLD | NEW |