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
|
//Ceci est une fonction qui permet de remettre une valeur correspondante dans tous les cas au RGB.
//
// YUV to RGB conversion:
//
unsigned char clip(int value)
{ if (value <= 0)
return 0;
else if (value >= 255)
return 255;
else
return (unsigned char) (value);
}
//Première méthode d'encodage je pense que le problème se situe ici
//
void yuv2rgb_buf(unsigned char *src, int width, int height, unsigned char *dst)
{
int u_offset = width * height;
int v_offset = u_offset + width * height / 4; // TODO: handle rows not divisible by 2.
int uv_width = width / 2;
int i;
for ( i = 0; i < ( width * height ); i++ )
{
int px = i % width;
int py = i / width;
int uv_x = px / 2; // x in u/v planes
int uv_y = py / 2; // y in u/v planes
unsigned char y, u, v;
unsigned char r, g, b;
y = src[i];
u = src[u_offset + uv_width * uv_y + uv_x];
v = src[v_offset + uv_width * uv_y + uv_x];
yuv2rgb(y, u, v, &r, &g, &b);
*dst++ = b;
*dst++ = g;
*dst++ = r;
}
}
// Le coeur de l'encodage
//
/**
* Converts a yuv into RGV, using only integer (no double).
*/
inline void yuv2rgb(unsigned char y, unsigned char u, unsigned char v, unsigned char *pr, unsigned char *pg, unsigned char *pb)
{
int C = 298 * (y - 16);
int D = u - 128;
int E = v - 128;
int r = ( C + 409 * E + 128) >> 8;
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
int g = ( C - 100 * D - 208 * E + 128) >> 8;
if (g < 0)
g = 0;
else if (g > 255)
g = 255;
int b = ( C + 516 * D + 128) >> 8;
if (b < 0)
b = 0;
else if (b > 255)
b = 255;
*pr = r;
*pg = g;
*pb = b;
} |
Partager