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

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: Implemented Sprang@ and Danilchap@ comments 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 24 matching lines...) Expand all
104 frame[0] = 0x05; // F=0, NRI=0, Type=5. 104 frame[0] = 0x05; // F=0, NRI=0, Type=5.
105 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { 105 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) {
106 frame[i + kNalHeaderSize] = i; 106 frame[i + kNalHeaderSize] = i;
107 } 107 }
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 EXPECT_EQ(
115 expected_sizes.size(),
116 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation));
115 117
116 RtpPacketToSend packet(kNoExtensions); 118 RtpPacketToSend packet(kNoExtensions);
117 ASSERT_LE(max_payload_size, packet.FreeCapacity()); 119 ASSERT_LE(max_payload_size, packet.FreeCapacity());
118 bool last = false;
119 size_t offset = kNalHeaderSize; 120 size_t offset = kNalHeaderSize;
120 for (size_t i = 0; i < expected_sizes.size(); ++i) { 121 for (size_t i = 0; i < expected_sizes.size(); ++i) {
121 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 122 ASSERT_TRUE(packetizer->NextPacket(&packet));
122 VerifyFua(i, frame.get(), offset, packet.payload(), expected_sizes); 123 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]; 124 offset += expected_sizes[i];
125 } 125 }
126 126
127 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 127 EXPECT_FALSE(packetizer->NextPacket(&packet));
128 } 128 }
129 129
130 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation, 130 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation,
131 size_t start_index, 131 size_t start_index,
132 size_t nalu_index) { 132 size_t nalu_index) {
133 assert(nalu_index < fragmentation.fragmentationVectorSize); 133 assert(nalu_index < fragmentation.fragmentationVectorSize);
134 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header. 134 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header.
135 for (size_t i = start_index; i < nalu_index; ++i) { 135 for (size_t i = start_index; i < nalu_index; ++i) {
136 expected_nalu_offset += 136 expected_nalu_offset +=
137 kLengthFieldLength + fragmentation.fragmentationLength[i]; 137 kLengthFieldLength + fragmentation.fragmentationLength[i];
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 : public ::testing::TestWithParam<H264PacketizationMode> {}; 176 : public ::testing::TestWithParam<H264PacketizationMode> {};
177 177
178 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { 178 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) {
179 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. 179 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5.
180 RTPFragmentationHeader fragmentation; 180 RTPFragmentationHeader fragmentation;
181 fragmentation.VerifyAndAllocateFragmentationHeader(1); 181 fragmentation.VerifyAndAllocateFragmentationHeader(1);
182 fragmentation.fragmentationOffset[0] = 0; 182 fragmentation.fragmentationOffset[0] = 0;
183 fragmentation.fragmentationLength[0] = sizeof(frame); 183 fragmentation.fragmentationLength[0] = sizeof(frame);
184 std::unique_ptr<RtpPacketizer> packetizer( 184 std::unique_ptr<RtpPacketizer> packetizer(
185 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); 185 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
186 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); 186 ASSERT_EQ(1u,
187 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation));
187 RtpPacketToSend packet(kNoExtensions); 188 RtpPacketToSend packet(kNoExtensions);
188 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 189 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
189 bool last = false; 190 ASSERT_TRUE(packetizer->NextPacket(&packet));
190 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
191 EXPECT_EQ(2u, packet.payload_size()); 191 EXPECT_EQ(2u, packet.payload_size());
192 EXPECT_TRUE(last);
193 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); 192 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
194 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 193 EXPECT_FALSE(packetizer->NextPacket(&packet));
195 } 194 }
196 195
197 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { 196 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) {
198 const size_t kFrameSize = kMaxPayloadSize + 100; 197 const size_t kFrameSize = kMaxPayloadSize + 100;
199 uint8_t frame[kFrameSize] = {0}; 198 uint8_t frame[kFrameSize] = {0};
200 for (size_t i = 0; i < kFrameSize; ++i) 199 for (size_t i = 0; i < kFrameSize; ++i)
201 frame[i] = i; 200 frame[i] = i;
202 RTPFragmentationHeader fragmentation; 201 RTPFragmentationHeader fragmentation;
203 fragmentation.VerifyAndAllocateFragmentationHeader(2); 202 fragmentation.VerifyAndAllocateFragmentationHeader(2);
204 fragmentation.fragmentationOffset[0] = 0; 203 fragmentation.fragmentationOffset[0] = 0;
205 fragmentation.fragmentationLength[0] = kMaxPayloadSize; 204 fragmentation.fragmentationLength[0] = kMaxPayloadSize;
206 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; 205 fragmentation.fragmentationOffset[1] = kMaxPayloadSize;
207 fragmentation.fragmentationLength[1] = 100; 206 fragmentation.fragmentationLength[1] = 100;
208 // Set NAL headers. 207 // Set NAL headers.
209 frame[fragmentation.fragmentationOffset[0]] = 0x01; 208 frame[fragmentation.fragmentationOffset[0]] = 0x01;
210 frame[fragmentation.fragmentationOffset[1]] = 0x01; 209 frame[fragmentation.fragmentationOffset[1]] = 0x01;
211 210
212 std::unique_ptr<RtpPacketizer> packetizer( 211 std::unique_ptr<RtpPacketizer> packetizer(
213 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); 212 CreateH264Packetizer(GetParam(), kMaxPayloadSize));
214 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 213 ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
215 214
216 RtpPacketToSend packet(kNoExtensions); 215 RtpPacketToSend packet(kNoExtensions);
217 bool last = false; 216 ASSERT_TRUE(packetizer->NextPacket(&packet));
218 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
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 ASSERT_EQ(1u, 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_TRUE(packetizer->NextPacket(&packet));
254 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
255 size_t expected_packet_size = 251 size_t expected_packet_size =
256 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; 252 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize;
257 ASSERT_EQ(expected_packet_size, packet.payload_size()); 253 ASSERT_EQ(expected_packet_size, packet.payload_size());
258 EXPECT_TRUE(last); 254
259 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) 255 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i)
260 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 256 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
261 257
262 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 258 EXPECT_FALSE(packetizer->NextPacket(&packet));
263 } 259 }
264 260
265 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) { 261 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) {
266 // This is the same setup as for the TestStapA test. 262 // This is the same setup as for the TestStapA test.
267 const size_t kFrameSize = 263 const size_t kFrameSize =
268 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 264 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
269 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 265 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
270 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 266 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
271 0x05}; // F=0, NRI=0, Type=5 (IDR). 267 0x05}; // F=0, NRI=0, Type=5 (IDR).
272 const size_t kPayloadOffset = 5; 268 const size_t kPayloadOffset = 5;
273 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 269 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
274 frame[i + kPayloadOffset] = i; 270 frame[i + kPayloadOffset] = i;
275 RTPFragmentationHeader fragmentation; 271 RTPFragmentationHeader fragmentation;
276 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); 272 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
277 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 273 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
278 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize)); 274 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize));
279 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 275 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
280 276
281 RtpPacketToSend packet(kNoExtensions); 277 RtpPacketToSend packet(kNoExtensions);
282 bool last = false;
283 // The three fragments should be returned as three packets. 278 // The three fragments should be returned as three packets.
284 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 279 ASSERT_TRUE(packetizer->NextPacket(&packet));
285 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 280 ASSERT_TRUE(packetizer->NextPacket(&packet));
286 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 281 ASSERT_TRUE(packetizer->NextPacket(&packet));
287 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 282 EXPECT_FALSE(packetizer->NextPacket(&packet));
288 } 283 }
289 284
290 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { 285 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) {
291 const size_t kFrameSize = kMaxPayloadSize - 1; 286 const size_t kFrameSize = kMaxPayloadSize - 1;
292 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. 287 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7.
293 0x08, 0xFF, // F=0, NRI=0, Type=8. 288 0x08, 0xFF, // F=0, NRI=0, Type=8.
294 0x05}; // F=0, NRI=0, Type=5. 289 0x05}; // F=0, NRI=0, Type=5.
295 const size_t kPayloadOffset = 5; 290 const size_t kPayloadOffset = 5;
296 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 291 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
297 frame[i + kPayloadOffset] = i; 292 frame[i + kPayloadOffset] = i;
298 RTPFragmentationHeader fragmentation; 293 RTPFragmentationHeader fragmentation;
299 fragmentation.VerifyAndAllocateFragmentationHeader(3); 294 fragmentation.VerifyAndAllocateFragmentationHeader(3);
300 fragmentation.fragmentationOffset[0] = 0; 295 fragmentation.fragmentationOffset[0] = 0;
301 fragmentation.fragmentationLength[0] = 2; 296 fragmentation.fragmentationLength[0] = 2;
302 fragmentation.fragmentationOffset[1] = 2; 297 fragmentation.fragmentationOffset[1] = 2;
303 fragmentation.fragmentationLength[1] = 2; 298 fragmentation.fragmentationLength[1] = 2;
304 fragmentation.fragmentationOffset[2] = 4; 299 fragmentation.fragmentationOffset[2] = 4;
305 fragmentation.fragmentationLength[2] = 300 fragmentation.fragmentationLength[2] =
306 kNalHeaderSize + kFrameSize - kPayloadOffset; 301 kNalHeaderSize + kFrameSize - kPayloadOffset;
307 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 302 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
308 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 303 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
309 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 304 ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
310 305
311 RtpPacketToSend packet(kNoExtensions); 306 RtpPacketToSend packet(kNoExtensions);
312 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 307 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
313 bool last = false; 308 ASSERT_TRUE(packetizer->NextPacket(&packet));
314 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
315 size_t expected_packet_size = kNalHeaderSize; 309 size_t expected_packet_size = kNalHeaderSize;
316 for (size_t i = 0; i < 2; ++i) { 310 for (size_t i = 0; i < 2; ++i) {
317 expected_packet_size += 311 expected_packet_size +=
318 kLengthFieldLength + fragmentation.fragmentationLength[i]; 312 kLengthFieldLength + fragmentation.fragmentationLength[i];
319 } 313 }
320 ASSERT_EQ(expected_packet_size, packet.payload_size()); 314 ASSERT_EQ(expected_packet_size, packet.payload_size());
321 EXPECT_FALSE(last);
322 for (size_t i = 0; i < 2; ++i) 315 for (size_t i = 0; i < 2; ++i)
323 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 316 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
324 317
325 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 318 ASSERT_TRUE(packetizer->NextPacket(&packet));
326 expected_packet_size = fragmentation.fragmentationLength[2]; 319 expected_packet_size = fragmentation.fragmentationLength[2];
327 ASSERT_EQ(expected_packet_size, packet.payload_size()); 320 ASSERT_EQ(expected_packet_size, packet.payload_size());
328 EXPECT_TRUE(last);
329 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); 321 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload());
330 322
331 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 323 EXPECT_FALSE(packetizer->NextPacket(&packet));
332 } 324 }
333 325
334 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) { 326 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) {
335 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100); 327 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100);
336 const size_t kStapANaluSize = 100; 328 const size_t kStapANaluSize = 100;
337 RTPFragmentationHeader fragmentation; 329 RTPFragmentationHeader fragmentation;
338 fragmentation.VerifyAndAllocateFragmentationHeader(3); 330 fragmentation.VerifyAndAllocateFragmentationHeader(3);
339 fragmentation.fragmentationOffset[0] = 0; 331 fragmentation.fragmentationOffset[0] = 0;
340 fragmentation.fragmentationLength[0] = kFuaNaluSize; 332 fragmentation.fragmentationLength[0] = kFuaNaluSize;
341 fragmentation.fragmentationOffset[1] = kFuaNaluSize; 333 fragmentation.fragmentationOffset[1] = kFuaNaluSize;
342 fragmentation.fragmentationLength[1] = kStapANaluSize; 334 fragmentation.fragmentationLength[1] = kStapANaluSize;
343 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize; 335 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize;
344 fragmentation.fragmentationLength[2] = kStapANaluSize; 336 fragmentation.fragmentationLength[2] = kStapANaluSize;
345 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; 337 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize;
346 uint8_t frame[kFrameSize]; 338 uint8_t frame[kFrameSize];
347 size_t nalu_offset = 0; 339 size_t nalu_offset = 0;
348 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { 340 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) {
349 nalu_offset = fragmentation.fragmentationOffset[i]; 341 nalu_offset = fragmentation.fragmentationOffset[i];
350 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. 342 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5.
351 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { 343 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) {
352 frame[nalu_offset + j] = i + j; 344 frame[nalu_offset + j] = i + j;
353 } 345 }
354 } 346 }
355 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 347 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
356 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 348 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
357 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 349 ASSERT_EQ(3u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
358 350
359 // First expecting two FU-A packets. 351 // First expecting two FU-A packets.
360 std::vector<size_t> fua_sizes; 352 std::vector<size_t> fua_sizes;
353 fua_sizes.push_back(1099);
361 fua_sizes.push_back(1100); 354 fua_sizes.push_back(1100);
362 fua_sizes.push_back(1099);
363 RtpPacketToSend packet(kNoExtensions); 355 RtpPacketToSend packet(kNoExtensions);
364 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 356 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
365 bool last = false;
366 int fua_offset = kNalHeaderSize; 357 int fua_offset = kNalHeaderSize;
367 for (size_t i = 0; i < 2; ++i) { 358 for (size_t i = 0; i < 2; ++i) {
368 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 359 ASSERT_TRUE(packetizer->NextPacket(&packet));
369 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes); 360 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes);
370 EXPECT_FALSE(last);
371 fua_offset += fua_sizes[i]; 361 fua_offset += fua_sizes[i];
372 } 362 }
373 // Then expecting one STAP-A packet with two nal units. 363 // Then expecting one STAP-A packet with two nal units.
374 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 364 ASSERT_TRUE(packetizer->NextPacket(&packet));
375 size_t expected_packet_size = 365 size_t expected_packet_size =
376 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize; 366 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize;
377 ASSERT_EQ(expected_packet_size, packet.payload_size()); 367 ASSERT_EQ(expected_packet_size, packet.payload_size());
378 EXPECT_TRUE(last);
379 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i) 368 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i)
380 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload()); 369 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload());
381 370
382 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 371 EXPECT_FALSE(packetizer->NextPacket(&packet));
383 } 372 }
384 373
385 TEST(RtpPacketizerH264Test, TestFUAOddSize) { 374 TEST(RtpPacketizerH264Test, TestFUAOddSize) {
386 const size_t kExpectedPayloadSizes[2] = {600, 600}; 375 const size_t kExpectedPayloadSizes[2] = {600, 600};
387 TestFua( 376 TestFua(
388 kMaxPayloadSize + 1, 377 kMaxPayloadSize + 1,
389 kMaxPayloadSize, 378 kMaxPayloadSize,
390 std::vector<size_t>(kExpectedPayloadSizes, 379 std::vector<size_t>(kExpectedPayloadSizes,
391 kExpectedPayloadSizes + 380 kExpectedPayloadSizes +
392 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 381 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
393 } 382 }
394 383
395 TEST(RtpPacketizerH264Test, TestFUAEvenSize) { 384 TEST(RtpPacketizerH264Test, TestFUAEvenSize) {
396 const size_t kExpectedPayloadSizes[2] = {601, 600}; 385 const size_t kExpectedPayloadSizes[2] = {600, 601};
397 TestFua( 386 TestFua(
398 kMaxPayloadSize + 2, 387 kMaxPayloadSize + 2,
399 kMaxPayloadSize, 388 kMaxPayloadSize,
400 std::vector<size_t>(kExpectedPayloadSizes, 389 std::vector<size_t>(kExpectedPayloadSizes,
401 kExpectedPayloadSizes + 390 kExpectedPayloadSizes +
402 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 391 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
403 } 392 }
404 393
405 TEST(RtpPacketizerH264Test, TestFUARounding) { 394 TEST(RtpPacketizerH264Test, TestFUARounding) {
406 const size_t kExpectedPayloadSizes[8] = {1266, 1266, 1266, 1266, 395 const size_t kExpectedPayloadSizes[8] = {1265, 1265, 1265, 1265,
407 1266, 1266, 1266, 1261}; 396 1265, 1266, 1266, 1266};
408 TestFua( 397 TestFua(
409 10124, 398 10124,
410 1448, 399 1448,
411 std::vector<size_t>(kExpectedPayloadSizes, 400 std::vector<size_t>(kExpectedPayloadSizes,
412 kExpectedPayloadSizes + 401 kExpectedPayloadSizes +
413 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 402 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
414 } 403 }
415 404
416 TEST(RtpPacketizerH264Test, TestFUABig) { 405 TEST(RtpPacketizerH264Test, TestFUABig) {
417 const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198, 406 const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 477 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
489 478
490 // Set size to fragment SPS into two FU-A packets. 479 // Set size to fragment SPS into two FU-A packets.
491 packetizer_.reset( 480 packetizer_.reset(
492 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 481 CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
493 sizeof(kOriginalSps) - 2 + kHeaderOverhead)); 482 sizeof(kOriginalSps) - 2 + kHeaderOverhead));
494 483
495 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 484 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
496 &fragmentation_header_); 485 &fragmentation_header_);
497 486
498 bool last_packet = true;
499 RtpPacketToSend packet(kNoExtensions); 487 RtpPacketToSend packet(kNoExtensions);
500 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity()); 488 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity());
501 489
502 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 490 EXPECT_TRUE(packetizer_->NextPacket(&packet));
503 size_t offset = H264::kNaluTypeSize; 491 size_t offset = H264::kNaluTypeSize;
504 size_t length = packet.payload_size() - kFuAHeaderSize; 492 size_t length = packet.payload_size() - kFuAHeaderSize;
505 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 493 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
506 ElementsAreArray(&kRewrittenSps[offset], length)); 494 ElementsAreArray(&kRewrittenSps[offset], length));
507 offset += length; 495 offset += length;
508 496
509 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 497 EXPECT_TRUE(packetizer_->NextPacket(&packet));
510 length = packet.payload_size() - kFuAHeaderSize; 498 length = packet.payload_size() - kFuAHeaderSize;
511 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 499 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
512 ElementsAreArray(&kRewrittenSps[offset], length)); 500 ElementsAreArray(&kRewrittenSps[offset], length));
513 offset += length; 501 offset += length;
514 502
515 EXPECT_EQ(offset, sizeof(kRewrittenSps)); 503 EXPECT_EQ(offset, sizeof(kRewrittenSps));
516 } 504 }
517 505
518 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { 506 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) {
519 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 507 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
520 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. 508 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type.
521 sizeof(kRewrittenSps) + sizeof(kIdrOne) + 509 sizeof(kRewrittenSps) + sizeof(kIdrOne) +
522 sizeof(kIdrTwo) + (kLengthFieldLength * 3); 510 sizeof(kIdrTwo) + (kLengthFieldLength * 3);
523 511
524 // Set size to include SPS and the rest of the packets in a Stap-A package. 512 // Set size to include SPS and the rest of the packets in a Stap-A package.
525 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 513 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
526 kExpectedTotalSize + kHeaderOverhead)); 514 kExpectedTotalSize + kHeaderOverhead));
527 515
528 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 516 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
529 &fragmentation_header_); 517 &fragmentation_header_);
530 518
531 bool last_packet = true;
532 RtpPacketToSend packet(kNoExtensions); 519 RtpPacketToSend packet(kNoExtensions);
533 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity()); 520 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity());
534 521
535 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 522 EXPECT_TRUE(packetizer_->NextPacket(&packet));
536 EXPECT_EQ(kExpectedTotalSize, packet.payload_size()); 523 EXPECT_EQ(kExpectedTotalSize, packet.payload_size());
537 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength, 524 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength,
538 sizeof(kRewrittenSps)), 525 sizeof(kRewrittenSps)),
539 ElementsAreArray(kRewrittenSps)); 526 ElementsAreArray(kRewrittenSps));
540 } 527 }
541 528
542 class RtpDepacketizerH264Test : public ::testing::Test { 529 class RtpDepacketizerH264Test : public ::testing::Test {
543 protected: 530 protected:
544 RtpDepacketizerH264Test() 531 RtpDepacketizerH264Test()
545 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {} 532 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {}
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
894 ASSERT_TRUE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload))); 881 ASSERT_TRUE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
895 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; 882 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
896 EXPECT_EQ(kVideoFrameDelta, payload.frame_type); 883 EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
897 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); 884 EXPECT_EQ(kH264SingleNalu, h264.packetization_type);
898 EXPECT_EQ(kSei, h264.nalu_type); 885 EXPECT_EQ(kSei, h264.nalu_type);
899 ASSERT_EQ(1u, h264.nalus_length); 886 ASSERT_EQ(1u, h264.nalus_length);
900 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); 887 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type);
901 EXPECT_EQ(-1, h264.nalus[0].sps_id); 888 EXPECT_EQ(-1, h264.nalus[0].sps_id);
902 EXPECT_EQ(-1, h264.nalus[0].pps_id); 889 EXPECT_EQ(-1, h264.nalus[0].pps_id);
903 } 890 }
904 891
danilchap 2017/05/18 11:14:24 add tests for non-zero last_packet_reduction_len
ilnik 2017/05/18 12:22:52 Done.
905 } // namespace webrtc 892 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698