@@ -307,3 +307,74 @@ fn stbi_f2f(x: f32) -> i32 {
307
307
fn stbi_fsh ( x : i32 ) -> i32 {
308
308
x << 12
309
309
}
310
+
311
+ #[ test]
312
+ fn test_dequantize_and_idct_block_8x8 ( ) {
313
+ let coefficients: [ i16 ; 8 * 8 ] = [
314
+ -14 , -39 , 58 , -2 , 3 , 3 , 0 , 1 ,
315
+ 11 , 27 , 4 , -3 , 3 , 0 , 1 , 0 ,
316
+ -6 , -13 , -9 , -1 , -2 , -1 , 0 , 0 ,
317
+ -4 , 0 , -1 , -2 , 0 , 0 , 0 , 0 ,
318
+ 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
319
+ -3 , -2 , 0 , 0 , 0 , 0 , 0 , 0 ,
320
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
321
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
322
+
323
+ let quantization_table: [ u16 ; 8 * 8 ] = [
324
+ 8 , 6 , 5 , 8 , 12 , 20 , 26 , 31 ,
325
+ 6 , 6 , 7 , 10 , 13 , 29 , 30 , 28 ,
326
+ 7 , 7 , 8 , 12 , 20 , 29 , 35 , 28 ,
327
+ 7 , 9 , 11 , 15 , 26 , 44 , 40 , 31 ,
328
+ 9 , 11 , 19 , 28 , 34 , 55 , 52 , 39 ,
329
+ 12 , 18 , 28 , 32 , 41 , 52 , 57 , 46 ,
330
+ 25 , 32 , 39 , 44 , 52 , 61 , 60 , 51 ,
331
+ 36 , 46 , 48 , 49 , 56 , 50 , 52 , 50 ] ;
332
+ let output_linestride: usize = 8 ;
333
+ let mut output = [ 0u8 ; 8 * 8 ] ;
334
+ dequantize_and_idct_block_8x8 (
335
+ & coefficients,
336
+ & quantization_table,
337
+ output_linestride,
338
+ & mut output) ;
339
+ let expected_output = [
340
+ 118 , 92 , 110 , 83 , 77 , 93 , 144 , 198 ,
341
+ 172 , 116 , 114 , 87 , 78 , 93 , 146 , 191 ,
342
+ 194 , 107 , 91 , 76 , 71 , 93 , 160 , 198 ,
343
+ 196 , 100 , 80 , 74 , 67 , 92 , 174 , 209 ,
344
+ 182 , 104 , 88 , 81 , 68 , 89 , 178 , 206 ,
345
+ 105 , 64 , 59 , 59 , 63 , 94 , 183 , 201 ,
346
+ 35 , 27 , 28 , 37 , 72 , 121 , 203 , 204 ,
347
+ 37 , 45 , 41 , 47 , 98 , 154 , 223 , 208 ] ;
348
+ assert_eq ! ( & output[ ..] , & expected_output[ ..] ) ;
349
+ }
350
+
351
+ #[ test]
352
+ fn test_dequantize_and_idct_block_8x8_all_zero ( ) {
353
+ let mut output = [ 0u8 ; 8 * 8 ] ;
354
+ dequantize_and_idct_block_8x8 (
355
+ & [ 0 ; 8 * 8 ] ,
356
+ & [ 666 ; 8 * 8 ] ,
357
+ 8 ,
358
+ & mut output) ;
359
+ assert_eq ! ( & output[ ..] , & [ 128 ; 8 * 8 ] [ ..] ) ;
360
+ }
361
+
362
+ #[ test]
363
+ fn test_dequantize_and_idct_block_8x8_saturated ( ) {
364
+ let mut output = [ 0u8 ; 8 * 8 ] ;
365
+ dequantize_and_idct_block_8x8 (
366
+ & [ std:: i16:: MAX ; 8 * 8 ] ,
367
+ & [ std:: u16:: MAX ; 8 * 8 ] ,
368
+ 8 ,
369
+ & mut output) ;
370
+ let expected = [
371
+ 0 , 0 , 0 , 255 , 255 , 0 , 0 , 255 ,
372
+ 0 , 0 , 215 , 0 , 0 , 255 , 255 , 0 ,
373
+ 255 , 255 , 255 , 255 , 255 , 0 , 0 , 255 ,
374
+ 0 , 0 , 255 , 0 , 255 , 0 , 255 , 255 ,
375
+ 0 , 0 , 255 , 255 , 0 , 255 , 0 , 0 ,
376
+ 255 , 255 , 0 , 255 , 255 , 255 , 170 , 0 ,
377
+ 0 , 255 , 0 , 0 , 0 , 0 , 0 , 255 ,
378
+ 255 , 255 , 0 , 255 , 0 , 255 , 0 , 0 ] ;
379
+ assert_eq ! ( & output[ ..] , & expected[ ..] ) ;
380
+ }
0 commit comments