1 ! Copyright (C) Chris Double.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.accessors alien.c-types alien.syntax byte-arrays
4 destructors generalizations kernel libc locals math math.order
5 sequences sequences.private classes.struct accessors alien.data
7 IN: benchmark.yuv-to-rgb
20 :: fake-data ( -- rgb yuv )
23 yuv-buffer <struct> :> buffer
24 w h * 3 * <byte-array> :> rgb
31 w h * iota [ dup * ] B{ } map-as malloc-byte-array &free >>y
32 w h * 2/ iota [ dup dup * * ] B{ } map-as malloc-byte-array &free >>u
33 w h * 2/ iota [ dup * dup * ] B{ } map-as malloc-byte-array &free >>v ;
36 255 min 0 max ; inline
38 : stride ( line yuv -- uvy yy )
39 [ uv_stride>> swap 2/ * ] [ y_stride>> * ] 2bi ; inline
41 : compute-y ( yuv uvy yy x -- y )
42 + >fixnum nip swap y>> swap alien-unsigned-1 16 - ; inline
44 : compute-v ( yuv uvy yy x -- v )
45 nip 2/ + >fixnum swap u>> swap alien-unsigned-1 128 - ; inline
47 : compute-u ( yuv uvy yy x -- v )
48 nip 2/ + >fixnum swap v>> swap alien-unsigned-1 128 - ; inline
50 :: compute-yuv ( yuv uvy yy x -- y u v )
51 yuv uvy yy x compute-y
52 yuv uvy yy x compute-u
53 yuv uvy yy x compute-v ; inline
55 : compute-blue ( y u v -- b )
56 drop 516 * 128 + swap 298 * + -8 shift clamp ; inline
58 : compute-green ( y u v -- g )
59 [ [ 298 * ] dip 100 * - ] dip 208 * - 128 + -8 shift clamp ; inline
61 : compute-red ( y u v -- g )
62 nip 409 * swap 298 * + 128 + -8 shift clamp ; inline
64 : compute-rgb ( y u v -- b g r )
65 [ compute-blue ] [ compute-green ] [ compute-red ] 3tri ; inline
67 : store-rgb ( index rgb b g r -- index )
68 [ pick 0 + pick set-nth-unsafe ]
69 [ pick 1 + pick set-nth-unsafe ]
70 [ pick 2 + pick set-nth-unsafe ] tri*
73 : yuv>rgb-pixel ( index rgb yuv uvy yy x -- index )
74 compute-yuv compute-rgb store-rgb 3 + ; inline
76 : yuv>rgb-row ( index rgb yuv y -- index )
79 [ yuv>rgb-pixel ] 4 nwith each ; inline
81 TYPED: yuv>rgb ( rgb: byte-array yuv: yuv-buffer -- )
84 [ yuv>rgb-row ] 2with each
87 : yuv-to-rgb-benchmark ( -- )
88 [ fake-data yuv>rgb ] with-destructors ;
90 MAIN: yuv-to-rgb-benchmark