Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: webrtc/modules/video_coding/h264_sps_pps_tracker_unittest.cc

Issue 2466993003: H264SpsPpsTracker class which keep tracks of SPS/PPS. (Closed)
Patch Set: Feedback fixes. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/modules/video_coding/h264_sps_pps_tracker.h"
12
13 #include <vector>
14
15 #include "webrtc/modules/video_coding/packet.h"
16 #include "webrtc/test/gtest.h"
17 #include "webrtc/common_video/h264/h264_common.h"
18
19 namespace webrtc {
20 namespace video_coding {
21
22 namespace {
23 // Using an std::initializer_list for easier appending to std::vector.
24 const std::initializer_list<uint8_t> start_code = {0, 0, 0, 1};
25 } // namespace
26
27 class TestH264SpsPpsTracker : public ::testing::Test {
28 public:
29 VCMPacket GetDefaultPacket() {
30 VCMPacket packet;
31 packet.codec = kVideoCodecH264;
32 packet.video_header.codecHeader.H264.nalus_length = 0;
33 packet.video_header.isFirstPacket = false;
34 packet.video_header.codecHeader.H264.packetization_type = kH264SingleNalu;
35
36 return packet;
37 }
38
39 void AddSps(VCMPacket* packet, int sps_id, std::vector<uint8_t>* data) {
40 NaluInfo info;
41 info.type = H264::NaluType::kSps;
42 info.sps_id = sps_id;
43 info.pps_id = -1;
44 info.offset = data->size();
45 info.size = 2;
46 data->push_back(H264::NaluType::kSps);
47 data->push_back(sps_id); // The sps data, just a single byte.
48
49 packet->video_header.codecHeader.H264
50 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
51 }
52
53 void AddPps(VCMPacket* packet,
54 int sps_id,
55 int pps_id,
56 std::vector<uint8_t>* data) {
57 NaluInfo info;
58 info.type = H264::NaluType::kPps;
59 info.sps_id = sps_id;
60 info.pps_id = pps_id;
61 info.offset = data->size();
62 info.size = 2;
63 data->push_back(H264::NaluType::kPps);
64 data->push_back(pps_id); // The pps data, just a single byte.
65
66 packet->video_header.codecHeader.H264
67 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
68 }
69
70 void AddIdr(VCMPacket* packet, int pps_id) {
71 NaluInfo info;
72 info.type = H264::NaluType::kIdr;
73 info.sps_id = -1;
74 info.pps_id = pps_id;
75
76 packet->video_header.codecHeader.H264
77 .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
78 }
79
80 protected:
81 H264SpsPpsTracker tracker_;
82 };
83
84 TEST_F(TestH264SpsPpsTracker, NoNalus) {
85 uint8_t data[] = {1, 2, 3};
86 VCMPacket packet = GetDefaultPacket();
87 packet.video_header.codecHeader.H264.packetization_type = kH264FuA;
88 packet.dataPtr = data;
89 packet.sizeBytes = sizeof(data);
90
91 EXPECT_TRUE(tracker_.CopyAndFixBitstream(&packet));
92 EXPECT_EQ(memcmp(packet.dataPtr, data, sizeof(data)), 0);
93 }
94
95 TEST_F(TestH264SpsPpsTracker, NoNalusFirstPacket) {
96 uint8_t data[] = {1, 2, 3};
97 VCMPacket packet = GetDefaultPacket();
98 packet.video_header.isFirstPacket = true;
99 packet.dataPtr = data;
100 packet.sizeBytes = sizeof(data);
101
102 EXPECT_TRUE(tracker_.CopyAndFixBitstream(&packet));
103 std::vector<uint8_t> expected;
104 expected.insert(expected.end(), start_code);
105 expected.insert(expected.end(), {1, 2, 3});
106 EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
107 }
108
109 TEST_F(TestH264SpsPpsTracker, IdrNoSpsPpsInserted) {
110 std::vector<uint8_t> data = {1, 2, 3};
111 VCMPacket packet = GetDefaultPacket();
112
113 AddIdr(&packet, 0);
114 packet.dataPtr = data.data();
115 packet.sizeBytes = data.size();
116
117 EXPECT_TRUE(tracker_.CopyAndFixBitstream(&packet));
118 std::vector<uint8_t> expected;
119 expected.insert(expected.end(), start_code);
120 expected.insert(expected.end(), {1, 2, 3});
121 EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
122 }
123
124 TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoSpsPpsInserted) {
125 std::vector<uint8_t> data = {1, 2, 3};
126 VCMPacket packet = GetDefaultPacket();
127 packet.video_header.isFirstPacket = true;
128
129 AddIdr(&packet, 0);
130 packet.dataPtr = data.data();
131 packet.sizeBytes = data.size();
132
133 EXPECT_FALSE(tracker_.CopyAndFixBitstream(&packet));
134 }
135
136 TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoPpsInserted) {
137 std::vector<uint8_t> data = {1, 2, 3};
138 VCMPacket packet = GetDefaultPacket();
139 packet.video_header.isFirstPacket = true;
140
141 AddSps(&packet, 0, &data);
142 AddIdr(&packet, 0);
143 packet.dataPtr = data.data();
144 packet.sizeBytes = data.size();
145
146 EXPECT_FALSE(tracker_.CopyAndFixBitstream(&packet));
147 }
148
149 TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoSpsInserted) {
150 std::vector<uint8_t> data = {1, 2, 3};
151 VCMPacket packet = GetDefaultPacket();
152 packet.video_header.isFirstPacket = true;
153
154 AddPps(&packet, 0, 0, &data);
155 AddIdr(&packet, 0);
156 packet.dataPtr = data.data();
157 packet.sizeBytes = data.size();
158
159 EXPECT_FALSE(tracker_.CopyAndFixBitstream(&packet));
160 }
161
162 TEST_F(TestH264SpsPpsTracker, SpsPpsPacketThenIdrFirstPacket) {
163 std::vector<uint8_t> data;
164 VCMPacket sps_pps_packet = GetDefaultPacket();
165
166 // Insert SPS/PPS
167 AddSps(&sps_pps_packet, 0, &data);
168 AddPps(&sps_pps_packet, 0, 1, &data);
169 sps_pps_packet.dataPtr = data.data();
170 sps_pps_packet.sizeBytes = data.size();
171 EXPECT_FALSE(tracker_.CopyAndFixBitstream(&sps_pps_packet));
172 data.clear();
173
174 // Insert first packet of the IDR
175 VCMPacket idr_packet = GetDefaultPacket();
176 idr_packet.video_header.isFirstPacket = true;
177 AddIdr(&idr_packet, 1);
178 data.insert(data.end(), {1, 2, 3});
179 idr_packet.dataPtr = data.data();
180 idr_packet.sizeBytes = data.size();
181 EXPECT_TRUE(tracker_.CopyAndFixBitstream(&idr_packet));
182
183 std::vector<uint8_t> expected;
184 expected.insert(expected.end(), start_code);
185 expected.insert(expected.end(), {H264::NaluType::kSps, 0});
186 expected.insert(expected.end(), start_code);
187 expected.insert(expected.end(), {H264::NaluType::kPps, 1});
188 expected.insert(expected.end(), start_code);
189 expected.insert(expected.end(), {1, 2, 3});
190 EXPECT_EQ(memcmp(idr_packet.dataPtr, expected.data(), expected.size()), 0);
191 }
192
193 TEST_F(TestH264SpsPpsTracker, SpsPpsIdrInStapA) {
194 std::vector<uint8_t> data;
195 VCMPacket packet = GetDefaultPacket();
196 packet.video_header.codecHeader.H264.packetization_type = kH264StapA;
197 packet.video_header.isFirstPacket = true; // Always true for StapA
198
199 data.insert(data.end(), {0}); // First byte is ignored
200 data.insert(data.end(), {0, 2}); // Length of segment
201 AddSps(&packet, 13, &data);
202 data.insert(data.end(), {0, 2}); // Length of segment
203 AddPps(&packet, 13, 27, &data);
204 data.insert(data.end(), {0, 5}); // Length of segment
205 AddIdr(&packet, 27);
206 data.insert(data.end(), {1, 2, 3, 2, 1});
207
208 packet.dataPtr = data.data();
209 packet.sizeBytes = data.size();
210 EXPECT_TRUE(tracker_.CopyAndFixBitstream(&packet));
211
212 std::vector<uint8_t> expected;
213 // The SPS/PPS is repeated because this packet both contains the SPS/PPS
214 // and it is the first packet of an IDR, which will cause the SPS/PPS to be
215 // prepended to the bitstream.
216 expected.insert(expected.end(), start_code);
217 expected.insert(expected.end(), {H264::NaluType::kSps, 13});
218 expected.insert(expected.end(), start_code);
219 expected.insert(expected.end(), {H264::NaluType::kPps, 27});
220 expected.insert(expected.end(), start_code);
221 expected.insert(expected.end(), {H264::NaluType::kSps, 13});
222 expected.insert(expected.end(), start_code);
223 expected.insert(expected.end(), {H264::NaluType::kPps, 27});
224 expected.insert(expected.end(), start_code);
225 expected.insert(expected.end(), {1, 2, 3, 2, 1});
226
227 EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
228 }
229
230 } // namespace video_coding
231 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698