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 25 matching lines...) Expand all Loading... | |
36 | 36 |
37 static const size_t kNalHeaderSize = 1; | 37 static const size_t kNalHeaderSize = 1; |
38 static const size_t kFuAHeaderSize = 2; | 38 static const size_t kFuAHeaderSize = 2; |
39 | 39 |
40 // Bit masks for FU (A and B) indicators. | 40 // Bit masks for FU (A and B) indicators. |
41 enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F }; | 41 enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F }; |
42 | 42 |
43 // Bit masks for FU (A and B) headers. | 43 // Bit masks for FU (A and B) headers. |
44 enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 }; | 44 enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 }; |
45 | 45 |
46 static const H264PacketizationMode packetization_modes[] = { | |
47 kH264PacketizationMode0, kH264PacketizationMode1}; | |
48 | |
49 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode, | |
50 size_t max_payload_size) { | |
51 RTPVideoTypeHeader type_header; | |
52 type_header.H264.packetization_mode = mode; | |
53 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, | |
54 kEmptyFrame); | |
55 } | |
56 | |
46 void VerifyFua(size_t fua_index, | 57 void VerifyFua(size_t fua_index, |
47 const uint8_t* expected_payload, | 58 const uint8_t* expected_payload, |
48 int offset, | 59 int offset, |
49 const uint8_t* packet, | 60 const uint8_t* packet, |
50 size_t length, | 61 size_t length, |
51 const std::vector<size_t>& expected_sizes) { | 62 const std::vector<size_t>& expected_sizes) { |
52 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) | 63 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) |
53 << "FUA index: " << fua_index; | 64 << "FUA index: " << fua_index; |
54 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. | 65 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. |
55 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; | 66 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; |
(...skipping 21 matching lines...) Expand all Loading... | |
77 std::unique_ptr<uint8_t[]> frame; | 88 std::unique_ptr<uint8_t[]> frame; |
78 frame.reset(new uint8_t[frame_size]); | 89 frame.reset(new uint8_t[frame_size]); |
79 frame[0] = 0x05; // F=0, NRI=0, Type=5. | 90 frame[0] = 0x05; // F=0, NRI=0, Type=5. |
80 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { | 91 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { |
81 frame[i + kNalHeaderSize] = i; | 92 frame[i + kNalHeaderSize] = i; |
82 } | 93 } |
83 RTPFragmentationHeader fragmentation; | 94 RTPFragmentationHeader fragmentation; |
84 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 95 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
85 fragmentation.fragmentationOffset[0] = 0; | 96 fragmentation.fragmentationOffset[0] = 0; |
86 fragmentation.fragmentationLength[0] = frame_size; | 97 fragmentation.fragmentationLength[0] = frame_size; |
87 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( | 98 std::unique_ptr<RtpPacketizer> packetizer( |
88 kRtpVideoH264, max_payload_size, NULL, kEmptyFrame)); | 99 CreateH264Packetizer(kH264PacketizationMode1, max_payload_size)); |
89 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); | 100 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); |
90 | 101 |
91 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); | 102 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); |
92 size_t length = 0; | 103 size_t length = 0; |
93 bool last = false; | 104 bool last = false; |
94 size_t offset = kNalHeaderSize; | 105 size_t offset = kNalHeaderSize; |
95 for (size_t i = 0; i < expected_sizes.size(); ++i) { | 106 for (size_t i = 0; i < expected_sizes.size(); ++i) { |
96 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); | 107 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); |
97 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); | 108 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); |
98 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; | 109 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 ::testing::ElementsAreArray(packet, packet_length)); | 162 ::testing::ElementsAreArray(packet, packet_length)); |
152 } | 163 } |
153 } // namespace | 164 } // namespace |
154 | 165 |
155 TEST(RtpPacketizerH264Test, TestSingleNalu) { | 166 TEST(RtpPacketizerH264Test, TestSingleNalu) { |
156 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. | 167 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. |
157 RTPFragmentationHeader fragmentation; | 168 RTPFragmentationHeader fragmentation; |
158 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 169 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
159 fragmentation.fragmentationOffset[0] = 0; | 170 fragmentation.fragmentationOffset[0] = 0; |
160 fragmentation.fragmentationLength[0] = sizeof(frame); | 171 fragmentation.fragmentationLength[0] = sizeof(frame); |
161 std::unique_ptr<RtpPacketizer> packetizer( | 172 // This test should work in both packetization mode 0 and mode 1. |
162 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 173 for (auto packetization_mode : packetization_modes) { |
magjed_webrtc
2016/11/04 13:57:05
I'm reposting one of my previous comments that I t
hta-webrtc
2016/11/09 09:27:10
Done.
Not enjoying the printout format (it prints
magjed_webrtc
2016/11/09 15:18:25
When the tests run, it will just print the index,
| |
163 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); | 174 std::unique_ptr<RtpPacketizer> packetizer( |
164 uint8_t packet[kMaxPayloadSize] = {0}; | 175 CreateH264Packetizer(packetization_mode, kMaxPayloadSize)); |
165 size_t length = 0; | 176 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); |
166 bool last = false; | 177 uint8_t packet[kMaxPayloadSize] = {0}; |
167 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 178 size_t length = 0; |
168 EXPECT_EQ(2u, length); | 179 bool last = false; |
169 EXPECT_TRUE(last); | 180 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
170 VerifySingleNaluPayload( | 181 EXPECT_EQ(2u, length); |
171 fragmentation, 0, frame, sizeof(frame), packet, length); | 182 EXPECT_TRUE(last); |
172 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 183 VerifySingleNaluPayload(fragmentation, 0, frame, sizeof(frame), packet, |
184 length); | |
185 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | |
186 } | |
173 } | 187 } |
174 | 188 |
175 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { | 189 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { |
176 const size_t kFrameSize = kMaxPayloadSize + 100; | 190 const size_t kFrameSize = kMaxPayloadSize + 100; |
177 uint8_t frame[kFrameSize] = {0}; | 191 uint8_t frame[kFrameSize] = {0}; |
178 for (size_t i = 0; i < kFrameSize; ++i) | 192 for (size_t i = 0; i < kFrameSize; ++i) |
179 frame[i] = i; | 193 frame[i] = i; |
180 RTPFragmentationHeader fragmentation; | 194 RTPFragmentationHeader fragmentation; |
181 fragmentation.VerifyAndAllocateFragmentationHeader(2); | 195 fragmentation.VerifyAndAllocateFragmentationHeader(2); |
182 fragmentation.fragmentationOffset[0] = 0; | 196 fragmentation.fragmentationOffset[0] = 0; |
183 fragmentation.fragmentationLength[0] = kMaxPayloadSize; | 197 fragmentation.fragmentationLength[0] = kMaxPayloadSize; |
184 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; | 198 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; |
185 fragmentation.fragmentationLength[1] = 100; | 199 fragmentation.fragmentationLength[1] = 100; |
186 // Set NAL headers. | 200 // Set NAL headers. |
187 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 201 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
188 frame[fragmentation.fragmentationOffset[1]] = 0x01; | 202 frame[fragmentation.fragmentationOffset[1]] = 0x01; |
189 | 203 |
190 std::unique_ptr<RtpPacketizer> packetizer( | 204 for (auto packetization_mode : packetization_modes) { |
191 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 205 std::unique_ptr<RtpPacketizer> packetizer( |
192 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 206 CreateH264Packetizer(packetization_mode, kMaxPayloadSize)); |
207 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | |
193 | 208 |
194 uint8_t packet[kMaxPayloadSize] = {0}; | 209 uint8_t packet[kMaxPayloadSize] = {0}; |
195 size_t length = 0; | 210 size_t length = 0; |
196 bool last = false; | 211 bool last = false; |
197 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 212 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
198 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); | 213 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); |
199 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); | 214 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, |
215 length); | |
200 | 216 |
201 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 217 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
202 ASSERT_EQ(fragmentation.fragmentationLength[1], length); | 218 ASSERT_EQ(fragmentation.fragmentationLength[1], length); |
203 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); | 219 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, |
204 EXPECT_TRUE(last); | 220 length); |
221 EXPECT_TRUE(last); | |
205 | 222 |
206 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 223 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
224 } | |
207 } | 225 } |
208 | 226 |
209 TEST(RtpPacketizerH264Test, TestStapA) { | 227 TEST(RtpPacketizerH264Test, TestStapA) { |
210 const size_t kFrameSize = | 228 const size_t kFrameSize = |
211 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 229 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
212 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 230 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
213 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 231 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
214 0x05}; // F=0, NRI=0, Type=5 (IDR). | 232 0x05}; // F=0, NRI=0, Type=5 (IDR). |
215 const size_t kPayloadOffset = 5; | 233 const size_t kPayloadOffset = 5; |
216 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 234 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
217 frame[i + kPayloadOffset] = i; | 235 frame[i + kPayloadOffset] = i; |
218 RTPFragmentationHeader fragmentation; | 236 RTPFragmentationHeader fragmentation; |
219 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 237 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
220 fragmentation.fragmentationOffset[0] = 0; | 238 fragmentation.fragmentationOffset[0] = 0; |
221 fragmentation.fragmentationLength[0] = 2; | 239 fragmentation.fragmentationLength[0] = 2; |
222 fragmentation.fragmentationOffset[1] = 2; | 240 fragmentation.fragmentationOffset[1] = 2; |
223 fragmentation.fragmentationLength[1] = 2; | 241 fragmentation.fragmentationLength[1] = 2; |
224 fragmentation.fragmentationOffset[2] = 4; | 242 fragmentation.fragmentationOffset[2] = 4; |
225 fragmentation.fragmentationLength[2] = | 243 fragmentation.fragmentationLength[2] = |
226 kNalHeaderSize + kFrameSize - kPayloadOffset; | 244 kNalHeaderSize + kFrameSize - kPayloadOffset; |
227 std::unique_ptr<RtpPacketizer> packetizer( | 245 std::unique_ptr<RtpPacketizer> packetizer( |
228 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 246 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
229 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 247 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
230 | 248 |
231 uint8_t packet[kMaxPayloadSize] = {0}; | 249 uint8_t packet[kMaxPayloadSize] = {0}; |
232 size_t length = 0; | 250 size_t length = 0; |
233 bool last = false; | 251 bool last = false; |
234 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 252 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
235 size_t expected_packet_size = | 253 size_t expected_packet_size = |
236 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; | 254 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; |
237 ASSERT_EQ(expected_packet_size, length); | 255 ASSERT_EQ(expected_packet_size, length); |
238 EXPECT_TRUE(last); | 256 EXPECT_TRUE(last); |
239 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) | 257 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) |
240 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); | 258 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); |
241 | 259 |
242 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 260 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
243 } | 261 } |
244 | 262 |
263 TEST(RtpPacketizerH264Test, TestMode0HasNoStapA) { | |
264 // This is the same setup as for the TestStapA test. | |
265 const size_t kFrameSize = | |
266 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | |
267 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | |
268 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | |
269 0x05}; // F=0, NRI=0, Type=5 (IDR). | |
270 const size_t kPayloadOffset = 5; | |
271 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | |
272 frame[i + kPayloadOffset] = i; | |
273 RTPFragmentationHeader fragmentation; | |
274 fragmentation.VerifyAndAllocateFragmentationHeader(3); | |
275 fragmentation.fragmentationOffset[0] = 0; | |
276 fragmentation.fragmentationLength[0] = 2; | |
277 fragmentation.fragmentationOffset[1] = 2; | |
278 fragmentation.fragmentationLength[1] = 2; | |
279 fragmentation.fragmentationOffset[2] = 4; | |
280 fragmentation.fragmentationLength[2] = | |
281 kNalHeaderSize + kFrameSize - kPayloadOffset; | |
282 std::unique_ptr<RtpPacketizer> packetizer( | |
283 CreateH264Packetizer(kH264PacketizationMode0, kMaxPayloadSize)); | |
284 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | |
285 | |
286 uint8_t packet[kMaxPayloadSize] = {0}; | |
287 size_t length = 0; | |
288 bool last = false; | |
289 // The three fragments should be returned as three packets. | |
290 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | |
291 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | |
292 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | |
293 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | |
294 } | |
295 | |
245 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { | 296 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { |
246 const size_t kFrameSize = kMaxPayloadSize - 1; | 297 const size_t kFrameSize = kMaxPayloadSize - 1; |
247 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. | 298 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. |
248 0x08, 0xFF, // F=0, NRI=0, Type=8. | 299 0x08, 0xFF, // F=0, NRI=0, Type=8. |
249 0x05}; // F=0, NRI=0, Type=5. | 300 0x05}; // F=0, NRI=0, Type=5. |
250 const size_t kPayloadOffset = 5; | 301 const size_t kPayloadOffset = 5; |
251 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 302 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
252 frame[i + kPayloadOffset] = i; | 303 frame[i + kPayloadOffset] = i; |
253 RTPFragmentationHeader fragmentation; | 304 RTPFragmentationHeader fragmentation; |
254 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 305 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
255 fragmentation.fragmentationOffset[0] = 0; | 306 fragmentation.fragmentationOffset[0] = 0; |
256 fragmentation.fragmentationLength[0] = 2; | 307 fragmentation.fragmentationLength[0] = 2; |
257 fragmentation.fragmentationOffset[1] = 2; | 308 fragmentation.fragmentationOffset[1] = 2; |
258 fragmentation.fragmentationLength[1] = 2; | 309 fragmentation.fragmentationLength[1] = 2; |
259 fragmentation.fragmentationOffset[2] = 4; | 310 fragmentation.fragmentationOffset[2] = 4; |
260 fragmentation.fragmentationLength[2] = | 311 fragmentation.fragmentationLength[2] = |
261 kNalHeaderSize + kFrameSize - kPayloadOffset; | 312 kNalHeaderSize + kFrameSize - kPayloadOffset; |
262 std::unique_ptr<RtpPacketizer> packetizer( | 313 std::unique_ptr<RtpPacketizer> packetizer( |
263 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 314 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
264 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 315 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
265 | 316 |
266 uint8_t packet[kMaxPayloadSize] = {0}; | 317 uint8_t packet[kMaxPayloadSize] = {0}; |
267 size_t length = 0; | 318 size_t length = 0; |
268 bool last = false; | 319 bool last = false; |
269 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 320 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
270 size_t expected_packet_size = kNalHeaderSize; | 321 size_t expected_packet_size = kNalHeaderSize; |
271 for (size_t i = 0; i < 2; ++i) { | 322 for (size_t i = 0; i < 2; ++i) { |
272 expected_packet_size += | 323 expected_packet_size += |
273 kLengthFieldLength + fragmentation.fragmentationLength[i]; | 324 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
(...skipping 27 matching lines...) Expand all Loading... | |
301 uint8_t frame[kFrameSize]; | 352 uint8_t frame[kFrameSize]; |
302 size_t nalu_offset = 0; | 353 size_t nalu_offset = 0; |
303 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { | 354 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { |
304 nalu_offset = fragmentation.fragmentationOffset[i]; | 355 nalu_offset = fragmentation.fragmentationOffset[i]; |
305 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. | 356 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. |
306 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { | 357 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { |
307 frame[nalu_offset + j] = i + j; | 358 frame[nalu_offset + j] = i + j; |
308 } | 359 } |
309 } | 360 } |
310 std::unique_ptr<RtpPacketizer> packetizer( | 361 std::unique_ptr<RtpPacketizer> packetizer( |
311 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 362 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); |
312 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 363 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
313 | 364 |
314 // First expecting two FU-A packets. | 365 // First expecting two FU-A packets. |
315 std::vector<size_t> fua_sizes; | 366 std::vector<size_t> fua_sizes; |
316 fua_sizes.push_back(1100); | 367 fua_sizes.push_back(1100); |
317 fua_sizes.push_back(1099); | 368 fua_sizes.push_back(1099); |
318 uint8_t packet[kMaxPayloadSize] = {0}; | 369 uint8_t packet[kMaxPayloadSize] = {0}; |
319 size_t length = 0; | 370 size_t length = 0; |
320 bool last = false; | 371 bool last = false; |
321 int fua_offset = kNalHeaderSize; | 372 int fua_offset = kNalHeaderSize; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
374 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU | 425 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU |
375 // header. | 426 // header. |
376 TestFua( | 427 TestFua( |
377 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, | 428 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, |
378 kMaxPayloadSize, | 429 kMaxPayloadSize, |
379 std::vector<size_t>(kExpectedPayloadSizes, | 430 std::vector<size_t>(kExpectedPayloadSizes, |
380 kExpectedPayloadSizes + | 431 kExpectedPayloadSizes + |
381 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 432 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
382 } | 433 } |
383 | 434 |
435 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | |
436 | |
437 TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) { | |
438 const size_t kFrameSize = kMaxPayloadSize + 100; | |
439 uint8_t frame[kFrameSize] = {0}; | |
440 for (size_t i = 0; i < kFrameSize; ++i) | |
441 frame[i] = i; | |
442 RTPFragmentationHeader fragmentation; | |
443 fragmentation.VerifyAndAllocateFragmentationHeader(1); | |
444 fragmentation.fragmentationOffset[0] = 0; | |
445 fragmentation.fragmentationLength[0] = kFrameSize; | |
446 // Set NAL headers. | |
447 frame[fragmentation.fragmentationOffset[0]] = 0x01; | |
448 | |
449 std::unique_ptr<RtpPacketizer> packetizer( | |
450 CreateH264Packetizer(kH264PacketizationMode0, kMaxPayloadSize)); | |
451 EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), | |
452 "payload_size"); | |
453 } | |
454 | |
455 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | |
456 | |
384 namespace { | 457 namespace { |
385 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; | 458 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; |
386 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, | 459 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, |
387 0xF4, 0x05, 0x03, 0xC7, 0xC0}; | 460 0xF4, 0x05, 0x03, 0xC7, 0xC0}; |
388 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, | 461 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, |
389 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; | 462 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; |
390 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; | 463 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; |
391 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; | 464 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; |
392 } | 465 } |
393 | 466 |
(...skipping 20 matching lines...) Expand all Loading... | |
414 protected: | 487 protected: |
415 rtc::Buffer in_buffer_; | 488 rtc::Buffer in_buffer_; |
416 RTPFragmentationHeader fragmentation_header_; | 489 RTPFragmentationHeader fragmentation_header_; |
417 std::unique_ptr<RtpPacketizer> packetizer_; | 490 std::unique_ptr<RtpPacketizer> packetizer_; |
418 }; | 491 }; |
419 | 492 |
420 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { | 493 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { |
421 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 494 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
422 | 495 |
423 // Set size to fragment SPS into two FU-A packets. | 496 // Set size to fragment SPS into two FU-A packets. |
424 packetizer_.reset(RtpPacketizer::Create( | 497 packetizer_.reset(CreateH264Packetizer( |
425 kRtpVideoH264, sizeof(kOriginalSps) - 2 + kHeaderOverhead, nullptr, | 498 kH264PacketizationMode1, sizeof(kOriginalSps) - 2 + kHeaderOverhead)); |
426 kEmptyFrame)); | |
427 | 499 |
428 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 500 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
429 &fragmentation_header_); | 501 &fragmentation_header_); |
430 | 502 |
431 bool last_packet = true; | 503 bool last_packet = true; |
432 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; | 504 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; |
433 size_t num_bytes = 0; | 505 size_t num_bytes = 0; |
434 | 506 |
435 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 507 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
436 size_t offset = H264::kNaluTypeSize; | 508 size_t offset = H264::kNaluTypeSize; |
(...skipping 15 matching lines...) Expand all Loading... | |
452 EXPECT_EQ(offset, sizeof(kRewrittenSps)); | 524 EXPECT_EQ(offset, sizeof(kRewrittenSps)); |
453 } | 525 } |
454 | 526 |
455 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { | 527 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { |
456 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 528 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
457 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. | 529 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. |
458 sizeof(kRewrittenSps) + sizeof(kIdrOne) + | 530 sizeof(kRewrittenSps) + sizeof(kIdrOne) + |
459 sizeof(kIdrTwo) + (kLengthFieldLength * 3); | 531 sizeof(kIdrTwo) + (kLengthFieldLength * 3); |
460 | 532 |
461 // Set size to include SPS and the rest of the packets in a Stap-A package. | 533 // Set size to include SPS and the rest of the packets in a Stap-A package. |
462 packetizer_.reset(RtpPacketizer::Create(kRtpVideoH264, | 534 packetizer_.reset(CreateH264Packetizer(kH264PacketizationMode1, |
463 kExpectedTotalSize + kHeaderOverhead, | 535 kExpectedTotalSize + kHeaderOverhead)); |
464 nullptr, kEmptyFrame)); | |
465 | 536 |
466 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 537 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
467 &fragmentation_header_); | 538 &fragmentation_header_); |
468 | 539 |
469 bool last_packet = true; | 540 bool last_packet = true; |
470 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; | 541 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; |
471 size_t num_bytes = 0; | 542 size_t num_bytes = 0; |
472 | 543 |
473 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 544 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
474 EXPECT_EQ(kExpectedTotalSize, num_bytes); | 545 EXPECT_EQ(kExpectedTotalSize, num_bytes); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
831 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; | 902 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; |
832 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); | 903 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); |
833 EXPECT_EQ(kSei, h264.nalu_type); | 904 EXPECT_EQ(kSei, h264.nalu_type); |
834 ASSERT_EQ(1u, h264.nalus_length); | 905 ASSERT_EQ(1u, h264.nalus_length); |
835 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); | 906 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); |
836 EXPECT_EQ(-1, h264.nalus[0].sps_id); | 907 EXPECT_EQ(-1, h264.nalus[0].sps_id); |
837 EXPECT_EQ(-1, h264.nalus[0].pps_id); | 908 EXPECT_EQ(-1, h264.nalus[0].pps_id); |
838 } | 909 } |
839 | 910 |
840 } // namespace webrtc | 911 } // namespace webrtc |
OLD | NEW |