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 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode, | |
47 size_t max_payload_size) { | |
48 RTPVideoTypeHeader type_header; | |
49 type_header.H264.packetization_mode = mode; | |
50 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, | |
51 kEmptyFrame); | |
52 } | |
53 | |
54 void VerifyFua(size_t fua_index, | 46 void VerifyFua(size_t fua_index, |
55 const uint8_t* expected_payload, | 47 const uint8_t* expected_payload, |
56 int offset, | 48 int offset, |
57 const uint8_t* packet, | 49 const uint8_t* packet, |
58 size_t length, | 50 size_t length, |
59 const std::vector<size_t>& expected_sizes) { | 51 const std::vector<size_t>& expected_sizes) { |
60 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) | 52 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) |
61 << "FUA index: " << fua_index; | 53 << "FUA index: " << fua_index; |
62 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. | 54 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. |
63 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; | 55 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; |
(...skipping 21 matching lines...) Expand all Loading... |
85 std::unique_ptr<uint8_t[]> frame; | 77 std::unique_ptr<uint8_t[]> frame; |
86 frame.reset(new uint8_t[frame_size]); | 78 frame.reset(new uint8_t[frame_size]); |
87 frame[0] = 0x05; // F=0, NRI=0, Type=5. | 79 frame[0] = 0x05; // F=0, NRI=0, Type=5. |
88 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { | 80 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { |
89 frame[i + kNalHeaderSize] = i; | 81 frame[i + kNalHeaderSize] = i; |
90 } | 82 } |
91 RTPFragmentationHeader fragmentation; | 83 RTPFragmentationHeader fragmentation; |
92 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 84 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
93 fragmentation.fragmentationOffset[0] = 0; | 85 fragmentation.fragmentationOffset[0] = 0; |
94 fragmentation.fragmentationLength[0] = frame_size; | 86 fragmentation.fragmentationLength[0] = frame_size; |
95 std::unique_ptr<RtpPacketizer> packetizer( | 87 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( |
96 CreateH264Packetizer(kH264PacketizationMode1, max_payload_size)); | 88 kRtpVideoH264, max_payload_size, NULL, kEmptyFrame)); |
97 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); | 89 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); |
98 | 90 |
99 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); | 91 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); |
100 size_t length = 0; | 92 size_t length = 0; |
101 bool last = false; | 93 bool last = false; |
102 size_t offset = kNalHeaderSize; | 94 size_t offset = kNalHeaderSize; |
103 for (size_t i = 0; i < expected_sizes.size(); ++i) { | 95 for (size_t i = 0; i < expected_sizes.size(); ++i) { |
104 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); | 96 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); |
105 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); | 97 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); |
106 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; | 98 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 size_t packet_length) { | 145 size_t packet_length) { |
154 std::vector<uint8_t> expected_payload_vector( | 146 std::vector<uint8_t> expected_payload_vector( |
155 &frame[fragmentation.fragmentationOffset[nalu_index]], | 147 &frame[fragmentation.fragmentationOffset[nalu_index]], |
156 &frame[fragmentation.fragmentationOffset[nalu_index] + | 148 &frame[fragmentation.fragmentationOffset[nalu_index] + |
157 fragmentation.fragmentationLength[nalu_index]]); | 149 fragmentation.fragmentationLength[nalu_index]]); |
158 EXPECT_THAT(expected_payload_vector, | 150 EXPECT_THAT(expected_payload_vector, |
159 ::testing::ElementsAreArray(packet, packet_length)); | 151 ::testing::ElementsAreArray(packet, packet_length)); |
160 } | 152 } |
161 } // namespace | 153 } // namespace |
162 | 154 |
163 // Tests that should work with both packetization mode 0 and | 155 TEST(RtpPacketizerH264Test, TestSingleNalu) { |
164 // packetization mode 1. | |
165 class RtpPacketizerH264ModeTest | |
166 : public ::testing::TestWithParam<H264PacketizationMode> {}; | |
167 | |
168 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { | |
169 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. | 156 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. |
170 RTPFragmentationHeader fragmentation; | 157 RTPFragmentationHeader fragmentation; |
171 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 158 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
172 fragmentation.fragmentationOffset[0] = 0; | 159 fragmentation.fragmentationOffset[0] = 0; |
173 fragmentation.fragmentationLength[0] = sizeof(frame); | 160 fragmentation.fragmentationLength[0] = sizeof(frame); |
174 std::unique_ptr<RtpPacketizer> packetizer( | 161 std::unique_ptr<RtpPacketizer> packetizer( |
175 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); | 162 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); |
176 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); | 163 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); |
177 uint8_t packet[kMaxPayloadSize] = {0}; | 164 uint8_t packet[kMaxPayloadSize] = {0}; |
178 size_t length = 0; | 165 size_t length = 0; |
179 bool last = false; | 166 bool last = false; |
180 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 167 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
181 EXPECT_EQ(2u, length); | 168 EXPECT_EQ(2u, length); |
182 EXPECT_TRUE(last); | 169 EXPECT_TRUE(last); |
183 VerifySingleNaluPayload(fragmentation, 0, frame, sizeof(frame), packet, | 170 VerifySingleNaluPayload( |
184 length); | 171 fragmentation, 0, frame, sizeof(frame), packet, length); |
185 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 172 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
186 } | 173 } |
187 | 174 |
188 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { | 175 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { |
189 const size_t kFrameSize = kMaxPayloadSize + 100; | 176 const size_t kFrameSize = kMaxPayloadSize + 100; |
190 uint8_t frame[kFrameSize] = {0}; | 177 uint8_t frame[kFrameSize] = {0}; |
191 for (size_t i = 0; i < kFrameSize; ++i) | 178 for (size_t i = 0; i < kFrameSize; ++i) |
192 frame[i] = i; | 179 frame[i] = i; |
193 RTPFragmentationHeader fragmentation; | 180 RTPFragmentationHeader fragmentation; |
194 fragmentation.VerifyAndAllocateFragmentationHeader(2); | 181 fragmentation.VerifyAndAllocateFragmentationHeader(2); |
195 fragmentation.fragmentationOffset[0] = 0; | 182 fragmentation.fragmentationOffset[0] = 0; |
196 fragmentation.fragmentationLength[0] = kMaxPayloadSize; | 183 fragmentation.fragmentationLength[0] = kMaxPayloadSize; |
197 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; | 184 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; |
198 fragmentation.fragmentationLength[1] = 100; | 185 fragmentation.fragmentationLength[1] = 100; |
199 // Set NAL headers. | 186 // Set NAL headers. |
200 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 187 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
201 frame[fragmentation.fragmentationOffset[1]] = 0x01; | 188 frame[fragmentation.fragmentationOffset[1]] = 0x01; |
202 | 189 |
203 std::unique_ptr<RtpPacketizer> packetizer( | 190 std::unique_ptr<RtpPacketizer> packetizer( |
204 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); | 191 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); |
205 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 192 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
206 | 193 |
207 uint8_t packet[kMaxPayloadSize] = {0}; | 194 uint8_t packet[kMaxPayloadSize] = {0}; |
208 size_t length = 0; | 195 size_t length = 0; |
209 bool last = false; | 196 bool last = false; |
210 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 197 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
211 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); | 198 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); |
212 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); | 199 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); |
213 | 200 |
214 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 201 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
215 ASSERT_EQ(fragmentation.fragmentationLength[1], length); | 202 ASSERT_EQ(fragmentation.fragmentationLength[1], length); |
216 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); | 203 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); |
217 EXPECT_TRUE(last); | 204 EXPECT_TRUE(last); |
218 | 205 |
219 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 206 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
220 } | 207 } |
221 | 208 |
222 INSTANTIATE_TEST_CASE_P(PacketMode, | |
223 RtpPacketizerH264ModeTest, | |
224 ::testing::Values(kH264PacketizationMode0, | |
225 kH264PacketizationMode1)); | |
226 | |
227 TEST(RtpPacketizerH264Test, TestStapA) { | 209 TEST(RtpPacketizerH264Test, TestStapA) { |
228 const size_t kFrameSize = | 210 const size_t kFrameSize = |
229 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 211 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
230 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 212 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
231 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 213 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
232 0x05}; // F=0, NRI=0, Type=5 (IDR). | 214 0x05}; // F=0, NRI=0, Type=5 (IDR). |
233 const size_t kPayloadOffset = 5; | 215 const size_t kPayloadOffset = 5; |
234 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 216 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
235 frame[i + kPayloadOffset] = i; | 217 frame[i + kPayloadOffset] = i; |
236 RTPFragmentationHeader fragmentation; | 218 RTPFragmentationHeader fragmentation; |
237 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 219 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
238 fragmentation.fragmentationOffset[0] = 0; | 220 fragmentation.fragmentationOffset[0] = 0; |
239 fragmentation.fragmentationLength[0] = 2; | 221 fragmentation.fragmentationLength[0] = 2; |
240 fragmentation.fragmentationOffset[1] = 2; | 222 fragmentation.fragmentationOffset[1] = 2; |
241 fragmentation.fragmentationLength[1] = 2; | 223 fragmentation.fragmentationLength[1] = 2; |
242 fragmentation.fragmentationOffset[2] = 4; | 224 fragmentation.fragmentationOffset[2] = 4; |
243 fragmentation.fragmentationLength[2] = | 225 fragmentation.fragmentationLength[2] = |
244 kNalHeaderSize + kFrameSize - kPayloadOffset; | 226 kNalHeaderSize + kFrameSize - kPayloadOffset; |
245 std::unique_ptr<RtpPacketizer> packetizer( | 227 std::unique_ptr<RtpPacketizer> packetizer( |
246 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); | 228 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); |
247 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 229 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
248 | 230 |
249 uint8_t packet[kMaxPayloadSize] = {0}; | 231 uint8_t packet[kMaxPayloadSize] = {0}; |
250 size_t length = 0; | 232 size_t length = 0; |
251 bool last = false; | 233 bool last = false; |
252 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 234 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
253 size_t expected_packet_size = | 235 size_t expected_packet_size = |
254 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; | 236 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; |
255 ASSERT_EQ(expected_packet_size, length); | 237 ASSERT_EQ(expected_packet_size, length); |
256 EXPECT_TRUE(last); | 238 EXPECT_TRUE(last); |
257 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) | 239 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) |
258 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); | 240 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); |
259 | 241 |
260 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 242 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
261 } | 243 } |
262 | 244 |
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 | |
296 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { | 245 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { |
297 const size_t kFrameSize = kMaxPayloadSize - 1; | 246 const size_t kFrameSize = kMaxPayloadSize - 1; |
298 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. | 247 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. |
299 0x08, 0xFF, // F=0, NRI=0, Type=8. | 248 0x08, 0xFF, // F=0, NRI=0, Type=8. |
300 0x05}; // F=0, NRI=0, Type=5. | 249 0x05}; // F=0, NRI=0, Type=5. |
301 const size_t kPayloadOffset = 5; | 250 const size_t kPayloadOffset = 5; |
302 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 251 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
303 frame[i + kPayloadOffset] = i; | 252 frame[i + kPayloadOffset] = i; |
304 RTPFragmentationHeader fragmentation; | 253 RTPFragmentationHeader fragmentation; |
305 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 254 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
306 fragmentation.fragmentationOffset[0] = 0; | 255 fragmentation.fragmentationOffset[0] = 0; |
307 fragmentation.fragmentationLength[0] = 2; | 256 fragmentation.fragmentationLength[0] = 2; |
308 fragmentation.fragmentationOffset[1] = 2; | 257 fragmentation.fragmentationOffset[1] = 2; |
309 fragmentation.fragmentationLength[1] = 2; | 258 fragmentation.fragmentationLength[1] = 2; |
310 fragmentation.fragmentationOffset[2] = 4; | 259 fragmentation.fragmentationOffset[2] = 4; |
311 fragmentation.fragmentationLength[2] = | 260 fragmentation.fragmentationLength[2] = |
312 kNalHeaderSize + kFrameSize - kPayloadOffset; | 261 kNalHeaderSize + kFrameSize - kPayloadOffset; |
313 std::unique_ptr<RtpPacketizer> packetizer( | 262 std::unique_ptr<RtpPacketizer> packetizer( |
314 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); | 263 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); |
315 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 264 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
316 | 265 |
317 uint8_t packet[kMaxPayloadSize] = {0}; | 266 uint8_t packet[kMaxPayloadSize] = {0}; |
318 size_t length = 0; | 267 size_t length = 0; |
319 bool last = false; | 268 bool last = false; |
320 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 269 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
321 size_t expected_packet_size = kNalHeaderSize; | 270 size_t expected_packet_size = kNalHeaderSize; |
322 for (size_t i = 0; i < 2; ++i) { | 271 for (size_t i = 0; i < 2; ++i) { |
323 expected_packet_size += | 272 expected_packet_size += |
324 kLengthFieldLength + fragmentation.fragmentationLength[i]; | 273 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
(...skipping 27 matching lines...) Expand all Loading... |
352 uint8_t frame[kFrameSize]; | 301 uint8_t frame[kFrameSize]; |
353 size_t nalu_offset = 0; | 302 size_t nalu_offset = 0; |
354 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { | 303 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { |
355 nalu_offset = fragmentation.fragmentationOffset[i]; | 304 nalu_offset = fragmentation.fragmentationOffset[i]; |
356 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. | 305 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. |
357 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { | 306 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { |
358 frame[nalu_offset + j] = i + j; | 307 frame[nalu_offset + j] = i + j; |
359 } | 308 } |
360 } | 309 } |
361 std::unique_ptr<RtpPacketizer> packetizer( | 310 std::unique_ptr<RtpPacketizer> packetizer( |
362 CreateH264Packetizer(kH264PacketizationMode1, kMaxPayloadSize)); | 311 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); |
363 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 312 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
364 | 313 |
365 // First expecting two FU-A packets. | 314 // First expecting two FU-A packets. |
366 std::vector<size_t> fua_sizes; | 315 std::vector<size_t> fua_sizes; |
367 fua_sizes.push_back(1100); | 316 fua_sizes.push_back(1100); |
368 fua_sizes.push_back(1099); | 317 fua_sizes.push_back(1099); |
369 uint8_t packet[kMaxPayloadSize] = {0}; | 318 uint8_t packet[kMaxPayloadSize] = {0}; |
370 size_t length = 0; | 319 size_t length = 0; |
371 bool last = false; | 320 bool last = false; |
372 int fua_offset = kNalHeaderSize; | 321 int fua_offset = kNalHeaderSize; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU | 374 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU |
426 // header. | 375 // header. |
427 TestFua( | 376 TestFua( |
428 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, | 377 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, |
429 kMaxPayloadSize, | 378 kMaxPayloadSize, |
430 std::vector<size_t>(kExpectedPayloadSizes, | 379 std::vector<size_t>(kExpectedPayloadSizes, |
431 kExpectedPayloadSizes + | 380 kExpectedPayloadSizes + |
432 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 381 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
433 } | 382 } |
434 | 383 |
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 | |
457 namespace { | 384 namespace { |
458 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; | 385 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; |
459 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, | 386 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, |
460 0xF4, 0x05, 0x03, 0xC7, 0xC0}; | 387 0xF4, 0x05, 0x03, 0xC7, 0xC0}; |
461 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, | 388 const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03, |
462 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; | 389 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00}; |
463 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; | 390 const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04}; |
464 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; | 391 const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11}; |
465 } | 392 } |
466 | 393 |
(...skipping 20 matching lines...) Expand all Loading... |
487 protected: | 414 protected: |
488 rtc::Buffer in_buffer_; | 415 rtc::Buffer in_buffer_; |
489 RTPFragmentationHeader fragmentation_header_; | 416 RTPFragmentationHeader fragmentation_header_; |
490 std::unique_ptr<RtpPacketizer> packetizer_; | 417 std::unique_ptr<RtpPacketizer> packetizer_; |
491 }; | 418 }; |
492 | 419 |
493 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { | 420 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { |
494 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 421 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
495 | 422 |
496 // Set size to fragment SPS into two FU-A packets. | 423 // Set size to fragment SPS into two FU-A packets. |
497 packetizer_.reset(CreateH264Packetizer( | 424 packetizer_.reset(RtpPacketizer::Create( |
498 kH264PacketizationMode1, sizeof(kOriginalSps) - 2 + kHeaderOverhead)); | 425 kRtpVideoH264, sizeof(kOriginalSps) - 2 + kHeaderOverhead, nullptr, |
| 426 kEmptyFrame)); |
499 | 427 |
500 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 428 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
501 &fragmentation_header_); | 429 &fragmentation_header_); |
502 | 430 |
503 bool last_packet = true; | 431 bool last_packet = true; |
504 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; | 432 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; |
505 size_t num_bytes = 0; | 433 size_t num_bytes = 0; |
506 | 434 |
507 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 435 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
508 size_t offset = H264::kNaluTypeSize; | 436 size_t offset = H264::kNaluTypeSize; |
(...skipping 15 matching lines...) Expand all Loading... |
524 EXPECT_EQ(offset, sizeof(kRewrittenSps)); | 452 EXPECT_EQ(offset, sizeof(kRewrittenSps)); |
525 } | 453 } |
526 | 454 |
527 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { | 455 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { |
528 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 456 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
529 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. | 457 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. |
530 sizeof(kRewrittenSps) + sizeof(kIdrOne) + | 458 sizeof(kRewrittenSps) + sizeof(kIdrOne) + |
531 sizeof(kIdrTwo) + (kLengthFieldLength * 3); | 459 sizeof(kIdrTwo) + (kLengthFieldLength * 3); |
532 | 460 |
533 // Set size to include SPS and the rest of the packets in a Stap-A package. | 461 // Set size to include SPS and the rest of the packets in a Stap-A package. |
534 packetizer_.reset(CreateH264Packetizer(kH264PacketizationMode1, | 462 packetizer_.reset(RtpPacketizer::Create(kRtpVideoH264, |
535 kExpectedTotalSize + kHeaderOverhead)); | 463 kExpectedTotalSize + kHeaderOverhead, |
| 464 nullptr, kEmptyFrame)); |
536 | 465 |
537 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 466 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
538 &fragmentation_header_); | 467 &fragmentation_header_); |
539 | 468 |
540 bool last_packet = true; | 469 bool last_packet = true; |
541 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; | 470 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; |
542 size_t num_bytes = 0; | 471 size_t num_bytes = 0; |
543 | 472 |
544 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 473 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
545 EXPECT_EQ(kExpectedTotalSize, num_bytes); | 474 EXPECT_EQ(kExpectedTotalSize, num_bytes); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; | 831 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; |
903 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); | 832 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); |
904 EXPECT_EQ(kSei, h264.nalu_type); | 833 EXPECT_EQ(kSei, h264.nalu_type); |
905 ASSERT_EQ(1u, h264.nalus_length); | 834 ASSERT_EQ(1u, h264.nalus_length); |
906 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); | 835 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); |
907 EXPECT_EQ(-1, h264.nalus[0].sps_id); | 836 EXPECT_EQ(-1, h264.nalus[0].sps_id); |
908 EXPECT_EQ(-1, h264.nalus[0].pps_id); | 837 EXPECT_EQ(-1, h264.nalus[0].pps_id); |
909 } | 838 } |
910 | 839 |
911 } // namespace webrtc | 840 } // namespace webrtc |
OLD | NEW |