xref: /webrtc/rtp/src/codecs/vp9/vp9_test.rs (revision 5d8fe953)
1 use super::*;
2 
3 #[test]
test_vp9_packet_unmarshal() -> Result<()>4 fn test_vp9_packet_unmarshal() -> Result<()> {
5     let tests = vec![
6         (
7             "Empty",
8             Bytes::from_static(&[]),
9             Vp9Packet::default(),
10             Bytes::new(),
11             Some(Error::ErrShortPacket),
12         ),
13         (
14             "NonFlexible",
15             Bytes::from_static(&[0x00, 0xAA]),
16             Vp9Packet::default(),
17             Bytes::from_static(&[0xAA]),
18             None,
19         ),
20         (
21             "NonFlexiblePictureID",
22             Bytes::from_static(&[0x80, 0x02, 0xAA]),
23             Vp9Packet {
24                 i: true,
25                 picture_id: 0x02,
26                 ..Default::default()
27             },
28             Bytes::from_static(&[0xAA]),
29             None,
30         ),
31         (
32             "NonFlexiblePictureIDExt",
33             Bytes::from_static(&[0x80, 0x81, 0xFF, 0xAA]),
34             Vp9Packet {
35                 i: true,
36                 picture_id: 0x01FF,
37                 ..Default::default()
38             },
39             Bytes::from_static(&[0xAA]),
40             None,
41         ),
42         (
43             "NonFlexiblePictureIDExt_ShortPacket0",
44             Bytes::from_static(&[0x80, 0x81]),
45             Vp9Packet::default(),
46             Bytes::new(),
47             Some(Error::ErrShortPacket),
48         ),
49         (
50             "NonFlexiblePictureIDExt_ShortPacket1",
51             Bytes::from_static(&[0x80]),
52             Vp9Packet::default(),
53             Bytes::new(),
54             Some(Error::ErrShortPacket),
55         ),
56         (
57             "NonFlexibleLayerIndicePictureID",
58             Bytes::from_static(&[0xA0, 0x02, 0x23, 0x01, 0xAA]),
59             Vp9Packet {
60                 i: true,
61                 l: true,
62                 picture_id: 0x02,
63                 tid: 0x01,
64                 sid: 0x01,
65                 d: true,
66                 tl0picidx: 0x01,
67                 ..Default::default()
68             },
69             Bytes::from_static(&[0xAA]),
70             None,
71         ),
72         (
73             "FlexibleLayerIndicePictureID",
74             Bytes::from_static(&[0xB0, 0x02, 0x23, 0x01, 0xAA]),
75             Vp9Packet {
76                 f: true,
77                 i: true,
78                 l: true,
79                 picture_id: 0x02,
80                 tid: 0x01,
81                 sid: 0x01,
82                 d: true,
83                 ..Default::default()
84             },
85             Bytes::from_static(&[0x01, 0xAA]),
86             None,
87         ),
88         (
89             "NonFlexibleLayerIndicePictureID_ShortPacket0",
90             Bytes::from_static(&[0xA0, 0x02, 0x23]),
91             Vp9Packet::default(),
92             Bytes::new(),
93             Some(Error::ErrShortPacket),
94         ),
95         (
96             "NonFlexibleLayerIndicePictureID_ShortPacket1",
97             Bytes::from_static(&[0xA0, 0x02]),
98             Vp9Packet::default(),
99             Bytes::new(),
100             Some(Error::ErrShortPacket),
101         ),
102         (
103             "FlexiblePictureIDRefIndex",
104             Bytes::from_static(&[0xD0, 0x02, 0x03, 0x04, 0xAA]),
105             Vp9Packet {
106                 i: true,
107                 p: true,
108                 f: true,
109                 picture_id: 0x02,
110                 pdiff: vec![0x01, 0x02],
111                 ..Default::default()
112             },
113             Bytes::from_static(&[0xAA]),
114             None,
115         ),
116         (
117             "FlexiblePictureIDRefIndex_TooManyPDiff",
118             Bytes::from_static(&[0xD0, 0x02, 0x03, 0x05, 0x07, 0x09, 0x10, 0xAA]),
119             Vp9Packet::default(),
120             Bytes::new(),
121             Some(Error::ErrTooManyPDiff),
122         ),
123         (
124             "FlexiblePictureIDRefIndexNoPayload",
125             Bytes::from_static(&[0xD0, 0x02, 0x03, 0x04]),
126             Vp9Packet {
127                 i: true,
128                 p: true,
129                 f: true,
130                 picture_id: 0x02,
131                 pdiff: vec![0x01, 0x02],
132                 ..Default::default()
133             },
134             Bytes::from_static(&[]),
135             None,
136         ),
137         (
138             "FlexiblePictureIDRefIndex_ShortPacket0",
139             Bytes::from_static(&[0xD0, 0x02, 0x03]),
140             Vp9Packet::default(),
141             Bytes::new(),
142             Some(Error::ErrShortPacket),
143         ),
144         (
145             "FlexiblePictureIDRefIndex_ShortPacket1",
146             Bytes::from_static(&[0xD0, 0x02]),
147             Vp9Packet::default(),
148             Bytes::new(),
149             Some(Error::ErrShortPacket),
150         ),
151         (
152             "FlexiblePictureIDRefIndex_ShortPacket2",
153             Bytes::from_static(&[0xD0]),
154             Vp9Packet::default(),
155             Bytes::new(),
156             Some(Error::ErrShortPacket),
157         ),
158         (
159             "ScalabilityStructureResolutionsNoPayload",
160             Bytes::from_static(&[
161                 0x0A,
162                 (1 << 5) | (1 << 4), // NS:1 Y:1 G:0
163                 (640 >> 8) as u8,
164                 (640 & 0xff) as u8,
165                 (360 >> 8) as u8,
166                 (360 & 0xff) as u8,
167                 (1280 >> 8) as u8,
168                 (1280 & 0xff) as u8,
169                 (720 >> 8) as u8,
170                 (720 & 0xff) as u8,
171             ]),
172             Vp9Packet {
173                 b: true,
174                 v: true,
175                 ns: 1,
176                 y: true,
177                 g: false,
178                 ng: 0,
179                 width: vec![640, 1280],
180                 height: vec![360, 720],
181                 ..Default::default()
182             },
183             Bytes::new(),
184             None,
185         ),
186         (
187             "ScalabilityStructureNoPayload",
188             Bytes::from_static(&[
189                 0x0A,
190                 (1 << 5) | (1 << 3), // NS:1 Y:0 G:1
191                 2,
192                 (1 << 4),            // T:0 U:1 R:0 -
193                 (2 << 5) | (1 << 2), // T:2 U:0 R:1 -
194                 33,
195             ]),
196             Vp9Packet {
197                 b: true,
198                 v: true,
199                 ns: 1,
200                 y: false,
201                 g: true,
202                 ng: 2,
203                 pgtid: vec![0, 2],
204                 pgu: vec![true, false],
205                 pgpdiff: vec![vec![], vec![33]],
206                 ..Default::default()
207             },
208             Bytes::new(),
209             None,
210         ),
211     ];
212 
213     for (name, b, pkt, expected, err) in tests {
214         let mut p = Vp9Packet::default();
215 
216         if let Some(expected) = err {
217             if let Err(actual) = p.depacketize(&b) {
218                 assert_eq!(
219                     expected, actual,
220                     "{name}: expected {expected}, but got {actual}"
221                 );
222             } else {
223                 panic!("{name}: expected error, but got passed");
224             }
225         } else {
226             let payload = p.depacketize(&b)?;
227             assert_eq!(pkt, p, "{name}: expected {pkt:?}, but got {p:?}");
228             assert_eq!(payload, expected);
229         }
230     }
231 
232     Ok(())
233 }
234 
235 #[test]
test_vp9_payloader_payload() -> Result<()>236 fn test_vp9_payloader_payload() -> Result<()> {
237     let mut r0 = 8692;
238     let mut rands = vec![];
239     for _ in 0..10 {
240         rands.push(vec![(r0 >> 8) as u8 | 0x80, (r0 & 0xFF) as u8]);
241         r0 += 1;
242     }
243 
244     let tests = vec![
245         ("NilPayload", vec![Bytes::new()], 100, vec![]),
246         ("SmallMTU", vec![Bytes::from(vec![0x00, 0x00])], 1, vec![]),
247         (
248             "NegativeMTU",
249             vec![Bytes::from(vec![0x00, 0x00])],
250             0,
251             vec![],
252         ),
253         (
254             "OnePacket",
255             vec![Bytes::from(vec![0x01, 0x02])],
256             10,
257             vec![Bytes::from(vec![
258                 0x9C,
259                 rands[0][0],
260                 rands[0][1],
261                 0x01,
262                 0x02,
263             ])],
264         ),
265         (
266             "TwoPackets",
267             vec![Bytes::from(vec![0x01, 0x02])],
268             4,
269             vec![
270                 Bytes::from(vec![0x98, rands[0][0], rands[0][1], 0x01]),
271                 Bytes::from(vec![0x94, rands[0][0], rands[0][1], 0x02]),
272             ],
273         ),
274         (
275             "ThreePackets",
276             vec![Bytes::from(vec![0x01, 0x02, 0x03])],
277             4,
278             vec![
279                 Bytes::from(vec![0x98, rands[0][0], rands[0][1], 0x01]),
280                 Bytes::from(vec![0x90, rands[0][0], rands[0][1], 0x02]),
281                 Bytes::from(vec![0x94, rands[0][0], rands[0][1], 0x03]),
282             ],
283         ),
284         (
285             "TwoFramesFourPackets",
286             vec![Bytes::from(vec![0x01, 0x02, 0x03]), Bytes::from(vec![0x04])],
287             5,
288             vec![
289                 Bytes::from(vec![0x98, rands[0][0], rands[0][1], 0x01, 0x02]),
290                 Bytes::from(vec![0x94, rands[0][0], rands[0][1], 0x03]),
291                 Bytes::from(vec![0x9C, rands[1][0], rands[1][1], 0x04]),
292             ],
293         ),
294     ];
295 
296     for (name, bs, mtu, expected) in tests {
297         let mut pck = Vp9Payloader {
298             initial_picture_id_fn: Some(Arc::new(|| -> u16 { 8692 })),
299             ..Default::default()
300         };
301 
302         let mut actual = vec![];
303         for b in &bs {
304             actual.extend(pck.payload(mtu, b)?);
305         }
306         assert_eq!(actual, expected, "{name}: Payloaded packet");
307     }
308 
309     //"PictureIDOverflow"
310     {
311         let mut pck = Vp9Payloader {
312             initial_picture_id_fn: Some(Arc::new(|| -> u16 { 8692 })),
313             ..Default::default()
314         };
315         let mut p_prev = Vp9Packet::default();
316         for i in 0..0x8000 {
317             let res = pck.payload(4, &Bytes::from_static(&[0x01]))?;
318             let mut p = Vp9Packet::default();
319             p.depacketize(&res[0])?;
320 
321             if i > 0 {
322                 if p_prev.picture_id == 0x7FFF {
323                     assert_eq!(
324                         p.picture_id, 0,
325                         "Picture ID next to 0x7FFF must be 0, got {}",
326                         p.picture_id
327                     );
328                 } else if p_prev.picture_id + 1 != p.picture_id {
329                     panic!(
330                         "Picture ID next must be incremented by 1: {} -> {}",
331                         p_prev.picture_id, p.picture_id,
332                     );
333                 }
334             }
335 
336             p_prev = p;
337         }
338     }
339 
340     Ok(())
341 }
342 
343 #[test]
test_vp9_partition_head_checker_is_partition_head() -> Result<()>344 fn test_vp9_partition_head_checker_is_partition_head() -> Result<()> {
345     let vp9 = Vp9Packet::default();
346 
347     //"SmallPacket"
348     assert!(
349         !vp9.is_partition_head(&Bytes::new()),
350         "Small packet should not be the head of a new partition"
351     );
352 
353     //"NormalPacket"
354     assert!(
355         vp9.is_partition_head(&Bytes::from_static(&[0x18, 0x00, 0x00])),
356         "VP9 RTP packet with B flag should be head of a new partition"
357     );
358     assert!(
359         !vp9.is_partition_head(&Bytes::from_static(&[0x10, 0x00, 0x00])),
360         "VP9 RTP packet without B flag should not be head of a new partition"
361     );
362 
363     Ok(())
364 }
365