Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(944)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc

Issue 2337453002: H.264 packetization mode 0 (try 2) (Closed)
Patch Set: Addressed hbos comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698