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