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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 fragmentation->fragmentationOffset[0] = 0; | 56 fragmentation->fragmentationOffset[0] = 0; |
57 fragmentation->fragmentationLength[0] = 2; | 57 fragmentation->fragmentationLength[0] = 2; |
58 fragmentation->fragmentationOffset[1] = 2; | 58 fragmentation->fragmentationOffset[1] = 2; |
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 size_t last_packet_reduction) { |
67 RTPVideoTypeHeader type_header; | 68 RTPVideoTypeHeader type_header; |
68 type_header.H264.packetization_mode = mode; | 69 type_header.H264.packetization_mode = mode; |
69 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, &type_header, | 70 return RtpPacketizer::Create(kRtpVideoH264, max_payload_size, |
| 71 last_packet_reduction, &type_header, |
70 kEmptyFrame); | 72 kEmptyFrame); |
71 } | 73 } |
72 | 74 |
73 void VerifyFua(size_t fua_index, | 75 void VerifyFua(size_t fua_index, |
74 const uint8_t* expected_payload, | 76 const uint8_t* expected_payload, |
75 int offset, | 77 int offset, |
76 rtc::ArrayView<const uint8_t> packet, | 78 rtc::ArrayView<const uint8_t> packet, |
77 const std::vector<size_t>& expected_sizes) { | 79 const std::vector<size_t>& expected_sizes) { |
78 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, packet.size()) | 80 ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, packet.size()) |
79 << "FUA index: " << fua_index; | 81 << "FUA index: " << fua_index; |
(...skipping 11 matching lines...) Expand all Loading... |
91 std::vector<uint8_t> expected_packet_payload( | 93 std::vector<uint8_t> expected_packet_payload( |
92 &expected_payload[offset], | 94 &expected_payload[offset], |
93 &expected_payload[offset + expected_sizes[fua_index]]); | 95 &expected_payload[offset + expected_sizes[fua_index]]); |
94 EXPECT_THAT(expected_packet_payload, | 96 EXPECT_THAT(expected_packet_payload, |
95 ElementsAreArray(&packet[2], expected_sizes[fua_index])) | 97 ElementsAreArray(&packet[2], expected_sizes[fua_index])) |
96 << "FUA index: " << fua_index; | 98 << "FUA index: " << fua_index; |
97 } | 99 } |
98 | 100 |
99 void TestFua(size_t frame_size, | 101 void TestFua(size_t frame_size, |
100 size_t max_payload_size, | 102 size_t max_payload_size, |
| 103 size_t last_packet_reduction, |
101 const std::vector<size_t>& expected_sizes) { | 104 const std::vector<size_t>& expected_sizes) { |
102 std::unique_ptr<uint8_t[]> frame; | 105 std::unique_ptr<uint8_t[]> frame; |
103 frame.reset(new uint8_t[frame_size]); | 106 frame.reset(new uint8_t[frame_size]); |
104 frame[0] = 0x05; // F=0, NRI=0, Type=5. | 107 frame[0] = 0x05; // F=0, NRI=0, Type=5. |
105 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { | 108 for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) { |
106 frame[i + kNalHeaderSize] = i; | 109 frame[i + kNalHeaderSize] = i; |
107 } | 110 } |
108 RTPFragmentationHeader fragmentation; | 111 RTPFragmentationHeader fragmentation; |
109 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 112 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
110 fragmentation.fragmentationOffset[0] = 0; | 113 fragmentation.fragmentationOffset[0] = 0; |
111 fragmentation.fragmentationLength[0] = frame_size; | 114 fragmentation.fragmentationLength[0] = frame_size; |
112 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 115 std::unique_ptr<RtpPacketizer> packetizer( |
113 H264PacketizationMode::NonInterleaved, max_payload_size)); | 116 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
114 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation); | 117 max_payload_size, last_packet_reduction)); |
| 118 EXPECT_EQ( |
| 119 expected_sizes.size(), |
| 120 packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation)); |
115 | 121 |
116 RtpPacketToSend packet(kNoExtensions); | 122 RtpPacketToSend packet(kNoExtensions); |
117 ASSERT_LE(max_payload_size, packet.FreeCapacity()); | 123 ASSERT_LE(max_payload_size, packet.FreeCapacity()); |
118 bool last = false; | |
119 size_t offset = kNalHeaderSize; | 124 size_t offset = kNalHeaderSize; |
120 for (size_t i = 0; i < expected_sizes.size(); ++i) { | 125 for (size_t i = 0; i < expected_sizes.size(); ++i) { |
121 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 126 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
122 VerifyFua(i, frame.get(), offset, packet.payload(), expected_sizes); | 127 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]; | 128 offset += expected_sizes[i]; |
125 } | 129 } |
126 | 130 |
127 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 131 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
128 } | 132 } |
129 | 133 |
130 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation, | 134 size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation, |
131 size_t start_index, | 135 size_t start_index, |
132 size_t nalu_index) { | 136 size_t nalu_index) { |
133 assert(nalu_index < fragmentation.fragmentationVectorSize); | 137 assert(nalu_index < fragmentation.fragmentationVectorSize); |
134 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header. | 138 size_t expected_nalu_offset = kNalHeaderSize; // STAP-A header. |
135 for (size_t i = start_index; i < nalu_index; ++i) { | 139 for (size_t i = start_index; i < nalu_index; ++i) { |
136 expected_nalu_offset += | 140 expected_nalu_offset += |
137 kLengthFieldLength + fragmentation.fragmentationLength[i]; | 141 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 class RtpPacketizerH264ModeTest | 179 class RtpPacketizerH264ModeTest |
176 : public ::testing::TestWithParam<H264PacketizationMode> {}; | 180 : public ::testing::TestWithParam<H264PacketizationMode> {}; |
177 | 181 |
178 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { | 182 TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) { |
179 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. | 183 const uint8_t frame[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5. |
180 RTPFragmentationHeader fragmentation; | 184 RTPFragmentationHeader fragmentation; |
181 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 185 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
182 fragmentation.fragmentationOffset[0] = 0; | 186 fragmentation.fragmentationOffset[0] = 0; |
183 fragmentation.fragmentationLength[0] = sizeof(frame); | 187 fragmentation.fragmentationLength[0] = sizeof(frame); |
184 std::unique_ptr<RtpPacketizer> packetizer( | 188 std::unique_ptr<RtpPacketizer> packetizer( |
185 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); | 189 CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0)); |
186 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation); | 190 ASSERT_EQ(1u, |
| 191 packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation)); |
187 RtpPacketToSend packet(kNoExtensions); | 192 RtpPacketToSend packet(kNoExtensions); |
188 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); | 193 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); |
189 bool last = false; | 194 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
190 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | |
191 EXPECT_EQ(2u, packet.payload_size()); | 195 EXPECT_EQ(2u, packet.payload_size()); |
192 EXPECT_TRUE(last); | |
193 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); | 196 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); |
194 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 197 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
195 } | 198 } |
196 | 199 |
197 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { | 200 TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) { |
198 const size_t kFrameSize = kMaxPayloadSize + 100; | 201 const size_t kFrameSize = kMaxPayloadSize + 100; |
199 uint8_t frame[kFrameSize] = {0}; | 202 uint8_t frame[kFrameSize] = {0}; |
200 for (size_t i = 0; i < kFrameSize; ++i) | 203 for (size_t i = 0; i < kFrameSize; ++i) |
201 frame[i] = i; | 204 frame[i] = i; |
202 RTPFragmentationHeader fragmentation; | 205 RTPFragmentationHeader fragmentation; |
203 fragmentation.VerifyAndAllocateFragmentationHeader(2); | 206 fragmentation.VerifyAndAllocateFragmentationHeader(2); |
204 fragmentation.fragmentationOffset[0] = 0; | 207 fragmentation.fragmentationOffset[0] = 0; |
205 fragmentation.fragmentationLength[0] = kMaxPayloadSize; | 208 fragmentation.fragmentationLength[0] = kMaxPayloadSize; |
206 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; | 209 fragmentation.fragmentationOffset[1] = kMaxPayloadSize; |
207 fragmentation.fragmentationLength[1] = 100; | 210 fragmentation.fragmentationLength[1] = 100; |
208 // Set NAL headers. | 211 // Set NAL headers. |
209 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 212 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
210 frame[fragmentation.fragmentationOffset[1]] = 0x01; | 213 frame[fragmentation.fragmentationOffset[1]] = 0x01; |
211 | 214 |
212 std::unique_ptr<RtpPacketizer> packetizer( | 215 std::unique_ptr<RtpPacketizer> packetizer( |
213 CreateH264Packetizer(GetParam(), kMaxPayloadSize)); | 216 CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0)); |
214 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 217 ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation)); |
215 | 218 |
216 RtpPacketToSend packet(kNoExtensions); | 219 RtpPacketToSend packet(kNoExtensions); |
217 bool last = false; | 220 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
218 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | |
219 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size()); | 221 ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size()); |
220 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); | 222 VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload()); |
221 | 223 |
222 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 224 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
223 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size()); | 225 ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size()); |
224 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload()); | 226 VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload()); |
225 EXPECT_TRUE(last); | |
226 | 227 |
227 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 228 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
228 } | 229 } |
229 | 230 |
230 INSTANTIATE_TEST_CASE_P( | 231 INSTANTIATE_TEST_CASE_P( |
231 PacketMode, | 232 PacketMode, |
232 RtpPacketizerH264ModeTest, | 233 RtpPacketizerH264ModeTest, |
233 ::testing::Values(H264PacketizationMode::SingleNalUnit, | 234 ::testing::Values(H264PacketizationMode::SingleNalUnit, |
234 H264PacketizationMode::NonInterleaved)); | 235 H264PacketizationMode::NonInterleaved)); |
235 | 236 |
236 TEST(RtpPacketizerH264Test, TestStapA) { | 237 TEST(RtpPacketizerH264Test, TestStapA) { |
237 const size_t kFrameSize = | 238 const size_t kFrameSize = |
238 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 239 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
239 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 240 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
240 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 241 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
241 0x05}; // F=0, NRI=0, Type=5 (IDR). | 242 0x05}; // F=0, NRI=0, Type=5 (IDR). |
242 const size_t kPayloadOffset = 5; | 243 const size_t kPayloadOffset = 5; |
243 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 244 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
244 frame[i + kPayloadOffset] = i; | 245 frame[i + kPayloadOffset] = i; |
245 RTPFragmentationHeader fragmentation; | 246 RTPFragmentationHeader fragmentation; |
246 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); | 247 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); |
247 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 248 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
248 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); | 249 H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0)); |
249 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 250 ASSERT_EQ(1u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation)); |
250 | 251 |
251 RtpPacketToSend packet(kNoExtensions); | 252 RtpPacketToSend packet(kNoExtensions); |
252 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); | 253 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); |
253 bool last = false; | 254 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
254 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | |
255 size_t expected_packet_size = | 255 size_t expected_packet_size = |
256 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; | 256 kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize; |
257 ASSERT_EQ(expected_packet_size, packet.payload_size()); | 257 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
258 EXPECT_TRUE(last); | 258 |
259 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) | 259 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) |
260 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); | 260 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); |
261 | 261 |
262 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 262 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
| 263 } |
| 264 |
| 265 TEST(RtpPacketizerH264Test, TestStapARespectsPacketReduction) { |
| 266 const size_t kLastPacketReduction = 100; |
| 267 const size_t kFrameSize = kMaxPayloadSize - 1 - kLastPacketReduction; |
| 268 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. |
| 269 0x08, 0xFF, // F=0, NRI=0, Type=8. |
| 270 0x05}; // F=0, NRI=0, Type=5. |
| 271 const size_t kPayloadOffset = 5; |
| 272 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
| 273 frame[i + kPayloadOffset] = i; |
| 274 RTPFragmentationHeader fragmentation; |
| 275 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
| 276 fragmentation.fragmentationOffset[0] = 0; |
| 277 fragmentation.fragmentationLength[0] = 2; |
| 278 fragmentation.fragmentationOffset[1] = 2; |
| 279 fragmentation.fragmentationLength[1] = 2; |
| 280 fragmentation.fragmentationOffset[2] = 4; |
| 281 fragmentation.fragmentationLength[2] = |
| 282 kNalHeaderSize + kFrameSize - kPayloadOffset; |
| 283 std::unique_ptr<RtpPacketizer> packetizer( |
| 284 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
| 285 kMaxPayloadSize, kLastPacketReduction)); |
| 286 ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation)); |
| 287 |
| 288 RtpPacketToSend packet(kNoExtensions); |
| 289 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); |
| 290 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
| 291 size_t expected_packet_size = kNalHeaderSize; |
| 292 for (size_t i = 0; i < 2; ++i) { |
| 293 expected_packet_size += |
| 294 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
| 295 } |
| 296 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
| 297 for (size_t i = 0; i < 2; ++i) |
| 298 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); |
| 299 |
| 300 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
| 301 expected_packet_size = fragmentation.fragmentationLength[2]; |
| 302 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
| 303 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); |
| 304 |
| 305 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
263 } | 306 } |
264 | 307 |
265 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) { | 308 TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) { |
266 // This is the same setup as for the TestStapA test. | 309 // This is the same setup as for the TestStapA test. |
267 const size_t kFrameSize = | 310 const size_t kFrameSize = |
268 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; | 311 kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize; |
269 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). | 312 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7 (SPS). |
270 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). | 313 0x08, 0xFF, // F=0, NRI=0, Type=8 (PPS). |
271 0x05}; // F=0, NRI=0, Type=5 (IDR). | 314 0x05}; // F=0, NRI=0, Type=5 (IDR). |
272 const size_t kPayloadOffset = 5; | 315 const size_t kPayloadOffset = 5; |
273 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 316 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
274 frame[i + kPayloadOffset] = i; | 317 frame[i + kPayloadOffset] = i; |
275 RTPFragmentationHeader fragmentation; | 318 RTPFragmentationHeader fragmentation; |
276 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); | 319 CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset); |
277 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 320 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
278 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize)); | 321 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0)); |
279 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 322 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); |
280 | 323 |
281 RtpPacketToSend packet(kNoExtensions); | 324 RtpPacketToSend packet(kNoExtensions); |
282 bool last = false; | |
283 // The three fragments should be returned as three packets. | 325 // The three fragments should be returned as three packets. |
284 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 326 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
285 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 327 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
286 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 328 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
287 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 329 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
288 } | 330 } |
289 | 331 |
290 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { | 332 TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) { |
291 const size_t kFrameSize = kMaxPayloadSize - 1; | 333 const size_t kFrameSize = kMaxPayloadSize - 1; |
292 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. | 334 uint8_t frame[kFrameSize] = {0x07, 0xFF, // F=0, NRI=0, Type=7. |
293 0x08, 0xFF, // F=0, NRI=0, Type=8. | 335 0x08, 0xFF, // F=0, NRI=0, Type=8. |
294 0x05}; // F=0, NRI=0, Type=5. | 336 0x05}; // F=0, NRI=0, Type=5. |
295 const size_t kPayloadOffset = 5; | 337 const size_t kPayloadOffset = 5; |
296 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) | 338 for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i) |
297 frame[i + kPayloadOffset] = i; | 339 frame[i + kPayloadOffset] = i; |
298 RTPFragmentationHeader fragmentation; | 340 RTPFragmentationHeader fragmentation; |
299 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 341 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
300 fragmentation.fragmentationOffset[0] = 0; | 342 fragmentation.fragmentationOffset[0] = 0; |
301 fragmentation.fragmentationLength[0] = 2; | 343 fragmentation.fragmentationLength[0] = 2; |
302 fragmentation.fragmentationOffset[1] = 2; | 344 fragmentation.fragmentationOffset[1] = 2; |
303 fragmentation.fragmentationLength[1] = 2; | 345 fragmentation.fragmentationLength[1] = 2; |
304 fragmentation.fragmentationOffset[2] = 4; | 346 fragmentation.fragmentationOffset[2] = 4; |
305 fragmentation.fragmentationLength[2] = | 347 fragmentation.fragmentationLength[2] = |
306 kNalHeaderSize + kFrameSize - kPayloadOffset; | 348 kNalHeaderSize + kFrameSize - kPayloadOffset; |
307 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 349 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
308 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); | 350 H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0)); |
309 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 351 ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation)); |
310 | 352 |
311 RtpPacketToSend packet(kNoExtensions); | 353 RtpPacketToSend packet(kNoExtensions); |
312 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); | 354 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); |
313 bool last = false; | 355 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
314 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | |
315 size_t expected_packet_size = kNalHeaderSize; | 356 size_t expected_packet_size = kNalHeaderSize; |
316 for (size_t i = 0; i < 2; ++i) { | 357 for (size_t i = 0; i < 2; ++i) { |
317 expected_packet_size += | 358 expected_packet_size += |
318 kLengthFieldLength + fragmentation.fragmentationLength[i]; | 359 kLengthFieldLength + fragmentation.fragmentationLength[i]; |
319 } | 360 } |
320 ASSERT_EQ(expected_packet_size, packet.payload_size()); | 361 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
321 EXPECT_FALSE(last); | |
322 for (size_t i = 0; i < 2; ++i) | 362 for (size_t i = 0; i < 2; ++i) |
323 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); | 363 VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload()); |
324 | 364 |
325 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 365 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
326 expected_packet_size = fragmentation.fragmentationLength[2]; | 366 expected_packet_size = fragmentation.fragmentationLength[2]; |
327 ASSERT_EQ(expected_packet_size, packet.payload_size()); | 367 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
328 EXPECT_TRUE(last); | |
329 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); | 368 VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload()); |
330 | 369 |
331 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 370 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
332 } | 371 } |
333 | 372 |
334 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) { | 373 TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) { |
335 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100); | 374 const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100); |
336 const size_t kStapANaluSize = 100; | 375 const size_t kStapANaluSize = 100; |
337 RTPFragmentationHeader fragmentation; | 376 RTPFragmentationHeader fragmentation; |
338 fragmentation.VerifyAndAllocateFragmentationHeader(3); | 377 fragmentation.VerifyAndAllocateFragmentationHeader(3); |
339 fragmentation.fragmentationOffset[0] = 0; | 378 fragmentation.fragmentationOffset[0] = 0; |
340 fragmentation.fragmentationLength[0] = kFuaNaluSize; | 379 fragmentation.fragmentationLength[0] = kFuaNaluSize; |
341 fragmentation.fragmentationOffset[1] = kFuaNaluSize; | 380 fragmentation.fragmentationOffset[1] = kFuaNaluSize; |
342 fragmentation.fragmentationLength[1] = kStapANaluSize; | 381 fragmentation.fragmentationLength[1] = kStapANaluSize; |
343 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize; | 382 fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize; |
344 fragmentation.fragmentationLength[2] = kStapANaluSize; | 383 fragmentation.fragmentationLength[2] = kStapANaluSize; |
345 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; | 384 const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize; |
346 uint8_t frame[kFrameSize]; | 385 uint8_t frame[kFrameSize]; |
347 size_t nalu_offset = 0; | 386 size_t nalu_offset = 0; |
348 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { | 387 for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) { |
349 nalu_offset = fragmentation.fragmentationOffset[i]; | 388 nalu_offset = fragmentation.fragmentationOffset[i]; |
350 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. | 389 frame[nalu_offset] = 0x05; // F=0, NRI=0, Type=5. |
351 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { | 390 for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) { |
352 frame[nalu_offset + j] = i + j; | 391 frame[nalu_offset + j] = i + j; |
353 } | 392 } |
354 } | 393 } |
355 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 394 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
356 H264PacketizationMode::NonInterleaved, kMaxPayloadSize)); | 395 H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0)); |
357 packetizer->SetPayloadData(frame, kFrameSize, &fragmentation); | 396 ASSERT_EQ(3u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation)); |
358 | 397 |
359 // First expecting two FU-A packets. | 398 // First expecting two FU-A packets. |
360 std::vector<size_t> fua_sizes; | 399 std::vector<size_t> fua_sizes; |
| 400 fua_sizes.push_back(1099); |
361 fua_sizes.push_back(1100); | 401 fua_sizes.push_back(1100); |
362 fua_sizes.push_back(1099); | |
363 RtpPacketToSend packet(kNoExtensions); | 402 RtpPacketToSend packet(kNoExtensions); |
364 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); | 403 ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity()); |
365 bool last = false; | |
366 int fua_offset = kNalHeaderSize; | 404 int fua_offset = kNalHeaderSize; |
367 for (size_t i = 0; i < 2; ++i) { | 405 for (size_t i = 0; i < 2; ++i) { |
368 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 406 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
369 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes); | 407 VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes); |
370 EXPECT_FALSE(last); | |
371 fua_offset += fua_sizes[i]; | 408 fua_offset += fua_sizes[i]; |
372 } | 409 } |
373 // Then expecting one STAP-A packet with two nal units. | 410 // Then expecting one STAP-A packet with two nal units. |
374 ASSERT_TRUE(packetizer->NextPacket(&packet, &last)); | 411 ASSERT_TRUE(packetizer->NextPacket(&packet)); |
375 size_t expected_packet_size = | 412 size_t expected_packet_size = |
376 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize; | 413 kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize; |
377 ASSERT_EQ(expected_packet_size, packet.payload_size()); | 414 ASSERT_EQ(expected_packet_size, packet.payload_size()); |
378 EXPECT_TRUE(last); | |
379 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i) | 415 for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i) |
380 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload()); | 416 VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload()); |
381 | 417 |
382 EXPECT_FALSE(packetizer->NextPacket(&packet, &last)); | 418 EXPECT_FALSE(packetizer->NextPacket(&packet)); |
383 } | 419 } |
384 | 420 |
385 TEST(RtpPacketizerH264Test, TestFUAOddSize) { | 421 TEST(RtpPacketizerH264Test, TestFUAOddSize) { |
386 const size_t kExpectedPayloadSizes[2] = {600, 600}; | 422 const size_t kExpectedPayloadSizes[2] = {600, 600}; |
387 TestFua( | 423 TestFua( |
388 kMaxPayloadSize + 1, | 424 kMaxPayloadSize + 1, kMaxPayloadSize, 0, |
389 kMaxPayloadSize, | 425 std::vector<size_t>(kExpectedPayloadSizes, |
| 426 kExpectedPayloadSizes + |
| 427 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
| 428 } |
| 429 |
| 430 TEST(RtpPacketizerH264Test, TestFUAWithLastPacketReduction) { |
| 431 const size_t kExpectedPayloadSizes[2] = {601, 597}; |
| 432 TestFua( |
| 433 kMaxPayloadSize - 1, kMaxPayloadSize, 4, |
390 std::vector<size_t>(kExpectedPayloadSizes, | 434 std::vector<size_t>(kExpectedPayloadSizes, |
391 kExpectedPayloadSizes + | 435 kExpectedPayloadSizes + |
392 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 436 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
393 } | 437 } |
394 | 438 |
395 TEST(RtpPacketizerH264Test, TestFUAEvenSize) { | 439 TEST(RtpPacketizerH264Test, TestFUAEvenSize) { |
396 const size_t kExpectedPayloadSizes[2] = {601, 600}; | 440 const size_t kExpectedPayloadSizes[2] = {600, 601}; |
397 TestFua( | 441 TestFua( |
398 kMaxPayloadSize + 2, | 442 kMaxPayloadSize + 2, kMaxPayloadSize, 0, |
399 kMaxPayloadSize, | |
400 std::vector<size_t>(kExpectedPayloadSizes, | 443 std::vector<size_t>(kExpectedPayloadSizes, |
401 kExpectedPayloadSizes + | 444 kExpectedPayloadSizes + |
402 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 445 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
403 } | 446 } |
404 | 447 |
405 TEST(RtpPacketizerH264Test, TestFUARounding) { | 448 TEST(RtpPacketizerH264Test, TestFUARounding) { |
406 const size_t kExpectedPayloadSizes[8] = {1266, 1266, 1266, 1266, | 449 const size_t kExpectedPayloadSizes[8] = {1265, 1265, 1265, 1265, |
407 1266, 1266, 1266, 1261}; | 450 1265, 1266, 1266, 1266}; |
408 TestFua( | 451 TestFua( |
409 10124, | 452 10124, 1448, 0, |
410 1448, | |
411 std::vector<size_t>(kExpectedPayloadSizes, | 453 std::vector<size_t>(kExpectedPayloadSizes, |
412 kExpectedPayloadSizes + | 454 kExpectedPayloadSizes + |
413 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 455 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
414 } | 456 } |
415 | 457 |
416 TEST(RtpPacketizerH264Test, TestFUABig) { | 458 TEST(RtpPacketizerH264Test, TestFUABig) { |
417 const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198, | 459 const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198, |
418 1198, 1198, 1198, 1198, 1198}; | 460 1198, 1198, 1198, 1198, 1198}; |
419 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU | 461 // Generate 10 full sized packets, leave room for FU-A headers minus the NALU |
420 // header. | 462 // header. |
421 TestFua( | 463 TestFua( |
422 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, | 464 10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, kMaxPayloadSize, |
423 kMaxPayloadSize, | 465 0, |
424 std::vector<size_t>(kExpectedPayloadSizes, | 466 std::vector<size_t>(kExpectedPayloadSizes, |
425 kExpectedPayloadSizes + | 467 kExpectedPayloadSizes + |
426 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); | 468 sizeof(kExpectedPayloadSizes) / sizeof(size_t))); |
427 } | 469 } |
428 | 470 |
429 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 471 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
430 | 472 |
431 TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) { | 473 TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) { |
432 const size_t kFrameSize = kMaxPayloadSize + 1; | 474 const size_t kFrameSize = kMaxPayloadSize + 1; |
433 uint8_t frame[kFrameSize] = {0}; | 475 uint8_t frame[kFrameSize] = {0}; |
434 for (size_t i = 0; i < kFrameSize; ++i) | 476 for (size_t i = 0; i < kFrameSize; ++i) |
435 frame[i] = i; | 477 frame[i] = i; |
436 RTPFragmentationHeader fragmentation; | 478 RTPFragmentationHeader fragmentation; |
437 fragmentation.VerifyAndAllocateFragmentationHeader(1); | 479 fragmentation.VerifyAndAllocateFragmentationHeader(1); |
438 fragmentation.fragmentationOffset[0] = 0; | 480 fragmentation.fragmentationOffset[0] = 0; |
439 fragmentation.fragmentationLength[0] = kFrameSize; | 481 fragmentation.fragmentationLength[0] = kFrameSize; |
440 // Set NAL headers. | 482 // Set NAL headers. |
441 frame[fragmentation.fragmentationOffset[0]] = 0x01; | 483 frame[fragmentation.fragmentationOffset[0]] = 0x01; |
442 | 484 |
443 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( | 485 std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer( |
444 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize)); | 486 H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0)); |
445 EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), | 487 EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation), |
446 "payload_size"); | 488 "payload_size"); |
447 } | 489 } |
448 | 490 |
449 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 491 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
450 | 492 |
451 namespace { | 493 namespace { |
452 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; | 494 const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01}; |
453 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, | 495 const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, |
454 0xF4, 0x05, 0x03, 0xC7, 0xC0}; | 496 0xF4, 0x05, 0x03, 0xC7, 0xC0}; |
(...skipping 28 matching lines...) Expand all Loading... |
483 RTPFragmentationHeader fragmentation_header_; | 525 RTPFragmentationHeader fragmentation_header_; |
484 std::unique_ptr<RtpPacketizer> packetizer_; | 526 std::unique_ptr<RtpPacketizer> packetizer_; |
485 }; | 527 }; |
486 | 528 |
487 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { | 529 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) { |
488 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 530 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
489 | 531 |
490 // Set size to fragment SPS into two FU-A packets. | 532 // Set size to fragment SPS into two FU-A packets. |
491 packetizer_.reset( | 533 packetizer_.reset( |
492 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, | 534 CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
493 sizeof(kOriginalSps) - 2 + kHeaderOverhead)); | 535 sizeof(kOriginalSps) - 2 + kHeaderOverhead, 0)); |
494 | 536 |
495 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 537 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
496 &fragmentation_header_); | 538 &fragmentation_header_); |
497 | 539 |
498 bool last_packet = true; | |
499 RtpPacketToSend packet(kNoExtensions); | 540 RtpPacketToSend packet(kNoExtensions); |
500 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity()); | 541 ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity()); |
501 | 542 |
502 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); | 543 EXPECT_TRUE(packetizer_->NextPacket(&packet)); |
503 size_t offset = H264::kNaluTypeSize; | 544 size_t offset = H264::kNaluTypeSize; |
504 size_t length = packet.payload_size() - kFuAHeaderSize; | 545 size_t length = packet.payload_size() - kFuAHeaderSize; |
505 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), | 546 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), |
506 ElementsAreArray(&kRewrittenSps[offset], length)); | 547 ElementsAreArray(&kRewrittenSps[offset], length)); |
507 offset += length; | 548 offset += length; |
508 | 549 |
509 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); | 550 EXPECT_TRUE(packetizer_->NextPacket(&packet)); |
510 length = packet.payload_size() - kFuAHeaderSize; | 551 length = packet.payload_size() - kFuAHeaderSize; |
511 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), | 552 EXPECT_THAT(packet.payload().subview(kFuAHeaderSize), |
512 ElementsAreArray(&kRewrittenSps[offset], length)); | 553 ElementsAreArray(&kRewrittenSps[offset], length)); |
513 offset += length; | 554 offset += length; |
514 | 555 |
515 EXPECT_EQ(offset, sizeof(kRewrittenSps)); | 556 EXPECT_EQ(offset, sizeof(kRewrittenSps)); |
516 } | 557 } |
517 | 558 |
518 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { | 559 TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) { |
519 const size_t kHeaderOverhead = kFuAHeaderSize + 1; | 560 const size_t kHeaderOverhead = kFuAHeaderSize + 1; |
520 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. | 561 const size_t kExpectedTotalSize = H264::kNaluTypeSize + // Stap-A type. |
521 sizeof(kRewrittenSps) + sizeof(kIdrOne) + | 562 sizeof(kRewrittenSps) + sizeof(kIdrOne) + |
522 sizeof(kIdrTwo) + (kLengthFieldLength * 3); | 563 sizeof(kIdrTwo) + (kLengthFieldLength * 3); |
523 | 564 |
524 // Set size to include SPS and the rest of the packets in a Stap-A package. | 565 // Set size to include SPS and the rest of the packets in a Stap-A package. |
525 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, | 566 packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved, |
526 kExpectedTotalSize + kHeaderOverhead)); | 567 kExpectedTotalSize + kHeaderOverhead, |
| 568 0)); |
527 | 569 |
528 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), | 570 packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(), |
529 &fragmentation_header_); | 571 &fragmentation_header_); |
530 | 572 |
531 bool last_packet = true; | |
532 RtpPacketToSend packet(kNoExtensions); | 573 RtpPacketToSend packet(kNoExtensions); |
533 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity()); | 574 ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity()); |
534 | 575 |
535 EXPECT_TRUE(packetizer_->NextPacket(&packet, &last_packet)); | 576 EXPECT_TRUE(packetizer_->NextPacket(&packet)); |
536 EXPECT_EQ(kExpectedTotalSize, packet.payload_size()); | 577 EXPECT_EQ(kExpectedTotalSize, packet.payload_size()); |
537 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength, | 578 EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength, |
538 sizeof(kRewrittenSps)), | 579 sizeof(kRewrittenSps)), |
539 ElementsAreArray(kRewrittenSps)); | 580 ElementsAreArray(kRewrittenSps)); |
540 } | 581 } |
541 | 582 |
542 class RtpDepacketizerH264Test : public ::testing::Test { | 583 class RtpDepacketizerH264Test : public ::testing::Test { |
543 protected: | 584 protected: |
544 RtpDepacketizerH264Test() | 585 RtpDepacketizerH264Test() |
545 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {} | 586 : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {} |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 EXPECT_EQ(kVideoFrameDelta, payload.frame_type); | 937 EXPECT_EQ(kVideoFrameDelta, payload.frame_type); |
897 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); | 938 EXPECT_EQ(kH264SingleNalu, h264.packetization_type); |
898 EXPECT_EQ(kSei, h264.nalu_type); | 939 EXPECT_EQ(kSei, h264.nalu_type); |
899 ASSERT_EQ(1u, h264.nalus_length); | 940 ASSERT_EQ(1u, h264.nalus_length); |
900 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); | 941 EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type); |
901 EXPECT_EQ(-1, h264.nalus[0].sps_id); | 942 EXPECT_EQ(-1, h264.nalus[0].sps_id); |
902 EXPECT_EQ(-1, h264.nalus[0].pps_id); | 943 EXPECT_EQ(-1, h264.nalus[0].pps_id); |
903 } | 944 } |
904 | 945 |
905 } // namespace webrtc | 946 } // namespace webrtc |
OLD | NEW |