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 void CreateThreeFragments(RTPFragmentationHeader* fragmentation, | |
47 size_t frameSize, | |
48 size_t payloadOffset) { | |
49 fragmentation->VerifyAndAllocateFragmentationHeader(3); | |
50 fragmentation->fragmentationOffset[0] = 0; | |
51 fragmentation->fragmentationLength[0] = 2; | |
52 fragmentation->fragmentationOffset[1] = 2; | |
53 fragmentation->fragmentationLength[1] = 2; | |
54 fragmentation->fragmentationOffset[2] = 4; | |
55 fragmentation->fragmentationLength[2] = | |
56 kNalHeaderSize + frameSize - payloadOffset; | |
57 } | |
58 | |
59 RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode, | |
60 size_t max_payload_size) { | |
61 RTPVideoTypeHeader type_header; | |
62 type_header.H264.packetization_mode = mode; | |
63 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, | |
64 kEmptyFrame); | |
65 } | |
66 | |
46 void VerifyFua(size_t fua_index, | 67 void VerifyFua(size_t fua_index, |
47 const uint8_t* expected_payload, | 68 const uint8_t* expected_payload, |
48 int offset, | 69 int offset, |
49 const uint8_t* packet, | 70 const uint8_t* packet, |
50 size_t length, | 71 size_t length, |
51 const std::vector<size_t>& expected_sizes) { | 72 const std::vector<size_t>& expected_sizes) { |
52 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) | 73 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, length) |
53 << "FUA index: " << fua_index; | 74 << "FUA index: " << fua_index; |
54 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. | 75 const uint8_t kFuIndicator = 0x1C; // F=0, NRI=0, Type=28. |
55 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; | 76 EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index; |
(...skipping 21 matching lines...) Expand all Loading... | |
77 std::unique_ptr<uint8_t[]> frame; | 98 std::unique_ptr<uint8_t[]> frame; |
78 frame.reset(new uint8_t[frame_size]); | 99 frame.reset(new uint8_t[frame_size]); |
79 frame[0] = 0x05; // F=0, NRI=0, Type=5. | 100 frame[0] = 0x05; // F=0, NRI=0, Type=5. |
80 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { | 101 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { |
81 frame[i + kNalHeaderSize] = i; | 102 frame[i + kNalHeaderSize] = i; |
82 } | 103 } |
83 RTPFragmentationHeader fragmentation; | 104 RTPFragmentationHeader fragmentation; |
84 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 105 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
85 fragmentation.fragmentationOffset[0] = 0; | 106 fragmentation.fragmentationOffset[0] = 0; |
86 fragmentation.fragmentationLength[0] = frame_size; | 107 fragmentation.fragmentationLength[0] = frame_size; |
87 std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create( | 108 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
88 kRtpVideoH264, max_payload_size, NULL, kEmptyFrame)); | 109 H264PacketizationMode::NonInterleaved, max_payload_size)); |
89 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); | 110 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); |
90 | 111 |
91 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); | 112 std::unique_ptr<uint8_t[]> packet(new uint8_t[max_payload_size]); |
92 size_t length = 0; | 113 size_t length = 0; |
93 bool last = false; | 114 bool last = false; |
94 size_t offset = kNalHeaderSize; | 115 size_t offset = kNalHeaderSize; |
95 for (size_t i = 0; i < expected_sizes.size(); ++i) { | 116 for (size_t i = 0; i < expected_sizes.size(); ++i) { |
96 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); | 117 ASSERT_TRUE(packetizer->NextPacket(packet.get(), &length, &last)); |
97 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); | 118 VerifyFua(i, frame.get(), offset, packet.get(), length, expected_sizes); |
98 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; | 119 EXPECT_EQ(i == expected_sizes.size() - 1, last) << "FUA index: " << i; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
145 size_t packet_length) { | 166 size_t packet_length) { |
146 std::vector<uint8_t> expected_payload_vector( | 167 std::vector<uint8_t> expected_payload_vector( |
147 &frame[fragmentation.fragmentationOffset[nalu_index]], | 168 &frame[fragmentation.fragmentationOffset[nalu_index]], |
148 &frame[fragmentation.fragmentationOffset[nalu_index] + | 169 &frame[fragmentation.fragmentationOffset[nalu_index] + |
149 fragmentation.fragmentationLength[nalu_index]]); | 170 fragmentation.fragmentationLength[nalu_index]]); |
150 EXPECT_THAT(expected_payload_vector, | 171 EXPECT_THAT(expected_payload_vector, |
151 ::testing::ElementsAreArray(packet, packet_length)); | 172 ::testing::ElementsAreArray(packet, packet_length)); |
152 } | 173 } |
153 } // namespace | 174 } // namespace |
154 | 175 |
155 TEST(RtpPacketizerH264Test, TestSingleNalu) { | 176 // Tests that should work with both packetization mode 0 and |
177 // packetization mode 1. | |
178 class RtpPacketizerH264ModeTest | |
179 : public ::testing::TestWithParam<H264PacketizationMode> {}; | |
180 | |
181 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { | |
156 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. | 182 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. |
157 RTPFragmentationHeader fragmentation; | 183 RTPFragmentationHeader fragmentation; |
158 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 184 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
159 fragmentation.fragmentationOffset[0] = 0; | 185 fragmentation.fragmentationOffset[0] = 0; |
160 fragmentation.fragmentationLength[0] = sizeof(frame); | 186 fragmentation.fragmentationLength[0] = sizeof(frame); |
161 std::unique_ptr<RtpPacketizer> packetizer( | 187 std::unique_ptr<RtpPacketizer> packetizer( |
162 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 188 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); |
163 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); | 189 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); |
164 uint8_t packet[kMaxPayloadSize] = {0}; | 190 uint8_t packet[kMaxPayloadSize] = {0}; |
165 size_t length = 0; | 191 size_t length = 0; |
166 bool last = false; | 192 bool last = false; |
167 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 193 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
168 EXPECT_EQ(2u, length); | 194 EXPECT_EQ(2u, length); |
169 EXPECT_TRUE(last); | 195 EXPECT_TRUE(last); |
170 VerifySingleNaluPayload( | 196 VerifySingleNaluPayload(fragmentation, 0, frame, sizeof(frame), packet, |
171 fragmentation, 0, frame, sizeof(frame), packet, length); | 197 length); |
172 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 198 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
173 } | 199 } |
174 | 200 |
175 TEST(RtpPacketizerH264Test, TestSingleNaluTwoPackets) { | 201 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { |
176 const size_t kFrameSize = kMaxPayloadSize + 100; | 202 const size_t kFrameSize = kMaxPayloadSize + 100; |
177 uint8_t frame[kFrameSize] = {0}; | 203 uint8_t frame[kFrameSize] = {0}; |
178 for (size_t i = 0; i < kFrameSize; ++i) | 204 for (size_t i = 0; i < kFrameSize; ++i) |
179 frame[i] = i; | 205 frame[i] = i; |
180 RTPFragmentationHeader fragmentation; | 206 RTPFragmentationHeader fragmentation; |
181 fragmentation.VerifyAndAllocateFragmentationHeader(2); | 207 fragmentation.VerifyAndAllocateFragmentationHeader(2); |
182 fragmentation.fragmentationOffset[0] = 0; | 208 fragmentation.fragmentationOffset[0] = 0; |
183 fragmentation.fragmentationLength[0] = kMaxPayloadSize; | 209 fragmentation.fragmentationLength[0] = kMaxPayloadSize; |
184 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; | 210 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; |
185 fragmentation.fragmentationLength[1] = 100; | 211 fragmentation.fragmentationLength[1] = 100; |
186 // Set NAL headers. | 212 // Set NAL headers. |
187 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 213 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
188 frame[fragmentation.fragmentationOffset[1]] = 0x01; | 214 frame[fragmentation.fragmentationOffset[1]] = 0x01; |
189 | 215 |
190 std::unique_ptr<RtpPacketizer> packetizer( | 216 std::unique_ptr<RtpPacketizer> packetizer( |
191 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 217 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); |
192 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 218 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
193 | 219 |
194 uint8_t packet[kMaxPayloadSize] = {0}; | 220 uint8_t packet[kMaxPayloadSize] = {0}; |
195 size_t length = 0; | 221 size_t length = 0; |
196 bool last = false; | 222 bool last = false; |
197 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 223 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
198 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); | 224 ASSERT_EQ(fragmentation.fragmentationOffset[1], length); |
199 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); | 225 VerifySingleNaluPayload(fragmentation, 0, frame, kFrameSize, packet, length); |
200 | 226 |
201 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 227 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
202 ASSERT_EQ(fragmentation.fragmentationLength[1], length); | 228 ASSERT_EQ(fragmentation.fragmentationLength[1], length); |
203 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); | 229 VerifySingleNaluPayload(fragmentation, 1, frame, kFrameSize, packet, length); |
204 EXPECT_TRUE(last); | 230 EXPECT_TRUE(last); |
205 | 231 |
206 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 232 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
207 } | 233 } |
208 | 234 |
235 INSTANTIATE_TEST_CASE_P( | |
236 PacketMode, | |
237 RtpPacketizerH264ModeTest, | |
238 ::testing::Values(H264PacketizationMode::SingleNalUnit, | |
239 H264PacketizationMode::NonInterleaved)); | |
240 | |
209 TEST(RtpPacketizerH264Test, TestStapA) { | 241 TEST(RtpPacketizerH264Test, TestStapA) { |
210 const size_t kFrameSize = | 242 const size_t kFrameSize = |
211 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 243 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
212 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 244 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
213 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 245 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
214 0x05}; // F=0, NRI=0, Type=5 (IDR). | 246 0x05}; // F=0, NRI=0, Type=5 (IDR). |
215 const size_t kPayloadOffset = 5; | 247 const size_t kPayloadOffset = 5; |
216 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 248 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
217 frame[i + kPayloadOffset] = i; | 249 frame[i + kPayloadOffset] = i; |
218 RTPFragmentationHeader fragmentation; | 250 RTPFragmentationHeader fragmentation; |
219 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 251 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); |
220 fragmentation.fragmentationOffset[0] = 0; | 252 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
221 fragmentation.fragmentationLength[0] = 2; | 253 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); |
222 fragmentation.fragmentationOffset[1] = 2; | |
223 fragmentation.fragmentationLength[1] = 2; | |
224 fragmentation.fragmentationOffset[2] = 4; | |
225 fragmentation.fragmentationLength[2] = | |
226 kNalHeaderSize + kFrameSize - kPayloadOffset; | |
227 std::unique_ptr<RtpPacketizer> packetizer( | |
228 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | |
229 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 254 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
230 | 255 |
231 uint8_t packet[kMaxPayloadSize] = {0}; | 256 uint8_t packet[kMaxPayloadSize] = {0}; |
232 size_t length = 0; | 257 size_t length = 0; |
233 bool last = false; | 258 bool last = false; |
234 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); | 259 ASSERT_TRUE(packetizer->NextPacket(packet, &length, &last)); |
235 size_t expected_packet_size = | 260 size_t expected_packet_size = |
236 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; | 261 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; |
237 ASSERT_EQ(expected_packet_size, length); | 262 ASSERT_EQ(expected_packet_size, length); |
238 EXPECT_TRUE(last); | 263 EXPECT_TRUE(last); |
239 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) | 264 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) |
240 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); | 265 VerifyStapAPayload(fragmentation, 0, i, frame, kFrameSize, packet, length); |
241 | 266 |
242 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); | 267 EXPECT_FALSE(packetizer->NextPacket(packet, &length, &last)); |
243 } | 268 } |
244 | 269 |
270 TEST(RtpPacketizerH264Test, TestMode0HasNoStapA) { | |
hbos
2016/12/02 10:21:26
nit/optional: Naming difference "mode" vs enum nam
hta-webrtc
2016/12/02 11:09:01
Done.
| |
271 // This is the same setup as for the TestStapA test. | |
272 const size_t kFrameSize = | |
273 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | |
274 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | |
275 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | |
276 0x05}; // F=0, NRI=0, Type=5 (IDR). | |
277 const size_t kPayloadOffset = 5; | |
278 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | |
279 frame[i + kPayloadOffset] = i; | |
280 RTPFragmentationHeader fragmentation; | |
281 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); | |
282 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | |
283 H264PacketizationMode::SingleNalUnit, 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(CreateH264Packetizer( |
263 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 314 H264PacketizationMode::NonInterleaved, 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 26 matching lines...) Expand all Loading... | |
300 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; | 351 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; |
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(CreateH264Packetizer( |
311 RtpPacketizer::Create(kRtpVideoH264, kMaxPayloadSize, NULL, kEmptyFrame)); | 362 H264PacketizationMode::NonInterleaved, 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; | |
hbos
2016/12/02 10:21:26
nit: I prefer to test the edge case + 1
hta-webrtc
2016/12/02 11:09:01
Done.
| |
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(CreateH264Packetizer( | |
450 H264PacketizationMode::SingleNalUnit, 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( |
425 kRtpVideoH264, sizeof(kOriginalSps) - 2 + kHeaderOverhead, nullptr, | 498 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
426 kEmptyFrame)); | 499 sizeof(kOriginalSps) - 2 + kHeaderOverhead)); |
427 | 500 |
428 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 501 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
429 &fragmentation_header_); | 502 &fragmentation_header_); |
430 | 503 |
431 bool last_packet = true; | 504 bool last_packet = true; |
432 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; | 505 uint8_t buffer[sizeof(kOriginalSps) + kHeaderOverhead] = {}; |
433 size_t num_bytes = 0; | 506 size_t num_bytes = 0; |
434 | 507 |
435 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 508 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
436 size_t offset = H264::kNaluTypeSize; | 509 size_t offset = H264::kNaluTypeSize; |
(...skipping 15 matching lines...) Expand all Loading... | |
452 EXPECT_EQ(offset, sizeof(kRewrittenSps)); | 525 EXPECT_EQ(offset, sizeof(kRewrittenSps)); |
453 } | 526 } |
454 | 527 |
455 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { | 528 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { |
456 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 529 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
457 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. | 530 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. |
458 sizeof(kRewrittenSps) + sizeof(kIdrOne) + | 531 sizeof(kRewrittenSps) + sizeof(kIdrOne) + |
459 sizeof(kIdrTwo) + (kLengthFieldLength * 3); | 532 sizeof(kIdrTwo) + (kLengthFieldLength * 3); |
460 | 533 |
461 // Set size to include SPS and the rest of the packets in a Stap-A package. | 534 // Set size to include SPS and the rest of the packets in a Stap-A package. |
462 packetizer_.reset(RtpPacketizer::Create(kRtpVideoH264, | 535 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
463 kExpectedTotalSize + kHeaderOverhead, | 536 kExpectedTotalSize + kHeaderOverhead)); |
464 nullptr, kEmptyFrame)); | |
465 | 537 |
466 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 538 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
467 &fragmentation_header_); | 539 &fragmentation_header_); |
468 | 540 |
469 bool last_packet = true; | 541 bool last_packet = true; |
470 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; | 542 uint8_t buffer[kExpectedTotalSize + kHeaderOverhead] = {}; |
471 size_t num_bytes = 0; | 543 size_t num_bytes = 0; |
472 | 544 |
473 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); | 545 EXPECT_TRUE(packetizer_->NextPacket(buffer, &num_bytes, &last_packet)); |
474 EXPECT_EQ(kExpectedTotalSize, num_bytes); | 546 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; | 903 const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264; |
832 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); | 904 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); |
833 EXPECT_EQ(kSei, h264.nalu_type); | 905 EXPECT_EQ(kSei, h264.nalu_type); |
834 ASSERT_EQ(1u, h264.nalus_length); | 906 ASSERT_EQ(1u, h264.nalus_length); |
835 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); | 907 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); |
836 EXPECT_EQ(-1, h264.nalus[0].sps_id); | 908 EXPECT_EQ(-1, h264.nalus[0].sps_id); |
837 EXPECT_EQ(-1, h264.nalus[0].pps_id); | 909 EXPECT_EQ(-1, h264.nalus[0].pps_id); |
838 } | 910 } |
839 | 911 |
840 } // namespace webrtc | 912 } // namespace webrtc |
OLD | NEW |