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

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

Issue 2528343002: H.264 packetization mode 0 (try 3) (Closed)
Patch Set: Changed from enum to enum class Created 4 years 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 void CreateThreeFragments(RTPFragmentationHeader* fragmentation,
47 size_t frameSize,
48 size_t payloadOffset) {
49 fragmentation->VerifyAndAllocateFragmentationHeader(3);
50 fragmentation->fragmentationOffset[0] = 0;
51 fragmentation->fragmentationLength[0] = 2;
52 fragmentation->fragmentationOffset[1] = 2;
53 fragmentation->fragmentationLength[1] = 2;
54 fragmentation->fragmentationOffset[2] = 4;
55 fragmentation->fragmentationLength[2] =
56 kNalHeaderSize + frameSize - payloadOffset;
57 }
58
59 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode,
60 size_t max_payload_size) {
61 RTPVideoTypeHeader type_header;
62 type_header.H264.packetization_mode = mode;
63 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header,
64 kEmptyFrame);
65 }
66
46 void VerifyFua(size_t fua_index, 67 void VerifyFua(size_t fua_index,
47 const uint8_t* expected_payload, 68 const uint8_t* expected_payload,
48 int offset, 69 int offset,
49 const uint8_t* packet, 70 const uint8_t* packet,
50 size_t length, 71 size_t length,
51 const std::vector<size_t>& expected_sizes) { 72 const std::vector<size_t>& expected_sizes) {
52 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) 73 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length)
53 << "FUA index: " << fua_index; 74 << "FUA index: " << fua_index;
54 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. 75 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28.
55 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; 76 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index;
(...skipping 21 matching lines...) Expand all
77 std::unique_ptr<uint8_t[]> frame; 98 std::unique_ptr<uint8_t[]> frame;
78 frame.reset(new uint8_t[frame_size]); 99 frame.reset(new uint8_t[frame_size]);
79 frame[0] = 0x05; // F=0, NRI=0, Type=5. 100 frame[0] = 0x05; // F=0, NRI=0, Type=5.
80 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { 101 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) {
81 frame[i + kNalHeaderSize] = i; 102 frame[i + kNalHeaderSize] = i;
82 } 103 }
83 RTPFragmentationHeader fragmentation; 104 RTPFragmentationHeader fragmentation;
84 fragmentation.VerifyAndAllocateFragmentationHeader(1); 105 fragmentation.VerifyAndAllocateFragmentationHeader(1);
85 fragmentation.fragmentationOffset[0] = 0; 106 fragmentation.fragmentationOffset[0] = 0;
86 fragmentation.fragmentationLength[0] = frame_size; 107 fragmentation.fragmentationLength[0] = frame_size;
87 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( 108 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
88 kRtpVideoH264, max_payload_size, NULL, kEmptyFrame)); 109 H264PacketizationMode::NonInterleaved, max_payload_size));
89 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); 110 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation);
90 111
91 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); 112 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]);
92 size_t length = 0; 113 size_t length = 0;
93 bool last = false; 114 bool last = false;
94 size_t offset = kNalHeaderSize; 115 size_t offset = kNalHeaderSize;
95 for (size_t i = 0; i < expected_sizes.size(); ++i) { 116 for (size_t i = 0; i < expected_sizes.size(); ++i) {
96 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); 117 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last));
97 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); 118 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes);
98 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; 119 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 size_t packet_length) { 166 size_t packet_length) {
146 std::vector<uint8_t> expected_payload_vector( 167 std::vector<uint8_t> expected_payload_vector(
147 &frame[fragmentation.fragmentationOffset[nalu_index]], 168 &frame[fragmentation.fragmentationOffset[nalu_index]],
148 &frame[fragmentation.fragmentationOffset[nalu_index] + 169 &frame[fragmentation.fragmentationOffset[nalu_index] +
149 fragmentation.fragmentationLength[nalu_index]]); 170 fragmentation.fragmentationLength[nalu_index]]);
150 EXPECT_THAT(expected_payload_vector, 171 EXPECT_THAT(expected_payload_vector,
151 ::testing::ElementsAreArray(packet, packet_length)); 172 ::testing::ElementsAreArray(packet, packet_length));
152 } 173 }
153 } // namespace 174 } // namespace
154 175
155 TEST(RtpPacketizerH264Test, TestSingleNalu) { 176 // Tests that should work with both packetization mode 0 and
177 // packetization mode 1.
178 class RtpPacketizerH264ModeTest
179 : public ::testing::TestWithParam<H264PacketizationMode> {};
180
181 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) {
156 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. 182 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5.
157 RTPFragmentationHeader fragmentation; 183 RTPFragmentationHeader fragmentation;
158 fragmentation.VerifyAndAllocateFragmentationHeader(1); 184 fragmentation.VerifyAndAllocateFragmentationHeader(1);
159 fragmentation.fragmentationOffset[0] = 0; 185 fragmentation.fragmentationOffset[0] = 0;
160 fragmentation.fragmentationLength[0] = sizeof(frame); 186 fragmentation.fragmentationLength[0] = sizeof(frame);
161 std::unique_ptr<RtpPacketizer> packetizer( 187 std::unique_ptr<RtpPacketizer> packetizer(
162 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); 188 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
163 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); 189 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation);
164 uint8_t packet[kMaxPayloadSize] = {0}; 190 uint8_t packet[kMaxPayloadSize] = {0};
165 size_t length = 0; 191 size_t length = 0;
166 bool last = false; 192 bool last = false;
167 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); 193 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
168 EXPECT_EQ(2u, length); 194 EXPECT_EQ(2u, length);
169 EXPECT_TRUE(last); 195 EXPECT_TRUE(last);
170 VerifySingleNaluPayload( 196 VerifySingleNaluPayload(fragmentation, 0, frame, sizeof(frame), packet,
171 fragmentation, 0, frame, sizeof(frame), packet, length); 197 length);
172 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); 198 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last));
173 } 199 }
174 200
175 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { 201 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) {
176 const size_t kFrameSize = kMaxPayloadSize + 100; 202 const size_t kFrameSize = kMaxPayloadSize + 100;
177 uint8_t frame[kFrameSize] = {0}; 203 uint8_t frame[kFrameSize] = {0};
178 for (size_t i = 0; i < kFrameSize; ++i) 204 for (size_t i = 0; i < kFrameSize; ++i)
179 frame[i] = i; 205 frame[i] = i;
180 RTPFragmentationHeader fragmentation; 206 RTPFragmentationHeader fragmentation;
181 fragmentation.VerifyAndAllocateFragmentationHeader(2); 207 fragmentation.VerifyAndAllocateFragmentationHeader(2);
182 fragmentation.fragmentationOffset[0] = 0; 208 fragmentation.fragmentationOffset[0] = 0;
183 fragmentation.fragmentationLength[0] = kMaxPayloadSize; 209 fragmentation.fragmentationLength[0] = kMaxPayloadSize;
184 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; 210 fragmentation.fragmentationOffset[1] = kMaxPayloadSize;
185 fragmentation.fragmentationLength[1] = 100; 211 fragmentation.fragmentationLength[1] = 100;
186 // Set NAL headers. 212 // Set NAL headers.
187 frame[fragmentation.fragmentationOffset[0]] = 0x01; 213 frame[fragmentation.fragmentationOffset[0]] = 0x01;
188 frame[fragmentation.fragmentationOffset[1]] = 0x01; 214 frame[fragmentation.fragmentationOffset[1]] = 0x01;
189 215
190 std::unique_ptr<RtpPacketizer> packetizer( 216 std::unique_ptr<RtpPacketizer> packetizer(
191 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); 217 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
192 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 218 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
193 219
194 uint8_t packet[kMaxPayloadSize] = {0}; 220 uint8_t packet[kMaxPayloadSize] = {0};
195 size_t length = 0; 221 size_t length = 0;
196 bool last = false; 222 bool last = false;
197 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); 223 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
198 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); 224 ASSERT_EQ(fragmentation.fragmentationOffset[1], length);
199 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); 225 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length);
200 226
201 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); 227 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
202 ASSERT_EQ(fragmentation.fragmentationLength[1], length); 228 ASSERT_EQ(fragmentation.fragmentationLength[1], length);
203 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); 229 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length);
204 EXPECT_TRUE(last); 230 EXPECT_TRUE(last);
205 231
206 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); 232 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last));
207 } 233 }
208 234
235 INSTANTIATE_TEST_CASE_P(
236 PacketMode,
237 RtpPacketizerH264ModeTest,
238 ::testing::Values(H264PacketizationMode::SingleNalUnit,
239 H264PacketizationMode::NonInterleaved));
240
209 TEST(RtpPacketizerH264Test, TestStapA) { 241 TEST(RtpPacketizerH264Test, TestStapA) {
210 const size_t kFrameSize = 242 const size_t kFrameSize =
211 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 243 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
212 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 244 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
213 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 245 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
214 0x05}; // F=0, NRI=0, Type=5 (IDR). 246 0x05}; // F=0, NRI=0, Type=5 (IDR).
215 const size_t kPayloadOffset = 5; 247 const size_t kPayloadOffset = 5;
216 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 248 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
217 frame[i + kPayloadOffset] = i; 249 frame[i + kPayloadOffset] = i;
218 RTPFragmentationHeader fragmentation; 250 RTPFragmentationHeader fragmentation;
219 fragmentation.VerifyAndAllocateFragmentationHeader(3); 251 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
220 fragmentation.fragmentationOffset[0] = 0; 252 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
221 fragmentation.fragmentationLength[0] = 2; 253 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
222 fragmentation.fragmentationOffset[1] = 2;
223 fragmentation.fragmentationLength[1] = 2;
224 fragmentation.fragmentationOffset[2] = 4;
225 fragmentation.fragmentationLength[2] =
226 kNalHeaderSize + kFrameSize - kPayloadOffset;
227 std::unique_ptr<RtpPacketizer> packetizer(
228 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame));
229 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 254 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
230 255
231 uint8_t packet[kMaxPayloadSize] = {0}; 256 uint8_t packet[kMaxPayloadSize] = {0};
232 size_t length = 0; 257 size_t length = 0;
233 bool last = false; 258 bool last = false;
234 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); 259 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
235 size_t expected_packet_size = 260 size_t expected_packet_size =
236 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; 261 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize;
237 ASSERT_EQ(expected_packet_size, length); 262 ASSERT_EQ(expected_packet_size, length);
238 EXPECT_TRUE(last); 263 EXPECT_TRUE(last);
239 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) 264 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i)
240 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); 265 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length);
241 266
242 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); 267 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last));
243 } 268 }
244 269
270 TEST(RtpPacketizerH264Test, TestMode0HasNoStapA) {
hbos 2016/12/02 10:21:26 nit/optional: Naming difference "mode" vs enum nam
hta-webrtc 2016/12/02 11:09:01 Done.
271 // This is the same setup as for the TestStapA test.
272 const size_t kFrameSize =
273 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
274 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
275 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
276 0x05}; // F=0, NRI=0, Type=5 (IDR).
277 const size_t kPayloadOffset = 5;
278 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
279 frame[i + kPayloadOffset] = i;
280 RTPFragmentationHeader fragmentation;
281 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
282 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
283 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize));
284 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
285
286 uint8_t packet[kMaxPayloadSize] = {0};
287 size_t length = 0;
288 bool last = false;
289 // The three fragments should be returned as three packets.
290 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
291 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
292 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
293 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last));
294 }
295
245 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { 296 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) {
246 const size_t kFrameSize = kMaxPayloadSize - 1; 297 const size_t kFrameSize = kMaxPayloadSize - 1;
247 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. 298 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7.
248 0x08, 0xFF, // F=0, NRI=0, Type=8. 299 0x08, 0xFF, // F=0, NRI=0, Type=8.
249 0x05}; // F=0, NRI=0, Type=5. 300 0x05}; // F=0, NRI=0, Type=5.
250 const size_t kPayloadOffset = 5; 301 const size_t kPayloadOffset = 5;
251 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 302 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
252 frame[i + kPayloadOffset] = i; 303 frame[i + kPayloadOffset] = i;
253 RTPFragmentationHeader fragmentation; 304 RTPFragmentationHeader fragmentation;
254 fragmentation.VerifyAndAllocateFragmentationHeader(3); 305 fragmentation.VerifyAndAllocateFragmentationHeader(3);
255 fragmentation.fragmentationOffset[0] = 0; 306 fragmentation.fragmentationOffset[0] = 0;
256 fragmentation.fragmentationLength[0] = 2; 307 fragmentation.fragmentationLength[0] = 2;
257 fragmentation.fragmentationOffset[1] = 2; 308 fragmentation.fragmentationOffset[1] = 2;
258 fragmentation.fragmentationLength[1] = 2; 309 fragmentation.fragmentationLength[1] = 2;
259 fragmentation.fragmentationOffset[2] = 4; 310 fragmentation.fragmentationOffset[2] = 4;
260 fragmentation.fragmentationLength[2] = 311 fragmentation.fragmentationLength[2] =
261 kNalHeaderSize + kFrameSize - kPayloadOffset; 312 kNalHeaderSize + kFrameSize - kPayloadOffset;
262 std::unique_ptr<RtpPacketizer> packetizer( 313 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
263 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); 314 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
264 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 315 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
265 316
266 uint8_t packet[kMaxPayloadSize] = {0}; 317 uint8_t packet[kMaxPayloadSize] = {0};
267 size_t length = 0; 318 size_t length = 0;
268 bool last = false; 319 bool last = false;
269 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); 320 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last));
270 size_t expected_packet_size = kNalHeaderSize; 321 size_t expected_packet_size = kNalHeaderSize;
271 for (size_t i = 0; i < 2; ++i) { 322 for (size_t i = 0; i < 2; ++i) {
272 expected_packet_size += 323 expected_packet_size +=
273 kLengthFieldLength + fragmentation.fragmentationLength[i]; 324 kLengthFieldLength + fragmentation.fragmentationLength[i];
(...skipping 26 matching lines...) Expand all
300 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; 351 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize;
301 uint8_t frame[kFrameSize]; 352 uint8_t frame[kFrameSize];
302 size_t nalu_offset = 0; 353 size_t nalu_offset = 0;
303 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { 354 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) {
304 nalu_offset = fragmentation.fragmentationOffset[i]; 355 nalu_offset = fragmentation.fragmentationOffset[i];
305 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. 356 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5.
306 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { 357 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) {
307 frame[nalu_offset + j] = i + j; 358 frame[nalu_offset + j] = i + j;
308 } 359 }
309 } 360 }
310 std::unique_ptr<RtpPacketizer> packetizer( 361 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
311 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); 362 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
312 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 363 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
313 364
314 // First expecting two FU-A packets. 365 // First expecting two FU-A packets.
315 std::vector<size_t> fua_sizes; 366 std::vector<size_t> fua_sizes;
316 fua_sizes.push_back(1100); 367 fua_sizes.push_back(1100);
317 fua_sizes.push_back(1099); 368 fua_sizes.push_back(1099);
318 uint8_t packet[kMaxPayloadSize] = {0}; 369 uint8_t packet[kMaxPayloadSize] = {0};
319 size_t length = 0; 370 size_t length = 0;
320 bool last = false; 371 bool last = false;
321 int fua_offset = kNalHeaderSize; 372 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 425 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU
375 // header. 426 // header.
376 TestFua( 427 TestFua(
377 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, 428 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize,
378 kMaxPayloadSize, 429 kMaxPayloadSize,
379 std::vector<size_t>(kExpectedPayloadSizes, 430 std::vector<size_t>(kExpectedPayloadSizes,
380 kExpectedPayloadSizes + 431 kExpectedPayloadSizes +
381 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 432 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
382 } 433 }
383 434
435 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
436
437 TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) {
438 const size_t kFrameSize = kMaxPayloadSize + 100;
hbos 2016/12/02 10:21:26 nit: I prefer to test the edge case + 1
hta-webrtc 2016/12/02 11:09:01 Done.
439 uint8_t frame[kFrameSize] = {0};
440 for (size_t i = 0; i < kFrameSize; ++i)
441 frame[i] = i;
442 RTPFragmentationHeader fragmentation;
443 fragmentation.VerifyAndAllocateFragmentationHeader(1);
444 fragmentation.fragmentationOffset[0] = 0;
445 fragmentation.fragmentationLength[0] = kFrameSize;
446 // Set NAL headers.
447 frame[fragmentation.fragmentationOffset[0]] = 0x01;
448
449 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
450 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize));
451 EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation),
452 "payload_size");
453 }
454
455 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
456
384 namespace { 457 namespace {
385 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; 458 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01};
386 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 459 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03,
387 0xF4, 0x05, 0x03, 0xC7, 0xC0}; 460 0xF4, 0x05, 0x03, 0xC7, 0xC0};
388 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, 461 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03,
389 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; 462 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00};
390 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; 463 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04};
391 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; 464 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11};
392 } 465 }
393 466
(...skipping 20 matching lines...) Expand all
414 protected: 487 protected:
415 rtc::Buffer in_buffer_; 488 rtc::Buffer in_buffer_;
416 RTPFragmentationHeader fragmentation_header_; 489 RTPFragmentationHeader fragmentation_header_;
417 std::unique_ptr<RtpPacketizer> packetizer_; 490 std::unique_ptr<RtpPacketizer> packetizer_;
418 }; 491 };
419 492
420 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { 493 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) {
421 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 494 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
422 495
423 // Set size to fragment SPS into two FU-A packets. 496 // Set size to fragment SPS into two FU-A packets.
424 packetizer_.reset(RtpPacketizer::Create( 497 packetizer_.reset(
425 kRtpVideoH264, sizeof(kOriginalSps) - 2 + kHeaderOverhead, nullptr, 498 CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
426 kEmptyFrame)); 499 sizeof(kOriginalSps) - 2 + kHeaderOverhead));
427 500
428 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 501 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
429 &fragmentation_header_); 502 &fragmentation_header_);
430 503
431 bool last_packet = true; 504 bool last_packet = true;
432 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; 505 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {};
433 size_t num_bytes = 0; 506 size_t num_bytes = 0;
434 507
435 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); 508 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet));
436 size_t offset = H264::kNaluTypeSize; 509 size_t offset = H264::kNaluTypeSize;
(...skipping 15 matching lines...) Expand all
452 EXPECT_EQ(offset, sizeof(kRewrittenSps)); 525 EXPECT_EQ(offset, sizeof(kRewrittenSps));
453 } 526 }
454 527
455 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { 528 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) {
456 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 529 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
457 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. 530 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type.
458 sizeof(kRewrittenSps) + sizeof(kIdrOne) + 531 sizeof(kRewrittenSps) + sizeof(kIdrOne) +
459 sizeof(kIdrTwo) + (kLengthFieldLength * 3); 532 sizeof(kIdrTwo) + (kLengthFieldLength * 3);
460 533
461 // Set size to include SPS and the rest of the packets in a Stap-A package. 534 // Set size to include SPS and the rest of the packets in a Stap-A package.
462 packetizer_.reset(RtpPacketizer::Create(kRtpVideoH264, 535 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
463 kExpectedTotalSize + kHeaderOverhead, 536 kExpectedTotalSize + kHeaderOverhead));
464 nullptr, kEmptyFrame));
465 537
466 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 538 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
467 &fragmentation_header_); 539 &fragmentation_header_);
468 540
469 bool last_packet = true; 541 bool last_packet = true;
470 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; 542 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {};
471 size_t num_bytes = 0; 543 size_t num_bytes = 0;
472 544
473 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); 545 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet));
474 EXPECT_EQ(kExpectedTotalSize, num_bytes); 546 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; 903 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
832 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); 904 EXPECT_EQ(kH264SingleNalu, h264.packetization_type);
833 EXPECT_EQ(kSei, h264.nalu_type); 905 EXPECT_EQ(kSei, h264.nalu_type);
834 ASSERT_EQ(1u, h264.nalus_length); 906 ASSERT_EQ(1u, h264.nalus_length);
835 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); 907 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type);
836 EXPECT_EQ(-1, h264.nalus[0].sps_id); 908 EXPECT_EQ(-1, h264.nalus[0].sps_id);
837 EXPECT_EQ(-1, h264.nalus[0].pps_id); 909 EXPECT_EQ(-1, h264.nalus[0].pps_id);
838 } 910 }
839 911
840 } // namespace webrtc 912 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698