1 /*
2 * Copyright (c) 2018 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 #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
11
12 #include "test/gmock.h"
13 #include "test/gtest.h"
14
15 namespace webrtc {
16 namespace {
17
18 using ::testing::ElementsAre;
19 using ::testing::ElementsAreArray;
20 using ::testing::IsEmpty;
21
22 constexpr uint8_t kDeprecatedFlags = 0x30;
23
24 // TODO(danilchap): Add fuzzer to test for various invalid inputs.
25
TEST(RtpGenericFrameDescriptorExtensionTest,ParseFirstPacketOfIndependenSubFrame)26 TEST(RtpGenericFrameDescriptorExtensionTest,
27 ParseFirstPacketOfIndependenSubFrame) {
28 const int kTemporalLayer = 5;
29 constexpr uint8_t kRaw[] = {0x80 | kTemporalLayer, 0x49, 0x12, 0x34};
30 RtpGenericFrameDescriptor descriptor;
31
32 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
33
34 EXPECT_TRUE(descriptor.FirstPacketInSubFrame());
35 EXPECT_FALSE(descriptor.LastPacketInSubFrame());
36
37 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), IsEmpty());
38 EXPECT_EQ(descriptor.TemporalLayer(), kTemporalLayer);
39 EXPECT_EQ(descriptor.SpatialLayersBitmask(), 0x49);
40 EXPECT_EQ(descriptor.FrameId(), 0x3412);
41 }
42
TEST(RtpGenericFrameDescriptorExtensionTest,WriteFirstPacketOfIndependenSubFrame)43 TEST(RtpGenericFrameDescriptorExtensionTest,
44 WriteFirstPacketOfIndependenSubFrame) {
45 const int kTemporalLayer = 5;
46 uint8_t kRaw[] = {0x80 | kTemporalLayer | kDeprecatedFlags, 0x49, 0x12, 0x34};
47 RtpGenericFrameDescriptor descriptor;
48
49 descriptor.SetFirstPacketInSubFrame(true);
50 descriptor.SetTemporalLayer(kTemporalLayer);
51 descriptor.SetSpatialLayersBitmask(0x49);
52 descriptor.SetFrameId(0x3412);
53
54 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
55 sizeof(kRaw));
56 uint8_t buffer[sizeof(kRaw)];
57 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
58
59 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
60 }
61
TEST(RtpGenericFrameDescriptorExtensionTest,ParseLastPacketOfSubFrame)62 TEST(RtpGenericFrameDescriptorExtensionTest, ParseLastPacketOfSubFrame) {
63 constexpr uint8_t kRaw[] = {0x40};
64 RtpGenericFrameDescriptor descriptor;
65
66 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
67
68 EXPECT_FALSE(descriptor.FirstPacketInSubFrame());
69 EXPECT_TRUE(descriptor.LastPacketInSubFrame());
70 }
71
TEST(RtpGenericFrameDescriptorExtensionTest,WriteLastPacketOfSubFrame)72 TEST(RtpGenericFrameDescriptorExtensionTest, WriteLastPacketOfSubFrame) {
73 uint8_t kRaw[] = {0x40 | kDeprecatedFlags};
74
75 RtpGenericFrameDescriptor descriptor;
76 descriptor.SetLastPacketInSubFrame(true);
77
78 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
79 sizeof(kRaw));
80 uint8_t buffer[sizeof(kRaw)];
81 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
82 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
83 }
84
TEST(RtpGenericFrameDescriptorExtensionTest,ParseMinShortFrameDependencies)85 TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinShortFrameDependencies) {
86 constexpr uint16_t kDiff = 1;
87 constexpr uint8_t kRaw[] = {0x88, 0x01, 0x00, 0x00, 0x04};
88 RtpGenericFrameDescriptor descriptor;
89
90 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
91 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
92 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
93 }
94
TEST(RtpGenericFrameDescriptorExtensionTest,WriteMinShortFrameDependencies)95 TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinShortFrameDependencies) {
96 constexpr uint16_t kDiff = 1;
97 uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x04};
98 RtpGenericFrameDescriptor descriptor;
99 descriptor.SetFirstPacketInSubFrame(true);
100 descriptor.AddFrameDependencyDiff(kDiff);
101
102 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
103 sizeof(kRaw));
104 uint8_t buffer[sizeof(kRaw)];
105 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
106 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
107 }
108
TEST(RtpGenericFrameDescriptorExtensionTest,ParseMaxShortFrameDependencies)109 TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxShortFrameDependencies) {
110 constexpr uint16_t kDiff = 0x3f;
111 constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfc};
112 RtpGenericFrameDescriptor descriptor;
113
114 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
115 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
116 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
117 }
118
TEST(RtpGenericFrameDescriptorExtensionTest,WriteMaxShortFrameDependencies)119 TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxShortFrameDependencies) {
120 constexpr uint16_t kDiff = 0x3f;
121 uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfc};
122 RtpGenericFrameDescriptor descriptor;
123 descriptor.SetFirstPacketInSubFrame(true);
124 descriptor.AddFrameDependencyDiff(kDiff);
125
126 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
127 sizeof(kRaw));
128 uint8_t buffer[sizeof(kRaw)];
129 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
130 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
131 }
132
TEST(RtpGenericFrameDescriptorExtensionTest,ParseMinLongFrameDependencies)133 TEST(RtpGenericFrameDescriptorExtensionTest, ParseMinLongFrameDependencies) {
134 constexpr uint16_t kDiff = 0x40;
135 constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x02, 0x01};
136 RtpGenericFrameDescriptor descriptor;
137
138 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
139 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
140 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
141 }
142
TEST(RtpGenericFrameDescriptorExtensionTest,WriteMinLongFrameDependencies)143 TEST(RtpGenericFrameDescriptorExtensionTest, WriteMinLongFrameDependencies) {
144 constexpr uint16_t kDiff = 0x40;
145 uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x02, 0x01};
146 RtpGenericFrameDescriptor descriptor;
147 descriptor.SetFirstPacketInSubFrame(true);
148 descriptor.AddFrameDependencyDiff(kDiff);
149
150 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
151 sizeof(kRaw));
152 uint8_t buffer[sizeof(kRaw)];
153 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
154 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
155 }
156
TEST(RtpGenericFrameDescriptorExtensionTest,ParseLongFrameDependenciesAsBigEndian)157 TEST(RtpGenericFrameDescriptorExtensionTest,
158 ParseLongFrameDependenciesAsBigEndian) {
159 constexpr uint16_t kDiff = 0x7654 >> 2;
160 constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76};
161 RtpGenericFrameDescriptor descriptor;
162
163 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
164 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
165 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
166 }
167
TEST(RtpGenericFrameDescriptorExtensionTest,WriteLongFrameDependenciesAsBigEndian)168 TEST(RtpGenericFrameDescriptorExtensionTest,
169 WriteLongFrameDependenciesAsBigEndian) {
170 constexpr uint16_t kDiff = 0x7654 >> 2;
171 uint8_t kRaw[] = {
172 0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x54 | 0x02, 0x76};
173 RtpGenericFrameDescriptor descriptor;
174 descriptor.SetFirstPacketInSubFrame(true);
175 descriptor.AddFrameDependencyDiff(kDiff);
176
177 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
178 sizeof(kRaw));
179 uint8_t buffer[sizeof(kRaw)];
180 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
181 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
182 }
183
TEST(RtpGenericFrameDescriptorExtensionTest,ParseMaxLongFrameDependencies)184 TEST(RtpGenericFrameDescriptorExtensionTest, ParseMaxLongFrameDependencies) {
185 constexpr uint16_t kDiff = 0x3fff;
186 constexpr uint8_t kRaw[] = {0xb8, 0x01, 0x00, 0x00, 0xfe, 0xff};
187 RtpGenericFrameDescriptor descriptor;
188
189 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
190 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
191 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff));
192 }
193
TEST(RtpGenericFrameDescriptorExtensionTest,WriteMaxLongFrameDependencies)194 TEST(RtpGenericFrameDescriptorExtensionTest, WriteMaxLongFrameDependencies) {
195 constexpr uint16_t kDiff = 0x3fff;
196 uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0xfe, 0xff};
197 RtpGenericFrameDescriptor descriptor;
198 descriptor.SetFirstPacketInSubFrame(true);
199 descriptor.AddFrameDependencyDiff(kDiff);
200
201 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
202 sizeof(kRaw));
203 uint8_t buffer[sizeof(kRaw)];
204 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
205 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
206 }
207
TEST(RtpGenericFrameDescriptorExtensionTest,ParseTwoFrameDependencies)208 TEST(RtpGenericFrameDescriptorExtensionTest, ParseTwoFrameDependencies) {
209 constexpr uint16_t kDiff1 = 9;
210 constexpr uint16_t kDiff2 = 15;
211 constexpr uint8_t kRaw[] = {
212 0xb8, 0x01, 0x00, 0x00, (kDiff1 << 2) | 0x01, kDiff2 << 2};
213 RtpGenericFrameDescriptor descriptor;
214
215 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
216 ASSERT_TRUE(descriptor.FirstPacketInSubFrame());
217 EXPECT_THAT(descriptor.FrameDependenciesDiffs(), ElementsAre(kDiff1, kDiff2));
218 }
219
TEST(RtpGenericFrameDescriptorExtensionTest,WriteTwoFrameDependencies)220 TEST(RtpGenericFrameDescriptorExtensionTest, WriteTwoFrameDependencies) {
221 constexpr uint16_t kDiff1 = 9;
222 constexpr uint16_t kDiff2 = 15;
223 uint8_t kRaw[] = {0x88 | kDeprecatedFlags, 0x01, 0x00, 0x00,
224 (kDiff1 << 2) | 0x01, kDiff2 << 2};
225 RtpGenericFrameDescriptor descriptor;
226 descriptor.SetFirstPacketInSubFrame(true);
227 descriptor.AddFrameDependencyDiff(kDiff1);
228 descriptor.AddFrameDependencyDiff(kDiff2);
229
230 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
231 sizeof(kRaw));
232 uint8_t buffer[sizeof(kRaw)];
233 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
234 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
235 }
236
TEST(RtpGenericFrameDescriptorExtensionTest,ParseResolutionOnIndependentFrame)237 TEST(RtpGenericFrameDescriptorExtensionTest,
238 ParseResolutionOnIndependentFrame) {
239 constexpr int kWidth = 0x2468;
240 constexpr int kHeight = 0x6543;
241 constexpr uint8_t kRaw[] = {0xb0, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43};
242 RtpGenericFrameDescriptor descriptor;
243
244 ASSERT_TRUE(RtpGenericFrameDescriptorExtension00::Parse(kRaw, &descriptor));
245 EXPECT_EQ(descriptor.Width(), kWidth);
246 EXPECT_EQ(descriptor.Height(), kHeight);
247 }
248
TEST(RtpGenericFrameDescriptorExtensionTest,WriteResolutionOnIndependentFrame)249 TEST(RtpGenericFrameDescriptorExtensionTest,
250 WriteResolutionOnIndependentFrame) {
251 constexpr int kWidth = 0x2468;
252 constexpr int kHeight = 0x6543;
253 uint8_t kRaw[] = {
254 0x80 | kDeprecatedFlags, 0x01, 0x00, 0x00, 0x24, 0x68, 0x65, 0x43};
255 RtpGenericFrameDescriptor descriptor;
256 descriptor.SetFirstPacketInSubFrame(true);
257 descriptor.SetResolution(kWidth, kHeight);
258
259 ASSERT_EQ(RtpGenericFrameDescriptorExtension00::ValueSize(descriptor),
260 sizeof(kRaw));
261 uint8_t buffer[sizeof(kRaw)];
262 EXPECT_TRUE(RtpGenericFrameDescriptorExtension00::Write(buffer, descriptor));
263 EXPECT_THAT(buffer, ElementsAreArray(kRaw));
264 }
265 } // namespace
266 } // namespace webrtc
267