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