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 24 matching lines...) Expand all Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |