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

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

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

Powered by Google App Engine
This is Rietveld 408576698