OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 17 matching lines...) Expand all Loading... |
28 VCMPacket GetDefaultPacket() { | 28 VCMPacket GetDefaultPacket() { |
29 VCMPacket packet; | 29 VCMPacket packet; |
30 packet.codec = kVideoCodecH264; | 30 packet.codec = kVideoCodecH264; |
31 packet.video_header.codecHeader.H264.nalus_length = 0; | 31 packet.video_header.codecHeader.H264.nalus_length = 0; |
32 packet.video_header.is_first_packet_in_frame = false; | 32 packet.video_header.is_first_packet_in_frame = false; |
33 packet.video_header.codecHeader.H264.packetization_type = kH264SingleNalu; | 33 packet.video_header.codecHeader.H264.packetization_type = kH264SingleNalu; |
34 | 34 |
35 return packet; | 35 return packet; |
36 } | 36 } |
37 | 37 |
38 void AddSps(VCMPacket* packet, int sps_id, std::vector<uint8_t>* data) { | 38 void AddSps(VCMPacket* packet, uint8_t sps_id, std::vector<uint8_t>* data) { |
39 NaluInfo info; | 39 NaluInfo info; |
40 info.type = H264::NaluType::kSps; | 40 info.type = H264::NaluType::kSps; |
41 info.sps_id = sps_id; | 41 info.sps_id = sps_id; |
42 info.pps_id = -1; | 42 info.pps_id = -1; |
43 info.offset = data->size(); | |
44 info.size = 2; | |
45 data->push_back(H264::NaluType::kSps); | 43 data->push_back(H264::NaluType::kSps); |
46 data->push_back(sps_id); // The sps data, just a single byte. | 44 data->push_back(sps_id); // The sps data, just a single byte. |
47 | 45 |
48 packet->video_header.codecHeader.H264 | 46 packet->video_header.codecHeader.H264 |
49 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info; | 47 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info; |
50 } | 48 } |
51 | 49 |
52 void AddPps(VCMPacket* packet, | 50 void AddPps(VCMPacket* packet, |
53 int sps_id, | 51 uint8_t sps_id, |
54 int pps_id, | 52 uint8_t pps_id, |
55 std::vector<uint8_t>* data) { | 53 std::vector<uint8_t>* data) { |
56 NaluInfo info; | 54 NaluInfo info; |
57 info.type = H264::NaluType::kPps; | 55 info.type = H264::NaluType::kPps; |
58 info.sps_id = sps_id; | 56 info.sps_id = sps_id; |
59 info.pps_id = pps_id; | 57 info.pps_id = pps_id; |
60 info.offset = data->size(); | |
61 info.size = 2; | |
62 data->push_back(H264::NaluType::kPps); | 58 data->push_back(H264::NaluType::kPps); |
63 data->push_back(pps_id); // The pps data, just a single byte. | 59 data->push_back(pps_id); // The pps data, just a single byte. |
64 | 60 |
65 packet->video_header.codecHeader.H264 | 61 packet->video_header.codecHeader.H264 |
66 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info; | 62 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info; |
67 } | 63 } |
68 | 64 |
69 void AddIdr(VCMPacket* packet, int pps_id) { | 65 void AddIdr(VCMPacket* packet, int pps_id) { |
70 NaluInfo info; | 66 NaluInfo info; |
71 info.type = H264::NaluType::kIdr; | 67 info.type = H264::NaluType::kIdr; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 idr_packet.video_header.is_first_packet_in_frame = true; | 203 idr_packet.video_header.is_first_packet_in_frame = true; |
208 AddIdr(&idr_packet, 1); | 204 AddIdr(&idr_packet, 1); |
209 data.insert(data.end(), {1, 2, 3}); | 205 data.insert(data.end(), {1, 2, 3}); |
210 idr_packet.dataPtr = data.data(); | 206 idr_packet.dataPtr = data.data(); |
211 idr_packet.sizeBytes = data.size(); | 207 idr_packet.sizeBytes = data.size(); |
212 EXPECT_EQ(H264SpsPpsTracker::kInsert, | 208 EXPECT_EQ(H264SpsPpsTracker::kInsert, |
213 tracker_.CopyAndFixBitstream(&idr_packet)); | 209 tracker_.CopyAndFixBitstream(&idr_packet)); |
214 | 210 |
215 std::vector<uint8_t> expected; | 211 std::vector<uint8_t> expected; |
216 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | 212 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); |
217 expected.insert(expected.end(), {H264::NaluType::kSps, 0}); | |
218 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | |
219 expected.insert(expected.end(), {H264::NaluType::kPps, 1}); | |
220 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | |
221 expected.insert(expected.end(), {1, 2, 3}); | 213 expected.insert(expected.end(), {1, 2, 3}); |
222 EXPECT_EQ(memcmp(idr_packet.dataPtr, expected.data(), expected.size()), 0); | 214 EXPECT_EQ(memcmp(idr_packet.dataPtr, expected.data(), expected.size()), 0); |
223 delete[] idr_packet.dataPtr; | 215 delete[] idr_packet.dataPtr; |
224 } | 216 } |
225 | 217 |
226 TEST_F(TestH264SpsPpsTracker, SpsPpsIdrInStapA) { | 218 TEST_F(TestH264SpsPpsTracker, SpsPpsIdrInStapA) { |
227 std::vector<uint8_t> data; | 219 std::vector<uint8_t> data; |
228 VCMPacket packet = GetDefaultPacket(); | 220 VCMPacket packet = GetDefaultPacket(); |
229 packet.video_header.codecHeader.H264.packetization_type = kH264StapA; | 221 packet.video_header.codecHeader.H264.packetization_type = kH264StapA; |
230 packet.video_header.is_first_packet_in_frame = true; // Always true for StapA | 222 packet.video_header.is_first_packet_in_frame = true; // Always true for StapA |
231 | 223 |
232 data.insert(data.end(), {0}); // First byte is ignored | 224 data.insert(data.end(), {0}); // First byte is ignored |
233 data.insert(data.end(), {0, 2}); // Length of segment | 225 data.insert(data.end(), {0, 2}); // Length of segment |
234 AddSps(&packet, 13, &data); | 226 AddSps(&packet, 13, &data); |
235 data.insert(data.end(), {0, 2}); // Length of segment | 227 data.insert(data.end(), {0, 2}); // Length of segment |
236 AddPps(&packet, 13, 27, &data); | 228 AddPps(&packet, 13, 27, &data); |
237 data.insert(data.end(), {0, 5}); // Length of segment | 229 data.insert(data.end(), {0, 5}); // Length of segment |
238 AddIdr(&packet, 27); | 230 AddIdr(&packet, 27); |
239 data.insert(data.end(), {1, 2, 3, 2, 1}); | 231 data.insert(data.end(), {1, 2, 3, 2, 1}); |
240 | 232 |
241 packet.dataPtr = data.data(); | 233 packet.dataPtr = data.data(); |
242 packet.sizeBytes = data.size(); | 234 packet.sizeBytes = data.size(); |
243 EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet)); | 235 EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet)); |
244 | 236 |
245 std::vector<uint8_t> expected; | 237 std::vector<uint8_t> expected; |
246 // The SPS/PPS is repeated because this packet both contains the SPS/PPS | |
247 // and it is the first packet of an IDR, which will cause the SPS/PPS to be | |
248 // prepended to the bitstream. | |
249 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | 238 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); |
250 expected.insert(expected.end(), {H264::NaluType::kSps, 13}); | 239 expected.insert(expected.end(), {H264::NaluType::kSps, 13}); |
251 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | 240 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); |
252 expected.insert(expected.end(), {H264::NaluType::kPps, 27}); | |
253 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | |
254 expected.insert(expected.end(), {H264::NaluType::kSps, 13}); | |
255 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | |
256 expected.insert(expected.end(), {H264::NaluType::kPps, 27}); | 241 expected.insert(expected.end(), {H264::NaluType::kPps, 27}); |
257 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); | 242 expected.insert(expected.end(), start_code, start_code + sizeof(start_code)); |
258 expected.insert(expected.end(), {1, 2, 3, 2, 1}); | 243 expected.insert(expected.end(), {1, 2, 3, 2, 1}); |
259 | 244 |
260 EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0); | 245 EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0); |
261 delete[] packet.dataPtr; | 246 delete[] packet.dataPtr; |
262 } | 247 } |
263 | 248 |
264 TEST_F(TestH264SpsPpsTracker, SpsPpsOutOfBand) { | 249 TEST_F(TestH264SpsPpsTracker, SpsPpsOutOfBand) { |
265 constexpr uint8_t kData[] = {1, 2, 3}; | 250 constexpr uint8_t kData[] = {1, 2, 3}; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 EXPECT_EQ(H264SpsPpsTracker::kInsert, | 339 EXPECT_EQ(H264SpsPpsTracker::kInsert, |
355 tracker_.CopyAndFixBitstream(&idr_packet)); | 340 tracker_.CopyAndFixBitstream(&idr_packet)); |
356 | 341 |
357 EXPECT_EQ(320, idr_packet.width); | 342 EXPECT_EQ(320, idr_packet.width); |
358 EXPECT_EQ(240, idr_packet.height); | 343 EXPECT_EQ(240, idr_packet.height); |
359 delete[] idr_packet.dataPtr; | 344 delete[] idr_packet.dataPtr; |
360 } | 345 } |
361 | 346 |
362 } // namespace video_coding | 347 } // namespace video_coding |
363 } // namespace webrtc | 348 } // namespace webrtc |
OLD | NEW |