3 C library
for fast
image conversion between yuv420p and rgb24.
5 This is
a simple library
for optimized
image conversion between YUV420p and rgb24.
6 It was
done mainly as an exercise to learn to use sse intrinsics, so there may still be room
for optimization.
8 For each conversion,
a standard
c optimized
function and
two sse
function (with aligned and unaligned
memory) are implemented.
9 The sse version requires only SSE2, which is
available on any reasonably recent CPU.
10 The library also supports the three different YUV (YCrCb to be correct)
color spaces that exist (see comments
in code), and others can be added simply.
12 There is
a simple test
program, that convert
a raw YUV file to rgb ppm
format, and measure computation
time.
13 Optionally, it also compares the
result and computation
time with the ffmpeg implementation (that uses MMX), and with the IPP functions.
15 To compile, simply
do :
19 cmake -DCMAKE_BUILD_TYPE=Release ..
22 The test program only support raw YUV files
for the YUV420
format, and ppm
for the RGB24 format.
23 To generate
a raw yuv file, you can use avconv:
25 avconv -
i example.jpg -
c:
v rawvideo -pix_fmt yuv420p example.yuv
27 To generate the rgb file, you can use the ImageMagick convert program:
29 convert example.jpg example.ppm
31 Then,
for YUV420 to RGB24 conversion, use the test program like that:
33 ./test_yuv_rgb yuv2rgb
image.yuv 4096 2160
image
35 The second and third parameters are
image width and
height (that are needed because not
available in the raw YUV file), and fourth parameter is the
output filename template (several
output files will be generated, named
for example output_sse.ppm, output_av.ppm, etc.)
37 Similarly,
for RGB24 to YUV420 conversion:
41 On my computer, the test program on
a 4K
image give the following
for yuv2rgb:
43 Time will be measured
in each configuration
for 100
iterations...
44 Processing
time (std) : 2.630193 sec
45 Processing time (sse2_unaligned) : 0.704394 sec
46 Processing time (ffmpeg_unaligned) : 1.221432 sec
47 Processing time (ipp_unaligned) : 0.636274 sec
48 Processing time (sse2_aligned) : 0.606648 sec
49 Processing time (ffmpeg_aligned) : 1.227100 sec
50 Processing time (ipp_aligned) : 0.636951 sec
54 Time will be measured
in each configuration for 100
iterations...
55 Processing time (std) : 2.588675 sec
56 Processing time (sse2_unaligned) : 0.676625 sec
57 Processing time (ffmpeg_unaligned) : 3.385816 sec
58 Processing time (ipp_unaligned) : 0.593890 sec
59 Processing time (sse2_aligned) : 0.640630 sec
60 Processing time (ffmpeg_aligned) : 3.397952 sec
61 Processing time (ipp_aligned) : 0.579043 sec
63 configuration : gcc 4.9.2, swscale 3.0.0, IPP 9.0.1, intel i7-5500U