#include "drv_types.h" #include "hdmi_dbg.h" #include "hdmi_hw.h" #include "hdmi_notice.h" #include "hdmi_xvycc.h" #include #ifdef SUPPORT_XVYCC void hdmi_handler_xvycc(void) { VIP_xvYccData XVYccData; UINT8 GBG_Profile; UINT8 GBD_Color_Space = 0; UINT8 GBD_Color_Precision; UINT8 Format_Flag; UINT32 ulGBD_data[8]; UINT8 *pubGBD_data; ulGBD_data[0] = HDMI_RegisterRead(HDMIRX_0224_DW_0224); //224 ulGBD_data[1] = HDMI_RegisterRead(HDMIRX_GBD_data_31_0_); //228 ulGBD_data[2] = HDMI_RegisterRead(HDMIRX_GBD_data_63_32_); ulGBD_data[3] = HDMI_RegisterRead(HDMIRX_GBD_data_95_64_); ulGBD_data[4] = HDMI_RegisterRead(HDMIRX_GBD_data_127_96_); ulGBD_data[5] = HDMI_RegisterRead(HDMIRX_GBD_data_159_128_); ulGBD_data[6] = HDMI_RegisterRead(HDMIRX_GBD_data_191_160_); ulGBD_data[7] = HDMI_RegisterRead(HDMIRX_GBD_data_223_192_); pubGBD_data = (UINT8*)(&ulGBD_data[0]); GBG_Profile = HDMI_RegisterRead(HDMIRX_GBD_profile_2_0_); switch (GBG_Profile) { case 0: hdmidbg(">>xvYCC Profile=0(P0)\n"); GBD_Color_Space = pubGBD_data[3] & 0x07;//0xbe0e0226[2:0] GBD_Color_Precision = (pubGBD_data[3] & 0x18) >> 3; //0xbe0e0226[4:3] Format_Flag = (pubGBD_data[3] & 0x80) >> 7; //0xbe0e0226[7] if (Format_Flag == 0) { XVYccData.ucFormat = VERTICES; hdmidbg(">>xvYCC Format_Flag=vertices/facets.ucFormat=%d\n", XVYccData.ucFormat); switch (GBD_Color_Precision) { case 0: // 8bits XVYccData.ucGBD_Color_Precision = 8; //hdmidbg(">>xvYCC GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); //{0xbe0e022c[0],0xbe0e022b[0],0,0xbe0e022a[1:0],0xbe0e0229[2:0]} XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07); XVYccData.Vertices.usBlack_MAP_Cb = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0] XVYccData.Vertices.usBlack_MAP_Cr = ((UINT16) pubGBD_data[11]) & 0xff; // 0xbe0e022e[7:0] XVYccData.Vertices.usRed_MAP_Y = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0] XVYccData.Vertices.usRed_MAP_Cb = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0] XVYccData.Vertices.usRed_MAP_Cr = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0] XVYccData.Vertices.usGreen_MAP_Y = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0] XVYccData.Vertices.usGreen_MAP_Cb = ((UINT16) pubGBD_data[16]) & 0xff; // 0xbe0e0233[7:0] XVYccData.Vertices.usGreen_MAP_Cr = ((UINT16) pubGBD_data[17]) & 0xff; // 0xbe0e0234[7:0] XVYccData.Vertices.usBlue_MAP_Y = ((UINT16) pubGBD_data[18]) & 0xff; // 0xbe0e0235[7:0] XVYccData.Vertices.usBlue_MAP_Cb = ((UINT16) pubGBD_data[19]) & 0xff; // 0xbe0e0236[7:0] XVYccData.Vertices.usBlue_MAP_Cr = ((UINT16) pubGBD_data[20]) & 0xff; // 0xbe0e0237[7:0] break; case 1: // 10bits XVYccData.ucGBD_Color_Precision = 10; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 9) | ((((UINT16) pubGBD_data[8]) & 0x01) << 8) | ((((UINT16) pubGBD_data[7]) & 0x03) << 5) | ((((UINT16) pubGBD_data[6]) & 0x07) << 2) | ((((UINT16) pubGBD_data[10]) & 0xc0) >> 6); XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[10]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4); XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[11]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[12]) & 0xfc) >> 2); XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[12]) & 0x03) << 8) | (((UINT16) pubGBD_data[13]) & 0xff); XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[14]) & 0xff) << 2) | ((((UINT16) pubGBD_data[15]) & 0xc0) >> 6); XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[15]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[16]) & 0xf0) >> 4); XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[16]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[17]) & 0xfc) >> 2); XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[17]) & 0x03) << 8) | (((UINT16) pubGBD_data[18]) & 0xff); XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[19]) & 0xff) << 2) | ((((UINT16) pubGBD_data[20]) & 0xc0) >> 2); XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[20]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[21]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[21]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[22]) & 0xfc) >> 2); XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[22]) & 0x03) << 8) | (((UINT16) pubGBD_data[23]) & 0xff); break; case 2: // 12bits XVYccData.ucGBD_Color_Precision = 12; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 11) | ((((UINT16) pubGBD_data[8]) & 0x01) << 10) | ((((UINT16) pubGBD_data[7]) & 0x03) << 7) | ((((UINT16) pubGBD_data[6]) & 0x07) << 4) | ((((UINT16) pubGBD_data[10]) & 0xf0) >> 4); XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[10]) & 0x0f) << 8) | (((UINT16) pubGBD_data[11]) & 0xff); XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[12]) & 0xff) << 4) | ((((UINT16) pubGBD_data[13]) & 0xf0) >> 4); XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[13]) & 0x0f) << 8) | (((UINT16) pubGBD_data[14]) & 0xff); XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[15]) & 0xff) << 4) | ((((UINT16) pubGBD_data[16]) & 0xf0) >> 4); XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[16]) & 0x0f) << 8) | (((UINT16) pubGBD_data[17]) & 0xff); XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[18]) & 0xff) << 4) | ((((UINT16) pubGBD_data[19]) & 0xf0) >> 4); XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[19]) & 0x0f) << 8) | (((UINT16) pubGBD_data[20]) & 0xff); XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[21]) & 0xff) << 4) | ((((UINT16) pubGBD_data[22]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[22]) & 0x0f) << 8) | (((UINT16) pubGBD_data[23]) & 0xff); XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[24]) & 0xff) << 4) | ((((UINT16) pubGBD_data[25]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[25]) & 0x0f) << 8) | (((UINT16) pubGBD_data[26]) & 0xff); break; default: // Unkown hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= Unknow\n"); break; } hdmidbg(">>xvYCC GBD Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); hdmidbg(">>usBlack_MAP_Y=0x%x. usBlack_MAP_Cb=0x%x. usBlack_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlack_MAP_Y, XVYccData.Vertices.usBlack_MAP_Cb, XVYccData.Vertices.usBlack_MAP_Cr); hdmidbg(">>usRed_MAP_Y=0x%x. usRed_MAP_Cb=0x%x. usRed_MAP_Cr=0x%x\n", XVYccData.Vertices.usRed_MAP_Y, XVYccData.Vertices.usRed_MAP_Cb, XVYccData.Vertices.usRed_MAP_Cr); hdmidbg(">>usGreen_MAP_Y=0x%x. usGreen_MAP_Cb=0x%x. usGreen_MAP_Cr=0x%x\n", XVYccData.Vertices.usGreen_MAP_Y, XVYccData.Vertices.usGreen_MAP_Cb, XVYccData.Vertices.usGreen_MAP_Cr); hdmidbg(">>usBlue_MAP_Y=0x%x. usBlue_MAP_Cb=0x%x. usBlue_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlue_MAP_Y, XVYccData.Vertices.usBlue_MAP_Cb, XVYccData.Vertices.usBlue_MAP_Cr); } else if (Format_Flag == 1) { XVYccData.ucFormat = GAMUT_RANGE; hdmidbg(">>xvYCC Format_Flag=gamut range.ucFormat=%d\n", XVYccData.ucFormat); switch (GBD_Color_Precision) { case 0: // 8bits XVYccData.ucGBD_Color_Precision = 8; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((UINT16) pubGBD_data[4]) & 0xff;// {0xbe0e0227[7:0]} XVYccData.GamutRange.usMax_Red_data = ((UINT16) pubGBD_data[5]) & 0xff;// {0xbe0e0228[7:0]} XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07); XVYccData.GamutRange.usMax_Green_data = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0] XVYccData.GamutRange.usMin_Blue_data = ((UINT16) pubGBD_data[11]) & 0xff; // 0xbe0e022e[7:0] XVYccData.GamutRange.usMax_Blue_data = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0] break; case 1: // 10bits XVYccData.ucGBD_Color_Precision = 10; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[4]) & 0xff) << 2) | ((((UINT16) pubGBD_data[5]) & 0xc0) >> 6); XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[5]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[9]) & 0x01) << 3) | ((((UINT16) pubGBD_data[8]) & 0x01) << 2) | ((((UINT16) pubGBD_data[7]) & 0x2) >> 1); XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[7]) & 0x01) << 9) | ((((UINT16) pubGBD_data[6]) & 0x07) << 6) | ((((UINT16) pubGBD_data[10]) & 0xf3) >> 2); XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[10]) & 0x03) << 8) | (((UINT16) pubGBD_data[11]) & 0xff); XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[12]) & 0xff) << 2) | ((((UINT16) pubGBD_data[13]) & 0xc0) >> 6); XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[13]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4); break; case 2: // 12bits XVYccData.ucGBD_Color_Precision = 12; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[4]) & 0xff) << 4) | ((((UINT16) pubGBD_data[5]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[5]) & 0x0f) << 8) | ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07); XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff); XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff); break; default: // Unkown hdmidbg(">>xvYCC GBD_Color_Precision= Unknow\n"); break; } hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); hdmidbg(">>usMin_Red_data=0x%x. usMax_Red_data=0x%x\n", XVYccData.GamutRange.usMin_Red_data, XVYccData.GamutRange.usMax_Red_data); hdmidbg(">>usMin_Green_data=0x%x. usMax_Green_data=0x%x\n", XVYccData.GamutRange.usMin_Green_data, XVYccData.GamutRange.usMax_Green_data); hdmidbg(">>usMin_Blue_data=0x%x. usMax_Blue_data=0x%x\n", XVYccData.GamutRange.usMin_Blue_data, XVYccData.GamutRange.usMax_Blue_data); } else { hdmidbg(">>xvYCC Error: Format_Flag=Unkown\n"); } break; case 1: case 2: case 3: hdmidbg(">>xvYCC Profile=%d(P%d)\n", GBG_Profile, GBG_Profile); GBD_Color_Space = pubGBD_data[6] & 0x07;//0xbe0e0229[2:0] GBD_Color_Precision = (pubGBD_data[7] & 0x18) >> 3; //0xbe0e022a[4:3] Format_Flag = pubGBD_data[9] & 0x01;//0xbe0e022c[0] if (Format_Flag == 0) { XVYccData.ucFormat = VERTICES; hdmidbg(">>xvYCC Format_Flag=vertices/facets.ucFormat=%d\n", XVYccData.ucFormat); switch (GBD_Color_Precision) { case 0: // 8bits XVYccData.ucGBD_Color_Precision = 8; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.Vertices.usBlack_MAP_Y = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0] XVYccData.Vertices.usBlack_MAP_Cb = ((UINT16) pubGBD_data[11]) & 0xff ; // 0xbe0e022e[7:0] XVYccData.Vertices.usBlack_MAP_Cr = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0] XVYccData.Vertices.usRed_MAP_Y = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0] XVYccData.Vertices.usRed_MAP_Cb = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0] XVYccData.Vertices.usRed_MAP_Cr = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0] XVYccData.Vertices.usGreen_MAP_Y = ((UINT16) pubGBD_data[16]) & 0xff; // 0xbe0e0233[7:0] XVYccData.Vertices.usGreen_MAP_Cb = ((UINT16) pubGBD_data[17]) & 0xff; // 0xbe0e0234[7:0] XVYccData.Vertices.usGreen_MAP_Cr = ((UINT16) pubGBD_data[18]) & 0xff; // 0xbe0e0235[7:0] XVYccData.Vertices.usBlue_MAP_Y = ((UINT16) pubGBD_data[19]) & 0xff; // 0xbe0e0236[7:0] XVYccData.Vertices.usBlue_MAP_Cb = ((UINT16) pubGBD_data[20]) & 0xff; // 0xbe0e0237[7:0] XVYccData.Vertices.usBlue_MAP_Cr = ((UINT16) pubGBD_data[21]) & 0xff; // 0xbe0e0238[7:0] break; case 1: // 10bits XVYccData.ucGBD_Color_Precision = 10; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[10]) & 0xff) << 2) | ((((UINT16) pubGBD_data[11]) & 0xc0) >> 6); XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[11]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[12]) & 0xf0) >> 4); XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[12]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[13]) & 0xfc) >> 2); XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[13]) & 0x03) << 8) | (((UINT16) pubGBD_data[14]) & 0xff); XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[15]) & 0xff) << 2) | ((((UINT16) pubGBD_data[16]) & 0xc0) >> 6);; XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[16]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4); XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[17]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[18]) & 0xfc) >> 2); XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[18]) & 0x03) << 8) | (((UINT16) pubGBD_data[19]) & 0xff); XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[20]) & 0xff) << 2) | ((((UINT16) pubGBD_data[21]) & 0xc0) >> 6); XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[21]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[22]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[22]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[23]) & 0xfc) >> 2); XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[23]) & 0x03) << 8) | (((UINT16) pubGBD_data[24]) & 0xff); break; case 2: // 12bits XVYccData.ucGBD_Color_Precision = 12; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4); XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff); XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4); XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff); XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[16]) & 0xff) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4); XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[17]) & 0x0f) << 8) | (((UINT16) pubGBD_data[18]) & 0xff); XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[19]) & 0xff) << 4) | ((((UINT16) pubGBD_data[20]) & 0xf0) >> 4); XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[20]) & 0x0f) << 8) | (((UINT16) pubGBD_data[21]) & 0xff); XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[22]) & 0xff) << 4) | ((((UINT16) pubGBD_data[23]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[23]) & 0x0f) << 8) | (((UINT16) pubGBD_data[24]) & 0xff); XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[25]) & 0xff) << 4) | ((((UINT16) pubGBD_data[26]) & 0xf0) >> 4); XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[26]) & 0x0f) << 8) | (((UINT16) pubGBD_data[27]) & 0xff); break; default: // Unkown hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= Unknow\n"); break; } hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); hdmidbg(">>usBlack_MAP_Y=0x%x. usBlack_MAP_Cb=0x%x. usBlack_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlack_MAP_Y, XVYccData.Vertices.usBlack_MAP_Cb, XVYccData.Vertices.usBlack_MAP_Cr); hdmidbg(">>usRed_MAP_Y=0x%x. usRed_MAP_Cb=0x%x. usRed_MAP_Cr=0x%x\n", XVYccData.Vertices.usRed_MAP_Y, XVYccData.Vertices.usRed_MAP_Cb, XVYccData.Vertices.usRed_MAP_Cr); hdmidbg(">>usGreen_MAP_Y=0x%x. usGreen_MAP_Cb=0x%x. usGreen_MAP_Cr=0x%x\n", XVYccData.Vertices.usGreen_MAP_Y, XVYccData.Vertices.usGreen_MAP_Cb, XVYccData.Vertices.usGreen_MAP_Cr); hdmidbg(">>usBlue_MAP_Y=0x%x. usBlue_MAP_Cb=0x%x. usBlue_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlue_MAP_Y, XVYccData.Vertices.usBlue_MAP_Cb, XVYccData.Vertices.usBlue_MAP_Cr); } else if (Format_Flag == 1) { XVYccData.ucFormat = GAMUT_RANGE; hdmidbg(">>xvYCC Format_Flag=gamut range.ucFormat=%d\n", XVYccData.ucFormat); switch (GBD_Color_Precision) { case 0: // 8bits XVYccData.ucGBD_Color_Precision = 8; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((UINT16) pubGBD_data[10]) & 0xff;// {0xbe0e022d[7:0]} XVYccData.GamutRange.usMax_Red_data = ((UINT16) pubGBD_data[11]) & 0xff;// {0xbe0e022e[7:0]} XVYccData.GamutRange.usMin_Green_data = ((UINT16) pubGBD_data[12]) & 0xff;// {0xbe0e022f[7:0]} XVYccData.GamutRange.usMax_Green_data = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0] XVYccData.GamutRange.usMin_Blue_data = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0] XVYccData.GamutRange.usMax_Blue_data = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0] break; case 1: // 10bits XVYccData.ucGBD_Color_Precision = 10; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 2) | ((((UINT16) pubGBD_data[11]) & 0xfc) >> 2); XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[11]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[12]) & 0xf0) >> 4); XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[12]) & 0x0f) << 8) | (((UINT16) pubGBD_data[13]) & 0xff); XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[13]) & 0x03) << 8) | (((UINT16) pubGBD_data[14]) & 0xff); XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[15]) & 0xff) << 2) | ((((UINT16) pubGBD_data[16]) & 0xfc) >> 2); XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[16]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4); break; case 2: // 12bits XVYccData.ucGBD_Color_Precision = 12; //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff); XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff); XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[16]) & 0xff) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4); XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[17]) & 0x0f) << 8) | (((UINT16) pubGBD_data[18]) & 0xff); break; default: // Unkown hdmidbg(">>xvYCC GBD_Color_Precision= Unknow\n"); break; } hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision); hdmidbg(">>usMin_Red_data=0x%x. usMax_Red_data=0x%x\n", XVYccData.GamutRange.usMin_Red_data, XVYccData.GamutRange.usMax_Red_data); hdmidbg(">>usMin_Green_data=0x%x. usMax_Green_data=0x%x\n", XVYccData.GamutRange.usMin_Green_data, XVYccData.GamutRange.usMax_Green_data); hdmidbg(">>usMin_Blue_data=0x%x. usMax_Blue_data=0x%x\n", XVYccData.GamutRange.usMin_Blue_data, XVYccData.GamutRange.usMax_Blue_data); } else { hdmidbg("xvYCC Error: Format_Flag=Unkown\n"); } break; case 4: case 5: case 6: case 7: hdmidbg("Not defined Profile=%d\n", GBG_Profile); break; } switch (GBD_Color_Space) { case xvYCC_RGB: hdmidbg("xvYCC_RGB\n"); XVYccData.ucGBD_Color_Space = xvYCC_RGB; break; case xvYCC601: hdmidbg("xvYCC601\n"); XVYccData.ucGBD_Color_Space = xvYCC601; break; case xvYCC709: hdmidbg("xvYCC709\n"); XVYccData.ucGBD_Color_Space = xvYCC709; break; case XYZ: hdmidbg("XYZ\n"); XVYccData.ucGBD_Color_Space = XYZ; break; default: hdmidbg("xvYCC_UNKNOWN_METRY\n"); XVYccData.ucGBD_Color_Space = xvYCC_UNKNOWN_METRY; break; } } #endif