OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 25 matching lines...) Expand all Loading... |
36 | 36 |
37 static const size_t kNalHeaderSize = 1; | 37 static const size_t kNalHeaderSize = 1; |
38 static const size_t kFuAHeaderSize = 2; | 38 static const size_t kFuAHeaderSize = 2; |
39 | 39 |
40 // Bit masks for FU (A and B) indicators. | 40 // Bit masks for FU (A and B) indicators. |
41 enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F }; | 41 enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F }; |
42 | 42 |
43 // Bit masks for FU (A and B) headers. | 43 // Bit masks for FU (A and B) headers. |
44 enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 }; | 44 enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 }; |
45 | 45 |
| 46 static const H264PacketizationMode packetization_modes[] = { |
| 47 kH264PacketizationMode0, kH264PacketizationMode1}; |
| 48 |
| 49 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode, |
| 50 size_t max_payload_size) { |
| 51 RTPVideoTypeHeader type_header; |
| 52 type_header.H264.packetization_mode = mode; |
| 53 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, |
| 54 kEmptyFrame); |
| 55 } |
| 56 |
46 void VerifyFua(size_t fua_index, | 57 void VerifyFua(size_t fua_index, |
47 const uint8_t* expected_payload, | 58 const uint8_t* expected_payload, |
48 int offset, | 59 int offset, |
49 const uint8_t* packet, | 60 const uint8_t* packet, |
50 size_t length, | 61 size_t length, |
51 const std::vector<size_t>& expected_sizes) { | 62 const std::vector<size_t>& expected_sizes) { |
52 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) | 63 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) |
53 << "FUA index: " << fua_index; | 64 << "FUA index: " << fua_index; |
54 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. | 65 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. |
55 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; | 66 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; |
(...skipping 21 matching lines...) Expand all Loading... |
77 std::unique_ptr<uint8_t[]> frame; | 88 std::unique_ptr<uint8_t[]> frame; |
78 frame.reset(new uint8_t[frame_size]); | 89 frame.reset(new uint8_t[frame_size]); |
79 frame[0] = 0x05; // F=0, NRI=0, Type=5. | 90 frame[0] = 0x05; // F=0, NRI=0, Type=5. |
80 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { | 91 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { |
81 frame[i + kNalHeaderSize] = i; | 92 frame[i + kNalHeaderSize] = i; |
82 } | 93 } |
83 RTPFragmentationHeader fragmentation; | 94 RTPFragmentationHeader fragmentation; |
84 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 95 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
85 fragmentation.fragmentationOffset[0] = 0; | 96 fragmentation.fragmentationOffset[0] = 0; |
86 fragmentation.fragmentationLength[0] = frame_size; | 97 fragmentation.fragmentationLength[0] = frame_size; |
87 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( | 98 std::unique_ptr<RtpPacketizer> packetizer( |
88 kRtpVideoH264, max_payload_size, NULL, kEmptyFrame)); | 99 CreateH264Packetizer(kH264PacketizationMode1, max_payload_size)); |
89 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); | 100 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); |
90 | 101 |
91 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); | 102 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); |
92 size_t length = 0; | 103 size_t length = 0; |
93 bool last = false; | 104 bool last = false; |
94 size_t offset = kNalHeaderSize; | 105 size_t offset = kNalHeaderSize; |
95 for (size_t i = 0; i < expected_sizes.size(); ++i) { | 106 for (size_t i = 0; i < expected_sizes.size(); ++i) { |
96 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); | 107 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); |
97 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); | 108 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); |
98 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; | 109 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 ::testing::ElementsAreArray(packet, packet_length)); | 162 ::testing::ElementsAreArray(packet, packet_length)); |
152 } | 163 } |
153 } // namespace | 164 } // namespace |
154 | 165 |
155 TEST(RtpPacketizerH264Test, TestSingleNalu) { | 166 TEST(RtpPacketizerH264Test, TestSingleNalu) { |
156 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. | 167 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. |
157 RTPFragmentationHeader fragmentation; | 168 RTPFragmentationHeader fragmentation; |
158 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 169 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
159 fragmentation.fragmentationOffset[0] = 0; | 170 fragmentation.fragmentationOffset[0] = 0; |
160 fragmentation.fragmentationLength[0] = sizeof(frame); | 171 fragmentation.fragmentationLength[0] = sizeof(frame); |
161 std::unique_ptr<RtpPacketizer> packetizer( | 172 // This test should work in both packetization mode 0 and mode 1. |
162 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 173 for (auto packetization_mode : packetization_modes) { |
163 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); | 174 std::unique_ptr<RtpPacketizer> packetizer( |
164 uint8_t packet[kMaxPayloadSize] = {0}; | 175 CreateH264Packetizer(packetization_mode, kMaxPayloadSize)); |
165 size_t length = 0; | 176 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); |
166 bool last = false; | 177 uint8_t packet[kMaxPayloadSize] = {0}; |
167 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 178 size_t length = 0; |
168 EXPECT_EQ(2u, length); | 179 bool last = false; |
169 EXPECT_TRUE(last); | 180 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
170 VerifySingleNaluPayload( | 181 EXPECT_EQ(2u, length); |
171 fragmentation, 0, frame, sizeof(frame), packet, length); | 182 EXPECT_TRUE(last); |
172 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 183 VerifySingleNaluPayload(fragmentation, 0, frame, sizeof(frame), packet, |
| 184 length); |
| 185 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
| 186 } |
173 } | 187 } |
174 | 188 |
175 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { | 189 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { |
176 const size_t kFrameSize = kMaxPayloadSize + 100; | 190 const size_t kFrameSize = kMaxPayloadSize + 100; |
177 uint8_t frame[kFrameSize] = {0}; | 191 uint8_t frame[kFrameSize] = {0}; |
178 for (size_t i = 0; i < kFrameSize; ++i) | 192 for (size_t i = 0; i < kFrameSize; ++i) |
179 frame[i] = i; | 193 frame[i] = i; |
180 RTPFragmentationHeader fragmentation; | 194 RTPFragmentationHeader fragmentation; |
181 fragmentation.VerifyAndAllocateFragmentationHeader(2); | 195 fragmentation.VerifyAndAllocateFragmentationHeader(2); |
182 fragmentation.fragmentationOffset[0] = 0; | 196 fragmentation.fragmentationOffset[0] = 0; |
183 fragmentation.fragmentationLength[0] = kMaxPayloadSize; | 197 fragmentation.fragmentationLength[0] = kMaxPayloadSize; |
184 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; | 198 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; |
185 fragmentation.fragmentationLength[1] = 100; | 199 fragmentation.fragmentationLength[1] = 100; |
186 // Set NAL headers. | 200 // Set NAL headers. |
187 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 201 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
188 frame[fragmentation.fragmentationOffset[1]] = 0x01; | 202 frame[fragmentation.fragmentationOffset[1]] = 0x01; |
189 | 203 |
190 std::unique_ptr<RtpPacketizer> packetizer( | 204 for (auto packetization_mode : packetization_modes) { |
191 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 205 std::unique_ptr<RtpPacketizer> packetizer( |
192 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 206 CreateH264Packetizer(packetization_mode, kMaxPayloadSize)); |
| 207 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
193 | 208 |
194 uint8_t packet[kMaxPayloadSize] = {0}; | 209 uint8_t packet[kMaxPayloadSize] = {0}; |
195 size_t length = 0; | 210 size_t length = 0; |
196 bool last = false; | 211 bool last = false; |
197 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 212 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
198 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); | 213 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); |
199 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); | 214 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, |
| 215 length); |
200 | 216 |
201 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 217 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
202 ASSERT_EQ(fragmentation.fragmentationLength[1], length); | 218 ASSERT_EQ(fragmentation.fragmentationLength[1], length); |
203 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); | 219 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, |
204 EXPECT_TRUE(last); | 220 length); |
| 221 EXPECT_TRUE(last); |
205 | 222 |
206 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 223 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
| 224 } |
207 } | 225 } |
208 | 226 |
209 TEST(RtpPacketizerH264Test, TestStapA) { | 227 TEST(RtpPacketizerH264Test, TestStapA) { |
210 const size_t kFrameSize = | 228 const size_t kFrameSize = |
211 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 229 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
212 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 230 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
213 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 231 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
214 0x05}; // F=0, NRI=0, Type=5 (IDR). | 232 0x05}; // F=0, NRI=0, Type=5 (IDR). |
215 const size_t kPayloadOffset = 5; | 233 const size_t kPayloadOffset = 5; |
216 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 234 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
217 frame[i + kPayloadOffset] = i; | 235 frame[i + kPayloadOffset] = i; |
218 RTPFragmentationHeader fragmentation; | 236 RTPFragmentationHeader fragmentation; |
219 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 237 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
220 fragmentation.fragmentationOffset[0] = 0; | 238 fragmentation.fragmentationOffset[0] = 0; |
221 fragmentation.fragmentationLength[0] = 2; | 239 fragmentation.fragmentationLength[0] = 2; |
222 fragmentation.fragmentationOffset[1] = 2; | 240 fragmentation.fragmentationOffset[1] = 2; |
223 fragmentation.fragmentationLength[1] = 2; | 241 fragmentation.fragmentationLength[1] = 2; |
224 fragmentation.fragmentationOffset[2] = 4; | 242 fragmentation.fragmentationOffset[2] = 4; |
225 fragmentation.fragmentationLength[2] = | 243 fragmentation.fragmentationLength[2] = |
226 kNalHeaderSize + kFrameSize - kPayloadOffset; | 244 kNalHeaderSize + kFrameSize - kPayloadOffset; |
227 std::unique_ptr<RtpPacketizer> packetizer( | 245 std::unique_ptr<RtpPacketizer> packetizer( |
228 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 246 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
229 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 247 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
230 | 248 |
231 uint8_t packet[kMaxPayloadSize] = {0}; | 249 uint8_t packet[kMaxPayloadSize] = {0}; |
232 size_t length = 0; | 250 size_t length = 0; |
233 bool last = false; | 251 bool last = false; |
234 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 252 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
235 size_t expected_packet_size = | 253 size_t expected_packet_size = |
236 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; | 254 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; |
237 ASSERT_EQ(expected_packet_size, length); | 255 ASSERT_EQ(expected_packet_size, length); |
238 EXPECT_TRUE(last); | 256 EXPECT_TRUE(last); |
(...skipping 14 matching lines...) Expand all Loading... |
253 RTPFragmentationHeader fragmentation; | 271 RTPFragmentationHeader fragmentation; |
254 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 272 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
255 fragmentation.fragmentationOffset[0] = 0; | 273 fragmentation.fragmentationOffset[0] = 0; |
256 fragmentation.fragmentationLength[0] = 2; | 274 fragmentation.fragmentationLength[0] = 2; |
257 fragmentation.fragmentationOffset[1] = 2; | 275 fragmentation.fragmentationOffset[1] = 2; |
258 fragmentation.fragmentationLength[1] = 2; | 276 fragmentation.fragmentationLength[1] = 2; |
259 fragmentation.fragmentationOffset[2] = 4; | 277 fragmentation.fragmentationOffset[2] = 4; |
260 fragmentation.fragmentationLength[2] = | 278 fragmentation.fragmentationLength[2] = |
261 kNalHeaderSize + kFrameSize - kPayloadOffset; | 279 kNalHeaderSize + kFrameSize - kPayloadOffset; |
262 std::unique_ptr<RtpPacketizer> packetizer( | 280 std::unique_ptr<RtpPacketizer> packetizer( |
263 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 281 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
264 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 282 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
265 | 283 |
266 uint8_t packet[kMaxPayloadSize] = {0}; | 284 uint8_t packet[kMaxPayloadSize] = {0}; |
267 size_t length = 0; | 285 size_t length = 0; |
268 bool last = false; | 286 bool last = false; |
269 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 287 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
270 size_t expected_packet_size = kNalHeaderSize; | 288 size_t expected_packet_size = kNalHeaderSize; |
271 for (size_t i = 0; i < 2; ++i) { | 289 for (size_t i = 0; i < 2; ++i) { |
272 expected_packet_size += | 290 expected_packet_size += |
273 kLengthFieldLength + fragmentation.fragmentationLength[i]; | 291 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
(...skipping 27 matching lines...) Expand all Loading... |
301 uint8_t frame[kFrameSize]; | 319 uint8_t frame[kFrameSize]; |
302 size_t nalu_offset = 0; | 320 size_t nalu_offset = 0; |
303 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { | 321 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { |
304 nalu_offset = fragmentation.fragmentationOffset[i]; | 322 nalu_offset = fragmentation.fragmentationOffset[i]; |
305 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. | 323 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. |
306 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { | 324 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { |
307 frame[nalu_offset + j] = i + j; | 325 frame[nalu_offset + j] = i + j; |
308 } | 326 } |
309 } | 327 } |
310 std::unique_ptr<RtpPacketizer> packetizer( | 328 std::unique_ptr<RtpPacketizer> packetizer( |
311 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 329 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
312 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 330 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
313 | 331 |
314 // First expecting two FU-A packets. | 332 // First expecting two FU-A packets. |
315 std::vector<size_t> fua_sizes; | 333 std::vector<size_t> fua_sizes; |
316 fua_sizes.push_back(1100); | 334 fua_sizes.push_back(1100); |
317 fua_sizes.push_back(1099); | 335 fua_sizes.push_back(1099); |
318 uint8_t packet[kMaxPayloadSize] = {0}; | 336 uint8_t packet[kMaxPayloadSize] = {0}; |
319 size_t length = 0; | 337 size_t length = 0; |
320 bool last = false; | 338 bool last = false; |
321 int fua_offset = kNalHeaderSize; | 339 int fua_offset = kNalHeaderSize; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU | 392 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU |
375 // header. | 393 // header. |
376 TestFua( | 394 TestFua( |
377 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, | 395 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, |
378 kMaxPayloadSize, | 396 kMaxPayloadSize, |
379 std::vector<size_t>(kExpectedPayloadSizes, | 397 std::vector<size_t>(kExpectedPayloadSizes, |
380 kExpectedPayloadSizes + | 398 kExpectedPayloadSizes + |
381 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 399 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
382 } | 400 } |
383 | 401 |
| 402 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
| 403 |
| 404 TEST(RtpPacketizerH264DeathTest, TestMode0HasNoStapA) { |
| 405 // This is the same setup as for the TestStapA test. |
| 406 const size_t kFrameSize = |
| 407 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
| 408 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
| 409 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
| 410 0x05}; // F=0, NRI=0, Type=5 (IDR). |
| 411 const size_t kPayloadOffset = 5; |
| 412 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
| 413 frame[i + kPayloadOffset] = i; |
| 414 RTPFragmentationHeader fragmentation; |
| 415 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
| 416 fragmentation.fragmentationOffset[0] = 0; |
| 417 fragmentation.fragmentationLength[0] = 2; |
| 418 fragmentation.fragmentationOffset[1] = 2; |
| 419 fragmentation.fragmentationLength[1] = 2; |
| 420 fragmentation.fragmentationOffset[2] = 4; |
| 421 fragmentation.fragmentationLength[2] = |
| 422 kNalHeaderSize + kFrameSize - kPayloadOffset; |
| 423 std::unique_ptr<RtpPacketizer> packetizer( |
| 424 CreateH264Packetizer(kH264PacketizationMode0, kMaxPayloadSize)); |
| 425 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
| 426 |
| 427 uint8_t packet[kMaxPayloadSize] = {0}; |
| 428 size_t length = 0; |
| 429 bool last = false; |
| 430 EXPECT_DEATH(packetizer->NextPacket(packet, &length, &last), |
| 431 "PacketizationMode1"); |
| 432 } |
| 433 |
| 434 TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) { |
| 435 const size_t kFrameSize = kMaxPayloadSize + 100; |
| 436 uint8_t frame[kFrameSize] = {0}; |
| 437 for (size_t i = 0; i < kFrameSize; ++i) |
| 438 frame[i] = i; |
| 439 RTPFragmentationHeader fragmentation; |
| 440 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
| 441 fragmentation.fragmentationOffset[0] = 0; |
| 442 fragmentation.fragmentationLength[0] = kFrameSize; |
| 443 // Set NAL headers. |
| 444 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
| 445 |
| 446 std::unique_ptr<RtpPacketizer> packetizer( |
| 447 CreateH264Packetizer(kH264PacketizationMode0, kMaxPayloadSize)); |
| 448 EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), |
| 449 "PacketizationMode1"); |
| 450 } |
| 451 |
| 452 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
| 453 |
384 namespace { | 454 namespace { |
385 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; | 455 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; |
386 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, | 456 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, |
387 0xF4, 0x05, 0x03, 0xC7, 0xC0}; | 457 0xF4, 0x05, 0x03, 0xC7, 0xC0}; |
388 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, | 458 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, |
389 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; | 459 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; |
390 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; | 460 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; |
391 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; | 461 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; |
392 } | 462 } |
393 | 463 |
(...skipping 20 matching lines...) Expand all Loading... |
414 protected: | 484 protected: |
415 rtc::Buffer in_buffer_; | 485 rtc::Buffer in_buffer_; |
416 RTPFragmentationHeader fragmentation_header_; | 486 RTPFragmentationHeader fragmentation_header_; |
417 std::unique_ptr<RtpPacketizer> packetizer_; | 487 std::unique_ptr<RtpPacketizer> packetizer_; |
418 }; | 488 }; |
419 | 489 |
420 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { | 490 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { |
421 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 491 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
422 | 492 |
423 // Set size to fragment SPS into two FU-A packets. | 493 // Set size to fragment SPS into two FU-A packets. |
424 packetizer_.reset(RtpPacketizer::Create( | 494 packetizer_.reset(CreateH264Packetizer( |
425 kRtpVideoH264, sizeof(kOriginalSps) - 2 + kHeaderOverhead, nullptr, | 495 kH264PacketizationMode1, sizeof(kOriginalSps) - 2 + kHeaderOverhead)); |
426 kEmptyFrame)); | |
427 | 496 |
428 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 497 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
429 &fragmentation_header_); | 498 &fragmentation_header_); |
430 | 499 |
431 bool last_packet = true; | 500 bool last_packet = true; |
432 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; | 501 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; |
433 size_t num_bytes = 0; | 502 size_t num_bytes = 0; |
434 | 503 |
435 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 504 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
436 size_t offset = H264::kNaluTypeSize; | 505 size_t offset = H264::kNaluTypeSize; |
(...skipping 15 matching lines...) Expand all Loading... |
452 EXPECT_EQ(offset, sizeof(kRewrittenSps)); | 521 EXPECT_EQ(offset, sizeof(kRewrittenSps)); |
453 } | 522 } |
454 | 523 |
455 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { | 524 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { |
456 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 525 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
457 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. | 526 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. |
458 sizeof(kRewrittenSps) + sizeof(kIdrOne) + | 527 sizeof(kRewrittenSps) + sizeof(kIdrOne) + |
459 sizeof(kIdrTwo) + (kLengthFieldLength * 3); | 528 sizeof(kIdrTwo) + (kLengthFieldLength * 3); |
460 | 529 |
461 // Set size to include SPS and the rest of the packets in a Stap-A package. | 530 // Set size to include SPS and the rest of the packets in a Stap-A package. |
462 packetizer_.reset(RtpPacketizer::Create(kRtpVideoH264, | 531 packetizer_.reset(CreateH264Packetizer(kH264PacketizationMode1, |
463 kExpectedTotalSize + kHeaderOverhead, | 532 kExpectedTotalSize + kHeaderOverhead)); |
464 nullptr, kEmptyFrame)); | |
465 | 533 |
466 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 534 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
467 &fragmentation_header_); | 535 &fragmentation_header_); |
468 | 536 |
469 bool last_packet = true; | 537 bool last_packet = true; |
470 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; | 538 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; |
471 size_t num_bytes = 0; | 539 size_t num_bytes = 0; |
472 | 540 |
473 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 541 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
474 EXPECT_EQ(kExpectedTotalSize, num_bytes); | 542 EXPECT_EQ(kExpectedTotalSize, num_bytes); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; | 899 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; |
832 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); | 900 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); |
833 EXPECT_EQ(kSei, h264.nalu_type); | 901 EXPECT_EQ(kSei, h264.nalu_type); |
834 ASSERT_EQ(1u, h264.nalus_length); | 902 ASSERT_EQ(1u, h264.nalus_length); |
835 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); | 903 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); |
836 EXPECT_EQ(-1, h264.nalus[0].sps_id); | 904 EXPECT_EQ(-1, h264.nalus[0].sps_id); |
837 EXPECT_EQ(-1, h264.nalus[0].pps_id); | 905 EXPECT_EQ(-1, h264.nalus[0].pps_id); |
838 } | 906 } |
839 | 907 |
840 } // namespace webrtc | 908 } // namespace webrtc |
OLD | NEW |