xref: /utopia/UTPA2-700.0.x/modules/xc/drv/ace/MsAce.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi #define _MSACE_C_
79*53ee8cc1Swenshuai.xi 
80*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
81*53ee8cc1Swenshuai.xi #include <linux/string.h>
82*53ee8cc1Swenshuai.xi #else
83*53ee8cc1Swenshuai.xi #include <string.h>
84*53ee8cc1Swenshuai.xi #endif
85*53ee8cc1Swenshuai.xi #include "apiXC_Ace.h"
86*53ee8cc1Swenshuai.xi #include "mhal_ace.h"
87*53ee8cc1Swenshuai.xi #include "ace_hwreg_utility2.h"
88*53ee8cc1Swenshuai.xi #include "MsAce_LIB.h"
89*53ee8cc1Swenshuai.xi #include "drvACE.h"
90*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
91*53ee8cc1Swenshuai.xi #include <sys/ioctl.h>
92*53ee8cc1Swenshuai.xi #include <unistd.h>
93*53ee8cc1Swenshuai.xi #include <fcntl.h> // O_RDWR
94*53ee8cc1Swenshuai.xi #endif
95*53ee8cc1Swenshuai.xi #include "../xc/mdrv_xc_io.h"
96*53ee8cc1Swenshuai.xi #include "UFO.h"
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
99*53ee8cc1Swenshuai.xi // msACE version history:
100*53ee8cc1Swenshuai.xi // v100(2008-04-16): Add version infromation
101*53ee8cc1Swenshuai.xi //       Change internal contrast/RGB gain variable to WORD(12bits)
102*53ee8cc1Swenshuai.xi //       Add new function for adjust contrast/RGB gain
103*53ee8cc1Swenshuai.xi //          void msAdjustVideoContrast_10Bits( BOOL bScalerWin, WORD wContrast );
104*53ee8cc1Swenshuai.xi //          void msAdjustVideoRGB_10Bits( BOOL bScalerWin, WORD ucRCon, WORD ucGCon, WORD ucBCon);
105*53ee8cc1Swenshuai.xi //          void msAdjustPCContrast_10Bits( BOOL bScalerWin, WORD wContrast );
106*53ee8cc1Swenshuai.xi //          void msAdjustPCRGB_10Bits( BOOL bScalerWin, WORD wRed, WORD wGreen, WORD wBlue );
107*53ee8cc1Swenshuai.xi // v101(2008-04-16): Modify msACE_GetVersion()
108*53ee8cc1Swenshuai.xi // v102(2008-09-04):
109*53ee8cc1Swenshuai.xi //  1.Fine tune color correction control.
110*53ee8cc1Swenshuai.xi //  2.Fine tune sRGB control
111*53ee8cc1Swenshuai.xi // v103(2008-09-08):
112*53ee8cc1Swenshuai.xi //  1.Add new function for get more infromation from ACE library
113*53ee8cc1Swenshuai.xi //  2.Seperate chip relative code to another file.
114*53ee8cc1Swenshuai.xi // v104(2008-09-17):
115*53ee8cc1Swenshuai.xi //  1.Use WriteByteMask to access REG_ADDR_CM_CTL_MAIN
116*53ee8cc1Swenshuai.xi //  2.Fix msACE_GetInfo() uncall warning.
117*53ee8cc1Swenshuai.xi // v105(2009-07-14):
118*53ee8cc1Swenshuai.xi //  1.Fine tune the define in LIB_Group.
119*53ee8cc1Swenshuai.xi //  2.Add new group for external chip.
120*53ee8cc1Swenshuai.xi // v106(2009-10-28):
121*53ee8cc1Swenshuai.xi //  1.Add C51 version info.
122*53ee8cc1Swenshuai.xi //  2.Add debug-info-YUVtoRGB Matrix selection
123*53ee8cc1Swenshuai.xi //  3.Add debug function to get Matrix
124*53ee8cc1Swenshuai.xi //  4.Add option for using internal sin/cos function.
125*53ee8cc1Swenshuai.xi //  5.Change some function interface to static.
126*53ee8cc1Swenshuai.xi // v107(2010-01-26):
127*53ee8cc1Swenshuai.xi //  1.Refine Sine&Cosine function: Using lookup table.
128*53ee8cc1Swenshuai.xi // v108(2010-04-13):
129*53ee8cc1Swenshuai.xi //  1.Enable Sine&Cosine function using lookup table.
130*53ee8cc1Swenshuai.xi //  2.Add 2 function: msACE_SetColorMatrixControl(), msACE_SetRBChannelRange()
131*53ee8cc1Swenshuai.xi #define MSACE_VERSION   (108)
132*53ee8cc1Swenshuai.xi //----------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #if defined(__C51__)
135*53ee8cc1Swenshuai.xi #define STR_C51_VERSION(x) "C51:"##  #x
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #define C51_VERSION(x) STR_C51_VERSION(x)
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi char* ace_c51version = C51_VERSION(__C51__);
140*53ee8cc1Swenshuai.xi #endif
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define MAIN_WINDOW     0
143*53ee8cc1Swenshuai.xi #define SUB_WINDOW      1
144*53ee8cc1Swenshuai.xi #define CONTRAST_MIN_VALUE 0x400
145*53ee8cc1Swenshuai.xi #define CONTRAST_MAX_VALUE 0x7FF
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi typedef short Typ3x3Array[3][3];
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #if 0
150*53ee8cc1Swenshuai.xi typedef struct
151*53ee8cc1Swenshuai.xi {
152*53ee8cc1Swenshuai.xi     WORD wContrast;
153*53ee8cc1Swenshuai.xi     WORD wRCon;
154*53ee8cc1Swenshuai.xi     WORD wGCon;
155*53ee8cc1Swenshuai.xi     WORD wBCon;
156*53ee8cc1Swenshuai.xi     BYTE ucSaturation;
157*53ee8cc1Swenshuai.xi     BYTE ucHue;
158*53ee8cc1Swenshuai.xi     short sContrastRGBMatrix[3][3];
159*53ee8cc1Swenshuai.xi     short sVideoSatHueMatrix[3][3];
160*53ee8cc1Swenshuai.xi     short* psColorCorrectionMatrix; // this variable must pointer to a array[3][3]
161*53ee8cc1Swenshuai.xi     short* psPCsRGBMatrix; // sRGB matrix for PC, this variable must pointer to a array[3][3]
162*53ee8cc1Swenshuai.xi     short* psYVUtoRGBMatrix; // this variable must pointer to a array[3][3]
163*53ee8cc1Swenshuai.xi     BYTE bForceYUVtoRGB : 1;
164*53ee8cc1Swenshuai.xi     BYTE ucYUVtoRGBMatrixSel : 2;
165*53ee8cc1Swenshuai.xi }StruAceInfo;
166*53ee8cc1Swenshuai.xi #endif
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi /// CFD OSD structure version
169*53ee8cc1Swenshuai.xi /// Version 0: Init structure
170*53ee8cc1Swenshuai.xi /// Version 1: Add backlight and hue/contrast/saturation valid flag
171*53ee8cc1Swenshuai.xi /// Version 2: Add color range and main/sub window.
172*53ee8cc1Swenshuai.xi /// Version 3: Add ultra black / white
173*53ee8cc1Swenshuai.xi /// Version 4: Add skip picture setting (hue/ contrast/ saturation)
174*53ee8cc1Swenshuai.xi /// Version 5: Add color correction matrix
175*53ee8cc1Swenshuai.xi #define ACE_OSD_CONTROL_VERSION 5
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi /// Update type
178*53ee8cc1Swenshuai.xi typedef enum
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi     /// Update all
181*53ee8cc1Swenshuai.xi     E_XC_CFD_UPDATE_TYPE_ALL,
182*53ee8cc1Swenshuai.xi     /// Update OSD only
183*53ee8cc1Swenshuai.xi     E_XC_CFD_UPDATE_TYPE_OSD_ONLY,
184*53ee8cc1Swenshuai.xi     /// Max
185*53ee8cc1Swenshuai.xi     E_XC_CFD_UPDATE_TYPE_MAX
186*53ee8cc1Swenshuai.xi } MS_XC_CFD_UPDATE_TYPE;
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi //controls from Panel OSD
189*53ee8cc1Swenshuai.xi typedef struct
190*53ee8cc1Swenshuai.xi {
191*53ee8cc1Swenshuai.xi     MS_U32 u32Version;   ///<Version of current structure. Please always set to "ACE_OSD_CONTROL_VERSION" as input
192*53ee8cc1Swenshuai.xi     MS_U16 u16Length;    ///<Length of this structure, u16Length=sizeof(ST_HAL_PQ_CFD_OSD_CONTROL)
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi     MS_U16 u16Hue;
195*53ee8cc1Swenshuai.xi     MS_U16 u16Saturation;
196*53ee8cc1Swenshuai.xi     MS_U16 u16Contrast;
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi     //default on , not in the document
199*53ee8cc1Swenshuai.xi     MS_U8  u8OSDUIEn;
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi     //Mode 0: update matrix by OSD and color format driver
202*53ee8cc1Swenshuai.xi     //Mode 1: only update matrix by OSD controls
203*53ee8cc1Swenshuai.xi     //for mode1 : the configures of matrix keep the same as the values by calling CFD last time
204*53ee8cc1Swenshuai.xi     MS_U8  u8OSDUIMode;
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi     ///
207*53ee8cc1Swenshuai.xi     MS_BOOL bHueValid;
208*53ee8cc1Swenshuai.xi     MS_BOOL bSaturationValid;
209*53ee8cc1Swenshuai.xi     MS_BOOL bContrastValid;
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi     MS_BOOL bBacklightValid;
212*53ee8cc1Swenshuai.xi     MS_U32 u32MinBacklight;
213*53ee8cc1Swenshuai.xi     MS_U32 u32MaxBacklight;
214*53ee8cc1Swenshuai.xi     MS_U32 u32Backlight;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     MS_U8 u8Win;
217*53ee8cc1Swenshuai.xi     MS_BOOL bColorRangeValid;
218*53ee8cc1Swenshuai.xi     MS_U8 u8ColorRange; // 0: Auto, 1: Full Range (0~255), 2: Limit Range (16~235)
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi     MS_BOOL bUltraBlackLevelValid;
221*53ee8cc1Swenshuai.xi     MS_U8 u8UltraBlackLevel;
222*53ee8cc1Swenshuai.xi     MS_BOOL bUltraWhiteLevelValid;
223*53ee8cc1Swenshuai.xi     MS_U8 u8UltraWhiteLevel;
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi     MS_BOOL bSkipPictureSettingValid;
226*53ee8cc1Swenshuai.xi     MS_BOOL bSkipPictureSetting;
227*53ee8cc1Swenshuai.xi 
228*53ee8cc1Swenshuai.xi     MS_BOOL bColorCorrectionValid;
229*53ee8cc1Swenshuai.xi     MS_S16 s16ColorCorrectionMatrix[32];
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi     MS_BOOL bYVUtoRGBMatrixValid;
232*53ee8cc1Swenshuai.xi     MS_S16 s16YVUtoRGBMatrix[32];
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi     MS_U16 u16R;
235*53ee8cc1Swenshuai.xi     MS_U16 u16G;
236*53ee8cc1Swenshuai.xi     MS_U16 u16B;
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi     MS_BOOL bR;
239*53ee8cc1Swenshuai.xi     MS_BOOL bG;
240*53ee8cc1Swenshuai.xi     MS_BOOL bB;
241*53ee8cc1Swenshuai.xi } ST_ACE_CFD_OSD_CONTROL;
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi typedef struct
244*53ee8cc1Swenshuai.xi {
245*53ee8cc1Swenshuai.xi     /// Structure version
246*53ee8cc1Swenshuai.xi     MS_U32 u32Version;
247*53ee8cc1Swenshuai.xi     /// Structure length
248*53ee8cc1Swenshuai.xi     MS_U16 u16Length;
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi     /// Window (main or sub window)
251*53ee8cc1Swenshuai.xi     MS_U8 u8Win;
252*53ee8cc1Swenshuai.xi     /// Input source, reference PQ_INPUT_SOURCE_TYPE in apxXC.h
253*53ee8cc1Swenshuai.xi     MS_U8 u8InputSource;
254*53ee8cc1Swenshuai.xi     /// Update type, reference MS_XC_CFD_UPDATE_TYPE
255*53ee8cc1Swenshuai.xi     MS_U8 u8UpdateType;
256*53ee8cc1Swenshuai.xi     /// RGB bypass
257*53ee8cc1Swenshuai.xi     MS_BOOL bIsRgbBypass;
258*53ee8cc1Swenshuai.xi     /// HD mode
259*53ee8cc1Swenshuai.xi     MS_BOOL bIsHdMode;
260*53ee8cc1Swenshuai.xi } ST_ACE_CFD_FIRE_CONTROL;
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX_KERNEL) && defined(CONFIG_MSTAR_XC_HDR_SUPPORT))
263*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_XC_CFDControl(ST_KDRV_XC_CFD_CONTROL_INFO *pstKdrvCFDCtrlInfo);
264*53ee8cc1Swenshuai.xi #endif
265*53ee8cc1Swenshuai.xi 
266*53ee8cc1Swenshuai.xi #include "ACE_private.h"
267*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
268*53ee8cc1Swenshuai.xi #include "utopia.h"
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi extern void* pu32ACEInst;
271*53ee8cc1Swenshuai.xi extern void* pu32ACERes[E_ACE_POOL_ID_MAX];
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi #if 0
274*53ee8cc1Swenshuai.xi static StruAceInfo s_AceInfo[XC_ACE_EX_MAX_DEVICE_NUM][2];
275*53ee8cc1Swenshuai.xi static BOOL bBypassColorMatrix[XC_ACE_EX_MAX_DEVICE_NUM];
276*53ee8cc1Swenshuai.xi #else
277*53ee8cc1Swenshuai.xi #define s_AceInfo psACEResPri->stdrvACE.s_AceInfo
278*53ee8cc1Swenshuai.xi #define bBypassColorMatrix psACEResPri->stdrvACE.bBypassColorMatrix
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi #endif
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi extern ACE_DRV_HDRinit g_ACEinitParameters;
283*53ee8cc1Swenshuai.xi static MS_BOOL _bSetHDRInit=FALSE;
284*53ee8cc1Swenshuai.xi static MS_BOOL _bSetGenRead=FALSE;
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi static MS_U16 s16PreRegs[9]={0};
287*53ee8cc1Swenshuai.xi static MS_U16 _u16HdrY2RRatio = 2;
288*53ee8cc1Swenshuai.xi static MS_U8 _u8PreMatrixCoefficients=0;
289*53ee8cc1Swenshuai.xi static MS_U8 _u8PreColorimetry = 0;
290*53ee8cc1Swenshuai.xi static MS_U8 _u8PreExtendedColorimetry = 0;
291*53ee8cc1Swenshuai.xi #ifdef UFO_XC_HDR
292*53ee8cc1Swenshuai.xi #if (UFO_XC_HDR_VERSION == 2)
293*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
294*53ee8cc1Swenshuai.xi static MS_S32   _s32FdScaler = -1;
295*53ee8cc1Swenshuai.xi #endif
296*53ee8cc1Swenshuai.xi #endif
297*53ee8cc1Swenshuai.xi #endif
298*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi void msAdjustPCContrast_10Bits(void* pInstance, BOOL bScalerWin, WORD wContrast );
301*53ee8cc1Swenshuai.xi void msAdjustVideoContrast_10Bits(void* pInstance, BOOL bScalerWin, WORD wContrast );
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////
msACE_GetVersion(void)304*53ee8cc1Swenshuai.xi WORD msACE_GetVersion(void)
305*53ee8cc1Swenshuai.xi {
306*53ee8cc1Swenshuai.xi     return MSACE_VERSION;
307*53ee8cc1Swenshuai.xi }
308*53ee8cc1Swenshuai.xi 
_TransferColorCorrectionOffsetValue(short s)309*53ee8cc1Swenshuai.xi static WORD _TransferColorCorrectionOffsetValue(short s)
310*53ee8cc1Swenshuai.xi {
311*53ee8cc1Swenshuai.xi     WORD w;
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi     w = s;
314*53ee8cc1Swenshuai.xi     if( w > 0x7F )
315*53ee8cc1Swenshuai.xi     {
316*53ee8cc1Swenshuai.xi         w = s*-1;
317*53ee8cc1Swenshuai.xi         w |= 0x80;
318*53ee8cc1Swenshuai.xi     }
319*53ee8cc1Swenshuai.xi     return w;
320*53ee8cc1Swenshuai.xi }
msACE_GetInfo(void * pInstance,BOOL bWindow,EnuACEInfoType ucInfoType)321*53ee8cc1Swenshuai.xi WORD msACE_GetInfo(void* pInstance, BOOL bWindow, EnuACEInfoType ucInfoType )
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi     WORD wReturnValue = 0xFFFF;
324*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi     switch( ucInfoType )
327*53ee8cc1Swenshuai.xi     {
328*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_VERSION:
329*53ee8cc1Swenshuai.xi             wReturnValue = MSACE_VERSION;
330*53ee8cc1Swenshuai.xi             break;
331*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_CONTRAST:
332*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].wContrast;
333*53ee8cc1Swenshuai.xi             break;
334*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_CONTRAST_MIN_VALUE:
335*53ee8cc1Swenshuai.xi             wReturnValue = CONTRAST_MIN_VALUE;
336*53ee8cc1Swenshuai.xi             break;
337*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_CONTRAST_MAX_VALUE:
338*53ee8cc1Swenshuai.xi             wReturnValue = CONTRAST_MAX_VALUE;
339*53ee8cc1Swenshuai.xi             break;
340*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_R_GAIN:
341*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].wRCon;
342*53ee8cc1Swenshuai.xi             break;
343*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_G_GAIN:
344*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].wGCon;
345*53ee8cc1Swenshuai.xi             break;
346*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_B_GAIN:
347*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].wBCon;
348*53ee8cc1Swenshuai.xi             break;
349*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_SATURATION:
350*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].ucSaturation;
351*53ee8cc1Swenshuai.xi             break;
352*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_HUE:
353*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].ucHue;
354*53ee8cc1Swenshuai.xi             break;
355*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_XY_R:
356*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
357*53ee8cc1Swenshuai.xi             {
358*53ee8cc1Swenshuai.xi                 wReturnValue = s_AceInfo[bWindow].psColorCorrectionMatrix[26]*-1;
359*53ee8cc1Swenshuai.xi                 wReturnValue = ((wReturnValue&0xFF00)>>4)|(wReturnValue&0xFF);
360*53ee8cc1Swenshuai.xi             }
361*53ee8cc1Swenshuai.xi             else
362*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
363*53ee8cc1Swenshuai.xi             break;
364*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_XY_G:
365*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
366*53ee8cc1Swenshuai.xi             {
367*53ee8cc1Swenshuai.xi                 wReturnValue = s_AceInfo[bWindow].psColorCorrectionMatrix[27];
368*53ee8cc1Swenshuai.xi                 wReturnValue = ((wReturnValue&0xFF00)>>4)|(wReturnValue&0xFF);
369*53ee8cc1Swenshuai.xi             }
370*53ee8cc1Swenshuai.xi             else
371*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
372*53ee8cc1Swenshuai.xi             break;
373*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_XY_B:
374*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
375*53ee8cc1Swenshuai.xi             {
376*53ee8cc1Swenshuai.xi                 wReturnValue = s_AceInfo[bWindow].psColorCorrectionMatrix[28]*-1;
377*53ee8cc1Swenshuai.xi                 wReturnValue = ((wReturnValue&0xFF00)>>4)|(wReturnValue&0xFF);
378*53ee8cc1Swenshuai.xi             }
379*53ee8cc1Swenshuai.xi             else
380*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
381*53ee8cc1Swenshuai.xi             break;
382*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_OFFSET_R:
383*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
384*53ee8cc1Swenshuai.xi             {
385*53ee8cc1Swenshuai.xi                 wReturnValue = _TransferColorCorrectionOffsetValue(s_AceInfo[bWindow].psColorCorrectionMatrix[29]);
386*53ee8cc1Swenshuai.xi             }
387*53ee8cc1Swenshuai.xi             else
388*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
389*53ee8cc1Swenshuai.xi             break;
390*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_OFFSET_G:
391*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
392*53ee8cc1Swenshuai.xi             {
393*53ee8cc1Swenshuai.xi                 wReturnValue = _TransferColorCorrectionOffsetValue(s_AceInfo[bWindow].psColorCorrectionMatrix[30]);
394*53ee8cc1Swenshuai.xi             }
395*53ee8cc1Swenshuai.xi             else
396*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
397*53ee8cc1Swenshuai.xi             break;
398*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COLOR_CORRECTION_OFFSET_B:
399*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix != NULL )
400*53ee8cc1Swenshuai.xi             {
401*53ee8cc1Swenshuai.xi                 wReturnValue = _TransferColorCorrectionOffsetValue(s_AceInfo[bWindow].psColorCorrectionMatrix[31]);
402*53ee8cc1Swenshuai.xi             }
403*53ee8cc1Swenshuai.xi             else
404*53ee8cc1Swenshuai.xi                 wReturnValue = 0;
405*53ee8cc1Swenshuai.xi             break;
406*53ee8cc1Swenshuai.xi 
407*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_COMPILER_VERSION:
408*53ee8cc1Swenshuai.xi     #if defined(__C51__)
409*53ee8cc1Swenshuai.xi             wReturnValue = __C51__;
410*53ee8cc1Swenshuai.xi     #else
411*53ee8cc1Swenshuai.xi             wReturnValue = 0;
412*53ee8cc1Swenshuai.xi     #endif
413*53ee8cc1Swenshuai.xi             break;
414*53ee8cc1Swenshuai.xi 
415*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_YUV_TO_RGB_MATRIX_SEL:
416*53ee8cc1Swenshuai.xi             wReturnValue = s_AceInfo[bWindow].ucYUVtoRGBMatrixSel;
417*53ee8cc1Swenshuai.xi             break;
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR1:
420*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR2:
421*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR3:
422*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR4:
423*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR5:
424*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR6:
425*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR7:
426*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR8:
427*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR9:
428*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR10:
429*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR11:
430*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR12:
431*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR13:
432*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR14:
433*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR15:
434*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IHC_USER_COLOR0:
435*53ee8cc1Swenshuai.xi             {
436*53ee8cc1Swenshuai.xi                 MS_U8 u8Val = 0;
437*53ee8cc1Swenshuai.xi                 XC_ACE_IHC_COLOR_TYPE eIHC;
438*53ee8cc1Swenshuai.xi                 switch(ucInfoType)
439*53ee8cc1Swenshuai.xi                 {
440*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR1:
441*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR1;
442*53ee8cc1Swenshuai.xi                         break;
443*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR2:
444*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR2;
445*53ee8cc1Swenshuai.xi                         break;
446*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR3:
447*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR3;
448*53ee8cc1Swenshuai.xi                         break;
449*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR4:
450*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR4;
451*53ee8cc1Swenshuai.xi                         break;
452*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR5:
453*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR5;
454*53ee8cc1Swenshuai.xi                         break;
455*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR6:
456*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR6;
457*53ee8cc1Swenshuai.xi                         break;
458*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR7:
459*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR7;
460*53ee8cc1Swenshuai.xi                         break;
461*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR8:
462*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR8;
463*53ee8cc1Swenshuai.xi                         break;
464*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR9:
465*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR9;
466*53ee8cc1Swenshuai.xi                         break;
467*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR10:
468*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR10;
469*53ee8cc1Swenshuai.xi                         break;
470*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR11:
471*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR11;
472*53ee8cc1Swenshuai.xi                         break;
473*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR12:
474*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR12;
475*53ee8cc1Swenshuai.xi                         break;
476*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR13:
477*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR13;
478*53ee8cc1Swenshuai.xi                         break;
479*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR14:
480*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR14;
481*53ee8cc1Swenshuai.xi                         break;
482*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR15:
483*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR15;
484*53ee8cc1Swenshuai.xi                         break;
485*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IHC_USER_COLOR0:
486*53ee8cc1Swenshuai.xi                         eIHC = E_XC_ACE_INFO_TYPE_IHC_USER_COLOR0;
487*53ee8cc1Swenshuai.xi                         break;
488*53ee8cc1Swenshuai.xi                     default:
489*53ee8cc1Swenshuai.xi                         break;
490*53ee8cc1Swenshuai.xi                 }
491*53ee8cc1Swenshuai.xi                 MDrv_ACE_GetIHC(pInstance, bWindow, eIHC, &u8Val);
492*53ee8cc1Swenshuai.xi                 wReturnValue = u8Val;
493*53ee8cc1Swenshuai.xi             }
494*53ee8cc1Swenshuai.xi             break;
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi 
497*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR1:
498*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR2:
499*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR3:
500*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR4:
501*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR5:
502*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR6:
503*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR7:
504*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR8:
505*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR9:
506*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR10:
507*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR11:
508*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR12:
509*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR13:
510*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR14:
511*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR15:
512*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_ICC_USER_COLOR0:
513*53ee8cc1Swenshuai.xi             {
514*53ee8cc1Swenshuai.xi                 MS_U8 u8Val = 0;
515*53ee8cc1Swenshuai.xi                 XC_ACE_ICC_COLOR_TYPE eICC;
516*53ee8cc1Swenshuai.xi                 switch(ucInfoType)
517*53ee8cc1Swenshuai.xi                 {
518*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR1:
519*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR1;
520*53ee8cc1Swenshuai.xi                         break;
521*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR2:
522*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR2;
523*53ee8cc1Swenshuai.xi                         break;
524*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR3:
525*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR3;
526*53ee8cc1Swenshuai.xi                         break;
527*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR4:
528*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR4;
529*53ee8cc1Swenshuai.xi                         break;
530*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR5:
531*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR5;
532*53ee8cc1Swenshuai.xi                         break;
533*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR6:
534*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR6;
535*53ee8cc1Swenshuai.xi                         break;
536*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR7:
537*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR7;
538*53ee8cc1Swenshuai.xi                         break;
539*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR8:
540*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR8;
541*53ee8cc1Swenshuai.xi                         break;
542*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR9:
543*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR9;
544*53ee8cc1Swenshuai.xi                         break;
545*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR10:
546*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR10;
547*53ee8cc1Swenshuai.xi                         break;
548*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR11:
549*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR11;
550*53ee8cc1Swenshuai.xi                         break;
551*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR12:
552*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR12;
553*53ee8cc1Swenshuai.xi                         break;
554*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR13:
555*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR13;
556*53ee8cc1Swenshuai.xi                         break;
557*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR14:
558*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR14;
559*53ee8cc1Swenshuai.xi                         break;
560*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR15:
561*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR15;
562*53ee8cc1Swenshuai.xi                         break;
563*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_ICC_USER_COLOR0:
564*53ee8cc1Swenshuai.xi                         eICC = E_ACE_ICC_USER_COLOR0;
565*53ee8cc1Swenshuai.xi                         break;
566*53ee8cc1Swenshuai.xi                     default:
567*53ee8cc1Swenshuai.xi                         break;
568*53ee8cc1Swenshuai.xi                 }
569*53ee8cc1Swenshuai.xi                 MDrv_ACE_GetICC(pInstance, bWindow, eICC, &u8Val);
570*53ee8cc1Swenshuai.xi                 wReturnValue = u8Val;
571*53ee8cc1Swenshuai.xi             }
572*53ee8cc1Swenshuai.xi             break;
573*53ee8cc1Swenshuai.xi 
574*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR1:
575*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR2:
576*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR3:
577*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR4:
578*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR5:
579*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR6:
580*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR7:
581*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR8:
582*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR9:
583*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR10:
584*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR11:
585*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR12:
586*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR13:
587*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR14:
588*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR15:
589*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_IBC_USER_COLOR0:
590*53ee8cc1Swenshuai.xi             {
591*53ee8cc1Swenshuai.xi                 MS_U8 u8Val = 0;
592*53ee8cc1Swenshuai.xi                 XC_ACE_IBC_COLOR_TYPE eIBC;
593*53ee8cc1Swenshuai.xi                 switch(ucInfoType)
594*53ee8cc1Swenshuai.xi                 {
595*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR1:
596*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR1;
597*53ee8cc1Swenshuai.xi                         break;
598*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR2:
599*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR2;
600*53ee8cc1Swenshuai.xi                         break;
601*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR3:
602*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR3;
603*53ee8cc1Swenshuai.xi                         break;
604*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR4:
605*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR4;
606*53ee8cc1Swenshuai.xi                         break;
607*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR5:
608*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR5;
609*53ee8cc1Swenshuai.xi                         break;
610*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR6:
611*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR6;
612*53ee8cc1Swenshuai.xi                         break;
613*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR7:
614*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR7;
615*53ee8cc1Swenshuai.xi                         break;
616*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR8:
617*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR8;
618*53ee8cc1Swenshuai.xi                         break;
619*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR9:
620*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR9;
621*53ee8cc1Swenshuai.xi                         break;
622*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR10:
623*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR10;
624*53ee8cc1Swenshuai.xi                         break;
625*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR11:
626*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR11;
627*53ee8cc1Swenshuai.xi                         break;
628*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR12:
629*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR12;
630*53ee8cc1Swenshuai.xi                         break;
631*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR13:
632*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR13;
633*53ee8cc1Swenshuai.xi                         break;
634*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR14:
635*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR14;
636*53ee8cc1Swenshuai.xi                         break;
637*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR15:
638*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR15;
639*53ee8cc1Swenshuai.xi                         break;
640*53ee8cc1Swenshuai.xi                     case ACE_INFO_TYPE_IBC_USER_COLOR0:
641*53ee8cc1Swenshuai.xi                         eIBC = E_ACE_IBC_USER_COLOR0;
642*53ee8cc1Swenshuai.xi                         break;
643*53ee8cc1Swenshuai.xi                     default:
644*53ee8cc1Swenshuai.xi                         break;
645*53ee8cc1Swenshuai.xi                 }
646*53ee8cc1Swenshuai.xi                 MDrv_ACE_GetIBC(pInstance, bWindow, eIBC, &u8Val);
647*53ee8cc1Swenshuai.xi                 wReturnValue = u8Val;
648*53ee8cc1Swenshuai.xi             }
649*53ee8cc1Swenshuai.xi             break;
650*53ee8cc1Swenshuai.xi 
651*53ee8cc1Swenshuai.xi         case ACE_INFO_TYPE_DUMMY:
652*53ee8cc1Swenshuai.xi         default:
653*53ee8cc1Swenshuai.xi             wReturnValue = 0;
654*53ee8cc1Swenshuai.xi             break;
655*53ee8cc1Swenshuai.xi     }
656*53ee8cc1Swenshuai.xi 
657*53ee8cc1Swenshuai.xi     return wReturnValue;
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi 
660*53ee8cc1Swenshuai.xi // matrix used to convert RGB color space to YUV color space for SDTV
661*53ee8cc1Swenshuai.xi //code short tSDTVRgb2yuv[3][3] =
662*53ee8cc1Swenshuai.xi //{
663*53ee8cc1Swenshuai.xi //    {  0x0107,  0x0204,  0x0064 }, // 0.257,  0.504,  0.098
664*53ee8cc1Swenshuai.xi //    { -0x0098, -0x012A,  0x01C2 }, // -0.148, -0.291, 0.439
665*53ee8cc1Swenshuai.xi //    {  0x01C2, -0x0179, -0x0049 }  // 0.439,  -0.368, -0.071
666*53ee8cc1Swenshuai.xi //};
667*53ee8cc1Swenshuai.xi 
668*53ee8cc1Swenshuai.xi // matrix used to convert YUV color space to RGB color space, used for video input for SDTV
669*53ee8cc1Swenshuai.xi static code short tSDTVYuv2rgb[3][3] =
670*53ee8cc1Swenshuai.xi #if 0
671*53ee8cc1Swenshuai.xi {
672*53ee8cc1Swenshuai.xi     {   0x0662, 0x04A8,  0x0000 }, // 1.596,  1.164, 0
673*53ee8cc1Swenshuai.xi     {  -0x0341, 0x04A8, -0x0190 }, // -0.813, 1.164, -0.391
674*53ee8cc1Swenshuai.xi     {   0x0000, 0x04A8,  0x0812 }  // 0,      1.164, 2.018
675*53ee8cc1Swenshuai.xi };
676*53ee8cc1Swenshuai.xi #else
677*53ee8cc1Swenshuai.xi {
678*53ee8cc1Swenshuai.xi     {   0x0667, 0x04AC,  0x0000 }, // 1.6005,  1.1679, 0
679*53ee8cc1Swenshuai.xi     {  -0x0343, 0x04AC, -0x0192 }, // -0.8154, 1.1679, -0.3925
680*53ee8cc1Swenshuai.xi     {   0x0000, 0x04AC,  0x0818 }  // 0,      1.1679, 2.0234
681*53ee8cc1Swenshuai.xi };
682*53ee8cc1Swenshuai.xi #endif
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi // matrix used to convert RGB color space to YUV color space for HDTV
685*53ee8cc1Swenshuai.xi //code short tHDTVRgb2yuv[3][3] =
686*53ee8cc1Swenshuai.xi //{
687*53ee8cc1Swenshuai.xi //    {  0x00DA,  0x02DC,  0x004A }, // 0.213,  0.715,  0.072
688*53ee8cc1Swenshuai.xi //    { -0x0078, -0x0193,  0x020B }, // -0.117, -0.394, 0.511
689*53ee8cc1Swenshuai.xi //    {  0x020B, -0x01DB, -0x0030 }  // 0.511,  -0.464, -0.047
690*53ee8cc1Swenshuai.xi //};
691*53ee8cc1Swenshuai.xi 
692*53ee8cc1Swenshuai.xi // matrix used to convert YUV color space to RGB color space, used for video input for HDTV
693*53ee8cc1Swenshuai.xi static code short tHDTVYuv2rgb[3][3] =
694*53ee8cc1Swenshuai.xi #if 0
695*53ee8cc1Swenshuai.xi {
696*53ee8cc1Swenshuai.xi     {   0x072C, 0x04A8,  0x0000 }, // 1.793,  1.164, 0
697*53ee8cc1Swenshuai.xi     {  -0x0223, 0x04A8, -0x00DA }, // -0.534, 1.164, -0.213
698*53ee8cc1Swenshuai.xi     {   0x0000, 0x04A8,  0x0876 }  // 0,      1.164, 2.115
699*53ee8cc1Swenshuai.xi };
700*53ee8cc1Swenshuai.xi #else
701*53ee8cc1Swenshuai.xi {
702*53ee8cc1Swenshuai.xi     {   0x0731, 0x04AC,  0x0000 }, // 1.7978,  1.1679, 0
703*53ee8cc1Swenshuai.xi     {  -0x0223, 0x04AC, -0x00DB }, // -0.5341, 1.1679, -0.2138
704*53ee8cc1Swenshuai.xi     {   0x0000, 0x04AC,  0x0879 }  // 0,      1.1679, 2.1181
705*53ee8cc1Swenshuai.xi };
706*53ee8cc1Swenshuai.xi #endif
CopyMatrix(WORD * pwBufSrc,WORD * pwBufTgt,BYTE ucLen)707*53ee8cc1Swenshuai.xi static void CopyMatrix(WORD* pwBufSrc, WORD* pwBufTgt, BYTE ucLen )
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi     BYTE i;
710*53ee8cc1Swenshuai.xi     for( i = 0; i < ucLen; ++ i )
711*53ee8cc1Swenshuai.xi     {
712*53ee8cc1Swenshuai.xi         pwBufTgt[i] = pwBufSrc[i];
713*53ee8cc1Swenshuai.xi     }
714*53ee8cc1Swenshuai.xi }
msACE_GetMatrix(void * pInstance,BOOL bWindow,BYTE ucMatrixId,WORD * pwBuf,BYTE ucBufLen)715*53ee8cc1Swenshuai.xi BOOL msACE_GetMatrix(void* pInstance, BOOL bWindow, BYTE ucMatrixId, WORD* pwBuf, BYTE ucBufLen)
716*53ee8cc1Swenshuai.xi {
717*53ee8cc1Swenshuai.xi     BYTE ucCopyLen = 9;
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
720*53ee8cc1Swenshuai.xi 
721*53ee8cc1Swenshuai.xi     // Check parameter ...
722*53ee8cc1Swenshuai.xi 
723*53ee8cc1Swenshuai.xi     //if( ucBufLen < ucCopyLen )
724*53ee8cc1Swenshuai.xi         ucCopyLen = ucBufLen;
725*53ee8cc1Swenshuai.xi 
726*53ee8cc1Swenshuai.xi     switch(ucMatrixId)
727*53ee8cc1Swenshuai.xi     {
728*53ee8cc1Swenshuai.xi         case ACE_MATRIX_ID__YUV_TO_RGB:
729*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].ucYUVtoRGBMatrixSel == ACE_YUV_TO_RGB_MATRIX_SDTV )
730*53ee8cc1Swenshuai.xi             {
731*53ee8cc1Swenshuai.xi                 CopyMatrix( (WORD*)tSDTVYuv2rgb, pwBuf, ucCopyLen );
732*53ee8cc1Swenshuai.xi             }
733*53ee8cc1Swenshuai.xi             else if( s_AceInfo[bWindow].ucYUVtoRGBMatrixSel == ACE_YUV_TO_RGB_MATRIX_HDTV )
734*53ee8cc1Swenshuai.xi             {
735*53ee8cc1Swenshuai.xi                 CopyMatrix( (WORD*)tHDTVYuv2rgb, pwBuf, ucCopyLen );
736*53ee8cc1Swenshuai.xi             }
737*53ee8cc1Swenshuai.xi             else if( s_AceInfo[bWindow].ucYUVtoRGBMatrixSel == ACE_YUV_TO_RGB_MATRIX_USER )
738*53ee8cc1Swenshuai.xi             {
739*53ee8cc1Swenshuai.xi                 if( s_AceInfo[bWindow].psYVUtoRGBMatrix == NULL )
740*53ee8cc1Swenshuai.xi                     return FALSE;
741*53ee8cc1Swenshuai.xi                 CopyMatrix( (WORD*)s_AceInfo[bWindow].psYVUtoRGBMatrix, pwBuf, ucCopyLen );
742*53ee8cc1Swenshuai.xi             }
743*53ee8cc1Swenshuai.xi             break;
744*53ee8cc1Swenshuai.xi         case ACE_MATRIX_ID__COLOR_CORRECTION:
745*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psColorCorrectionMatrix == NULL)
746*53ee8cc1Swenshuai.xi                 return FALSE;
747*53ee8cc1Swenshuai.xi             CopyMatrix( (WORD*)s_AceInfo[bWindow].psColorCorrectionMatrix, pwBuf, ucCopyLen );
748*53ee8cc1Swenshuai.xi             break;
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi         case ACE_MATRIX_ID__SRGB:
751*53ee8cc1Swenshuai.xi             if( s_AceInfo[bWindow].psPCsRGBMatrix == NULL)
752*53ee8cc1Swenshuai.xi                 return FALSE;
753*53ee8cc1Swenshuai.xi             CopyMatrix( (WORD*)s_AceInfo[bWindow].psPCsRGBMatrix, pwBuf, ucCopyLen );
754*53ee8cc1Swenshuai.xi             break;
755*53ee8cc1Swenshuai.xi     }
756*53ee8cc1Swenshuai.xi     return TRUE;
757*53ee8cc1Swenshuai.xi }
758*53ee8cc1Swenshuai.xi 
msACEPCForceYUVtoRGB(void * pInstance,BOOL bWin,BOOL bEnable)759*53ee8cc1Swenshuai.xi void msACEPCForceYUVtoRGB(void* pInstance, BOOL bWin, BOOL bEnable )
760*53ee8cc1Swenshuai.xi {
761*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
762*53ee8cc1Swenshuai.xi     if( bEnable )
763*53ee8cc1Swenshuai.xi         s_AceInfo[bWin].bForceYUVtoRGB = 1;
764*53ee8cc1Swenshuai.xi     else
765*53ee8cc1Swenshuai.xi         s_AceInfo[bWin].bForceYUVtoRGB = 0;
766*53ee8cc1Swenshuai.xi }
msACESelectYUVtoRGBMatrix(void * pInstance,BOOL bWindow,BYTE ucMatrix,short * psUserYUVtoRGBMatrix)767*53ee8cc1Swenshuai.xi void msACESelectYUVtoRGBMatrix(void* pInstance, BOOL bWindow, BYTE ucMatrix, short* psUserYUVtoRGBMatrix )
768*53ee8cc1Swenshuai.xi {
769*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
772*53ee8cc1Swenshuai.xi 
773*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].ucYUVtoRGBMatrixSel = ucMatrix;
774*53ee8cc1Swenshuai.xi     if( ucMatrix == ACE_YUV_TO_RGB_MATRIX_USER )
775*53ee8cc1Swenshuai.xi     {
776*53ee8cc1Swenshuai.xi 		//printf("Color table User mode\n");
777*53ee8cc1Swenshuai.xi 
778*53ee8cc1Swenshuai.xi         if(DISABLE==g_ACEinitParameters.bHDREnable)
779*53ee8cc1Swenshuai.xi             //s_AceInfo[bWindow].psYVUtoRGBMatrix = psUserYUVtoRGBMatrix;
780*53ee8cc1Swenshuai.xi             memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,psUserYUVtoRGBMatrix,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
781*53ee8cc1Swenshuai.xi     }
782*53ee8cc1Swenshuai.xi     else if( ucMatrix == ACE_YUV_TO_RGB_MATRIX_HDTV )
783*53ee8cc1Swenshuai.xi     {
784*53ee8cc1Swenshuai.xi 		//printf("Color table HD mode\n");
785*53ee8cc1Swenshuai.xi 	    BACKUP_SC_BANK
786*53ee8cc1Swenshuai.xi 		SET_SC_BANK(BANK_ACE);
787*53ee8cc1Swenshuai.xi 		if(bWindow==0) // 0: main, 1:sub
788*53ee8cc1Swenshuai.xi 		{
789*53ee8cc1Swenshuai.xi 			//printf("Prepare Load Main color table\n");
790*53ee8cc1Swenshuai.xi 	    	if(ACE_READ_CTL(psACEInstPri->u32DeviceID, REG_ADDR_ACE_R2Y_EQ_SEL,0x04)) // (BK18_6F[2] for main)
791*53ee8cc1Swenshuai.xi     		{
792*53ee8cc1Swenshuai.xi 				//printf("Load SD table\n");
793*53ee8cc1Swenshuai.xi 				if(DISABLE==g_ACEinitParameters.bHDREnable)
794*53ee8cc1Swenshuai.xi     			    //s_AceInfo[bWindow].psYVUtoRGBMatrix = (short*)tSDTVYuv2rgb;
795*53ee8cc1Swenshuai.xi                     memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,(short*)tSDTVYuv2rgb,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
796*53ee8cc1Swenshuai.xi     		}
797*53ee8cc1Swenshuai.xi 			else
798*53ee8cc1Swenshuai.xi 			{
799*53ee8cc1Swenshuai.xi 				//printf("Load HD table\n");
800*53ee8cc1Swenshuai.xi 				if(DISABLE==g_ACEinitParameters.bHDREnable)
801*53ee8cc1Swenshuai.xi 				    //s_AceInfo[bWindow].psYVUtoRGBMatrix = (short*)tHDTVYuv2rgb;
802*53ee8cc1Swenshuai.xi                     memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,(short*)tHDTVYuv2rgb,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
803*53ee8cc1Swenshuai.xi 			}
804*53ee8cc1Swenshuai.xi 		}
805*53ee8cc1Swenshuai.xi 		else
806*53ee8cc1Swenshuai.xi 		{
807*53ee8cc1Swenshuai.xi 			//printf("Prepare Load Sub color table\n");
808*53ee8cc1Swenshuai.xi 	    	if(ACE_READ_CTL(psACEInstPri->u32DeviceID, REG_ADDR_ACE_R2Y_EQ_SEL,0x40))//(BK18_6F[6] for sub)
809*53ee8cc1Swenshuai.xi     		{
810*53ee8cc1Swenshuai.xi 				//printf("Load SD table\n");
811*53ee8cc1Swenshuai.xi 				if(DISABLE==g_ACEinitParameters.bHDREnable)
812*53ee8cc1Swenshuai.xi     			    //s_AceInfo[bWindow].psYVUtoRGBMatrix = (short*)tSDTVYuv2rgb;
813*53ee8cc1Swenshuai.xi                     memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,(short*)tSDTVYuv2rgb,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
814*53ee8cc1Swenshuai.xi     		}
815*53ee8cc1Swenshuai.xi 			else
816*53ee8cc1Swenshuai.xi 			{
817*53ee8cc1Swenshuai.xi 				//printf("Load HD table\n");
818*53ee8cc1Swenshuai.xi 				if(DISABLE==g_ACEinitParameters.bHDREnable)
819*53ee8cc1Swenshuai.xi 				    //s_AceInfo[bWindow].psYVUtoRGBMatrix = (short*)tHDTVYuv2rgb;
820*53ee8cc1Swenshuai.xi                     memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,(short*)tHDTVYuv2rgb,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
821*53ee8cc1Swenshuai.xi 			}
822*53ee8cc1Swenshuai.xi 		}
823*53ee8cc1Swenshuai.xi 	    RECOVER_SC_BANK
824*53ee8cc1Swenshuai.xi     }
825*53ee8cc1Swenshuai.xi     else // ACE_YUV_TO_RGB_MATRIX_SDTV
826*53ee8cc1Swenshuai.xi     {
827*53ee8cc1Swenshuai.xi 		//printf("Color table SD mode\n");
828*53ee8cc1Swenshuai.xi 		if(DISABLE==g_ACEinitParameters.bHDREnable)
829*53ee8cc1Swenshuai.xi             //s_AceInfo[bWindow].psYVUtoRGBMatrix = (short*)tSDTVYuv2rgb;
830*53ee8cc1Swenshuai.xi             memcpy(s_AceInfo[bWindow].psYVUtoRGBMatrix,(short*)tSDTVYuv2rgb,sizeof(s_AceInfo[bWindow].psYVUtoRGBMatrix));
831*53ee8cc1Swenshuai.xi     }
832*53ee8cc1Swenshuai.xi }
833*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------
834*53ee8cc1Swenshuai.xi // Specify the color correction table.
835*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------
msACESetColorCorrectionTable(void * pInstance,BOOL bWindow,short * psColorCorrectionTable)836*53ee8cc1Swenshuai.xi void msACESetColorCorrectionTable(void* pInstance, BOOL bWindow, short* psColorCorrectionTable )
837*53ee8cc1Swenshuai.xi {
838*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
839*53ee8cc1Swenshuai.xi     if(psColorCorrectionTable!=NULL)
840*53ee8cc1Swenshuai.xi     {
841*53ee8cc1Swenshuai.xi         memcpy(s_AceInfo[bWindow].psColorCorrectionMatrix,psColorCorrectionTable,sizeof(MS_S16)*32);
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi         ST_ACE_CFD_OSD_CONTROL stAceOSDControl;
844*53ee8cc1Swenshuai.xi         memset(&stAceOSDControl, 0, sizeof(ST_ACE_CFD_OSD_CONTROL));
845*53ee8cc1Swenshuai.xi         stAceOSDControl.u32Version = ACE_OSD_CONTROL_VERSION;
846*53ee8cc1Swenshuai.xi         stAceOSDControl.u16Length = sizeof(ST_ACE_CFD_OSD_CONTROL);
847*53ee8cc1Swenshuai.xi         stAceOSDControl.bColorCorrectionValid = TRUE;
848*53ee8cc1Swenshuai.xi         memcpy(stAceOSDControl.s16ColorCorrectionMatrix, psColorCorrectionTable, sizeof(MS_S16)*32);
849*53ee8cc1Swenshuai.xi         stAceOSDControl.u8OSDUIEn = 1;
850*53ee8cc1Swenshuai.xi         stAceOSDControl.u8OSDUIMode = 1;
851*53ee8cc1Swenshuai.xi         stAceOSDControl.u8Win = (bWindow==TRUE)?1:0;
852*53ee8cc1Swenshuai.xi 
853*53ee8cc1Swenshuai.xi         ST_KDRV_XC_CFD_CONTROL_INFO stCFDCtrlInfo;
854*53ee8cc1Swenshuai.xi         memset(&stCFDCtrlInfo, 0, sizeof(ST_KDRV_XC_CFD_CONTROL_INFO));
855*53ee8cc1Swenshuai.xi         stCFDCtrlInfo.enCtrlType = E_KDRV_XC_CFD_CTRL_SET_OSD;
856*53ee8cc1Swenshuai.xi         stCFDCtrlInfo.pParam = &stAceOSDControl;
857*53ee8cc1Swenshuai.xi         stCFDCtrlInfo.u32ParamLen = sizeof(ST_ACE_CFD_OSD_CONTROL);
858*53ee8cc1Swenshuai.xi #ifdef UFO_XC_HDR
859*53ee8cc1Swenshuai.xi #if (UFO_XC_HDR_VERSION == 2)
860*53ee8cc1Swenshuai.xi     //_s32FdScaler only defined by UFO_XC_HDR_VERSION == 2
861*53ee8cc1Swenshuai.xi #if (defined MSOS_TYPE_LINUX) || (defined ANDROID)
862*53ee8cc1Swenshuai.xi         if(0 > _s32FdScaler)
863*53ee8cc1Swenshuai.xi         {
864*53ee8cc1Swenshuai.xi             _s32FdScaler = open("/dev/scaler", O_RDWR);
865*53ee8cc1Swenshuai.xi 
866*53ee8cc1Swenshuai.xi             if(0 > _s32FdScaler)
867*53ee8cc1Swenshuai.xi             {
868*53ee8cc1Swenshuai.xi                 printf("Scaler device not opened!!!!\n");
869*53ee8cc1Swenshuai.xi                 return ;
870*53ee8cc1Swenshuai.xi             }
871*53ee8cc1Swenshuai.xi         }
872*53ee8cc1Swenshuai.xi 
873*53ee8cc1Swenshuai.xi         if (ioctl(_s32FdScaler, MDRV_XC_IOC_CFDCONCTRL, &stCFDCtrlInfo))
874*53ee8cc1Swenshuai.xi         {
875*53ee8cc1Swenshuai.xi             printf("MDRV_XC_IOC_CFDCONCTRL OSD fail!!!!\n");
876*53ee8cc1Swenshuai.xi             return ;
877*53ee8cc1Swenshuai.xi         }
878*53ee8cc1Swenshuai.xi 
879*53ee8cc1Swenshuai.xi         if (stCFDCtrlInfo.u16ErrCode != 0)
880*53ee8cc1Swenshuai.xi         {
881*53ee8cc1Swenshuai.xi             printf("MDRV_XC_IOC_CFDCONCTRL OSD fail, errCode: %d\n", stCFDCtrlInfo.u16ErrCode);
882*53ee8cc1Swenshuai.xi         }
883*53ee8cc1Swenshuai.xi #endif
884*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX_KERNEL) && defined(CONFIG_MSTAR_XC_HDR_SUPPORT))
885*53ee8cc1Swenshuai.xi         MDrv_XC_CFDControl(&stCFDCtrlInfo);
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi #endif
888*53ee8cc1Swenshuai.xi #endif
889*53ee8cc1Swenshuai.xi 
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi 
892*53ee8cc1Swenshuai.xi     }
893*53ee8cc1Swenshuai.xi }
894*53ee8cc1Swenshuai.xi 
895*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------
896*53ee8cc1Swenshuai.xi // Specify the sRGB table.
897*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------
msACESetPCsRGBTable(void * pInstance,BOOL bWin,short * psPCsRGBTable)898*53ee8cc1Swenshuai.xi void msACESetPCsRGBTable(void* pInstance, BOOL bWin, short* psPCsRGBTable )
899*53ee8cc1Swenshuai.xi {
900*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
901*53ee8cc1Swenshuai.xi     s_AceInfo[bWin].psPCsRGBMatrix = psPCsRGBTable;
902*53ee8cc1Swenshuai.xi }
903*53ee8cc1Swenshuai.xi 
InitACEVar(void * pInstance)904*53ee8cc1Swenshuai.xi void InitACEVar(void* pInstance)
905*53ee8cc1Swenshuai.xi {
906*53ee8cc1Swenshuai.xi     BYTE i;
907*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
908*53ee8cc1Swenshuai.xi 
909*53ee8cc1Swenshuai.xi     for( i = 0; i < 2; ++ i )
910*53ee8cc1Swenshuai.xi     {
911*53ee8cc1Swenshuai.xi         s_AceInfo[i].wRCon = 1024;
912*53ee8cc1Swenshuai.xi         s_AceInfo[i].wGCon = 1024;
913*53ee8cc1Swenshuai.xi         s_AceInfo[i].wBCon = 1024;
914*53ee8cc1Swenshuai.xi         s_AceInfo[i].wContrast = 1024;
915*53ee8cc1Swenshuai.xi         s_AceInfo[i].ucSaturation = 0x80;
916*53ee8cc1Swenshuai.xi         s_AceInfo[i].ucHue = 50;
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[0][0] =
919*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[1][1] =
920*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[2][2] = 1024;
921*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[0][1] =
922*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[1][0] =
923*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[2][0] =
924*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[0][2] =
925*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[1][2] =
926*53ee8cc1Swenshuai.xi         s_AceInfo[i].sContrastRGBMatrix[2][1] = 0;
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[0][0] =
929*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[1][1] =
930*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[2][2] = 1024;
931*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[0][1] =
932*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[1][0] =
933*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[2][0] =
934*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[0][2] =
935*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[1][2] =
936*53ee8cc1Swenshuai.xi         s_AceInfo[i].sVideoSatHueMatrix[2][1] = 0;
937*53ee8cc1Swenshuai.xi 
938*53ee8cc1Swenshuai.xi         //psColorCorrectionMatrix change type from a pointer to array,
939*53ee8cc1Swenshuai.xi         //we init this array by a elementary array instead of zero array
940*53ee8cc1Swenshuai.xi         s_AceInfo[i].psColorCorrectionMatrix[0] = 0x400;
941*53ee8cc1Swenshuai.xi         s_AceInfo[i].psColorCorrectionMatrix[4] = 0x400;
942*53ee8cc1Swenshuai.xi         s_AceInfo[i].psColorCorrectionMatrix[8] = 0x400;
943*53ee8cc1Swenshuai.xi 
944*53ee8cc1Swenshuai.xi         //s_AceInfo[i].psColorCorrectionMatrix = NULL;
945*53ee8cc1Swenshuai.xi         msACESetColorCorrectionTable(pInstance, i, NULL );
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi         //s_AceInfo[i].psPCsRGBMatrix = NULL;
948*53ee8cc1Swenshuai.xi         msACESetPCsRGBTable(pInstance, i, NULL );
949*53ee8cc1Swenshuai.xi 
950*53ee8cc1Swenshuai.xi         //s_AceInfo[i].bForceYUVtoRGB = 0;
951*53ee8cc1Swenshuai.xi         msACEPCForceYUVtoRGB(pInstance, i, FALSE );
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi         //s_AceInfo[i].ucYUVtoRGBMatrixSel = ACE_YUV_TO_RGB_MATRIX_SDTV;
954*53ee8cc1Swenshuai.xi         //s_AceInfo[i].psYVUtoRGBMatrix = (short*)tSDTVYuv2rgb;
955*53ee8cc1Swenshuai.xi         msACESelectYUVtoRGBMatrix(pInstance, i, ACE_YUV_TO_RGB_MATRIX_SDTV, NULL );
956*53ee8cc1Swenshuai.xi     }
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi #if defined(__C51__)
959*53ee8cc1Swenshuai.xi     // For uncall warning...
960*53ee8cc1Swenshuai.xi     if( i == 0 )
961*53ee8cc1Swenshuai.xi     {
962*53ee8cc1Swenshuai.xi         msACE_GetVersion();
963*53ee8cc1Swenshuai.xi         msACE_GetInfo(pInstance, 0, 0);
964*53ee8cc1Swenshuai.xi         msAdjustPCContrast_10Bits(pInstance, 0,0);
965*53ee8cc1Swenshuai.xi         msAdjustPCRGB_10Bits(pInstance, 0, 0, 0, 0 );
966*53ee8cc1Swenshuai.xi         msAdjustVideoContrast_10Bits(pInstance, 0,0);
967*53ee8cc1Swenshuai.xi         msAdjustVideoRGB_10Bits(pInstance, 0, 0, 0, 0 );
968*53ee8cc1Swenshuai.xi         msACE_GetMatrix(pInstance, 0, 0, NULL, 0);
969*53ee8cc1Swenshuai.xi         msACE_SetColorMatrixControl(pInstance, 0, 0 );
970*53ee8cc1Swenshuai.xi         msACE_SetRBChannelRange(pInstance, 0, 0 );
971*53ee8cc1Swenshuai.xi     }
972*53ee8cc1Swenshuai.xi #endif
973*53ee8cc1Swenshuai.xi }
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi #define ENABLE_SINE_COSINE_USING_LOOKUP_TABLE   1
976*53ee8cc1Swenshuai.xi 
977*53ee8cc1Swenshuai.xi #if( ENABLE_SINE_COSINE_USING_LOOKUP_TABLE ) // sine/cosine use lookup table
978*53ee8cc1Swenshuai.xi 
sine(BYTE u8Hue)979*53ee8cc1Swenshuai.xi static short sine(BYTE u8Hue)
980*53ee8cc1Swenshuai.xi {
981*53ee8cc1Swenshuai.xi     code short tHueToSine[] =
982*53ee8cc1Swenshuai.xi     {
983*53ee8cc1Swenshuai.xi         784, // 0
984*53ee8cc1Swenshuai.xi         772, // 1
985*53ee8cc1Swenshuai.xi         760, // 2
986*53ee8cc1Swenshuai.xi         748, // 3
987*53ee8cc1Swenshuai.xi         736, // 4
988*53ee8cc1Swenshuai.xi         724, // 5
989*53ee8cc1Swenshuai.xi         711, // 6
990*53ee8cc1Swenshuai.xi         698, // 7
991*53ee8cc1Swenshuai.xi         685, // 8
992*53ee8cc1Swenshuai.xi         671, // 9
993*53ee8cc1Swenshuai.xi         658, // 10
994*53ee8cc1Swenshuai.xi         644, // 11
995*53ee8cc1Swenshuai.xi         630, // 12
996*53ee8cc1Swenshuai.xi         616, // 13
997*53ee8cc1Swenshuai.xi         601, // 14
998*53ee8cc1Swenshuai.xi         587, // 15
999*53ee8cc1Swenshuai.xi         572, // 16
1000*53ee8cc1Swenshuai.xi         557, // 17
1001*53ee8cc1Swenshuai.xi         542, // 18
1002*53ee8cc1Swenshuai.xi         527, // 19
1003*53ee8cc1Swenshuai.xi         511, // 20
1004*53ee8cc1Swenshuai.xi         496, // 21
1005*53ee8cc1Swenshuai.xi         480, // 22
1006*53ee8cc1Swenshuai.xi         464, // 23
1007*53ee8cc1Swenshuai.xi         448, // 24
1008*53ee8cc1Swenshuai.xi         432, // 25
1009*53ee8cc1Swenshuai.xi         416, // 26
1010*53ee8cc1Swenshuai.xi         400, // 27
1011*53ee8cc1Swenshuai.xi         383, // 28
1012*53ee8cc1Swenshuai.xi         366, // 29
1013*53ee8cc1Swenshuai.xi         350, // 30
1014*53ee8cc1Swenshuai.xi         333, // 31
1015*53ee8cc1Swenshuai.xi         316, // 32
1016*53ee8cc1Swenshuai.xi         299, // 33
1017*53ee8cc1Swenshuai.xi         282, // 34
1018*53ee8cc1Swenshuai.xi         265, // 35
1019*53ee8cc1Swenshuai.xi         247, // 36
1020*53ee8cc1Swenshuai.xi         230, // 37
1021*53ee8cc1Swenshuai.xi         212, // 38
1022*53ee8cc1Swenshuai.xi         195, // 39
1023*53ee8cc1Swenshuai.xi         177, // 40
1024*53ee8cc1Swenshuai.xi         160, // 41
1025*53ee8cc1Swenshuai.xi         142, // 42
1026*53ee8cc1Swenshuai.xi         124, // 43
1027*53ee8cc1Swenshuai.xi         107, // 44
1028*53ee8cc1Swenshuai.xi         89, // 45
1029*53ee8cc1Swenshuai.xi         71, // 46
1030*53ee8cc1Swenshuai.xi         53, // 47
1031*53ee8cc1Swenshuai.xi         35, // 48
1032*53ee8cc1Swenshuai.xi         17, // 49
1033*53ee8cc1Swenshuai.xi         0, // 50
1034*53ee8cc1Swenshuai.xi         -17, // 51
1035*53ee8cc1Swenshuai.xi         -35, // 52
1036*53ee8cc1Swenshuai.xi         -53, // 53
1037*53ee8cc1Swenshuai.xi         -71, // 54
1038*53ee8cc1Swenshuai.xi         -89, // 55
1039*53ee8cc1Swenshuai.xi         -107, // 56
1040*53ee8cc1Swenshuai.xi         -124, // 57
1041*53ee8cc1Swenshuai.xi         -142, // 58
1042*53ee8cc1Swenshuai.xi         -160, // 59
1043*53ee8cc1Swenshuai.xi         -177, // 60
1044*53ee8cc1Swenshuai.xi         -195, // 61
1045*53ee8cc1Swenshuai.xi         -212, // 62
1046*53ee8cc1Swenshuai.xi         -230, // 63
1047*53ee8cc1Swenshuai.xi         -247, // 64
1048*53ee8cc1Swenshuai.xi         -265, // 65
1049*53ee8cc1Swenshuai.xi         -282, // 66
1050*53ee8cc1Swenshuai.xi         -299, // 67
1051*53ee8cc1Swenshuai.xi         -316, // 68
1052*53ee8cc1Swenshuai.xi         -333, // 69
1053*53ee8cc1Swenshuai.xi         -350, // 70
1054*53ee8cc1Swenshuai.xi         -366, // 71
1055*53ee8cc1Swenshuai.xi         -383, // 72
1056*53ee8cc1Swenshuai.xi         -400, // 73
1057*53ee8cc1Swenshuai.xi         -416, // 74
1058*53ee8cc1Swenshuai.xi         -432, // 75
1059*53ee8cc1Swenshuai.xi         -448, // 76
1060*53ee8cc1Swenshuai.xi         -464, // 77
1061*53ee8cc1Swenshuai.xi         -480, // 78
1062*53ee8cc1Swenshuai.xi         -496, // 79
1063*53ee8cc1Swenshuai.xi         -512, // 80
1064*53ee8cc1Swenshuai.xi         -527, // 81
1065*53ee8cc1Swenshuai.xi         -542, // 82
1066*53ee8cc1Swenshuai.xi         -557, // 83
1067*53ee8cc1Swenshuai.xi         -572, // 84
1068*53ee8cc1Swenshuai.xi         -587, // 85
1069*53ee8cc1Swenshuai.xi         -601, // 86
1070*53ee8cc1Swenshuai.xi         -616, // 87
1071*53ee8cc1Swenshuai.xi         -630, // 88
1072*53ee8cc1Swenshuai.xi         -644, // 89
1073*53ee8cc1Swenshuai.xi         -658, // 90
1074*53ee8cc1Swenshuai.xi         -671, // 91
1075*53ee8cc1Swenshuai.xi         -685, // 92
1076*53ee8cc1Swenshuai.xi         -698, // 93
1077*53ee8cc1Swenshuai.xi         -711, // 94
1078*53ee8cc1Swenshuai.xi         -724, // 95
1079*53ee8cc1Swenshuai.xi         -736, // 96
1080*53ee8cc1Swenshuai.xi         -748, // 97
1081*53ee8cc1Swenshuai.xi         -760, // 98
1082*53ee8cc1Swenshuai.xi         -772, // 99
1083*53ee8cc1Swenshuai.xi         -784, // 100
1084*53ee8cc1Swenshuai.xi     };
1085*53ee8cc1Swenshuai.xi     if( u8Hue > 100 )
1086*53ee8cc1Swenshuai.xi         u8Hue = 100;
1087*53ee8cc1Swenshuai.xi     return tHueToSine[u8Hue];
1088*53ee8cc1Swenshuai.xi }
1089*53ee8cc1Swenshuai.xi // cos function
cosine(BYTE u8Hue)1090*53ee8cc1Swenshuai.xi static short cosine(BYTE u8Hue)
1091*53ee8cc1Swenshuai.xi {
1092*53ee8cc1Swenshuai.xi     code short tHueToCosine[] =
1093*53ee8cc1Swenshuai.xi     {
1094*53ee8cc1Swenshuai.xi         658, // 0
1095*53ee8cc1Swenshuai.xi         671, // 1
1096*53ee8cc1Swenshuai.xi         685, // 2
1097*53ee8cc1Swenshuai.xi         698, // 3
1098*53ee8cc1Swenshuai.xi         711, // 4
1099*53ee8cc1Swenshuai.xi         724, // 5
1100*53ee8cc1Swenshuai.xi         736, // 6
1101*53ee8cc1Swenshuai.xi         748, // 7
1102*53ee8cc1Swenshuai.xi         760, // 8
1103*53ee8cc1Swenshuai.xi         772, // 9
1104*53ee8cc1Swenshuai.xi         784, // 10
1105*53ee8cc1Swenshuai.xi         795, // 11
1106*53ee8cc1Swenshuai.xi         806, // 12
1107*53ee8cc1Swenshuai.xi         817, // 13
1108*53ee8cc1Swenshuai.xi         828, // 14
1109*53ee8cc1Swenshuai.xi         838, // 15
1110*53ee8cc1Swenshuai.xi         848, // 16
1111*53ee8cc1Swenshuai.xi         858, // 17
1112*53ee8cc1Swenshuai.xi         868, // 18
1113*53ee8cc1Swenshuai.xi         877, // 19
1114*53ee8cc1Swenshuai.xi         886, // 20
1115*53ee8cc1Swenshuai.xi         895, // 21
1116*53ee8cc1Swenshuai.xi         904, // 22
1117*53ee8cc1Swenshuai.xi         912, // 23
1118*53ee8cc1Swenshuai.xi         920, // 24
1119*53ee8cc1Swenshuai.xi         928, // 25
1120*53ee8cc1Swenshuai.xi         935, // 26
1121*53ee8cc1Swenshuai.xi         942, // 27
1122*53ee8cc1Swenshuai.xi         949, // 28
1123*53ee8cc1Swenshuai.xi         955, // 29
1124*53ee8cc1Swenshuai.xi         962, // 30
1125*53ee8cc1Swenshuai.xi         968, // 31
1126*53ee8cc1Swenshuai.xi         973, // 32
1127*53ee8cc1Swenshuai.xi         979, // 33
1128*53ee8cc1Swenshuai.xi         984, // 34
1129*53ee8cc1Swenshuai.xi         989, // 35
1130*53ee8cc1Swenshuai.xi         993, // 36
1131*53ee8cc1Swenshuai.xi         997, // 37
1132*53ee8cc1Swenshuai.xi         1001, // 38
1133*53ee8cc1Swenshuai.xi         1005, // 39
1134*53ee8cc1Swenshuai.xi         1008, // 40
1135*53ee8cc1Swenshuai.xi         1011, // 41
1136*53ee8cc1Swenshuai.xi         1014, // 42
1137*53ee8cc1Swenshuai.xi         1016, // 43
1138*53ee8cc1Swenshuai.xi         1018, // 44
1139*53ee8cc1Swenshuai.xi         1020, // 45
1140*53ee8cc1Swenshuai.xi         1021, // 46
1141*53ee8cc1Swenshuai.xi         1022, // 47
1142*53ee8cc1Swenshuai.xi         1023, // 48
1143*53ee8cc1Swenshuai.xi         1023, // 49
1144*53ee8cc1Swenshuai.xi         1024, // 50
1145*53ee8cc1Swenshuai.xi         1023, // 51
1146*53ee8cc1Swenshuai.xi         1023, // 52
1147*53ee8cc1Swenshuai.xi         1022, // 53
1148*53ee8cc1Swenshuai.xi         1021, // 54
1149*53ee8cc1Swenshuai.xi         1020, // 55
1150*53ee8cc1Swenshuai.xi         1018, // 56
1151*53ee8cc1Swenshuai.xi         1016, // 57
1152*53ee8cc1Swenshuai.xi         1014, // 58
1153*53ee8cc1Swenshuai.xi         1011, // 59
1154*53ee8cc1Swenshuai.xi         1008, // 60
1155*53ee8cc1Swenshuai.xi         1005, // 61
1156*53ee8cc1Swenshuai.xi         1001, // 62
1157*53ee8cc1Swenshuai.xi         997, // 63
1158*53ee8cc1Swenshuai.xi         993, // 64
1159*53ee8cc1Swenshuai.xi         989, // 65
1160*53ee8cc1Swenshuai.xi         984, // 66
1161*53ee8cc1Swenshuai.xi         979, // 67
1162*53ee8cc1Swenshuai.xi         973, // 68
1163*53ee8cc1Swenshuai.xi         968, // 69
1164*53ee8cc1Swenshuai.xi         962, // 70
1165*53ee8cc1Swenshuai.xi         955, // 71
1166*53ee8cc1Swenshuai.xi         949, // 72
1167*53ee8cc1Swenshuai.xi         942, // 73
1168*53ee8cc1Swenshuai.xi         935, // 74
1169*53ee8cc1Swenshuai.xi         928, // 75
1170*53ee8cc1Swenshuai.xi         920, // 76
1171*53ee8cc1Swenshuai.xi         912, // 77
1172*53ee8cc1Swenshuai.xi         904, // 78
1173*53ee8cc1Swenshuai.xi         895, // 79
1174*53ee8cc1Swenshuai.xi         886, // 80
1175*53ee8cc1Swenshuai.xi         877, // 81
1176*53ee8cc1Swenshuai.xi         868, // 82
1177*53ee8cc1Swenshuai.xi         858, // 83
1178*53ee8cc1Swenshuai.xi         848, // 84
1179*53ee8cc1Swenshuai.xi         838, // 85
1180*53ee8cc1Swenshuai.xi         828, // 86
1181*53ee8cc1Swenshuai.xi         817, // 87
1182*53ee8cc1Swenshuai.xi         806, // 88
1183*53ee8cc1Swenshuai.xi         795, // 89
1184*53ee8cc1Swenshuai.xi         784, // 90
1185*53ee8cc1Swenshuai.xi         772, // 91
1186*53ee8cc1Swenshuai.xi         760, // 92
1187*53ee8cc1Swenshuai.xi         748, // 93
1188*53ee8cc1Swenshuai.xi         736, // 94
1189*53ee8cc1Swenshuai.xi         724, // 95
1190*53ee8cc1Swenshuai.xi         711, // 96
1191*53ee8cc1Swenshuai.xi         698, // 97
1192*53ee8cc1Swenshuai.xi         685, // 98
1193*53ee8cc1Swenshuai.xi         671, // 99
1194*53ee8cc1Swenshuai.xi         658, // 100
1195*53ee8cc1Swenshuai.xi     };
1196*53ee8cc1Swenshuai.xi     if( u8Hue > 100 )
1197*53ee8cc1Swenshuai.xi         u8Hue = 100;
1198*53ee8cc1Swenshuai.xi     return tHueToCosine[u8Hue];
1199*53ee8cc1Swenshuai.xi }
1200*53ee8cc1Swenshuai.xi 
1201*53ee8cc1Swenshuai.xi #else
1202*53ee8cc1Swenshuai.xi 
1203*53ee8cc1Swenshuai.xi #define PI  (3.14159265358979323846)
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi #if( USE_ACE_INTERNAL_SIN_COS ) // Use user define
_ACE_sin(double f0)1206*53ee8cc1Swenshuai.xi static double _ACE_sin( double f0)
1207*53ee8cc1Swenshuai.xi {
1208*53ee8cc1Swenshuai.xi     double  f2, f4;
1209*53ee8cc1Swenshuai.xi     int     r0;
1210*53ee8cc1Swenshuai.xi 
1211*53ee8cc1Swenshuai.xi     f0 *= 6.3661977236758134e-01;
1212*53ee8cc1Swenshuai.xi     if (f0 < 0)
1213*53ee8cc1Swenshuai.xi     {
1214*53ee8cc1Swenshuai.xi         if (f0 < -1073741824.0)
1215*53ee8cc1Swenshuai.xi         {
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi             if (f0 < -1.0e+18)
1218*53ee8cc1Swenshuai.xi                     f0 = 0;
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi             f0 /= 1073741824.0;
1221*53ee8cc1Swenshuai.xi             r0 = (int)f0;
1222*53ee8cc1Swenshuai.xi 
1223*53ee8cc1Swenshuai.xi             f2 = (double) r0;
1224*53ee8cc1Swenshuai.xi             f0 -= f2;
1225*53ee8cc1Swenshuai.xi             f0 *= 1073741824.0;
1226*53ee8cc1Swenshuai.xi         }
1227*53ee8cc1Swenshuai.xi 
1228*53ee8cc1Swenshuai.xi         f2 = f0;
1229*53ee8cc1Swenshuai.xi         f2 -= 0.5;
1230*53ee8cc1Swenshuai.xi     }
1231*53ee8cc1Swenshuai.xi     else
1232*53ee8cc1Swenshuai.xi     {
1233*53ee8cc1Swenshuai.xi         if (f0 >= 1073741824.0)
1234*53ee8cc1Swenshuai.xi         {
1235*53ee8cc1Swenshuai.xi             if (f0 > 1.0e+18)
1236*53ee8cc1Swenshuai.xi                 f0 = 0;
1237*53ee8cc1Swenshuai.xi             f0 /= 1073741824.0;
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi             r0 = f0;
1240*53ee8cc1Swenshuai.xi             f2 = (double) r0;
1241*53ee8cc1Swenshuai.xi             f0 -= f2;
1242*53ee8cc1Swenshuai.xi             f0 *= 1073741824.0;
1243*53ee8cc1Swenshuai.xi         }
1244*53ee8cc1Swenshuai.xi 
1245*53ee8cc1Swenshuai.xi         f2 = f0;
1246*53ee8cc1Swenshuai.xi         f2 += 0.5;
1247*53ee8cc1Swenshuai.xi     }
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi     r0 = (int) f2;
1250*53ee8cc1Swenshuai.xi     f2 = (double) r0;
1251*53ee8cc1Swenshuai.xi     f0 -= f2;
1252*53ee8cc1Swenshuai.xi     if (r0 & 1)
1253*53ee8cc1Swenshuai.xi     {
1254*53ee8cc1Swenshuai.xi         f0 *= f0;
1255*53ee8cc1Swenshuai.xi         f2 = 6.5659631149794723e-11;
1256*53ee8cc1Swenshuai.xi         f2 *= f0;
1257*53ee8cc1Swenshuai.xi         f2 += -6.3866030837918522e-09;
1258*53ee8cc1Swenshuai.xi         f2 *= f0;
1259*53ee8cc1Swenshuai.xi         f2 += 4.7108747788181715e-07;
1260*53ee8cc1Swenshuai.xi         f2 *= f0;
1261*53ee8cc1Swenshuai.xi         f2 += -2.5202042373060605e-05;
1262*53ee8cc1Swenshuai.xi         f2 *= f0;
1263*53ee8cc1Swenshuai.xi         f2 += 9.1926027483942659e-04;
1264*53ee8cc1Swenshuai.xi         f2 *= f0;
1265*53ee8cc1Swenshuai.xi         f2 += -2.0863480763352961e-02;
1266*53ee8cc1Swenshuai.xi         f2 *= f0;
1267*53ee8cc1Swenshuai.xi         f2 += 2.5366950790104802e-01;
1268*53ee8cc1Swenshuai.xi         f2 *= f0;
1269*53ee8cc1Swenshuai.xi         f2 += -1.2337005501361698e+00;
1270*53ee8cc1Swenshuai.xi         f0 *= f2;
1271*53ee8cc1Swenshuai.xi         f0 += 1.0;
1272*53ee8cc1Swenshuai.xi     }
1273*53ee8cc1Swenshuai.xi     else
1274*53ee8cc1Swenshuai.xi     {
1275*53ee8cc1Swenshuai.xi         f4 = f0;
1276*53ee8cc1Swenshuai.xi         f0 *= f0;
1277*53ee8cc1Swenshuai.xi         f2 = -6.6880351098114673e-10;
1278*53ee8cc1Swenshuai.xi         f2 *= f0;
1279*53ee8cc1Swenshuai.xi         f2 += 5.6921729219679268e-08;
1280*53ee8cc1Swenshuai.xi         f2 *= f0;
1281*53ee8cc1Swenshuai.xi         f2 += -3.5988432352120853e-06;
1282*53ee8cc1Swenshuai.xi         f2 *= f0;
1283*53ee8cc1Swenshuai.xi         f2 += 1.6044118478735982e-04;
1284*53ee8cc1Swenshuai.xi         f2 *= f0;
1285*53ee8cc1Swenshuai.xi         f2 += -4.6817541353186881e-03;
1286*53ee8cc1Swenshuai.xi         f2 *= f0;
1287*53ee8cc1Swenshuai.xi         f2 += 7.9692626246167046e-02;
1288*53ee8cc1Swenshuai.xi         f2 *= f0;
1289*53ee8cc1Swenshuai.xi         f2 += -6.4596409750624625e-01;
1290*53ee8cc1Swenshuai.xi         f0 *= f2;
1291*53ee8cc1Swenshuai.xi         f0 += 1.5707963267948966e+00;
1292*53ee8cc1Swenshuai.xi         f0 *= f4;
1293*53ee8cc1Swenshuai.xi     }
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi     if (r0 & 2)
1296*53ee8cc1Swenshuai.xi       f0 = -f0;
1297*53ee8cc1Swenshuai.xi 
1298*53ee8cc1Swenshuai.xi     return(f0);
1299*53ee8cc1Swenshuai.xi }
1300*53ee8cc1Swenshuai.xi 
_ACE_cos(double f0)1301*53ee8cc1Swenshuai.xi static double _ACE_cos(double f0)
1302*53ee8cc1Swenshuai.xi {
1303*53ee8cc1Swenshuai.xi     double f2,f4;
1304*53ee8cc1Swenshuai.xi     int r0;
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi     f0 *= 6.3661977236758134e-01;
1307*53ee8cc1Swenshuai.xi     if (f0 < 0)
1308*53ee8cc1Swenshuai.xi       f0 = -f0;
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi     if (f0 > 1073741824.0)
1311*53ee8cc1Swenshuai.xi     {
1312*53ee8cc1Swenshuai.xi         if (f0 > 1.0e+18)
1313*53ee8cc1Swenshuai.xi             f0 = 0;
1314*53ee8cc1Swenshuai.xi 
1315*53ee8cc1Swenshuai.xi         f0 /= 1073741824.0;
1316*53ee8cc1Swenshuai.xi         r0 = f0;
1317*53ee8cc1Swenshuai.xi         f0 = (double) r0;
1318*53ee8cc1Swenshuai.xi         f0 -= f2;
1319*53ee8cc1Swenshuai.xi         f0 *= 1073741824.0;
1320*53ee8cc1Swenshuai.xi     }
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi     f2 = f0;
1323*53ee8cc1Swenshuai.xi     f0 += 0.5;
1324*53ee8cc1Swenshuai.xi     r0 = (int)f0;
1325*53ee8cc1Swenshuai.xi     f0 = (double) r0;
1326*53ee8cc1Swenshuai.xi     f0 -= f2;
1327*53ee8cc1Swenshuai.xi 
1328*53ee8cc1Swenshuai.xi     if (r0 & 1)
1329*53ee8cc1Swenshuai.xi     {
1330*53ee8cc1Swenshuai.xi         f4 = f0;
1331*53ee8cc1Swenshuai.xi         f0 *= f0;
1332*53ee8cc1Swenshuai.xi         f2 = -6.6880351098114673e-10;
1333*53ee8cc1Swenshuai.xi         f2 *= f0;
1334*53ee8cc1Swenshuai.xi         f2 += 5.6921729219679268e-08;
1335*53ee8cc1Swenshuai.xi         f2 *= f0;
1336*53ee8cc1Swenshuai.xi         f2 += -3.5988432352120853e-06;
1337*53ee8cc1Swenshuai.xi         f2 *= f0;
1338*53ee8cc1Swenshuai.xi         f2 += 1.6044118478735982e-04;
1339*53ee8cc1Swenshuai.xi         f2 *= f0;
1340*53ee8cc1Swenshuai.xi         f2 += -4.6817541353186881e-03;
1341*53ee8cc1Swenshuai.xi         f2 *= f0;
1342*53ee8cc1Swenshuai.xi         f2 += 7.9692626246167046e-02;
1343*53ee8cc1Swenshuai.xi         f2 *= f0;
1344*53ee8cc1Swenshuai.xi         f2 += -6.4596409750624625e-01;
1345*53ee8cc1Swenshuai.xi         f0 *= f2;
1346*53ee8cc1Swenshuai.xi         f0 += 1.5707963267948966e+00;
1347*53ee8cc1Swenshuai.xi         f0 *= f4;
1348*53ee8cc1Swenshuai.xi     }
1349*53ee8cc1Swenshuai.xi     else
1350*53ee8cc1Swenshuai.xi     {
1351*53ee8cc1Swenshuai.xi         f0 *= f0;
1352*53ee8cc1Swenshuai.xi         f2 = 6.5659631149794723e-11;
1353*53ee8cc1Swenshuai.xi         f2 *= f0;
1354*53ee8cc1Swenshuai.xi         f2 += -6.3866030837918522e-09;
1355*53ee8cc1Swenshuai.xi         f2 *= f0;
1356*53ee8cc1Swenshuai.xi         f2 += 4.7108747788181715e-07;
1357*53ee8cc1Swenshuai.xi         f2 *= f0;
1358*53ee8cc1Swenshuai.xi         f2 += -2.5202042373060605e-05;
1359*53ee8cc1Swenshuai.xi         f2 *= f0;
1360*53ee8cc1Swenshuai.xi         f2 += 9.1926027483942659e-04;
1361*53ee8cc1Swenshuai.xi         f2 *= f0;
1362*53ee8cc1Swenshuai.xi         f2 += -2.0863480763352961e-02;
1363*53ee8cc1Swenshuai.xi         f2 *= f0;
1364*53ee8cc1Swenshuai.xi         f2 += 2.5366950790104802e-01;
1365*53ee8cc1Swenshuai.xi         f2 *= f0;
1366*53ee8cc1Swenshuai.xi         f2 += -1.2337005501361698e+00;
1367*53ee8cc1Swenshuai.xi         f0 *= f2;
1368*53ee8cc1Swenshuai.xi         f0 += 1.0;
1369*53ee8cc1Swenshuai.xi     }
1370*53ee8cc1Swenshuai.xi 
1371*53ee8cc1Swenshuai.xi     if (r0 & 2)
1372*53ee8cc1Swenshuai.xi         f0 = -f0;
1373*53ee8cc1Swenshuai.xi 
1374*53ee8cc1Swenshuai.xi     return(f0);
1375*53ee8cc1Swenshuai.xi }
1376*53ee8cc1Swenshuai.xi #define sin     _ACE_sin
1377*53ee8cc1Swenshuai.xi #define cos     _ACE_cos
1378*53ee8cc1Swenshuai.xi 
1379*53ee8cc1Swenshuai.xi #endif
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi //#define PI  (3.14159265)
1382*53ee8cc1Swenshuai.xi // sin function
sine(WORD u16Hue)1383*53ee8cc1Swenshuai.xi static short sine(WORD u16Hue)
1384*53ee8cc1Swenshuai.xi {
1385*53ee8cc1Swenshuai.xi     return (short)(sin((u16Hue * PI) / 180.) * 1024.);
1386*53ee8cc1Swenshuai.xi }
1387*53ee8cc1Swenshuai.xi // cos function
cosine(WORD u16Hue)1388*53ee8cc1Swenshuai.xi static short cosine(WORD u16Hue)
1389*53ee8cc1Swenshuai.xi {
1390*53ee8cc1Swenshuai.xi     return (short)(cos((u16Hue * PI) / 180.) * 1024.);
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi #endif
1393*53ee8cc1Swenshuai.xi 
SetVideoSatHueMatrix(void * pInstance,BOOL bWindow)1394*53ee8cc1Swenshuai.xi static void SetVideoSatHueMatrix(void *pInstance, BOOL bWindow )
1395*53ee8cc1Swenshuai.xi {
1396*53ee8cc1Swenshuai.xi     short sTmp;
1397*53ee8cc1Swenshuai.xi     WORD u16Hue;
1398*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi #if( ENABLE_SINE_COSINE_USING_LOOKUP_TABLE )
1401*53ee8cc1Swenshuai.xi     u16Hue = s_AceInfo[bWindow].ucHue;
1402*53ee8cc1Swenshuai.xi #else
1403*53ee8cc1Swenshuai.xi     u16Hue = ((s_AceInfo[bWindow].ucHue <= 50) ? (50 - s_AceInfo[bWindow].ucHue) : (360-(s_AceInfo[bWindow].ucHue-50)));
1404*53ee8cc1Swenshuai.xi #endif
1405*53ee8cc1Swenshuai.xi 
1406*53ee8cc1Swenshuai.xi     sTmp = ((short)s_AceInfo[bWindow].ucSaturation * 8);
1407*53ee8cc1Swenshuai.xi 
1408*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[2][2] = ((((long)cosine(u16Hue) * sTmp))>>10);
1409*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[0][0] = ((( (long)cosine(u16Hue)* sTmp))>>10);
1410*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[2][0] = ((((long)sine(u16Hue)   * sTmp))>>10);
1411*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[0][2] = (((-(long)sine(u16Hue)  * sTmp))>>10);
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[1][1] = 1024;
1414*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sVideoSatHueMatrix[0][1] = s_AceInfo[bWindow].sVideoSatHueMatrix[1][0] = s_AceInfo[bWindow].sVideoSatHueMatrix[1][2] = s_AceInfo[bWindow].sVideoSatHueMatrix[2][1] = 0;
1415*53ee8cc1Swenshuai.xi }
1416*53ee8cc1Swenshuai.xi 
SetVideoContrastMatrix(void * pInstance,BOOL bWindow)1417*53ee8cc1Swenshuai.xi static void SetVideoContrastMatrix(void *pInstance, BOOL bWindow )
1418*53ee8cc1Swenshuai.xi {
1419*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1420*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[0][0] = ( (DWORD)s_AceInfo[bWindow].wRCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1421*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[1][1] = ( (DWORD)s_AceInfo[bWindow].wGCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1422*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[2][2] = ( (DWORD)s_AceInfo[bWindow].wBCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1423*53ee8cc1Swenshuai.xi }
1424*53ee8cc1Swenshuai.xi 
ArrayMultiply(short sFirst[3][3],short sSecond[3][3],short sResult[3][3])1425*53ee8cc1Swenshuai.xi static void ArrayMultiply(short sFirst[3][3], short sSecond[3][3], short sResult[3][3])
1426*53ee8cc1Swenshuai.xi {
1427*53ee8cc1Swenshuai.xi     BYTE ucRow, ucCol;
1428*53ee8cc1Swenshuai.xi 
1429*53ee8cc1Swenshuai.xi     //go line by line
1430*53ee8cc1Swenshuai.xi     for(ucRow=0; ucRow!=3; ucRow++)
1431*53ee8cc1Swenshuai.xi     {
1432*53ee8cc1Swenshuai.xi         // go column by column
1433*53ee8cc1Swenshuai.xi         for(ucCol=0; ucCol!=3; ucCol++)
1434*53ee8cc1Swenshuai.xi         {
1435*53ee8cc1Swenshuai.xi             sResult[ucRow][ucCol] = (((long)sFirst[ucRow][0] * sSecond[0][ucCol]) +
1436*53ee8cc1Swenshuai.xi                                      ((long)sFirst[ucRow][1] * sSecond[1][ucCol]) +
1437*53ee8cc1Swenshuai.xi                                      ((long)sFirst[ucRow][2] * sSecond[2][ucCol])) >> 10;
1438*53ee8cc1Swenshuai.xi         } // for
1439*53ee8cc1Swenshuai.xi     } // for
1440*53ee8cc1Swenshuai.xi }
1441*53ee8cc1Swenshuai.xi 
msWriteColorMatrix(void * pInstance,BOOL bWindow,short * psMatrix)1442*53ee8cc1Swenshuai.xi static void msWriteColorMatrix(void *pInstance, BOOL bWindow, short* psMatrix )
1443*53ee8cc1Swenshuai.xi {
1444*53ee8cc1Swenshuai.xi #if defined(UFO_XC_HDR) && defined(UFO_XC_HDR_VERSION) && (UFO_XC_HDR_VERSION == 2) && !defined(ACE_NOT_IN_KERNEL)
1445*53ee8cc1Swenshuai.xi #else
1446*53ee8cc1Swenshuai.xi     BYTE i,j;
1447*53ee8cc1Swenshuai.xi     BYTE ucAddr;
1448*53ee8cc1Swenshuai.xi     short sTmp;
1449*53ee8cc1Swenshuai.xi     _ACE_GET_INST_PRIVATE();
1450*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi     BACKUP_SC_BANK
1453*53ee8cc1Swenshuai.xi     if( bWindow == MAIN_WINDOW )
1454*53ee8cc1Swenshuai.xi     {
1455*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_MAIN);
1456*53ee8cc1Swenshuai.xi         ucAddr = REG_ADDR_CM_MAIN&0xFF;
1457*53ee8cc1Swenshuai.xi     }
1458*53ee8cc1Swenshuai.xi     else
1459*53ee8cc1Swenshuai.xi     {
1460*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_SUB);
1461*53ee8cc1Swenshuai.xi         ucAddr = REG_ADDR_CM_SUB&0xFF;
1462*53ee8cc1Swenshuai.xi     }
1463*53ee8cc1Swenshuai.xi 
1464*53ee8cc1Swenshuai.xi     for(i=0; i!=3; i++)
1465*53ee8cc1Swenshuai.xi     {
1466*53ee8cc1Swenshuai.xi         for(j=0; j!=3; j++)
1467*53ee8cc1Swenshuai.xi         {
1468*53ee8cc1Swenshuai.xi             sTmp = psMatrix[i*3+j];
1469*53ee8cc1Swenshuai.xi             if( sTmp >= 0 )
1470*53ee8cc1Swenshuai.xi             {
1471*53ee8cc1Swenshuai.xi                 if( sTmp > 0xfff )
1472*53ee8cc1Swenshuai.xi                 {
1473*53ee8cc1Swenshuai.xi                     sTmp = 0xfff;
1474*53ee8cc1Swenshuai.xi                 }
1475*53ee8cc1Swenshuai.xi                 //SC_WRITE_2BYTE( ucAddr, sTmp );
1476*53ee8cc1Swenshuai.xi             }
1477*53ee8cc1Swenshuai.xi             else
1478*53ee8cc1Swenshuai.xi             {
1479*53ee8cc1Swenshuai.xi                 sTmp = sTmp * -1;
1480*53ee8cc1Swenshuai.xi                 if( sTmp > 0xfff )
1481*53ee8cc1Swenshuai.xi                 {
1482*53ee8cc1Swenshuai.xi                     sTmp = 0xfff;
1483*53ee8cc1Swenshuai.xi                 }
1484*53ee8cc1Swenshuai.xi                 #ifdef USE_NEW_ACE_MATRIX_RULE
1485*53ee8cc1Swenshuai.xi                     sTmp = ~sTmp +1;
1486*53ee8cc1Swenshuai.xi                 #else
1487*53ee8cc1Swenshuai.xi                 sTmp |= 0x1000;
1488*53ee8cc1Swenshuai.xi                 #endif
1489*53ee8cc1Swenshuai.xi 
1490*53ee8cc1Swenshuai.xi                 //SC_WRITE_2BYTE( ucAddr, sTmp );
1491*53ee8cc1Swenshuai.xi             }
1492*53ee8cc1Swenshuai.xi             ACE_WRITE_CM(psACEInstPri->u32DeviceID, ucAddr, sTmp );
1493*53ee8cc1Swenshuai.xi 
1494*53ee8cc1Swenshuai.xi             ucAddr += 2;
1495*53ee8cc1Swenshuai.xi         } // for
1496*53ee8cc1Swenshuai.xi     } // for
1497*53ee8cc1Swenshuai.xi 
1498*53ee8cc1Swenshuai.xi     RECOVER_SC_BANK
1499*53ee8cc1Swenshuai.xi #endif
1500*53ee8cc1Swenshuai.xi }
1501*53ee8cc1Swenshuai.xi 
msSetVideoColorMatrix(void * pInstance,BOOL bScalerWin)1502*53ee8cc1Swenshuai.xi void msSetVideoColorMatrix(void *pInstance, BOOL bScalerWin )
1503*53ee8cc1Swenshuai.xi {
1504*53ee8cc1Swenshuai.xi     short sResultTmp1[3][3];
1505*53ee8cc1Swenshuai.xi     short sResultTmp2[3][3];
1506*53ee8cc1Swenshuai.xi     short* psLastResult;
1507*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
1508*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1509*53ee8cc1Swenshuai.xi 
1510*53ee8cc1Swenshuai.xi     U8 i,j;
1511*53ee8cc1Swenshuai.xi     short ColorMatrix_1[3][3];
1512*53ee8cc1Swenshuai.xi     short ColorMatrix_2[3][3];
1513*53ee8cc1Swenshuai.xi 
1514*53ee8cc1Swenshuai.xi     if( TRUE == bBypassColorMatrix)
1515*53ee8cc1Swenshuai.xi     {
1516*53ee8cc1Swenshuai.xi         return ;
1517*53ee8cc1Swenshuai.xi     }
1518*53ee8cc1Swenshuai.xi 
1519*53ee8cc1Swenshuai.xi     BACKUP_SC_BANK
1520*53ee8cc1Swenshuai.xi 
1521*53ee8cc1Swenshuai.xi 
1522*53ee8cc1Swenshuai.xi     // Adjust hue&saturation, and then YUV to RGB
1523*53ee8cc1Swenshuai.xi     //ArrayMultiply( (Typ3x3Array)(s_AceInfo[bScalerWin].psYVUtoRGBMatrix), s_AceInfo[bScalerWin].sVideoSatHueMatrix, sResultTmp1 );
1524*53ee8cc1Swenshuai.xi 
1525*53ee8cc1Swenshuai.xi         for ( i=0;i<3;i++ )
1526*53ee8cc1Swenshuai.xi         {
1527*53ee8cc1Swenshuai.xi             for ( j=0;j<3;j++ )
1528*53ee8cc1Swenshuai.xi             {
1529*53ee8cc1Swenshuai.xi                ColorMatrix_1[i][j]=*(s_AceInfo[bScalerWin].psYVUtoRGBMatrix +(i*3)+j);;
1530*53ee8cc1Swenshuai.xi                ColorMatrix_2[i][j]= s_AceInfo[bScalerWin].sVideoSatHueMatrix[i][j];
1531*53ee8cc1Swenshuai.xi             }
1532*53ee8cc1Swenshuai.xi         }
1533*53ee8cc1Swenshuai.xi        ArrayMultiply(ColorMatrix_1,ColorMatrix_2, sResultTmp1 );
1534*53ee8cc1Swenshuai.xi 
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi 
1537*53ee8cc1Swenshuai.xi 
1538*53ee8cc1Swenshuai.xi     // Do color correction
1539*53ee8cc1Swenshuai.xi     if(( NULL != s_AceInfo[bScalerWin].psColorCorrectionMatrix )&&(DISABLE==g_ACEinitParameters.bHDREnable))
1540*53ee8cc1Swenshuai.xi     {
1541*53ee8cc1Swenshuai.xi       // ArrayMultiply( (Typ3x3Array)(s_AceInfo[bScalerWin].psColorCorrectionMatrix), sResultTmp1, sResultTmp2 );
1542*53ee8cc1Swenshuai.xi         for ( i=0;i<3;i++ )
1543*53ee8cc1Swenshuai.xi         {
1544*53ee8cc1Swenshuai.xi             for ( j=0;j<3;j++ )
1545*53ee8cc1Swenshuai.xi             {
1546*53ee8cc1Swenshuai.xi                ColorMatrix_1[i][j]=*(s_AceInfo[bScalerWin].psColorCorrectionMatrix +(i*3)+j);
1547*53ee8cc1Swenshuai.xi             }
1548*53ee8cc1Swenshuai.xi          }
1549*53ee8cc1Swenshuai.xi          ArrayMultiply( ColorMatrix_1, sResultTmp1, sResultTmp2 );
1550*53ee8cc1Swenshuai.xi 
1551*53ee8cc1Swenshuai.xi 
1552*53ee8cc1Swenshuai.xi         // Adjust contrast-RGB
1553*53ee8cc1Swenshuai.xi         ArrayMultiply( s_AceInfo[bScalerWin].sContrastRGBMatrix, sResultTmp2, sResultTmp1 );
1554*53ee8cc1Swenshuai.xi 
1555*53ee8cc1Swenshuai.xi         psLastResult = (short*)sResultTmp1;
1556*53ee8cc1Swenshuai.xi     }
1557*53ee8cc1Swenshuai.xi     else // No color correction
1558*53ee8cc1Swenshuai.xi     {
1559*53ee8cc1Swenshuai.xi         // Adjust contrast-RGB
1560*53ee8cc1Swenshuai.xi         ArrayMultiply( s_AceInfo[bScalerWin].sContrastRGBMatrix, sResultTmp1, sResultTmp2 );
1561*53ee8cc1Swenshuai.xi         psLastResult = (short*)sResultTmp2;
1562*53ee8cc1Swenshuai.xi     }
1563*53ee8cc1Swenshuai.xi     if (MDrv_ACE_IsSupportMLoad(pInstance) && (!MDrv_ACE_GetSkipWaitVsync(pInstance, bScalerWin)))
1564*53ee8cc1Swenshuai.xi     {
1565*53ee8cc1Swenshuai.xi         MDrv_ACE_WriteColorMatrixBurst(pInstance, bScalerWin, (MS_U16*)psLastResult );
1566*53ee8cc1Swenshuai.xi     }
1567*53ee8cc1Swenshuai.xi     else
1568*53ee8cc1Swenshuai.xi     {
1569*53ee8cc1Swenshuai.xi         msWriteColorMatrix(pInstance, bScalerWin, psLastResult );
1570*53ee8cc1Swenshuai.xi     }
1571*53ee8cc1Swenshuai.xi 
1572*53ee8cc1Swenshuai.xi #if defined(UFO_XC_HDR) && defined(UFO_XC_HDR_VERSION) && (UFO_XC_HDR_VERSION == 2) && !defined(ACE_NOT_IN_KERNEL)
1573*53ee8cc1Swenshuai.xi #else
1574*53ee8cc1Swenshuai.xi     if( bScalerWin == MAIN_WINDOW )
1575*53ee8cc1Swenshuai.xi     {
1576*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_MAIN);
1577*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_MAIN, ENABLE_CM_CTL1, MASK_CM_CTL ); // Enable color matrix&Change R/B range
1578*53ee8cc1Swenshuai.xi         //ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_MAIN, 0x35, MASK_CM_CTL ); // Enable color matrix&Change R/B range
1579*53ee8cc1Swenshuai.xi     }
1580*53ee8cc1Swenshuai.xi     else // Sub window
1581*53ee8cc1Swenshuai.xi     {
1582*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_SUB);
1583*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_SUB, ENABLE_CM_CTL1, MASK_CM_CTL ); // Enable color matrix&Change R/B range
1584*53ee8cc1Swenshuai.xi         //ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_SUB, 0x35, MASK_CM_CTL ); // Enable color matrix&Change R/B range
1585*53ee8cc1Swenshuai.xi     }
1586*53ee8cc1Swenshuai.xi #endif
1587*53ee8cc1Swenshuai.xi 
1588*53ee8cc1Swenshuai.xi     RECOVER_SC_BANK
1589*53ee8cc1Swenshuai.xi }
1590*53ee8cc1Swenshuai.xi 
msAdjustHSC(void * pInstance,BOOL bScalerWin,BYTE ucHue,BYTE ucSaturation,BYTE ucContrast)1591*53ee8cc1Swenshuai.xi void msAdjustHSC(void *pInstance, BOOL bScalerWin, BYTE ucHue, BYTE ucSaturation, BYTE ucContrast)
1592*53ee8cc1Swenshuai.xi {
1593*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1594*53ee8cc1Swenshuai.xi 
1595*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].ucSaturation = ucSaturation;
1596*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wContrast = (WORD)ucContrast<<3;
1597*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].ucHue = ucHue;
1598*53ee8cc1Swenshuai.xi     SetVideoSatHueMatrix(pInstance, bScalerWin );
1599*53ee8cc1Swenshuai.xi     SetVideoContrastMatrix(pInstance, bScalerWin );
1600*53ee8cc1Swenshuai.xi 
1601*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin );
1602*53ee8cc1Swenshuai.xi }
1603*53ee8cc1Swenshuai.xi 
msAdjustCFDOSDInfo(void * pInstance,BOOL bScalerWin)1604*53ee8cc1Swenshuai.xi MS_BOOL msAdjustCFDOSDInfo(void *pInstance, BOOL bScalerWin)
1605*53ee8cc1Swenshuai.xi {
1606*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1607*53ee8cc1Swenshuai.xi 
1608*53ee8cc1Swenshuai.xi     if(psACEInstPri->u32DeviceID == 1)
1609*53ee8cc1Swenshuai.xi     {
1610*53ee8cc1Swenshuai.xi         printf("STB CFD not support SC1 3x3 matrix now!!!!\n");
1611*53ee8cc1Swenshuai.xi         return FALSE;
1612*53ee8cc1Swenshuai.xi     }
1613*53ee8cc1Swenshuai.xi 
1614*53ee8cc1Swenshuai.xi     ST_ACE_CFD_OSD_CONTROL stAceOSDControl;
1615*53ee8cc1Swenshuai.xi     memset(&stAceOSDControl, 0, sizeof(ST_ACE_CFD_OSD_CONTROL));
1616*53ee8cc1Swenshuai.xi     stAceOSDControl.u32Version = ACE_OSD_CONTROL_VERSION;
1617*53ee8cc1Swenshuai.xi     stAceOSDControl.u16Length = sizeof(ST_ACE_CFD_OSD_CONTROL);
1618*53ee8cc1Swenshuai.xi     stAceOSDControl.bContrastValid = TRUE;
1619*53ee8cc1Swenshuai.xi     stAceOSDControl.u16Contrast = s_AceInfo[bScalerWin].wContrast;
1620*53ee8cc1Swenshuai.xi     stAceOSDControl.bHueValid = TRUE;
1621*53ee8cc1Swenshuai.xi     stAceOSDControl.u16Hue = s_AceInfo[bScalerWin].ucHue;
1622*53ee8cc1Swenshuai.xi     stAceOSDControl.bSaturationValid = TRUE;
1623*53ee8cc1Swenshuai.xi     stAceOSDControl.u16Saturation = s_AceInfo[bScalerWin].ucSaturation;
1624*53ee8cc1Swenshuai.xi     if(s_AceInfo[bScalerWin].psYVUtoRGBMatrix != NULL)
1625*53ee8cc1Swenshuai.xi     {
1626*53ee8cc1Swenshuai.xi         stAceOSDControl.bYVUtoRGBMatrixValid = TRUE;
1627*53ee8cc1Swenshuai.xi         memcpy(stAceOSDControl.s16YVUtoRGBMatrix, s_AceInfo[bScalerWin].psYVUtoRGBMatrix, sizeof(short)*9);
1628*53ee8cc1Swenshuai.xi     }
1629*53ee8cc1Swenshuai.xi     stAceOSDControl.bR = TRUE;
1630*53ee8cc1Swenshuai.xi     stAceOSDControl.bG = TRUE;
1631*53ee8cc1Swenshuai.xi     stAceOSDControl.bB = TRUE;
1632*53ee8cc1Swenshuai.xi     stAceOSDControl.u16R = s_AceInfo[bScalerWin].wRCon;
1633*53ee8cc1Swenshuai.xi     stAceOSDControl.u16G = s_AceInfo[bScalerWin].wGCon;
1634*53ee8cc1Swenshuai.xi     stAceOSDControl.u16B = s_AceInfo[bScalerWin].wBCon;
1635*53ee8cc1Swenshuai.xi     stAceOSDControl.u8OSDUIEn = 1;
1636*53ee8cc1Swenshuai.xi     stAceOSDControl.u8OSDUIMode = 1;
1637*53ee8cc1Swenshuai.xi     stAceOSDControl.u8Win = (bScalerWin==TRUE)?1:0;
1638*53ee8cc1Swenshuai.xi 
1639*53ee8cc1Swenshuai.xi     ST_KDRV_XC_CFD_CONTROL_INFO stCFDCtrlInfo;
1640*53ee8cc1Swenshuai.xi     memset(&stCFDCtrlInfo, 0, sizeof(ST_KDRV_XC_CFD_CONTROL_INFO));
1641*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.enCtrlType = E_KDRV_XC_CFD_CTRL_SET_OSD;
1642*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.pParam = &stAceOSDControl;
1643*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.u32ParamLen = sizeof(ST_ACE_CFD_OSD_CONTROL);
1644*53ee8cc1Swenshuai.xi #ifdef UFO_XC_HDR
1645*53ee8cc1Swenshuai.xi #if (UFO_XC_HDR_VERSION == 2)
1646*53ee8cc1Swenshuai.xi //_s32FdScaler only defined by UFO_XC_HDR_VERSION == 2
1647*53ee8cc1Swenshuai.xi #if (defined MSOS_TYPE_LINUX) || (defined ANDROID)
1648*53ee8cc1Swenshuai.xi     if(0 > _s32FdScaler)
1649*53ee8cc1Swenshuai.xi     {
1650*53ee8cc1Swenshuai.xi         _s32FdScaler = open("/dev/scaler", O_RDWR);
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi         if(0 > _s32FdScaler)
1653*53ee8cc1Swenshuai.xi         {
1654*53ee8cc1Swenshuai.xi             printf("Scaler device not opened!!!!\n");
1655*53ee8cc1Swenshuai.xi             return FALSE;
1656*53ee8cc1Swenshuai.xi         }
1657*53ee8cc1Swenshuai.xi     }
1658*53ee8cc1Swenshuai.xi 
1659*53ee8cc1Swenshuai.xi     if (ioctl(_s32FdScaler, MDRV_XC_IOC_CFDCONCTRL, &stCFDCtrlInfo))
1660*53ee8cc1Swenshuai.xi     {
1661*53ee8cc1Swenshuai.xi         printf("MDRV_XC_IOC_CFDCONCTRL OSD fail!!!!\n");
1662*53ee8cc1Swenshuai.xi         return FALSE;
1663*53ee8cc1Swenshuai.xi     }
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi     if (stCFDCtrlInfo.u16ErrCode != 0)
1666*53ee8cc1Swenshuai.xi     {
1667*53ee8cc1Swenshuai.xi         printf("MDRV_XC_IOC_CFDCONCTRL OSD fail, errCode: %d\n", stCFDCtrlInfo.u16ErrCode);
1668*53ee8cc1Swenshuai.xi     }
1669*53ee8cc1Swenshuai.xi 
1670*53ee8cc1Swenshuai.xi     ST_ACE_CFD_FIRE_CONTROL stAceCfdFire;
1671*53ee8cc1Swenshuai.xi     memset(&stAceCfdFire, 0, sizeof(ST_ACE_CFD_FIRE_CONTROL));
1672*53ee8cc1Swenshuai.xi     stAceCfdFire.u32Version = 0;
1673*53ee8cc1Swenshuai.xi     stAceCfdFire.u16Length = sizeof(ST_ACE_CFD_FIRE_CONTROL);
1674*53ee8cc1Swenshuai.xi     stAceCfdFire.u8UpdateType = E_XC_CFD_UPDATE_TYPE_OSD_ONLY;
1675*53ee8cc1Swenshuai.xi     stAceCfdFire.u8Win = bScalerWin;
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.enCtrlType = E_KDRV_XC_CFD_CTRL_SET_FIRE;
1678*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.pParam = &stAceCfdFire;
1679*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.u32ParamLen = sizeof(ST_ACE_CFD_FIRE_CONTROL);
1680*53ee8cc1Swenshuai.xi     if (ioctl(_s32FdScaler, MDRV_XC_IOC_CFDCONCTRL, &stCFDCtrlInfo))
1681*53ee8cc1Swenshuai.xi     {
1682*53ee8cc1Swenshuai.xi         printf("MDRV_XC_IOC_CFDCONCTRL E_KDRV_XC_CFD_CTRL_FIRE fail!!!!\n");
1683*53ee8cc1Swenshuai.xi         return FALSE;
1684*53ee8cc1Swenshuai.xi     }
1685*53ee8cc1Swenshuai.xi 
1686*53ee8cc1Swenshuai.xi     if (stCFDCtrlInfo.u16ErrCode != 0)
1687*53ee8cc1Swenshuai.xi     {
1688*53ee8cc1Swenshuai.xi         printf("MDRV_XC_IOC_CFDCONCTRL E_KDRV_XC_CFD_CTRL_FIRE fail, errCode: %d\n", stCFDCtrlInfo.u16ErrCode);
1689*53ee8cc1Swenshuai.xi     }
1690*53ee8cc1Swenshuai.xi #endif
1691*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX_KERNEL) && defined(CONFIG_MSTAR_XC_HDR_SUPPORT))
1692*53ee8cc1Swenshuai.xi     MDrv_XC_CFDControl(&stCFDCtrlInfo);
1693*53ee8cc1Swenshuai.xi     ST_ACE_CFD_FIRE_CONTROL stAceCfdFire;
1694*53ee8cc1Swenshuai.xi     memset(&stAceCfdFire, 0, sizeof(ST_ACE_CFD_FIRE_CONTROL));
1695*53ee8cc1Swenshuai.xi     stAceCfdFire.u32Version = 0;
1696*53ee8cc1Swenshuai.xi     stAceCfdFire.u16Length = sizeof(ST_ACE_CFD_FIRE_CONTROL);
1697*53ee8cc1Swenshuai.xi     stAceCfdFire.u8UpdateType = E_XC_CFD_UPDATE_TYPE_OSD_ONLY;
1698*53ee8cc1Swenshuai.xi     stAceCfdFire.u8Win = bScalerWin;
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.enCtrlType = E_KDRV_XC_CFD_CTRL_SET_FIRE;
1701*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.pParam = &stAceCfdFire;
1702*53ee8cc1Swenshuai.xi     stCFDCtrlInfo.u32ParamLen = sizeof(ST_ACE_CFD_FIRE_CONTROL);
1703*53ee8cc1Swenshuai.xi     MDrv_XC_CFDControl(&stCFDCtrlInfo);
1704*53ee8cc1Swenshuai.xi #endif
1705*53ee8cc1Swenshuai.xi #endif
1706*53ee8cc1Swenshuai.xi #endif
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi     return TRUE;
1709*53ee8cc1Swenshuai.xi }
1710*53ee8cc1Swenshuai.xi 
msAdjustVideoContrast(void * pInstance,BOOL bScalerWin,BYTE ucContrast)1711*53ee8cc1Swenshuai.xi void msAdjustVideoContrast(void *pInstance, BOOL bScalerWin, BYTE ucContrast )
1712*53ee8cc1Swenshuai.xi {
1713*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1714*53ee8cc1Swenshuai.xi 
1715*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wContrast = (WORD)ucContrast<<3;
1716*53ee8cc1Swenshuai.xi     SetVideoContrastMatrix(pInstance, bScalerWin );
1717*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin );
1718*53ee8cc1Swenshuai.xi }
msAdjustVideoContrast_10Bits(void * pInstance,BOOL bScalerWin,WORD wContrast)1719*53ee8cc1Swenshuai.xi void msAdjustVideoContrast_10Bits(void *pInstance, BOOL bScalerWin, WORD wContrast )
1720*53ee8cc1Swenshuai.xi {
1721*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1722*53ee8cc1Swenshuai.xi 
1723*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wContrast = wContrast<<1;
1724*53ee8cc1Swenshuai.xi     SetVideoContrastMatrix(pInstance, bScalerWin );
1725*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin );
1726*53ee8cc1Swenshuai.xi }
1727*53ee8cc1Swenshuai.xi 
msAdjustVideoSaturation(void * pInstance,BOOL bScalerWin,BYTE ucSaturation)1728*53ee8cc1Swenshuai.xi void msAdjustVideoSaturation(void *pInstance, BOOL bScalerWin, BYTE ucSaturation )
1729*53ee8cc1Swenshuai.xi {
1730*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1731*53ee8cc1Swenshuai.xi 
1732*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].ucSaturation = ucSaturation;
1733*53ee8cc1Swenshuai.xi     SetVideoSatHueMatrix(pInstance, bScalerWin);
1734*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin);
1735*53ee8cc1Swenshuai.xi }
1736*53ee8cc1Swenshuai.xi 
msAdjustVideoHue(void * pInstance,BOOL bScalerWin,BYTE ucHue)1737*53ee8cc1Swenshuai.xi void msAdjustVideoHue(void *pInstance, BOOL bScalerWin, BYTE ucHue )
1738*53ee8cc1Swenshuai.xi {
1739*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1740*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].ucHue = ucHue;
1741*53ee8cc1Swenshuai.xi     SetVideoSatHueMatrix(pInstance, bScalerWin);
1742*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin);
1743*53ee8cc1Swenshuai.xi }
msAdjustVideoRGB(void * pInstance,BOOL bScalerWin,BYTE ucRCon,BYTE ucGCon,BYTE ucBCon)1744*53ee8cc1Swenshuai.xi void msAdjustVideoRGB(void *pInstance, BOOL bScalerWin, BYTE ucRCon, BYTE ucGCon, BYTE ucBCon)
1745*53ee8cc1Swenshuai.xi {
1746*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1747*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wRCon = (WORD)ucRCon<<3;
1748*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wGCon = (WORD)ucGCon<<3;
1749*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wBCon = (WORD)ucBCon<<3;
1750*53ee8cc1Swenshuai.xi     SetVideoContrastMatrix(pInstance, bScalerWin);
1751*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin);
1752*53ee8cc1Swenshuai.xi }
msAdjustVideoRGB_10Bits(void * pInstance,BOOL bScalerWin,WORD wRCon,WORD wGCon,WORD wBCon)1753*53ee8cc1Swenshuai.xi void msAdjustVideoRGB_10Bits(void *pInstance, BOOL bScalerWin, WORD wRCon, WORD wGCon, WORD wBCon)
1754*53ee8cc1Swenshuai.xi {
1755*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1756*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wRCon = wRCon<<1;
1757*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wGCon = wGCon<<1;
1758*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wBCon = wBCon<<1;
1759*53ee8cc1Swenshuai.xi     SetVideoContrastMatrix(pInstance, bScalerWin );
1760*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, bScalerWin );
1761*53ee8cc1Swenshuai.xi }
1762*53ee8cc1Swenshuai.xi 
SetPCConRGBMatrix(void * pInstance,BOOL bWindow)1763*53ee8cc1Swenshuai.xi static void SetPCConRGBMatrix(void *pInstance, BOOL bWindow )
1764*53ee8cc1Swenshuai.xi {
1765*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1766*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[0][0] = ( (DWORD)s_AceInfo[bWindow].wRCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1767*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[1][1] = ( (DWORD)s_AceInfo[bWindow].wGCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1768*53ee8cc1Swenshuai.xi     s_AceInfo[bWindow].sContrastRGBMatrix[2][2] = ( (DWORD)s_AceInfo[bWindow].wBCon * (s_AceInfo[bWindow].wContrast)) >> 10;
1769*53ee8cc1Swenshuai.xi }
1770*53ee8cc1Swenshuai.xi 
msSetPCColorMatrix(void * pInstance,BOOL bScalerWin)1771*53ee8cc1Swenshuai.xi void msSetPCColorMatrix(void *pInstance, BOOL bScalerWin )
1772*53ee8cc1Swenshuai.xi {
1773*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1774*53ee8cc1Swenshuai.xi     short sResultTmp1[3][3];
1775*53ee8cc1Swenshuai.xi     short sResultTmp2[3][3];
1776*53ee8cc1Swenshuai.xi     short* psOutTab;
1777*53ee8cc1Swenshuai.xi     //BYTE ucCMCtlVal;
1778*53ee8cc1Swenshuai.xi     DECLARA_CMCTL_VARIABLE
1779*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi     U8 i,j;
1782*53ee8cc1Swenshuai.xi     short ColorMatrix_1[3][3];
1783*53ee8cc1Swenshuai.xi     short ColorMatrix_2[3][3];
1784*53ee8cc1Swenshuai.xi 
1785*53ee8cc1Swenshuai.xi     if( TRUE == bBypassColorMatrix)
1786*53ee8cc1Swenshuai.xi     {
1787*53ee8cc1Swenshuai.xi         return ;
1788*53ee8cc1Swenshuai.xi     }
1789*53ee8cc1Swenshuai.xi 
1790*53ee8cc1Swenshuai.xi     BACKUP_SC_BANK
1791*53ee8cc1Swenshuai.xi 
1792*53ee8cc1Swenshuai.xi 
1793*53ee8cc1Swenshuai.xi     psOutTab = (short*)s_AceInfo[bScalerWin].sContrastRGBMatrix;
1794*53ee8cc1Swenshuai.xi 
1795*53ee8cc1Swenshuai.xi     // YUV => RGB
1796*53ee8cc1Swenshuai.xi     if( (s_AceInfo[bScalerWin].bForceYUVtoRGB) || (bScalerWin == SUB_WINDOW) )
1797*53ee8cc1Swenshuai.xi     {
1798*53ee8cc1Swenshuai.xi         //ArrayMultiply( s_AceInfo[bScalerWin].sContrastRGBMatrix, (Typ3x3Array)(s_AceInfo[bScalerWin].psYVUtoRGBMatrix), sResultTmp1 );
1799*53ee8cc1Swenshuai.xi         for ( i=0;i<3;i++ )
1800*53ee8cc1Swenshuai.xi         {
1801*53ee8cc1Swenshuai.xi             for ( j=0;j<3;j++ )
1802*53ee8cc1Swenshuai.xi             {
1803*53ee8cc1Swenshuai.xi                ColorMatrix_1[i][j]=*(s_AceInfo[bScalerWin].psYVUtoRGBMatrix +(i*3)+j);;
1804*53ee8cc1Swenshuai.xi             }
1805*53ee8cc1Swenshuai.xi         }
1806*53ee8cc1Swenshuai.xi         ArrayMultiply( s_AceInfo[bScalerWin].sContrastRGBMatrix, ColorMatrix_1, sResultTmp1 );
1807*53ee8cc1Swenshuai.xi 
1808*53ee8cc1Swenshuai.xi 
1809*53ee8cc1Swenshuai.xi         psOutTab = (short*)sResultTmp1;
1810*53ee8cc1Swenshuai.xi         //ucCMCtlVal = 0x35;
1811*53ee8cc1Swenshuai.xi         CTLVal = ENABLE_CM_CTL1;
1812*53ee8cc1Swenshuai.xi     }
1813*53ee8cc1Swenshuai.xi     else
1814*53ee8cc1Swenshuai.xi     {
1815*53ee8cc1Swenshuai.xi         CTLVal = ENABLE_CM_CTL2;
1816*53ee8cc1Swenshuai.xi         //ucCMCtlVal = 0x30;
1817*53ee8cc1Swenshuai.xi     }
1818*53ee8cc1Swenshuai.xi 
1819*53ee8cc1Swenshuai.xi     // Convert to sRGB
1820*53ee8cc1Swenshuai.xi     if( s_AceInfo[bScalerWin].psPCsRGBMatrix != NULL )
1821*53ee8cc1Swenshuai.xi     {
1822*53ee8cc1Swenshuai.xi         //ArrayMultiply( (Typ3x3Array)s_AceInfo[bScalerWin].psPCsRGBMatrix, (Typ3x3Array)psOutTab, sResultTmp2 );
1823*53ee8cc1Swenshuai.xi         for ( i=0;i<3;i++ )
1824*53ee8cc1Swenshuai.xi         {
1825*53ee8cc1Swenshuai.xi             for ( j=0;j<3;j++ )
1826*53ee8cc1Swenshuai.xi             {
1827*53ee8cc1Swenshuai.xi                ColorMatrix_1[i][j]=*(s_AceInfo[bScalerWin].psPCsRGBMatrix +(i*3)+j);;
1828*53ee8cc1Swenshuai.xi                ColorMatrix_2[i][j]=*(psOutTab +(i*3)+j);;
1829*53ee8cc1Swenshuai.xi             }
1830*53ee8cc1Swenshuai.xi         }
1831*53ee8cc1Swenshuai.xi         ArrayMultiply( ColorMatrix_1, ColorMatrix_2, sResultTmp2 );
1832*53ee8cc1Swenshuai.xi 
1833*53ee8cc1Swenshuai.xi 
1834*53ee8cc1Swenshuai.xi         psOutTab = (short*)sResultTmp2;
1835*53ee8cc1Swenshuai.xi     }
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi     if (MDrv_ACE_IsSupportMLoad(pInstance))
1838*53ee8cc1Swenshuai.xi     {
1839*53ee8cc1Swenshuai.xi         MDrv_ACE_WriteColorMatrixBurst(pInstance, bScalerWin, (MS_U16*)psOutTab );
1840*53ee8cc1Swenshuai.xi     }
1841*53ee8cc1Swenshuai.xi     else
1842*53ee8cc1Swenshuai.xi     {
1843*53ee8cc1Swenshuai.xi         msWriteColorMatrix(pInstance, bScalerWin, psOutTab );
1844*53ee8cc1Swenshuai.xi     }
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi #if defined(UFO_XC_HDR) && defined(UFO_XC_HDR_VERSION) && (UFO_XC_HDR_VERSION == 2) && !defined(ACE_NOT_IN_KERNEL)
1847*53ee8cc1Swenshuai.xi #else
1848*53ee8cc1Swenshuai.xi     if( bScalerWin == MAIN_WINDOW )
1849*53ee8cc1Swenshuai.xi     {
1850*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_MAIN);
1851*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_MAIN, CTLVal, MASK_CM_CTL );
1852*53ee8cc1Swenshuai.xi     }
1853*53ee8cc1Swenshuai.xi     else
1854*53ee8cc1Swenshuai.xi     {
1855*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_SUB);
1856*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_SUB, CTLVal, MASK_CM_CTL );
1857*53ee8cc1Swenshuai.xi     }
1858*53ee8cc1Swenshuai.xi #endif
1859*53ee8cc1Swenshuai.xi 
1860*53ee8cc1Swenshuai.xi     RECOVER_SC_BANK
1861*53ee8cc1Swenshuai.xi }
1862*53ee8cc1Swenshuai.xi 
msAdjustPCContrast(void * pInstance,BOOL bScalerWin,BYTE ucContrast)1863*53ee8cc1Swenshuai.xi void msAdjustPCContrast(void *pInstance, BOOL bScalerWin, BYTE ucContrast )
1864*53ee8cc1Swenshuai.xi {
1865*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1866*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wContrast = (WORD)ucContrast<<3;
1867*53ee8cc1Swenshuai.xi     SetPCConRGBMatrix(pInstance, bScalerWin );
1868*53ee8cc1Swenshuai.xi     msSetPCColorMatrix(pInstance, bScalerWin );
1869*53ee8cc1Swenshuai.xi }
msAdjustPCContrast_10Bits(void * pInstance,BOOL bScalerWin,WORD wContrast)1870*53ee8cc1Swenshuai.xi void msAdjustPCContrast_10Bits(void *pInstance, BOOL bScalerWin, WORD wContrast )
1871*53ee8cc1Swenshuai.xi {
1872*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1873*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wContrast = wContrast<<1;
1874*53ee8cc1Swenshuai.xi     SetPCConRGBMatrix(pInstance, bScalerWin );
1875*53ee8cc1Swenshuai.xi     msSetPCColorMatrix(pInstance, bScalerWin );
1876*53ee8cc1Swenshuai.xi }
1877*53ee8cc1Swenshuai.xi 
msAdjustPCRGB(void * pInstance,BOOL bScalerWin,BYTE ucRed,BYTE ucGreen,BYTE ucBlue)1878*53ee8cc1Swenshuai.xi void msAdjustPCRGB(void *pInstance, BOOL bScalerWin, BYTE ucRed, BYTE ucGreen, BYTE ucBlue )
1879*53ee8cc1Swenshuai.xi {
1880*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1881*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wRCon = (WORD)ucRed<<3;
1882*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wGCon = (WORD)ucGreen<<3;
1883*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wBCon = (WORD)ucBlue<<3;
1884*53ee8cc1Swenshuai.xi     SetPCConRGBMatrix(pInstance,  bScalerWin );
1885*53ee8cc1Swenshuai.xi     msSetPCColorMatrix(pInstance,  bScalerWin );
1886*53ee8cc1Swenshuai.xi }
msAdjustPCRGB_10Bits(void * pInstance,BOOL bScalerWin,WORD wRed,WORD wGreen,WORD wBlue)1887*53ee8cc1Swenshuai.xi void msAdjustPCRGB_10Bits(void *pInstance, BOOL bScalerWin, WORD wRed, WORD wGreen, WORD wBlue )
1888*53ee8cc1Swenshuai.xi {
1889*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1890*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wRCon = wRed<<1;
1891*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wGCon = wGreen<<1;
1892*53ee8cc1Swenshuai.xi     s_AceInfo[bScalerWin].wBCon = wBlue<<1;
1893*53ee8cc1Swenshuai.xi     SetPCConRGBMatrix(pInstance, bScalerWin );
1894*53ee8cc1Swenshuai.xi     msSetPCColorMatrix(pInstance, bScalerWin );
1895*53ee8cc1Swenshuai.xi }
1896*53ee8cc1Swenshuai.xi 
1897*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------
1898*53ee8cc1Swenshuai.xi // Directly control color matrix on/off
1899*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------
msACE_SetColorMatrixControl(void * pInstance,BOOL bScalerWin,BOOL bEnable)1900*53ee8cc1Swenshuai.xi void msACE_SetColorMatrixControl(void *pInstance, BOOL bScalerWin, BOOL bEnable )
1901*53ee8cc1Swenshuai.xi {
1902*53ee8cc1Swenshuai.xi     DECLARA_CMCTL_VARIABLE
1903*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
1904*53ee8cc1Swenshuai.xi 
1905*53ee8cc1Swenshuai.xi     BACKUP_SC_BANK
1906*53ee8cc1Swenshuai.xi     _ACE_GET_INST_PRIVATE();
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi     if( bEnable )
1909*53ee8cc1Swenshuai.xi         CTLVal = MASK_CM_CTL_EN;
1910*53ee8cc1Swenshuai.xi     else
1911*53ee8cc1Swenshuai.xi         CTLVal = 0;
1912*53ee8cc1Swenshuai.xi 
1913*53ee8cc1Swenshuai.xi     if( bScalerWin == MAIN_WINDOW )
1914*53ee8cc1Swenshuai.xi     {
1915*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_MAIN);
1916*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_MAIN, CTLVal, MASK_CM_CTL_EN );
1917*53ee8cc1Swenshuai.xi     }
1918*53ee8cc1Swenshuai.xi     else
1919*53ee8cc1Swenshuai.xi     {
1920*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_SUB);
1921*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_SUB, CTLVal, MASK_CM_CTL_EN );
1922*53ee8cc1Swenshuai.xi     }
1923*53ee8cc1Swenshuai.xi     RECOVER_SC_BANK
1924*53ee8cc1Swenshuai.xi }
1925*53ee8cc1Swenshuai.xi 
1926*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------
1927*53ee8cc1Swenshuai.xi // Directly control color matrix R/B range
1928*53ee8cc1Swenshuai.xi // bRange: 0 -> 0~255, 1 -> -128~127
1929*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------
msACE_SetRBChannelRange(void * pInstance,BOOL bScalerWin,BOOL bRange)1930*53ee8cc1Swenshuai.xi void msACE_SetRBChannelRange(void *pInstance, BOOL bScalerWin, BOOL bRange )
1931*53ee8cc1Swenshuai.xi {
1932*53ee8cc1Swenshuai.xi     DECLARA_CMCTL_VARIABLE
1933*53ee8cc1Swenshuai.xi 
1934*53ee8cc1Swenshuai.xi     DECLARA_BANK_VARIABLE
1935*53ee8cc1Swenshuai.xi 
1936*53ee8cc1Swenshuai.xi     BACKUP_SC_BANK
1937*53ee8cc1Swenshuai.xi 
1938*53ee8cc1Swenshuai.xi     if( bRange )
1939*53ee8cc1Swenshuai.xi         CTLVal = MASK_CM_CTL_RB_RANGE;
1940*53ee8cc1Swenshuai.xi     else
1941*53ee8cc1Swenshuai.xi         CTLVal = 0;
1942*53ee8cc1Swenshuai.xi     _ACE_GET_INST_PRIVATE();
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi     if( bScalerWin == MAIN_WINDOW )
1945*53ee8cc1Swenshuai.xi     {
1946*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_MAIN);
1947*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_MAIN, CTLVal, MASK_CM_CTL_RB_RANGE );
1948*53ee8cc1Swenshuai.xi     }
1949*53ee8cc1Swenshuai.xi     else
1950*53ee8cc1Swenshuai.xi     {
1951*53ee8cc1Swenshuai.xi         SET_SC_BANK(BANK_CM_SUB);
1952*53ee8cc1Swenshuai.xi         ACE_WRITE_CM_CTL(psACEInstPri->u32DeviceID,  REG_ADDR_CM_CTL_SUB, CTLVal, MASK_CM_CTL_RB_RANGE );
1953*53ee8cc1Swenshuai.xi     }
1954*53ee8cc1Swenshuai.xi     RECOVER_SC_BANK
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi 
msACESetBypassColorMatrix(void * pInstance,MS_BOOL bEnable)1957*53ee8cc1Swenshuai.xi MS_BOOL msACESetBypassColorMatrix(void *pInstance, MS_BOOL bEnable)
1958*53ee8cc1Swenshuai.xi {
1959*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
1960*53ee8cc1Swenshuai.xi     bBypassColorMatrix = bEnable;
1961*53ee8cc1Swenshuai.xi     return TRUE ;
1962*53ee8cc1Swenshuai.xi }
1963*53ee8cc1Swenshuai.xi 
msACE_HDR_MatrixInvGen(void * pInstance,MS_S32 Minv[3][3],MS_S32 M[3][3])1964*53ee8cc1Swenshuai.xi void msACE_HDR_MatrixInvGen(void *pInstance,MS_S32 Minv[3][3], MS_S32 M[3][3])
1965*53ee8cc1Swenshuai.xi {
1966*53ee8cc1Swenshuai.xi     MS_S32 a = M[0][0];
1967*53ee8cc1Swenshuai.xi     MS_S32 b = M[0][1];
1968*53ee8cc1Swenshuai.xi     MS_S32 c = M[0][2];
1969*53ee8cc1Swenshuai.xi     MS_S32 d = M[1][0];
1970*53ee8cc1Swenshuai.xi     MS_S32 e = M[1][1];
1971*53ee8cc1Swenshuai.xi     MS_S32 f = M[1][2];
1972*53ee8cc1Swenshuai.xi     MS_S32 g = M[2][0];
1973*53ee8cc1Swenshuai.xi     MS_S32 h = M[2][1];
1974*53ee8cc1Swenshuai.xi     MS_S32 i = M[2][2];
1975*53ee8cc1Swenshuai.xi 
1976*53ee8cc1Swenshuai.xi     MS_S64 ei_fh = (MS_S64)e*i - (MS_S64)f*h; // a b c a
1977*53ee8cc1Swenshuai.xi     MS_S64 fg_di = (MS_S64)f*g - (MS_S64)d*i; // d e f d
1978*53ee8cc1Swenshuai.xi     MS_S64 dh_eg = (MS_S64)d*h - (MS_S64)e*g; // g h i g
1979*53ee8cc1Swenshuai.xi     MS_S64 hc_ib = (MS_S64)h*c - (MS_S64)i*b; // a b c a
1980*53ee8cc1Swenshuai.xi     MS_S64 ia_gc = (MS_S64)i*a - (MS_S64)g*c;
1981*53ee8cc1Swenshuai.xi     MS_S64 gb_ha = (MS_S64)g*b - (MS_S64)h*a;
1982*53ee8cc1Swenshuai.xi     MS_S64 bf_ce = (MS_S64)b*f - (MS_S64)c*e;
1983*53ee8cc1Swenshuai.xi     MS_S64 cd_af = (MS_S64)c*d - (MS_S64)a*f;
1984*53ee8cc1Swenshuai.xi     MS_S64 ae_bd = (MS_S64)a*e - (MS_S64)b*d;
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi     MS_S64 det = a*ei_fh + b*fg_di + c*dh_eg;
1987*53ee8cc1Swenshuai.xi 
1988*53ee8cc1Swenshuai.xi     Minv[0][0] = ei_fh * 2500000000LL / det;
1989*53ee8cc1Swenshuai.xi     Minv[1][0] = fg_di * 2500000000LL / det;
1990*53ee8cc1Swenshuai.xi     Minv[2][0] = dh_eg * 2500000000LL / det;
1991*53ee8cc1Swenshuai.xi     Minv[0][1] = hc_ib * 2500000000LL / det;
1992*53ee8cc1Swenshuai.xi     Minv[1][1] = ia_gc * 2500000000LL / det;
1993*53ee8cc1Swenshuai.xi     Minv[2][1] = gb_ha * 2500000000LL / det;
1994*53ee8cc1Swenshuai.xi     Minv[0][2] = bf_ce * 2500000000LL / det;
1995*53ee8cc1Swenshuai.xi     Minv[1][2] = cd_af * 2500000000LL / det;
1996*53ee8cc1Swenshuai.xi     Minv[2][2] = ae_bd * 2500000000LL / det;
1997*53ee8cc1Swenshuai.xi 
1998*53ee8cc1Swenshuai.xi }
1999*53ee8cc1Swenshuai.xi 
msACE_HDR_YUV2RGBGen(void * pInstance,ACE_DRV_HDR_YUV2RGBData * pData)2000*53ee8cc1Swenshuai.xi void msACE_HDR_YUV2RGBGen(void *pInstance,ACE_DRV_HDR_YUV2RGBData* pData)
2001*53ee8cc1Swenshuai.xi {
2002*53ee8cc1Swenshuai.xi     MS_S32 Mr2y[3][3], My2r[3][3];
2003*53ee8cc1Swenshuai.xi     MS_S64 Kr, Kb, Kg;
2004*53ee8cc1Swenshuai.xi     MS_U16 u16Regs[9];
2005*53ee8cc1Swenshuai.xi 
2006*53ee8cc1Swenshuai.xi     memset(Mr2y, 0, sizeof(MS_S32)*3*3);
2007*53ee8cc1Swenshuai.xi     memset(My2r, 0, sizeof(MS_S32)*3*3);
2008*53ee8cc1Swenshuai.xi     memset(u16Regs, 0, sizeof(MS_U16)*9);
2009*53ee8cc1Swenshuai.xi 
2010*53ee8cc1Swenshuai.xi     if (pData->u8SMode == 0)
2011*53ee8cc1Swenshuai.xi     {
2012*53ee8cc1Swenshuai.xi         Kr = pData->u16SKr;
2013*53ee8cc1Swenshuai.xi         Kb = pData->u16SKb;
2014*53ee8cc1Swenshuai.xi         Kg = 50000 - Kb - Kr;
2015*53ee8cc1Swenshuai.xi         Mr2y[0][0] = Kr;
2016*53ee8cc1Swenshuai.xi         Mr2y[0][1] = Kg;
2017*53ee8cc1Swenshuai.xi         Mr2y[0][2] = Kb;
2018*53ee8cc1Swenshuai.xi 
2019*53ee8cc1Swenshuai.xi         Mr2y[1][0] = -Kr * 25000 / (50000 - Kb);
2020*53ee8cc1Swenshuai.xi         Mr2y[1][1] = -Kg * 25000 / (50000 - Kb);
2021*53ee8cc1Swenshuai.xi 
2022*53ee8cc1Swenshuai.xi         Mr2y[1][2] = (50000 - Kb) * 25000 / (50000 - Kb);
2023*53ee8cc1Swenshuai.xi         Mr2y[2][0] = (50000 - Kr) * 25000 / (50000 - Kr);
2024*53ee8cc1Swenshuai.xi 
2025*53ee8cc1Swenshuai.xi         Mr2y[2][1] = -Kg * 25000 / (50000 - Kr);
2026*53ee8cc1Swenshuai.xi         Mr2y[2][2] = -Kb * 25000 / (50000 - Kr);
2027*53ee8cc1Swenshuai.xi 
2028*53ee8cc1Swenshuai.xi         msACE_HDR_MatrixInvGen(pInstance,My2r, Mr2y);
2029*53ee8cc1Swenshuai.xi 
2030*53ee8cc1Swenshuai.xi     }
2031*53ee8cc1Swenshuai.xi     else if (pData->u8SMode == 1) // YCgCo
2032*53ee8cc1Swenshuai.xi     {
2033*53ee8cc1Swenshuai.xi         // TODO
2034*53ee8cc1Swenshuai.xi     }
2035*53ee8cc1Swenshuai.xi     else// if (pData->sMode == 2) // 2020CL
2036*53ee8cc1Swenshuai.xi     {
2037*53ee8cc1Swenshuai.xi         // TODO
2038*53ee8cc1Swenshuai.xi     }
2039*53ee8cc1Swenshuai.xi 
2040*53ee8cc1Swenshuai.xi     if ((g_ACEinitParameters.ACE_HDRMetadataMpegVUI.u8TransferCharacteristics == 16) ||
2041*53ee8cc1Swenshuai.xi        (g_ACEinitParameters.ACE_HDRMetadataHdmiTxInfoFrame.u8EOTF == 2))    // HDMI HDR is SMPTE ST2084.
2042*53ee8cc1Swenshuai.xi     {
2043*53ee8cc1Swenshuai.xi         // BT.2084.
2044*53ee8cc1Swenshuai.xi         _u16HdrY2RRatio = 2;
2045*53ee8cc1Swenshuai.xi     }
2046*53ee8cc1Swenshuai.xi     else
2047*53ee8cc1Swenshuai.xi     {
2048*53ee8cc1Swenshuai.xi         // Others.
2049*53ee8cc1Swenshuai.xi         _u16HdrY2RRatio = 1;
2050*53ee8cc1Swenshuai.xi     }
2051*53ee8cc1Swenshuai.xi 
2052*53ee8cc1Swenshuai.xi     u16Regs[1] = (((My2r[0][0] << 10)*_u16HdrY2RRatio + 25000) / 50000*1167/1000) & 0x1FFF;
2053*53ee8cc1Swenshuai.xi     u16Regs[2] = (((My2r[0][1] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2054*53ee8cc1Swenshuai.xi     u16Regs[0] = (((My2r[0][2] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2055*53ee8cc1Swenshuai.xi     u16Regs[4] = (((My2r[1][0] << 10)*_u16HdrY2RRatio + 25000) / 50000*1167/1000) & 0x1FFF;
2056*53ee8cc1Swenshuai.xi     u16Regs[5] = (((My2r[1][1] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2057*53ee8cc1Swenshuai.xi     u16Regs[3] = (((My2r[1][2] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2058*53ee8cc1Swenshuai.xi     u16Regs[7] = (((My2r[2][0] << 10)*_u16HdrY2RRatio + 25000) / 50000*1167/1000) & 0x1FFF;
2059*53ee8cc1Swenshuai.xi     u16Regs[8] = (((My2r[2][1] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2060*53ee8cc1Swenshuai.xi     u16Regs[6] = (((My2r[2][2] << 10)*_u16HdrY2RRatio + 25000) / 50000) & 0x1FFF;
2061*53ee8cc1Swenshuai.xi 
2062*53ee8cc1Swenshuai.xi     BYTE i;
2063*53ee8cc1Swenshuai.xi     BYTE ucCopyLen = 9;
2064*53ee8cc1Swenshuai.xi 
2065*53ee8cc1Swenshuai.xi     for( i = 0; i < ucCopyLen; ++ i )
2066*53ee8cc1Swenshuai.xi     {
2067*53ee8cc1Swenshuai.xi         if(u16Regs[i] >0xFFF)
2068*53ee8cc1Swenshuai.xi         {
2069*53ee8cc1Swenshuai.xi             u16Regs[i]= u16Regs[i]|0xF000;
2070*53ee8cc1Swenshuai.xi         }
2071*53ee8cc1Swenshuai.xi     }
2072*53ee8cc1Swenshuai.xi 
2073*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
2074*53ee8cc1Swenshuai.xi 
2075*53ee8cc1Swenshuai.xi     CopyMatrix( u16Regs,(WORD*)s_AceInfo[MAIN_WINDOW].psYVUtoRGBMatrix  ,ucCopyLen );
2076*53ee8cc1Swenshuai.xi 
2077*53ee8cc1Swenshuai.xi     msSetVideoColorMatrix(pInstance, MAIN_WINDOW );
2078*53ee8cc1Swenshuai.xi }
2079*53ee8cc1Swenshuai.xi 
msACE_HDR_Set3x3Gen(void * pInstance,MS_BOOL bWrite)2080*53ee8cc1Swenshuai.xi MS_BOOL msACE_HDR_Set3x3Gen(void *pInstance,MS_BOOL bWrite)
2081*53ee8cc1Swenshuai.xi {
2082*53ee8cc1Swenshuai.xi     _ACE_GET_VARIABLE();
2083*53ee8cc1Swenshuai.xi     BYTE ucCopyLen = 9;
2084*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2085*53ee8cc1Swenshuai.xi 
2086*53ee8cc1Swenshuai.xi     if(TRUE==bWrite)
2087*53ee8cc1Swenshuai.xi     {
2088*53ee8cc1Swenshuai.xi         if(_bSetGenRead==TRUE)
2089*53ee8cc1Swenshuai.xi         {
2090*53ee8cc1Swenshuai.xi             CopyMatrix( s16PreRegs,(WORD*)s_AceInfo[MAIN_WINDOW].psYVUtoRGBMatrix  ,ucCopyLen );
2091*53ee8cc1Swenshuai.xi             _bSetGenRead=FALSE;
2092*53ee8cc1Swenshuai.xi             bRet = TRUE;
2093*53ee8cc1Swenshuai.xi         }
2094*53ee8cc1Swenshuai.xi     }
2095*53ee8cc1Swenshuai.xi     else
2096*53ee8cc1Swenshuai.xi     {
2097*53ee8cc1Swenshuai.xi 
2098*53ee8cc1Swenshuai.xi         if(_bSetGenRead==FALSE)
2099*53ee8cc1Swenshuai.xi         {
2100*53ee8cc1Swenshuai.xi             if(FALSE==_bSetHDRInit)
2101*53ee8cc1Swenshuai.xi             {
2102*53ee8cc1Swenshuai.xi                 _u16HdrY2RRatio = 2;
2103*53ee8cc1Swenshuai.xi 
2104*53ee8cc1Swenshuai.xi                 _bSetHDRInit=TRUE;
2105*53ee8cc1Swenshuai.xi             }
2106*53ee8cc1Swenshuai.xi             CopyMatrix( (WORD*)s_AceInfo[MAIN_WINDOW].psYVUtoRGBMatrix,s16PreRegs  ,ucCopyLen );
2107*53ee8cc1Swenshuai.xi 
2108*53ee8cc1Swenshuai.xi             _bSetGenRead=TRUE;
2109*53ee8cc1Swenshuai.xi 
2110*53ee8cc1Swenshuai.xi             bRet = TRUE;
2111*53ee8cc1Swenshuai.xi         }
2112*53ee8cc1Swenshuai.xi     }
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi     return bRet;
2115*53ee8cc1Swenshuai.xi }
msACE_HDR_ConfigMetadata_HdmiTxInfoFrame(void * pInstance,ACE_DRV_HDR_YUV2RGBData * pY2RData,ACE_DRV_HDRHdmiTxAviInfoFrame * stMetadata)2116*53ee8cc1Swenshuai.xi void msACE_HDR_ConfigMetadata_HdmiTxInfoFrame(void *pInstance,ACE_DRV_HDR_YUV2RGBData* pY2RData, ACE_DRV_HDRHdmiTxAviInfoFrame *stMetadata)
2117*53ee8cc1Swenshuai.xi {
2118*53ee8cc1Swenshuai.xi     // Matrix Coefficients (Note: Don't care about whether the pixel format is RGB or YCC. Just assume input to VOP2 is YCC!! Important!!!!!!!!!)
2119*53ee8cc1Swenshuai.xi     pY2RData->bSValid = TRUE;
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi     if (stMetadata->Colorimetry == 0 || stMetadata->Colorimetry == 2) // No data or 709
2122*53ee8cc1Swenshuai.xi     {
2123*53ee8cc1Swenshuai.xi         // 709 matrices
2124*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2125*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 10630; //0.2126
2126*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 3610; //0.0722
2127*53ee8cc1Swenshuai.xi     }
2128*53ee8cc1Swenshuai.xi     else if (stMetadata->Colorimetry == 1) // 170M (=601)
2129*53ee8cc1Swenshuai.xi     {
2130*53ee8cc1Swenshuai.xi         // 601 matrices
2131*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2132*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 14950; //0.299
2133*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 5700; //0.114
2134*53ee8cc1Swenshuai.xi     }
2135*53ee8cc1Swenshuai.xi     else if (stMetadata->Colorimetry == 3 && (stMetadata->ExtendedColorimetry == 1)) // xvYCC 709
2136*53ee8cc1Swenshuai.xi     {
2137*53ee8cc1Swenshuai.xi         // 709 matrices
2138*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2139*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 10630; //0.2126
2140*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 3610; //0.0722
2141*53ee8cc1Swenshuai.xi     }
2142*53ee8cc1Swenshuai.xi     else if (stMetadata->Colorimetry == 3 && (stMetadata->ExtendedColorimetry == 0 || stMetadata->ExtendedColorimetry == 2 || stMetadata->ExtendedColorimetry == 3)) // xvYCC 601 or sYCC 601 or Adobe YCC 601
2143*53ee8cc1Swenshuai.xi     {
2144*53ee8cc1Swenshuai.xi         // 601 matrices
2145*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2146*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 14950; //0.299
2147*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 5700; //0.114
2148*53ee8cc1Swenshuai.xi     }
2149*53ee8cc1Swenshuai.xi     else if (stMetadata->Colorimetry == 3 && (stMetadata->ExtendedColorimetry == 4)) // Adobe RGB
2150*53ee8cc1Swenshuai.xi     {
2151*53ee8cc1Swenshuai.xi         // 601 matrices (NOTE : Assume the input of VOP2 is YCC)
2152*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2153*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 14950; //0.299
2154*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 5700; //0.114
2155*53ee8cc1Swenshuai.xi     }
2156*53ee8cc1Swenshuai.xi     else if (stMetadata->Colorimetry == 3 && (stMetadata->ExtendedColorimetry == 5 || stMetadata->ExtendedColorimetry == 6)) // BT2020 CL YCC
2157*53ee8cc1Swenshuai.xi     {
2158*53ee8cc1Swenshuai.xi         // 2020 matrices
2159*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2160*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 13135; //0.2627
2161*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 2965; //0.0593
2162*53ee8cc1Swenshuai.xi     }
2163*53ee8cc1Swenshuai.xi     else
2164*53ee8cc1Swenshuai.xi     {
2165*53ee8cc1Swenshuai.xi         pY2RData->bSValid = FALSE;
2166*53ee8cc1Swenshuai.xi     }
2167*53ee8cc1Swenshuai.xi }
2168*53ee8cc1Swenshuai.xi 
msACE_HDR_ConfigMetadata_MpegVUI(void * pInstance,ACE_DRV_HDR_YUV2RGBData * pY2RData)2169*53ee8cc1Swenshuai.xi void msACE_HDR_ConfigMetadata_MpegVUI(void *pInstance,ACE_DRV_HDR_YUV2RGBData* pY2RData)
2170*53ee8cc1Swenshuai.xi {
2171*53ee8cc1Swenshuai.xi     // Matrix Coefficients
2172*53ee8cc1Swenshuai.xi     pY2RData->bSValid = TRUE;
2173*53ee8cc1Swenshuai.xi     switch (g_ACEinitParameters.ACE_HDRMetadataMpegVUI.u8MatrixCoefficients)
2174*53ee8cc1Swenshuai.xi     {
2175*53ee8cc1Swenshuai.xi      case 1: // 709
2176*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2177*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 10630; //0.2126
2178*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 3610; //0.0722
2179*53ee8cc1Swenshuai.xi         break;
2180*53ee8cc1Swenshuai.xi      case 4: // 47
2181*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2182*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 15000; //0.30
2183*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 5500; //0.11
2184*53ee8cc1Swenshuai.xi         break;
2185*53ee8cc1Swenshuai.xi      case 5: // 601 (625)
2186*53ee8cc1Swenshuai.xi      case 6: // 601 (525)
2187*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2188*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 14950; //0.299
2189*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 5700; //0.114
2190*53ee8cc1Swenshuai.xi         break;
2191*53ee8cc1Swenshuai.xi      case 7: // 240M
2192*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2193*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 10600; //0.212
2194*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 4350; //0.087
2195*53ee8cc1Swenshuai.xi         break;
2196*53ee8cc1Swenshuai.xi      case 8: // YCgCo
2197*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 1;
2198*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 2500;
2199*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 1250;
2200*53ee8cc1Swenshuai.xi         break;
2201*53ee8cc1Swenshuai.xi      case 9: // 2020NCL
2202*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;
2203*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 13135; //0.2627
2204*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 2965; //0.0593
2205*53ee8cc1Swenshuai.xi         break;
2206*53ee8cc1Swenshuai.xi      case 10: // 2020CL
2207*53ee8cc1Swenshuai.xi         pY2RData->u8SMode = 0;  // Spec is 2. Reference mantis 0959025.
2208*53ee8cc1Swenshuai.xi         pY2RData->u16SKr = 13135; //0.2627
2209*53ee8cc1Swenshuai.xi         pY2RData->u16SKb = 2965; //0.0593
2210*53ee8cc1Swenshuai.xi         break;
2211*53ee8cc1Swenshuai.xi      case 2: // Unspecified
2212*53ee8cc1Swenshuai.xi      default:
2213*53ee8cc1Swenshuai.xi         pY2RData->bSValid = FALSE;
2214*53ee8cc1Swenshuai.xi         break;
2215*53ee8cc1Swenshuai.xi     }
2216*53ee8cc1Swenshuai.xi }
2217*53ee8cc1Swenshuai.xi 
msACE_HDR_Main(void * pInstance)2218*53ee8cc1Swenshuai.xi void msACE_HDR_Main(void *pInstance)
2219*53ee8cc1Swenshuai.xi {
2220*53ee8cc1Swenshuai.xi     ACE_DRV_HDR_YUV2RGBData stY2RData = {0, 0, 0, 3610, 10630, 0, 3610, 10630};
2221*53ee8cc1Swenshuai.xi 
2222*53ee8cc1Swenshuai.xi 
2223*53ee8cc1Swenshuai.xi     if(ENABLE==g_ACEinitParameters.bHDREnable)
2224*53ee8cc1Swenshuai.xi     {
2225*53ee8cc1Swenshuai.xi         // Read 3*3
2226*53ee8cc1Swenshuai.xi         msACE_HDR_Set3x3Gen(pInstance,FALSE);
2227*53ee8cc1Swenshuai.xi         if(g_ACEinitParameters.u16HDRFunctionSelect & 0x01)
2228*53ee8cc1Swenshuai.xi         {
2229*53ee8cc1Swenshuai.xi             msACE_HDR_ConfigMetadata_MpegVUI(pInstance,&stY2RData);
2230*53ee8cc1Swenshuai.xi 
2231*53ee8cc1Swenshuai.xi             if(g_ACEinitParameters.ACE_HDRMetadataMpegVUI.u8MatrixCoefficients !=_u8PreMatrixCoefficients)
2232*53ee8cc1Swenshuai.xi             {
2233*53ee8cc1Swenshuai.xi                 _u8PreMatrixCoefficients = g_ACEinitParameters.ACE_HDRMetadataMpegVUI.u8MatrixCoefficients;
2234*53ee8cc1Swenshuai.xi 
2235*53ee8cc1Swenshuai.xi                 msACE_HDR_YUV2RGBGen(pInstance,&stY2RData);
2236*53ee8cc1Swenshuai.xi             }
2237*53ee8cc1Swenshuai.xi         }
2238*53ee8cc1Swenshuai.xi         // For HDMI HDR
2239*53ee8cc1Swenshuai.xi         if(g_ACEinitParameters.u16HDRFunctionSelect==0x10)
2240*53ee8cc1Swenshuai.xi         {
2241*53ee8cc1Swenshuai.xi 
2242*53ee8cc1Swenshuai.xi             ACE_DRV_HDRHdmiTxAviInfoFrame stAviInfoFrame;
2243*53ee8cc1Swenshuai.xi             memcpy(&stAviInfoFrame,&g_ACEinitParameters.ACE_HDRHdmiTxAviInfoFrame,sizeof(ACE_DRV_HDRHdmiTxAviInfoFrame));
2244*53ee8cc1Swenshuai.xi 
2245*53ee8cc1Swenshuai.xi             msACE_HDR_ConfigMetadata_HdmiTxInfoFrame(pInstance,&stY2RData,&stAviInfoFrame);
2246*53ee8cc1Swenshuai.xi 
2247*53ee8cc1Swenshuai.xi             if((stAviInfoFrame.ExtendedColorimetry !=_u8PreExtendedColorimetry) || (stAviInfoFrame.Colorimetry != _u8PreColorimetry))
2248*53ee8cc1Swenshuai.xi             {
2249*53ee8cc1Swenshuai.xi                 printf("PixelFormat: %x\n",stAviInfoFrame.PixelFormat);
2250*53ee8cc1Swenshuai.xi                 printf("Colorimetry: %x\n",stAviInfoFrame.Colorimetry);
2251*53ee8cc1Swenshuai.xi                 printf("ExtendedColorimetry: %x\n",stAviInfoFrame.ExtendedColorimetry);
2252*53ee8cc1Swenshuai.xi                 printf("RgbQuantizationRange: %x\n",stAviInfoFrame.RgbQuantizationRange);
2253*53ee8cc1Swenshuai.xi                 printf("YccQuantizationRange: %x\n",stAviInfoFrame.YccQuantizationRange);
2254*53ee8cc1Swenshuai.xi                 printf("StaticMetadataDescriptorID: %x\n",stAviInfoFrame.StaticMetadataDescriptorID);
2255*53ee8cc1Swenshuai.xi                 printf("_u8PreColorimetry: %x\n",_u8PreColorimetry);
2256*53ee8cc1Swenshuai.xi                 printf("_u8PreExtendedColorimetry: %x\n",_u8PreExtendedColorimetry);
2257*53ee8cc1Swenshuai.xi                 _u8PreColorimetry = stAviInfoFrame.Colorimetry;
2258*53ee8cc1Swenshuai.xi                 _u8PreExtendedColorimetry = stAviInfoFrame.ExtendedColorimetry;
2259*53ee8cc1Swenshuai.xi                 msACE_HDR_YUV2RGBGen(pInstance,&stY2RData);
2260*53ee8cc1Swenshuai.xi             }
2261*53ee8cc1Swenshuai.xi         }
2262*53ee8cc1Swenshuai.xi     }
2263*53ee8cc1Swenshuai.xi     else
2264*53ee8cc1Swenshuai.xi     {
2265*53ee8cc1Swenshuai.xi         // Write 3*3
2266*53ee8cc1Swenshuai.xi         if (msACE_HDR_Set3x3Gen(pInstance,TRUE) == TRUE)
2267*53ee8cc1Swenshuai.xi         {
2268*53ee8cc1Swenshuai.xi             msSetVideoColorMatrix(pInstance, MAIN_WINDOW );
2269*53ee8cc1Swenshuai.xi         }
2270*53ee8cc1Swenshuai.xi         _u8PreMatrixCoefficients=0;
2271*53ee8cc1Swenshuai.xi          _u8PreExtendedColorimetry = 0;
2272*53ee8cc1Swenshuai.xi          _u8PreColorimetry = 0;
2273*53ee8cc1Swenshuai.xi     }
2274*53ee8cc1Swenshuai.xi 
2275*53ee8cc1Swenshuai.xi }
2276*53ee8cc1Swenshuai.xi 
2277*53ee8cc1Swenshuai.xi 
2278