OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |