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