1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/******************************************************************************
* recordMyDesktop - rmd_yuv_utils.c *
*******************************************************************************
* *
* Copyright (C) 2006,2007,2008 John Varouhakis *
* Copyright (C) 2008 Luca Bonavita *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
* *
* *
* *
* For further information contact me at johnvarouhakis@gmail.com *
******************************************************************************/
#include "config.h"
#include "rmd_yuv_utils.h"
// Keep these global (for performance reasons I assume).
unsigned char Yr[256], Yg[256], Yb[256],
Ur[256], Ug[256], UbVr[256],
Vg[256], Vb[256];
void MakeMatrices (void) {
int i;
/* assuming 8-bit precision */
float Yscale = 219.0, Yoffset = 16.0;
float Cscale = 224.0, Coffset = 128.0;
float RGBscale = 255.0;
float r, g, b;
float yr, yg, yb;
float ur, ug, ub;
float vg, vb; /* vr intentionally missing */
/* as for ITU-R BT-601-6 specifications: */
r = 0.299;
b = 0.114;
g = 1.0 - r - b;
/* as a note, here are the coefficients
as for ITU-R BT-709 specifications:
r=0.2126; b=0.0722; g=1.0-r-b; */
yr = r * Yscale / RGBscale;
yg = g * Yscale / RGBscale;
yb = b * Yscale / RGBscale;
ur = ( -0.5 * r / ( 1 - b ) ) * Cscale / RGBscale;
ug = ( -0.5 * g / ( 1 - b ) ) * Cscale / RGBscale;
ub = ( 0.5 * Cscale / RGBscale);
/* vr = ub so UbVr = ub*i = vr*i */
vg = ( -0.5 * g / ( 1 - r ) ) * Cscale / RGBscale;
vb = ( -0.5 * b / ( 1 - r ) ) * Cscale / RGBscale;
for( i = 0 ; i < 256 ; i++ ) {
Yr[i] = (unsigned char) roundf( Yoffset + yr * i );
Yg[i] = (unsigned char) roundf( yg * i );
Yb[i] = (unsigned char) roundf( yb * i );
Ur[i] = (unsigned char) roundf( Coffset + ur * i );
Ug[i] = (unsigned char) roundf( ug * i );
UbVr[i] = (unsigned char) roundf( ub * i );
Vg[i] = (unsigned char) roundf( vg * i );
Vb[i] = (unsigned char) roundf( Coffset + vb * i );
}
}
|