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

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

Issue 2871173008: Fix packetization logic to leave space for extensions in the last packet (Closed)
Patch Set: Fix packet buffer allocations bugs and old tests with incorrect assumptions about extensions locati… Created 3 years, 7 months 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 fragmentation->fragmentationLength[1] = 2; 59 fragmentation->fragmentationLength[1] = 2;
60 fragmentation->fragmentationOffset[2] = 4; 60 fragmentation->fragmentationOffset[2] = 4;
61 fragmentation->fragmentationLength[2] = 61 fragmentation->fragmentationLength[2] =
62 kNalHeaderSize + frameSize - payloadOffset; 62 kNalHeaderSize + frameSize - payloadOffset;
63 } 63 }
64 64
65 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode, 65 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode,
66 size_t max_payload_size) { 66 size_t max_payload_size) {
67 RTPVideoTypeHeader type_header; 67 RTPVideoTypeHeader type_header;
68 type_header.H264.packetization_mode = mode; 68 type_header.H264.packetization_mode = mode;
69 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, 69 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, 0, &type_header,
70 kEmptyFrame); 70 kEmptyFrame);
71 } 71 }
72 72
73 void VerifyFua(size_t fua_index, 73 void VerifyFua(size_t fua_index,
74 const uint8_t* expected_payload, 74 const uint8_t* expected_payload,
75 int offset, 75 int offset,
76 rtc::ArrayView<const uint8_t> packet, 76 rtc::ArrayView<const uint8_t> packet,
77 const std::vector<size_t>& expected_sizes) { 77 const std::vector<size_t>& expected_sizes) {
78 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, packet.size()) 78 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, packet.size())
79 << "FUA index: " << fua_index; 79 << "FUA index: " << fua_index;
(...skipping 28 matching lines...) Expand all
108 RTPFragmentationHeader fragmentation; 108 RTPFragmentationHeader fragmentation;
109 fragmentation.VerifyAndAllocateFragmentationHeader(1); 109 fragmentation.VerifyAndAllocateFragmentationHeader(1);
110 fragmentation.fragmentationOffset[0] = 0; 110 fragmentation.fragmentationOffset[0] = 0;
111 fragmentation.fragmentationLength[0] = frame_size; 111 fragmentation.fragmentationLength[0] = frame_size;
112 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 112 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
113 H264PacketizationMode::NonInterleaved, max_payload_size)); 113 H264PacketizationMode::NonInterleaved, max_payload_size));
114 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); 114 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation);
115 115
116 RtpPacketToSend packet(kNoExtensions); 116 RtpPacketToSend packet(kNoExtensions);
117 ASSERT_LE(max_payload_size, packet.FreeCapacity()); 117 ASSERT_LE(max_payload_size, packet.FreeCapacity());
118 bool last = false;
119 size_t offset = kNalHeaderSize; 118 size_t offset = kNalHeaderSize;
119 EXPECT_EQ(packetizer->TotalPackets(), expected_sizes.size());
120 for (size_t i = 0; i < expected_sizes.size(); ++i) { 120 for (size_t i = 0; i < expected_sizes.size(); ++i) {
121 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 121 ASSERT_TRUE(packetizer->NextPacket(&packet));
122 VerifyFua(i, frame.get(), offset, packet.payload(), expected_sizes); 122 VerifyFua(i, frame.get(), offset, packet.payload(), expected_sizes);
123 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i;
124 offset += expected_sizes[i]; 123 offset += expected_sizes[i];
125 } 124 }
126 125
127 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 126 EXPECT_FALSE(packetizer->NextPacket(&packet));
128 } 127 }
129 128
130 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation, 129 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation,
131 size_t start_index, 130 size_t start_index,
132 size_t nalu_index) { 131 size_t nalu_index) {
133 assert(nalu_index < fragmentation.fragmentationVectorSize); 132 assert(nalu_index < fragmentation.fragmentationVectorSize);
134 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header. 133 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header.
135 for (size_t i = start_index; i < nalu_index; ++i) { 134 for (size_t i = start_index; i < nalu_index; ++i) {
136 expected_nalu_offset += 135 expected_nalu_offset +=
137 kLengthFieldLength + fragmentation.fragmentationLength[i]; 136 kLengthFieldLength + fragmentation.fragmentationLength[i];
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. 178 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5.
180 RTPFragmentationHeader fragmentation; 179 RTPFragmentationHeader fragmentation;
181 fragmentation.VerifyAndAllocateFragmentationHeader(1); 180 fragmentation.VerifyAndAllocateFragmentationHeader(1);
182 fragmentation.fragmentationOffset[0] = 0; 181 fragmentation.fragmentationOffset[0] = 0;
183 fragmentation.fragmentationLength[0] = sizeof(frame); 182 fragmentation.fragmentationLength[0] = sizeof(frame);
184 std::unique_ptr<RtpPacketizer> packetizer( 183 std::unique_ptr<RtpPacketizer> packetizer(
185 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); 184 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
186 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); 185 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation);
187 RtpPacketToSend packet(kNoExtensions); 186 RtpPacketToSend packet(kNoExtensions);
188 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 187 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
189 bool last = false; 188 ASSERT_EQ(packetizer->TotalPackets(), 1u);
190 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 189 ASSERT_TRUE(packetizer->NextPacket(&packet));
191 EXPECT_EQ(2u, packet.payload_size()); 190 EXPECT_EQ(2u, packet.payload_size());
192 EXPECT_TRUE(last);
193 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); 191 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
194 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 192 EXPECT_FALSE(packetizer->NextPacket(&packet));
195 } 193 }
196 194
197 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { 195 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) {
198 const size_t kFrameSize = kMaxPayloadSize + 100; 196 const size_t kFrameSize = kMaxPayloadSize + 100;
199 uint8_t frame[kFrameSize] = {0}; 197 uint8_t frame[kFrameSize] = {0};
200 for (size_t i = 0; i < kFrameSize; ++i) 198 for (size_t i = 0; i < kFrameSize; ++i)
201 frame[i] = i; 199 frame[i] = i;
202 RTPFragmentationHeader fragmentation; 200 RTPFragmentationHeader fragmentation;
203 fragmentation.VerifyAndAllocateFragmentationHeader(2); 201 fragmentation.VerifyAndAllocateFragmentationHeader(2);
204 fragmentation.fragmentationOffset[0] = 0; 202 fragmentation.fragmentationOffset[0] = 0;
205 fragmentation.fragmentationLength[0] = kMaxPayloadSize; 203 fragmentation.fragmentationLength[0] = kMaxPayloadSize;
206 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; 204 fragmentation.fragmentationOffset[1] = kMaxPayloadSize;
207 fragmentation.fragmentationLength[1] = 100; 205 fragmentation.fragmentationLength[1] = 100;
208 // Set NAL headers. 206 // Set NAL headers.
209 frame[fragmentation.fragmentationOffset[0]] = 0x01; 207 frame[fragmentation.fragmentationOffset[0]] = 0x01;
210 frame[fragmentation.fragmentationOffset[1]] = 0x01; 208 frame[fragmentation.fragmentationOffset[1]] = 0x01;
211 209
212 std::unique_ptr<RtpPacketizer> packetizer( 210 std::unique_ptr<RtpPacketizer> packetizer(
213 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); 211 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
214 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 212 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
215 213
216 RtpPacketToSend packet(kNoExtensions); 214 RtpPacketToSend packet(kNoExtensions);
217 bool last = false; 215 ASSERT_EQ(packetizer->TotalPackets(), 2u);
218 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 216 ASSERT_TRUE(packetizer->NextPacket(&packet));
219 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size()); 217 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size());
220 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); 218 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
221 219
222 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 220 ASSERT_TRUE(packetizer->NextPacket(&packet));
223 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size()); 221 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size());
224 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload()); 222 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload());
225 EXPECT_TRUE(last);
226 223
227 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 224 EXPECT_FALSE(packetizer->NextPacket(&packet));
228 } 225 }
229 226
230 INSTANTIATE_TEST_CASE_P( 227 INSTANTIATE_TEST_CASE_P(
231 PacketMode, 228 PacketMode,
232 RtpPacketizerH264ModeTest, 229 RtpPacketizerH264ModeTest,
233 ::testing::Values(H264PacketizationMode::SingleNalUnit, 230 ::testing::Values(H264PacketizationMode::SingleNalUnit,
234 H264PacketizationMode::NonInterleaved)); 231 H264PacketizationMode::NonInterleaved));
235 232
236 TEST(RtpPacketizerH264Test, TestStapA) { 233 TEST(RtpPacketizerH264Test, TestStapA) {
237 const size_t kFrameSize = 234 const size_t kFrameSize =
238 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 235 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
239 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 236 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
240 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 237 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
241 0x05}; // F=0, NRI=0, Type=5 (IDR). 238 0x05}; // F=0, NRI=0, Type=5 (IDR).
242 const size_t kPayloadOffset = 5; 239 const size_t kPayloadOffset = 5;
243 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 240 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
244 frame[i + kPayloadOffset] = i; 241 frame[i + kPayloadOffset] = i;
245 RTPFragmentationHeader fragmentation; 242 RTPFragmentationHeader fragmentation;
246 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); 243 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
247 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 244 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
248 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 245 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
249 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 246 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
250 247
251 RtpPacketToSend packet(kNoExtensions); 248 RtpPacketToSend packet(kNoExtensions);
252 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 249 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
253 bool last = false; 250 ASSERT_EQ(packetizer->TotalPackets(), 1u);
254 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 251 ASSERT_TRUE(packetizer->NextPacket(&packet));
255 size_t expected_packet_size = 252 size_t expected_packet_size =
256 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; 253 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize;
257 ASSERT_EQ(expected_packet_size, packet.payload_size()); 254 ASSERT_EQ(expected_packet_size, packet.payload_size());
258 EXPECT_TRUE(last); 255
259 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) 256 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i)
260 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 257 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
261 258
262 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 259 EXPECT_FALSE(packetizer->NextPacket(&packet));
263 } 260 }
264 261
265 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) { 262 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) {
266 // This is the same setup as for the TestStapA test. 263 // This is the same setup as for the TestStapA test.
267 const size_t kFrameSize = 264 const size_t kFrameSize =
268 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 265 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
269 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 266 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
270 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 267 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
271 0x05}; // F=0, NRI=0, Type=5 (IDR). 268 0x05}; // F=0, NRI=0, Type=5 (IDR).
272 const size_t kPayloadOffset = 5; 269 const size_t kPayloadOffset = 5;
273 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 270 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
274 frame[i + kPayloadOffset] = i; 271 frame[i + kPayloadOffset] = i;
275 RTPFragmentationHeader fragmentation; 272 RTPFragmentationHeader fragmentation;
276 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); 273 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
277 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 274 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
278 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize)); 275 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize));
279 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 276 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
280 277
281 RtpPacketToSend packet(kNoExtensions); 278 RtpPacketToSend packet(kNoExtensions);
282 bool last = false;
283 // The three fragments should be returned as three packets. 279 // The three fragments should be returned as three packets.
284 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 280 ASSERT_TRUE(packetizer->NextPacket(&packet));
285 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 281 ASSERT_TRUE(packetizer->NextPacket(&packet));
286 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 282 ASSERT_TRUE(packetizer->NextPacket(&packet));
287 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 283 EXPECT_FALSE(packetizer->NextPacket(&packet));
288 } 284 }
289 285
290 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { 286 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) {
291 const size_t kFrameSize = kMaxPayloadSize - 1; 287 const size_t kFrameSize = kMaxPayloadSize - 1;
292 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. 288 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7.
293 0x08, 0xFF, // F=0, NRI=0, Type=8. 289 0x08, 0xFF, // F=0, NRI=0, Type=8.
294 0x05}; // F=0, NRI=0, Type=5. 290 0x05}; // F=0, NRI=0, Type=5.
295 const size_t kPayloadOffset = 5; 291 const size_t kPayloadOffset = 5;
296 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 292 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
297 frame[i + kPayloadOffset] = i; 293 frame[i + kPayloadOffset] = i;
298 RTPFragmentationHeader fragmentation; 294 RTPFragmentationHeader fragmentation;
299 fragmentation.VerifyAndAllocateFragmentationHeader(3); 295 fragmentation.VerifyAndAllocateFragmentationHeader(3);
300 fragmentation.fragmentationOffset[0] = 0; 296 fragmentation.fragmentationOffset[0] = 0;
301 fragmentation.fragmentationLength[0] = 2; 297 fragmentation.fragmentationLength[0] = 2;
302 fragmentation.fragmentationOffset[1] = 2; 298 fragmentation.fragmentationOffset[1] = 2;
303 fragmentation.fragmentationLength[1] = 2; 299 fragmentation.fragmentationLength[1] = 2;
304 fragmentation.fragmentationOffset[2] = 4; 300 fragmentation.fragmentationOffset[2] = 4;
305 fragmentation.fragmentationLength[2] = 301 fragmentation.fragmentationLength[2] =
306 kNalHeaderSize + kFrameSize - kPayloadOffset; 302 kNalHeaderSize + kFrameSize - kPayloadOffset;
307 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 303 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
308 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 304 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
309 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 305 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
310 306
311 RtpPacketToSend packet(kNoExtensions); 307 RtpPacketToSend packet(kNoExtensions);
312 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 308 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
313 bool last = false; 309 ASSERT_EQ(packetizer->TotalPackets(), 2u);
314 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 310 ASSERT_TRUE(packetizer->NextPacket(&packet));
315 size_t expected_packet_size = kNalHeaderSize; 311 size_t expected_packet_size = kNalHeaderSize;
316 for (size_t i = 0; i < 2; ++i) { 312 for (size_t i = 0; i < 2; ++i) {
317 expected_packet_size += 313 expected_packet_size +=
318 kLengthFieldLength + fragmentation.fragmentationLength[i]; 314 kLengthFieldLength + fragmentation.fragmentationLength[i];
319 } 315 }
320 ASSERT_EQ(expected_packet_size, packet.payload_size()); 316 ASSERT_EQ(expected_packet_size, packet.payload_size());
321 EXPECT_FALSE(last);
322 for (size_t i = 0; i < 2; ++i) 317 for (size_t i = 0; i < 2; ++i)
323 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 318 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
324 319
325 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 320 ASSERT_TRUE(packetizer->NextPacket(&packet));
326 expected_packet_size = fragmentation.fragmentationLength[2]; 321 expected_packet_size = fragmentation.fragmentationLength[2];
327 ASSERT_EQ(expected_packet_size, packet.payload_size()); 322 ASSERT_EQ(expected_packet_size, packet.payload_size());
328 EXPECT_TRUE(last);
329 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); 323 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload());
330 324
331 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 325 EXPECT_FALSE(packetizer->NextPacket(&packet));
332 } 326 }
333 327
334 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) { 328 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) {
335 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100); 329 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100);
336 const size_t kStapANaluSize = 100; 330 const size_t kStapANaluSize = 100;
337 RTPFragmentationHeader fragmentation; 331 RTPFragmentationHeader fragmentation;
338 fragmentation.VerifyAndAllocateFragmentationHeader(3); 332 fragmentation.VerifyAndAllocateFragmentationHeader(3);
339 fragmentation.fragmentationOffset[0] = 0; 333 fragmentation.fragmentationOffset[0] = 0;
340 fragmentation.fragmentationLength[0] = kFuaNaluSize; 334 fragmentation.fragmentationLength[0] = kFuaNaluSize;
341 fragmentation.fragmentationOffset[1] = kFuaNaluSize; 335 fragmentation.fragmentationOffset[1] = kFuaNaluSize;
(...skipping 13 matching lines...) Expand all
355 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 349 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
356 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 350 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
357 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 351 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
358 352
359 // First expecting two FU-A packets. 353 // First expecting two FU-A packets.
360 std::vector<size_t> fua_sizes; 354 std::vector<size_t> fua_sizes;
361 fua_sizes.push_back(1100); 355 fua_sizes.push_back(1100);
362 fua_sizes.push_back(1099); 356 fua_sizes.push_back(1099);
363 RtpPacketToSend packet(kNoExtensions); 357 RtpPacketToSend packet(kNoExtensions);
364 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 358 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
365 bool last = false; 359 ASSERT_EQ(packetizer->TotalPackets(), 3u);
366 int fua_offset = kNalHeaderSize; 360 int fua_offset = kNalHeaderSize;
367 for (size_t i = 0; i < 2; ++i) { 361 for (size_t i = 0; i < 2; ++i) {
368 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 362 ASSERT_TRUE(packetizer->NextPacket(&packet));
369 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes); 363 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes);
370 EXPECT_FALSE(last);
371 fua_offset += fua_sizes[i]; 364 fua_offset += fua_sizes[i];
372 } 365 }
373 // Then expecting one STAP-A packet with two nal units. 366 // Then expecting one STAP-A packet with two nal units.
374 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 367 ASSERT_TRUE(packetizer->NextPacket(&packet));
375 size_t expected_packet_size = 368 size_t expected_packet_size =
376 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize; 369 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize;
377 ASSERT_EQ(expected_packet_size, packet.payload_size()); 370 ASSERT_EQ(expected_packet_size, packet.payload_size());
378 EXPECT_TRUE(last);
379 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i) 371 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i)
380 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload()); 372 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload());
381 373
382 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 374 EXPECT_FALSE(packetizer->NextPacket(&packet));
383 } 375 }
384 376
385 TEST(RtpPacketizerH264Test, TestFUAOddSize) { 377 TEST(RtpPacketizerH264Test, TestFUAOddSize) {
386 const size_t kExpectedPayloadSizes[2] = {600, 600}; 378 const size_t kExpectedPayloadSizes[2] = {600, 600};
387 TestFua( 379 TestFua(
388 kMaxPayloadSize + 1, 380 kMaxPayloadSize + 1,
389 kMaxPayloadSize, 381 kMaxPayloadSize,
390 std::vector<size_t>(kExpectedPayloadSizes, 382 std::vector<size_t>(kExpectedPayloadSizes,
391 kExpectedPayloadSizes + 383 kExpectedPayloadSizes +
392 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 384 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 480 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
489 481
490 // Set size to fragment SPS into two FU-A packets. 482 // Set size to fragment SPS into two FU-A packets.
491 packetizer_.reset( 483 packetizer_.reset(
492 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 484 CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
493 sizeof(kOriginalSps) - 2 + kHeaderOverhead)); 485 sizeof(kOriginalSps) - 2 + kHeaderOverhead));
494 486
495 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 487 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
496 &fragmentation_header_); 488 &fragmentation_header_);
497 489
498 bool last_packet = true;
499 RtpPacketToSend packet(kNoExtensions); 490 RtpPacketToSend packet(kNoExtensions);
500 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity()); 491 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity());
501 492
502 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 493 EXPECT_TRUE(packetizer_->NextPacket(&packet));
503 size_t offset = H264::kNaluTypeSize; 494 size_t offset = H264::kNaluTypeSize;
504 size_t length = packet.payload_size() - kFuAHeaderSize; 495 size_t length = packet.payload_size() - kFuAHeaderSize;
505 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 496 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
506 ElementsAreArray(&kRewrittenSps[offset], length)); 497 ElementsAreArray(&kRewrittenSps[offset], length));
507 offset += length; 498 offset += length;
508 499
509 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 500 EXPECT_TRUE(packetizer_->NextPacket(&packet));
510 length = packet.payload_size() - kFuAHeaderSize; 501 length = packet.payload_size() - kFuAHeaderSize;
511 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 502 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
512 ElementsAreArray(&kRewrittenSps[offset], length)); 503 ElementsAreArray(&kRewrittenSps[offset], length));
513 offset += length; 504 offset += length;
514 505
515 EXPECT_EQ(offset, sizeof(kRewrittenSps)); 506 EXPECT_EQ(offset, sizeof(kRewrittenSps));
516 } 507 }
517 508
518 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { 509 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) {
519 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 510 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
520 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. 511 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type.
521 sizeof(kRewrittenSps) + sizeof(kIdrOne) + 512 sizeof(kRewrittenSps) + sizeof(kIdrOne) +
522 sizeof(kIdrTwo) + (kLengthFieldLength * 3); 513 sizeof(kIdrTwo) + (kLengthFieldLength * 3);
523 514
524 // Set size to include SPS and the rest of the packets in a Stap-A package. 515 // Set size to include SPS and the rest of the packets in a Stap-A package.
525 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 516 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
526 kExpectedTotalSize + kHeaderOverhead)); 517 kExpectedTotalSize + kHeaderOverhead));
527 518
528 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 519 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
529 &fragmentation_header_); 520 &fragmentation_header_);
530 521
531 bool last_packet = true;
532 RtpPacketToSend packet(kNoExtensions); 522 RtpPacketToSend packet(kNoExtensions);
533 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity()); 523 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity());
534 524
535 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 525 EXPECT_TRUE(packetizer_->NextPacket(&packet));
536 EXPECT_EQ(kExpectedTotalSize, packet.payload_size()); 526 EXPECT_EQ(kExpectedTotalSize, packet.payload_size());
537 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength, 527 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength,
538 sizeof(kRewrittenSps)), 528 sizeof(kRewrittenSps)),
539 ElementsAreArray(kRewrittenSps)); 529 ElementsAreArray(kRewrittenSps));
540 } 530 }
541 531
542 class RtpDepacketizerH264Test : public ::testing::Test { 532 class RtpDepacketizerH264Test : public ::testing::Test {
543 protected: 533 protected:
544 RtpDepacketizerH264Test() 534 RtpDepacketizerH264Test()
545 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {} 535 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {}
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 EXPECT_EQ(kVideoFrameDelta, payload.frame_type); 886 EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
897 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); 887 EXPECT_EQ(kH264SingleNalu, h264.packetization_type);
898 EXPECT_EQ(kSei, h264.nalu_type); 888 EXPECT_EQ(kSei, h264.nalu_type);
899 ASSERT_EQ(1u, h264.nalus_length); 889 ASSERT_EQ(1u, h264.nalus_length);
900 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); 890 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type);
901 EXPECT_EQ(-1, h264.nalus[0].sps_id); 891 EXPECT_EQ(-1, h264.nalus[0].sps_id);
902 EXPECT_EQ(-1, h264.nalus[0].pps_id); 892 EXPECT_EQ(-1, h264.nalus[0].pps_id);
903 } 893 }
904 894
905 } // namespace webrtc 895 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698