diff options
author | Matt Ebb <matt@mke3.net> | 2010-03-31 03:32:16 +0400 |
---|---|---|
committer | Matt Ebb <matt@mke3.net> | 2010-03-31 03:32:16 +0400 |
commit | 05c2906b769a3a56939bd870589dab637b73d63d (patch) | |
tree | b3de8d412091615f9ea823894b1b4ea0af0042f7 /source | |
parent | c9f81c87b88574fa803050040a6b8ddf398968aa (diff) |
Patch from Xavier Thomas:
YCbCr conversion function according to ITU-R BT.601/709 and JFIF
Clarifies color space usage in rgb->ycc conversion, doesn't change existing results.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_math_color.h | 9 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_color.c | 51 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c | 4 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c | 4 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c | 6 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_util.c | 4 |
6 files changed, 57 insertions, 21 deletions
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h index 8c84df9c245..72724c1c0f7 100644 --- a/source/blender/blenlib/BLI_math_color.h +++ b/source/blender/blenlib/BLI_math_color.h @@ -41,20 +41,25 @@ extern "C" { #define BLI_PR_NONE 0 #define BLI_PR_SRGB 1 #define BLI_PR_REC709 2 + +/* YCbCr */ +#define BLI_YCC_ITU_BT601 0 +#define BLI_YCC_ITU_BT709 1 +#define BLI_YCC_JFIF_0_255 2 /******************* Conversion to RGB ********************/ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b); void hex_to_rgb(char *hexcol, float *r, float *g, float *b); void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb); -void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb); +void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace); void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace); void cpack_to_rgb(unsigned int col, float *r, float *g, float *b); /***************** Conversion from RGB ********************/ void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv); -void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr); +void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace); void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv); unsigned int rgb_to_cpack(float r, float g, float b); unsigned int hsv_to_cpack(float h, float s, float v); diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c index a1bb2754d95..6aa85d14084 100644 --- a/source/blender/blenlib/intern/math_color.c +++ b/source/blender/blenlib/intern/math_color.c @@ -109,7 +109,9 @@ void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb) *lb=b; } -void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr) +/* The RGB inputs are supposed gamma corrected and in the range 0 - 1.0f */ +/* Output YCC have a range of 16-235 and 16-240 exepect with JFIF_0_255 where the range is 0-255 */ +void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace) { float sr,sg, sb; float y, cr, cb; @@ -118,24 +120,53 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr) sg=255.0f*g; sb=255.0f*b; - - y=(0.257f*sr)+(0.504f*sg)+(0.098f*sb)+16.0f; - cb=(-0.148f*sr)-(0.291f*sg)+(0.439f*sb)+128.0f; - cr=(0.439f*sr)-(0.368f*sg)-(0.071f*sb)+128.0f; + switch (colorspace) { + case BLI_YCC_ITU_BT601 : + y=(0.257f*sr)+(0.504f*sg)+(0.098f*sb)+16.0f; + cb=(-0.148f*sr)-(0.291f*sg)+(0.439f*sb)+128.0f; + cr=(0.439f*sr)-(0.368f*sg)-(0.071f*sb)+128.0f; + break; + case BLI_YCC_ITU_BT709 : + y=(0.183f*sr)+(0.614f*sg)+(0.062f*sb)+16.0f; + cb=(-0.101f*sr)-(0.338f*sg)+(0.439f*sb)+128.0f; + cr=(0.439f*sr)-(0.399f*sg)-(0.040f*sb)+128.0f; + break; + case BLI_YCC_JFIF_0_255 : + y=(0.299f*sr)+(0.587f*sg)+(0.114f*sb)+16.0f; + cb=(-0.16874f*sr)-(0.33126f*sg)+(0.5f*sb)+128.0f; + cr=(0.5f*sr)-(0.41869f*sg)-(0.08131f*sb)+128.0f; + break; + } *ly=y; *lcb=cb; *lcr=cr; } -void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb) + +/* YCC input have a range of 16-235 and 16-240 exepect with JFIF_0_255 where the range is 0-255 */ +/* RGB outputs are in the range 0 - 1.0f */ +void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace) { float r,g,b; - r=1.164f*(y-16.0f)+1.596f*(cr-128.0f); - g=1.164f*(y-16.0f)-0.813f*(cr-128.0f)-0.392f*(cb-128.0f); - b=1.164f*(y-16.0f)+2.017f*(cb-128.0f); - + switch (colorspace) { + case BLI_YCC_ITU_BT601 : + r=1.164f*(y-16.0f)+1.596f*(cr-128.0f); + g=1.164f*(y-16.0f)-0.813f*(cr-128.0f)-0.392f*(cb-128.0f); + b=1.164f*(y-16.0f)+2.017f*(cb-128.0f); + break; + case BLI_YCC_ITU_BT709 : + r=1.164f*(y-16.0f)+1.793f*(cr-128.0f); + g=1.164f*(y-16.0f)-0.534f*(cr-128.0f)-0.213f*(cb-128.0f); + b=1.164f*(y-16.0f)+2.115f*(cb-128.0f); + break; + case BLI_YCC_JFIF_0_255 : + r=y+1.402f*cr - 179.456f; + g=y-0.34414f*cb - 0.71414f*cr + 135.45984f; + b=y+1.772f*cb - 226.816f; + break; + } *lr=r/255.0f; *lg=g/255.0f; *lb=b/255.0f; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c index b1fe0a2897b..ca7c19cc778 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c @@ -45,7 +45,7 @@ static bNodeSocketType cmp_node_channel_matte_out[]={ static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in) { /*normalize to the range 0.0 to 1.0) */ - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[0]=(out[0])/255.0; out[1]=(out[1])/255.0; out[2]=(out[2])/255.0; @@ -58,7 +58,7 @@ static void do_normalized_ycca_to_rgba2(bNode *node, float *out, float *in) in[0]=in[0]*255.0; in[1]=in[1]*255.0; in[2]=in[2]*255.0; - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c index a8d7ff6b029..b081880b87b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c @@ -45,7 +45,7 @@ static bNodeSocketType cmp_node_chroma_out[]={ static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in) { /*normalize to the range -1.0 to 1.0) */ - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[0]=((out[0])-16)/255.0; out[1]=((out[1])-128)/255.0; out[2]=((out[2])-128)/255.0; @@ -58,7 +58,7 @@ static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in) in[0]=(in[0]*255.0)+16; in[1]=(in[1]*255.0)+128; in[2]=(in[2]*255.0)+128; - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c index e42fafe58e5..7b3dfccab50 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c @@ -47,7 +47,7 @@ static void do_sepycca(bNode *node, float *out, float *in) { float y, cb, cr; - rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr); + rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); /*divided by 255 to normalize for viewing in */ out[0]= y/255.0; @@ -62,7 +62,7 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in, if(in[0]->data==NULL) { float y, cb, cr; - rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr); + rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); /*divided by 255 to normalize for viewing in */ out[0]->vec[0] = y/255.0; @@ -136,7 +136,7 @@ static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float cb=in2[0]*255; cr=in3[0]*255; - ycc_to_rgb(y,cb,cr, &r, &g, &b); + ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_ITU_BT601); out[0] = r; out[1] = g; diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c index 6e53e8bb968..336694a4788 100644 --- a/source/blender/nodes/intern/CMP_util.c +++ b/source/blender/nodes/intern/CMP_util.c @@ -671,7 +671,7 @@ void do_rgba_to_hsva(bNode *node, float *out, float *in) void do_rgba_to_ycca(bNode *node, float *out, float *in) { - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } @@ -689,7 +689,7 @@ void do_hsva_to_rgba(bNode *node, float *out, float *in) void do_ycca_to_rgba(bNode *node, float *out, float *in) { - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } |