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 |
11 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
12 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | 12 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
13 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 13 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
14 #include "webrtc/test/gmock.h" | 14 #include "webrtc/test/gmock.h" |
15 #include "webrtc/test/gtest.h" | 15 #include "webrtc/test/gtest.h" |
16 | 16 |
17 namespace webrtc { | 17 namespace webrtc { |
18 namespace { | 18 namespace { |
19 | 19 |
| 20 using ::testing::ElementsAre; |
20 using ::testing::ElementsAreArray; | 21 using ::testing::ElementsAreArray; |
21 using ::testing::make_tuple; | 22 using ::testing::make_tuple; |
22 | 23 |
23 const int8_t kPayloadType = 100; | 24 const int8_t kPayloadType = 100; |
24 const uint32_t kSsrc = 0x12345678; | 25 const uint32_t kSsrc = 0x12345678; |
25 const uint16_t kSeqNum = 88; | 26 const uint16_t kSeqNum = 88; |
26 const uint32_t kTimestamp = 0x65431278; | 27 const uint32_t kTimestamp = 0x65431278; |
27 | 28 |
28 } // namespace | 29 } // namespace |
29 | 30 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); | 142 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); |
142 RTPHeader header; | 143 RTPHeader header; |
143 | 144 |
144 EXPECT_TRUE(parser.Parse(&header, &extensions)); | 145 EXPECT_TRUE(parser.Parse(&header, &extensions)); |
145 | 146 |
146 // Parse should ignore extension. | 147 // Parse should ignore extension. |
147 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); | 148 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); |
148 EXPECT_EQ(sizeof(kPacket), header.headerLength); | 149 EXPECT_EQ(sizeof(kPacket), header.headerLength); |
149 } | 150 } |
150 | 151 |
151 TEST(RtpHeaderParser, ParseAll6Extensions) { | 152 TEST(RtpHeaderParser, ParseAll8Extensions) { |
152 const uint8_t kAudioLevel = 0x5a; | 153 const uint8_t kAudioLevel = 0x5a; |
153 // clang-format off | 154 // clang-format off |
154 const uint8_t kPacket[] = { | 155 const uint8_t kPacket[] = { |
155 0x90, kPayloadType, 0x00, kSeqNum, | 156 0x90, kPayloadType, 0x00, kSeqNum, |
156 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 157 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
157 0x12, 0x34, 0x56, 0x78, // kSsrc. | 158 0x12, 0x34, 0x56, 0x78, // kSsrc. |
158 0xbe, 0xde, 0x00, 0x05, // Extension of size 5x32bit word. | 159 0xbe, 0xde, 0x00, 0x08, // Extension of size 8x32bit words. |
159 0x40, 0x80|kAudioLevel, // AudioLevel. | 160 0x40, 0x80|kAudioLevel, // AudioLevel. |
160 0x22, 0x01, 0x56, 0xce, // TransmissionOffset. | 161 0x22, 0x01, 0x56, 0xce, // TransmissionOffset. |
161 0x62, 0x12, 0x34, 0x56, // AbsoluteSendTime. | 162 0x62, 0x12, 0x34, 0x56, // AbsoluteSendTime. |
162 0x81, 0xce, 0xab, // TransportSequenceNumber. | 163 0x81, 0xce, 0xab, // TransportSequenceNumber. |
163 0xa0, 0x03, // VideoRotation. | 164 0xa0, 0x03, // VideoRotation. |
164 0xb2, 0x12, 0x48, 0x76, // PlayoutDelayLimits. | 165 0xb2, 0x12, 0x48, 0x76, // PlayoutDelayLimits. |
165 0x00, // Padding to 32bit boundary. | 166 0xc2, 'r', 't', 'x', // RtpStreamId |
| 167 0xd5, 's', 't', 'r', 'e', 'a', 'm', // RepairedRtpStreamId |
| 168 0x00, 0x00, // Padding to 32bit boundary. |
166 }; | 169 }; |
167 // clang-format on | 170 // clang-format on |
168 ASSERT_EQ(sizeof(kPacket) % 4, 0u); | 171 ASSERT_EQ(sizeof(kPacket) % 4, 0u); |
169 | 172 |
170 RtpHeaderExtensionMap extensions; | 173 RtpHeaderExtensionMap extensions; |
171 extensions.Register<TransmissionOffset>(2); | 174 extensions.Register<TransmissionOffset>(2); |
172 extensions.Register<AudioLevel>(4); | 175 extensions.Register<AudioLevel>(4); |
173 extensions.Register<AbsoluteSendTime>(6); | 176 extensions.Register<AbsoluteSendTime>(6); |
174 extensions.Register<TransportSequenceNumber>(8); | 177 extensions.Register<TransportSequenceNumber>(8); |
175 extensions.Register<VideoOrientation>(0xa); | 178 extensions.Register<VideoOrientation>(0xa); |
176 extensions.Register<PlayoutDelayLimits>(0xb); | 179 extensions.Register<PlayoutDelayLimits>(0xb); |
| 180 extensions.Register<RtpStreamId>(0xc); |
| 181 extensions.Register<RepairedRtpStreamId>(0xd); |
177 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); | 182 RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket)); |
178 RTPHeader header; | 183 RTPHeader header; |
179 | 184 |
180 EXPECT_TRUE(parser.Parse(&header, &extensions)); | 185 EXPECT_TRUE(parser.Parse(&header, &extensions)); |
181 | 186 |
182 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); | 187 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); |
183 EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset); | 188 EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset); |
184 | 189 |
185 EXPECT_TRUE(header.extension.hasAudioLevel); | 190 EXPECT_TRUE(header.extension.hasAudioLevel); |
186 EXPECT_TRUE(header.extension.voiceActivity); | 191 EXPECT_TRUE(header.extension.voiceActivity); |
187 EXPECT_EQ(kAudioLevel, header.extension.audioLevel); | 192 EXPECT_EQ(kAudioLevel, header.extension.audioLevel); |
188 | 193 |
189 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); | 194 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
190 EXPECT_EQ(0x123456U, header.extension.absoluteSendTime); | 195 EXPECT_EQ(0x123456U, header.extension.absoluteSendTime); |
191 | 196 |
192 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); | 197 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
193 EXPECT_EQ(0xceab, header.extension.transportSequenceNumber); | 198 EXPECT_EQ(0xceab, header.extension.transportSequenceNumber); |
194 | 199 |
195 EXPECT_TRUE(header.extension.hasVideoRotation); | 200 EXPECT_TRUE(header.extension.hasVideoRotation); |
196 EXPECT_EQ(kVideoRotation_270, header.extension.videoRotation); | 201 EXPECT_EQ(kVideoRotation_270, header.extension.videoRotation); |
197 | 202 |
198 EXPECT_EQ(0x124 * PlayoutDelayLimits::kGranularityMs, | 203 EXPECT_EQ(0x124 * PlayoutDelayLimits::kGranularityMs, |
199 header.extension.playout_delay.min_ms); | 204 header.extension.playout_delay.min_ms); |
200 EXPECT_EQ(0x876 * PlayoutDelayLimits::kGranularityMs, | 205 EXPECT_EQ(0x876 * PlayoutDelayLimits::kGranularityMs, |
201 header.extension.playout_delay.max_ms); | 206 header.extension.playout_delay.max_ms); |
| 207 EXPECT_EQ(header.extension.stream_id, StreamId("rtx")); |
| 208 EXPECT_EQ(header.extension.repaired_stream_id, StreamId("stream")); |
202 } | 209 } |
203 | 210 |
204 TEST(RtpHeaderParser, ParseWithCsrcsExtensionAndPadding) { | 211 TEST(RtpHeaderParser, ParseWithCsrcsExtensionAndPadding) { |
205 const uint8_t kPacketPaddingSize = 8; | 212 const uint8_t kPacketPaddingSize = 8; |
206 const uint32_t kCsrcs[] = {0x34567890, 0x32435465}; | 213 const uint32_t kCsrcs[] = {0x34567890, 0x32435465}; |
207 const size_t kPayloadSize = 7; | 214 const size_t kPayloadSize = 7; |
208 // clang-format off | 215 // clang-format off |
209 const uint8_t kPacket[] = { | 216 const uint8_t kPacket[] = { |
210 0xb2, kPayloadType, 0x00, kSeqNum, | 217 0xb2, kPayloadType, 0x00, kSeqNum, |
211 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 218 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
(...skipping 19 matching lines...) Expand all Loading... |
231 EXPECT_THAT(make_tuple(header.arrOfCSRCs, header.numCSRCs), | 238 EXPECT_THAT(make_tuple(header.arrOfCSRCs, header.numCSRCs), |
232 ElementsAreArray(kCsrcs)); | 239 ElementsAreArray(kCsrcs)); |
233 EXPECT_EQ(kPacketPaddingSize, header.paddingLength); | 240 EXPECT_EQ(kPacketPaddingSize, header.paddingLength); |
234 EXPECT_THAT(sizeof(kPacket) - kPayloadSize - kPacketPaddingSize, | 241 EXPECT_THAT(sizeof(kPacket) - kPayloadSize - kPacketPaddingSize, |
235 header.headerLength); | 242 header.headerLength); |
236 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); | 243 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); |
237 EXPECT_EQ(0x56ce, header.extension.transmissionTimeOffset); | 244 EXPECT_EQ(0x56ce, header.extension.transmissionTimeOffset); |
238 } | 245 } |
239 | 246 |
240 } // namespace webrtc | 247 } // namespace webrtc |
OLD | NEW |