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

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 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(packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation),
115 expected_sizes.size());
sprang_webrtc 2017/05/17 13:10:07 nit: For EXPECT_EQ and ASSERT_EQ below, prefer hav
danilchap 2017/05/17 13:21:54 Actually error message treat both parameters equal
ilnik 2017/05/17 15:06:33 Actually, it's true that expected value is the fir
danilchap 2017/05/17 15:28:39 Let's make some test fail with EXPECT_EQ failure..
ilnik 2017/05/18 07:33:01 Yes, you are right. It just that I saw that the fi
sprang_webrtc 2017/05/18 09:48:19 Right, thanks. Old habits...
115 116
116 RtpPacketToSend packet(kNoExtensions); 117 RtpPacketToSend packet(kNoExtensions);
117 ASSERT_LE(max_payload_size, packet.FreeCapacity()); 118 ASSERT_LE(max_payload_size, packet.FreeCapacity());
118 bool last = false;
119 size_t offset = kNalHeaderSize; 119 size_t offset = kNalHeaderSize;
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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 : public ::testing::TestWithParam<H264PacketizationMode> {}; 175 : public ::testing::TestWithParam<H264PacketizationMode> {};
177 176
178 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { 177 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) {
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 ASSERT_EQ(packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation),
186 1u);
187 RtpPacketToSend packet(kNoExtensions); 187 RtpPacketToSend packet(kNoExtensions);
188 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 188 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
189 bool last = false; 189 ASSERT_TRUE(packetizer->NextPacket(&packet));
190 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
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 ASSERT_EQ(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), 2u);
215 213
216 RtpPacketToSend packet(kNoExtensions); 214 RtpPacketToSend packet(kNoExtensions);
217 bool last = false; 215 ASSERT_TRUE(packetizer->NextPacket(&packet));
218 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
219 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size()); 216 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size());
220 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); 217 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
221 218
222 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 219 ASSERT_TRUE(packetizer->NextPacket(&packet));
223 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size()); 220 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size());
224 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload()); 221 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload());
225 EXPECT_TRUE(last);
226 222
227 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 223 EXPECT_FALSE(packetizer->NextPacket(&packet));
228 } 224 }
229 225
230 INSTANTIATE_TEST_CASE_P( 226 INSTANTIATE_TEST_CASE_P(
231 PacketMode, 227 PacketMode,
232 RtpPacketizerH264ModeTest, 228 RtpPacketizerH264ModeTest,
233 ::testing::Values(H264PacketizationMode::SingleNalUnit, 229 ::testing::Values(H264PacketizationMode::SingleNalUnit,
234 H264PacketizationMode::NonInterleaved)); 230 H264PacketizationMode::NonInterleaved));
235 231
236 TEST(RtpPacketizerH264Test, TestStapA) { 232 TEST(RtpPacketizerH264Test, TestStapA) {
237 const size_t kFrameSize = 233 const size_t kFrameSize =
238 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 234 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
239 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 235 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
240 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 236 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
241 0x05}; // F=0, NRI=0, Type=5 (IDR). 237 0x05}; // F=0, NRI=0, Type=5 (IDR).
242 const size_t kPayloadOffset = 5; 238 const size_t kPayloadOffset = 5;
243 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 239 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
244 frame[i + kPayloadOffset] = i; 240 frame[i + kPayloadOffset] = i;
245 RTPFragmentationHeader fragmentation; 241 RTPFragmentationHeader fragmentation;
246 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); 242 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
247 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 243 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
248 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 244 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
249 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 245 ASSERT_EQ(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), 1u);
250 246
251 RtpPacketToSend packet(kNoExtensions); 247 RtpPacketToSend packet(kNoExtensions);
252 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 248 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
253 bool last = false; 249 ASSERT_TRUE(packetizer->NextPacket(&packet));
254 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
255 size_t expected_packet_size = 250 size_t expected_packet_size =
256 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; 251 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize;
257 ASSERT_EQ(expected_packet_size, packet.payload_size()); 252 ASSERT_EQ(expected_packet_size, packet.payload_size());
258 EXPECT_TRUE(last); 253
259 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) 254 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i)
260 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 255 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
261 256
262 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 257 EXPECT_FALSE(packetizer->NextPacket(&packet));
263 } 258 }
264 259
265 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) { 260 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) {
266 // This is the same setup as for the TestStapA test. 261 // This is the same setup as for the TestStapA test.
267 const size_t kFrameSize = 262 const size_t kFrameSize =
268 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; 263 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
269 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). 264 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS).
270 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). 265 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS).
271 0x05}; // F=0, NRI=0, Type=5 (IDR). 266 0x05}; // F=0, NRI=0, Type=5 (IDR).
272 const size_t kPayloadOffset = 5; 267 const size_t kPayloadOffset = 5;
273 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 268 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
274 frame[i + kPayloadOffset] = i; 269 frame[i + kPayloadOffset] = i;
275 RTPFragmentationHeader fragmentation; 270 RTPFragmentationHeader fragmentation;
276 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); 271 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
277 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 272 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
278 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize)); 273 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize));
279 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 274 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
280 275
281 RtpPacketToSend packet(kNoExtensions); 276 RtpPacketToSend packet(kNoExtensions);
282 bool last = false;
283 // The three fragments should be returned as three packets. 277 // The three fragments should be returned as three packets.
284 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 278 ASSERT_TRUE(packetizer->NextPacket(&packet));
285 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 279 ASSERT_TRUE(packetizer->NextPacket(&packet));
286 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 280 ASSERT_TRUE(packetizer->NextPacket(&packet));
287 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 281 EXPECT_FALSE(packetizer->NextPacket(&packet));
288 } 282 }
289 283
290 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { 284 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) {
291 const size_t kFrameSize = kMaxPayloadSize - 1; 285 const size_t kFrameSize = kMaxPayloadSize - 1;
292 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. 286 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7.
293 0x08, 0xFF, // F=0, NRI=0, Type=8. 287 0x08, 0xFF, // F=0, NRI=0, Type=8.
294 0x05}; // F=0, NRI=0, Type=5. 288 0x05}; // F=0, NRI=0, Type=5.
295 const size_t kPayloadOffset = 5; 289 const size_t kPayloadOffset = 5;
296 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) 290 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
297 frame[i + kPayloadOffset] = i; 291 frame[i + kPayloadOffset] = i;
298 RTPFragmentationHeader fragmentation; 292 RTPFragmentationHeader fragmentation;
299 fragmentation.VerifyAndAllocateFragmentationHeader(3); 293 fragmentation.VerifyAndAllocateFragmentationHeader(3);
300 fragmentation.fragmentationOffset[0] = 0; 294 fragmentation.fragmentationOffset[0] = 0;
301 fragmentation.fragmentationLength[0] = 2; 295 fragmentation.fragmentationLength[0] = 2;
302 fragmentation.fragmentationOffset[1] = 2; 296 fragmentation.fragmentationOffset[1] = 2;
303 fragmentation.fragmentationLength[1] = 2; 297 fragmentation.fragmentationLength[1] = 2;
304 fragmentation.fragmentationOffset[2] = 4; 298 fragmentation.fragmentationOffset[2] = 4;
305 fragmentation.fragmentationLength[2] = 299 fragmentation.fragmentationLength[2] =
306 kNalHeaderSize + kFrameSize - kPayloadOffset; 300 kNalHeaderSize + kFrameSize - kPayloadOffset;
307 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 301 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
308 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 302 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
309 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 303 ASSERT_EQ(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), 2u);
310 304
311 RtpPacketToSend packet(kNoExtensions); 305 RtpPacketToSend packet(kNoExtensions);
312 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 306 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
313 bool last = false; 307 ASSERT_TRUE(packetizer->NextPacket(&packet));
314 ASSERT_TRUE(packetizer->NextPacket(&packet, &last));
315 size_t expected_packet_size = kNalHeaderSize; 308 size_t expected_packet_size = kNalHeaderSize;
316 for (size_t i = 0; i < 2; ++i) { 309 for (size_t i = 0; i < 2; ++i) {
317 expected_packet_size += 310 expected_packet_size +=
318 kLengthFieldLength + fragmentation.fragmentationLength[i]; 311 kLengthFieldLength + fragmentation.fragmentationLength[i];
319 } 312 }
320 ASSERT_EQ(expected_packet_size, packet.payload_size()); 313 ASSERT_EQ(expected_packet_size, packet.payload_size());
321 EXPECT_FALSE(last);
322 for (size_t i = 0; i < 2; ++i) 314 for (size_t i = 0; i < 2; ++i)
323 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); 315 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
324 316
325 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 317 ASSERT_TRUE(packetizer->NextPacket(&packet));
326 expected_packet_size = fragmentation.fragmentationLength[2]; 318 expected_packet_size = fragmentation.fragmentationLength[2];
327 ASSERT_EQ(expected_packet_size, packet.payload_size()); 319 ASSERT_EQ(expected_packet_size, packet.payload_size());
328 EXPECT_TRUE(last);
329 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); 320 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload());
330 321
331 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 322 EXPECT_FALSE(packetizer->NextPacket(&packet));
332 } 323 }
333 324
334 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) { 325 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) {
335 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100); 326 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100);
336 const size_t kStapANaluSize = 100; 327 const size_t kStapANaluSize = 100;
337 RTPFragmentationHeader fragmentation; 328 RTPFragmentationHeader fragmentation;
338 fragmentation.VerifyAndAllocateFragmentationHeader(3); 329 fragmentation.VerifyAndAllocateFragmentationHeader(3);
339 fragmentation.fragmentationOffset[0] = 0; 330 fragmentation.fragmentationOffset[0] = 0;
340 fragmentation.fragmentationLength[0] = kFuaNaluSize; 331 fragmentation.fragmentationLength[0] = kFuaNaluSize;
341 fragmentation.fragmentationOffset[1] = kFuaNaluSize; 332 fragmentation.fragmentationOffset[1] = kFuaNaluSize;
342 fragmentation.fragmentationLength[1] = kStapANaluSize; 333 fragmentation.fragmentationLength[1] = kStapANaluSize;
343 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize; 334 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize;
344 fragmentation.fragmentationLength[2] = kStapANaluSize; 335 fragmentation.fragmentationLength[2] = kStapANaluSize;
345 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; 336 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize;
346 uint8_t frame[kFrameSize]; 337 uint8_t frame[kFrameSize];
347 size_t nalu_offset = 0; 338 size_t nalu_offset = 0;
348 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { 339 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) {
349 nalu_offset = fragmentation.fragmentationOffset[i]; 340 nalu_offset = fragmentation.fragmentationOffset[i];
350 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. 341 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5.
351 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { 342 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) {
352 frame[nalu_offset + j] = i + j; 343 frame[nalu_offset + j] = i + j;
353 } 344 }
354 } 345 }
355 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( 346 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
356 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); 347 H264PacketizationMode::NonInterleaved, kMaxPayloadSize));
357 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); 348 ASSERT_EQ(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), 3u);
358 349
359 // First expecting two FU-A packets. 350 // First expecting two FU-A packets.
360 std::vector<size_t> fua_sizes; 351 std::vector<size_t> fua_sizes;
361 fua_sizes.push_back(1100); 352 fua_sizes.push_back(1100);
362 fua_sizes.push_back(1099); 353 fua_sizes.push_back(1099);
363 RtpPacketToSend packet(kNoExtensions); 354 RtpPacketToSend packet(kNoExtensions);
364 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); 355 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
365 bool last = false;
366 int fua_offset = kNalHeaderSize; 356 int fua_offset = kNalHeaderSize;
367 for (size_t i = 0; i < 2; ++i) { 357 for (size_t i = 0; i < 2; ++i) {
368 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 358 ASSERT_TRUE(packetizer->NextPacket(&packet));
369 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes); 359 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes);
370 EXPECT_FALSE(last);
371 fua_offset += fua_sizes[i]; 360 fua_offset += fua_sizes[i];
372 } 361 }
373 // Then expecting one STAP-A packet with two nal units. 362 // Then expecting one STAP-A packet with two nal units.
374 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); 363 ASSERT_TRUE(packetizer->NextPacket(&packet));
375 size_t expected_packet_size = 364 size_t expected_packet_size =
376 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize; 365 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize;
377 ASSERT_EQ(expected_packet_size, packet.payload_size()); 366 ASSERT_EQ(expected_packet_size, packet.payload_size());
378 EXPECT_TRUE(last);
379 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i) 367 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i)
380 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload()); 368 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload());
381 369
382 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); 370 EXPECT_FALSE(packetizer->NextPacket(&packet));
383 } 371 }
384 372
385 TEST(RtpPacketizerH264Test, TestFUAOddSize) { 373 TEST(RtpPacketizerH264Test, TestFUAOddSize) {
386 const size_t kExpectedPayloadSizes[2] = {600, 600}; 374 const size_t kExpectedPayloadSizes[2] = {600, 600};
387 TestFua( 375 TestFua(
388 kMaxPayloadSize + 1, 376 kMaxPayloadSize + 1,
389 kMaxPayloadSize, 377 kMaxPayloadSize,
390 std::vector<size_t>(kExpectedPayloadSizes, 378 std::vector<size_t>(kExpectedPayloadSizes,
391 kExpectedPayloadSizes + 379 kExpectedPayloadSizes +
392 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 380 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
393 } 381 }
394 382
395 TEST(RtpPacketizerH264Test, TestFUAEvenSize) { 383 TEST(RtpPacketizerH264Test, TestFUAEvenSize) {
396 const size_t kExpectedPayloadSizes[2] = {601, 600}; 384 const size_t kExpectedPayloadSizes[2] = {601, 600};
397 TestFua( 385 TestFua(
398 kMaxPayloadSize + 2, 386 kMaxPayloadSize + 2,
399 kMaxPayloadSize, 387 kMaxPayloadSize,
400 std::vector<size_t>(kExpectedPayloadSizes, 388 std::vector<size_t>(kExpectedPayloadSizes,
401 kExpectedPayloadSizes + 389 kExpectedPayloadSizes +
402 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 390 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
403 } 391 }
404 392
405 TEST(RtpPacketizerH264Test, TestFUARounding) { 393 TEST(RtpPacketizerH264Test, TestFUARounding) {
406 const size_t kExpectedPayloadSizes[8] = {1266, 1266, 1266, 1266, 394 const size_t kExpectedPayloadSizes[8] = {1266, 1266, 1266, 1265,
407 1266, 1266, 1266, 1261}; 395 1265, 1265, 1265, 1265};
408 TestFua( 396 TestFua(
409 10124, 397 10124,
410 1448, 398 1448,
411 std::vector<size_t>(kExpectedPayloadSizes, 399 std::vector<size_t>(kExpectedPayloadSizes,
412 kExpectedPayloadSizes + 400 kExpectedPayloadSizes +
413 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); 401 sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
414 } 402 }
415 403
416 TEST(RtpPacketizerH264Test, TestFUABig) { 404 TEST(RtpPacketizerH264Test, TestFUABig) {
417 const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198, 405 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; 476 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
489 477
490 // Set size to fragment SPS into two FU-A packets. 478 // Set size to fragment SPS into two FU-A packets.
491 packetizer_.reset( 479 packetizer_.reset(
492 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 480 CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
493 sizeof(kOriginalSps) - 2 + kHeaderOverhead)); 481 sizeof(kOriginalSps) - 2 + kHeaderOverhead));
494 482
495 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 483 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
496 &fragmentation_header_); 484 &fragmentation_header_);
497 485
498 bool last_packet = true;
499 RtpPacketToSend packet(kNoExtensions); 486 RtpPacketToSend packet(kNoExtensions);
500 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity()); 487 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity());
501 488
502 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 489 EXPECT_TRUE(packetizer_->NextPacket(&packet));
503 size_t offset = H264::kNaluTypeSize; 490 size_t offset = H264::kNaluTypeSize;
504 size_t length = packet.payload_size() - kFuAHeaderSize; 491 size_t length = packet.payload_size() - kFuAHeaderSize;
505 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 492 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
506 ElementsAreArray(&kRewrittenSps[offset], length)); 493 ElementsAreArray(&kRewrittenSps[offset], length));
507 offset += length; 494 offset += length;
508 495
509 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 496 EXPECT_TRUE(packetizer_->NextPacket(&packet));
510 length = packet.payload_size() - kFuAHeaderSize; 497 length = packet.payload_size() - kFuAHeaderSize;
511 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), 498 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
512 ElementsAreArray(&kRewrittenSps[offset], length)); 499 ElementsAreArray(&kRewrittenSps[offset], length));
513 offset += length; 500 offset += length;
514 501
515 EXPECT_EQ(offset, sizeof(kRewrittenSps)); 502 EXPECT_EQ(offset, sizeof(kRewrittenSps));
516 } 503 }
517 504
518 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { 505 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) {
519 const size_t kHeaderOverhead = kFuAHeaderSize + 1; 506 const size_t kHeaderOverhead = kFuAHeaderSize + 1;
520 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. 507 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type.
521 sizeof(kRewrittenSps) + sizeof(kIdrOne) + 508 sizeof(kRewrittenSps) + sizeof(kIdrOne) +
522 sizeof(kIdrTwo) + (kLengthFieldLength * 3); 509 sizeof(kIdrTwo) + (kLengthFieldLength * 3);
523 510
524 // Set size to include SPS and the rest of the packets in a Stap-A package. 511 // Set size to include SPS and the rest of the packets in a Stap-A package.
525 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, 512 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
526 kExpectedTotalSize + kHeaderOverhead)); 513 kExpectedTotalSize + kHeaderOverhead));
527 514
528 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), 515 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
529 &fragmentation_header_); 516 &fragmentation_header_);
530 517
531 bool last_packet = true;
532 RtpPacketToSend packet(kNoExtensions); 518 RtpPacketToSend packet(kNoExtensions);
533 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity()); 519 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity());
534 520
535 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); 521 EXPECT_TRUE(packetizer_->NextPacket(&packet));
536 EXPECT_EQ(kExpectedTotalSize, packet.payload_size()); 522 EXPECT_EQ(kExpectedTotalSize, packet.payload_size());
537 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength, 523 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength,
538 sizeof(kRewrittenSps)), 524 sizeof(kRewrittenSps)),
539 ElementsAreArray(kRewrittenSps)); 525 ElementsAreArray(kRewrittenSps));
540 } 526 }
541 527
542 class RtpDepacketizerH264Test : public ::testing::Test { 528 class RtpDepacketizerH264Test : public ::testing::Test {
543 protected: 529 protected:
544 RtpDepacketizerH264Test() 530 RtpDepacketizerH264Test()
545 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {} 531 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {}
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 EXPECT_EQ(kVideoFrameDelta, payload.frame_type); 882 EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
897 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); 883 EXPECT_EQ(kH264SingleNalu, h264.packetization_type);
898 EXPECT_EQ(kSei, h264.nalu_type); 884 EXPECT_EQ(kSei, h264.nalu_type);
899 ASSERT_EQ(1u, h264.nalus_length); 885 ASSERT_EQ(1u, h264.nalus_length);
900 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); 886 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type);
901 EXPECT_EQ(-1, h264.nalus[0].sps_id); 887 EXPECT_EQ(-1, h264.nalus[0].sps_id);
902 EXPECT_EQ(-1, h264.nalus[0].pps_id); 888 EXPECT_EQ(-1, h264.nalus[0].pps_id);
903 } 889 }
904 890
905 } // namespace webrtc 891 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698