1 #include "rk_aiq_uapi_accm_int.h"
2 #include "accm/rk_aiq_types_accm_algo_prvt.h"
3
4 #if RKAIQ_HAVE_CCM_V1
5 XCamReturn
rk_aiq_uapi_accm_SetAttrib(RkAiqAlgoContext * ctx,const rk_aiq_ccm_attrib_t * attr,bool need_sync)6 rk_aiq_uapi_accm_SetAttrib(RkAiqAlgoContext *ctx,
7 const rk_aiq_ccm_attrib_t* attr,
8 bool need_sync)
9 {
10
11 accm_context_t* ccm_contex = (accm_context_t*)ctx->accm_para;
12 ccm_contex->invarMode = ccm_contex->mCurAtt.mode & attr->mode;
13 ccm_contex->mCurAtt = *attr;
14 ccm_contex->updateAtt = true;
15 return XCAM_RETURN_NO_ERROR;
16 }
17
18 XCamReturn
rk_aiq_uapi_accm_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_ccm_attrib_t * attr)19 rk_aiq_uapi_accm_GetAttrib(const RkAiqAlgoContext *ctx,
20 rk_aiq_ccm_attrib_t *attr)
21 {
22
23 accm_context_t* ccm_contex = (accm_context_t*)ctx->accm_para;
24 memcpy(ccm_contex->mCurAtt.stManual.ccMatrix, ccm_contex->ccmHwConf.matrix, sizeof(ccm_contex->ccmHwConf.matrix));
25 memcpy(ccm_contex->mCurAtt.stManual.ccOffsets, ccm_contex->ccmHwConf.offs, sizeof(ccm_contex->ccmHwConf.offs));
26 memcpy(ccm_contex->mCurAtt.stManual.y_alpha_curve, ccm_contex->ccmHwConf.alp_y, sizeof(ccm_contex->ccmHwConf.alp_y));
27 ccm_contex->mCurAtt.stManual.low_bound_pos_bit = ccm_contex->ccmHwConf.bound_bit;
28
29 memcpy(attr, &ccm_contex->mCurAtt, sizeof(rk_aiq_ccm_attrib_t));
30
31 return XCAM_RETURN_NO_ERROR;
32 }
33 #else
34 XCamReturn
rk_aiq_uapi_accm_SetAttrib(RkAiqAlgoContext * ctx,const rk_aiq_ccm_attrib_t * attr,bool need_sync)35 rk_aiq_uapi_accm_SetAttrib(RkAiqAlgoContext *ctx,
36 const rk_aiq_ccm_attrib_t* attr,
37 bool need_sync)
38 {
39 return XCAM_RETURN_NO_ERROR;
40 }
41
42 XCamReturn
rk_aiq_uapi_accm_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_ccm_attrib_t * attr)43 rk_aiq_uapi_accm_GetAttrib(const RkAiqAlgoContext *ctx,
44 rk_aiq_ccm_attrib_t *attr)
45 {
46 return XCAM_RETURN_NO_ERROR;
47 }
48 #endif
49
50 #if RKAIQ_HAVE_CCM_V2
51 XCamReturn
rk_aiq_uapi_accm_v2_SetAttrib(RkAiqAlgoContext * ctx,const rk_aiq_ccm_v2_attrib_t * attr,bool need_sync)52 rk_aiq_uapi_accm_v2_SetAttrib(RkAiqAlgoContext *ctx,
53 const rk_aiq_ccm_v2_attrib_t* attr,
54 bool need_sync)
55 {
56
57 accm_context_t* ccm_contex = (accm_context_t*)ctx->accm_para;
58 ccm_contex->invarMode = ccm_contex->mCurAttV2.mode & attr->mode;
59 ccm_contex->mCurAttV2 = *attr;
60 ccm_contex->updateAtt = true;
61 return XCAM_RETURN_NO_ERROR;
62 }
63
64 XCamReturn
rk_aiq_uapi_accm_v2_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_ccm_v2_attrib_t * attr)65 rk_aiq_uapi_accm_v2_GetAttrib(const RkAiqAlgoContext *ctx,
66 rk_aiq_ccm_v2_attrib_t *attr)
67 {
68
69 accm_context_t* ccm_contex = (accm_context_t*)ctx->accm_para;
70
71 memcpy(ccm_contex->mCurAttV2.stManual.ccMatrix, ccm_contex->ccmHwConf_v2.matrix,
72 sizeof(float)*9);
73 memcpy(ccm_contex->mCurAttV2.stManual.ccOffsets, ccm_contex->ccmHwConf_v2.offs,
74 sizeof(float)*3);
75 memcpy(ccm_contex->mCurAttV2.stManual.y_alpha_curve, ccm_contex->ccmHwConf_v2.alp_y,
76 sizeof(float)*CCM_CURVE_DOT_NUM_V2);
77 memcpy(ccm_contex->mCurAttV2.stManual.enh_rgb2y_para, ccm_contex->ccmHwConf_v2.enh_rgb2y_para,
78 sizeof(unsigned char)*3);
79 ccm_contex->mCurAttV2.stManual.enh_adj_en = ccm_contex->ccmHwConf_v2.enh_adj_en;
80 ccm_contex->mCurAttV2.stManual.enh_rat_max = ccm_contex->ccmHwConf_v2.enh_rat_max;
81 ccm_contex->mCurAttV2.stManual.highy_adj_en = ccm_contex->ccmHwConf_v2.highy_adj_en;
82 ccm_contex->mCurAttV2.stManual.asym_enable = ccm_contex->ccmHwConf_v2.asym_adj_en;
83 ccm_contex->mCurAttV2.stManual.bound_pos_bit = ccm_contex->ccmHwConf_v2.bound_bit;
84 ccm_contex->mCurAttV2.stManual.right_pos_bit = ccm_contex->ccmHwConf_v2.right_bit;
85
86 memcpy(attr, &ccm_contex->mCurAttV2, sizeof(rk_aiq_ccm_v2_attrib_t));
87
88 return XCAM_RETURN_NO_ERROR;
89 }
90 #else
91 XCamReturn
rk_aiq_uapi_accm_v2_SetAttrib(RkAiqAlgoContext * ctx,const rk_aiq_ccm_v2_attrib_t * attr,bool need_sync)92 rk_aiq_uapi_accm_v2_SetAttrib(RkAiqAlgoContext *ctx,
93 const rk_aiq_ccm_v2_attrib_t* attr,
94 bool need_sync)
95 {
96 return XCAM_RETURN_NO_ERROR;
97 }
98
99 XCamReturn
rk_aiq_uapi_accm_v2_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_ccm_v2_attrib_t * attr)100 rk_aiq_uapi_accm_v2_GetAttrib(const RkAiqAlgoContext *ctx,
101 rk_aiq_ccm_v2_attrib_t *attr)
102 {
103 return XCAM_RETURN_NO_ERROR;
104 }
105 #endif
106
107 XCamReturn
rk_aiq_uapi_accm_QueryCcmInfo(const RkAiqAlgoContext * ctx,rk_aiq_ccm_querry_info_t * ccm_querry_info)108 rk_aiq_uapi_accm_QueryCcmInfo(const RkAiqAlgoContext *ctx,
109 rk_aiq_ccm_querry_info_t *ccm_querry_info )
110 {
111
112 accm_context_t* ccm_contex = (accm_context_t*)ctx->accm_para;
113 ccm_querry_info->finalSat = 0;
114 memset(ccm_querry_info->ccmname1, 0x0, sizeof(ccm_querry_info->ccmname1));
115 memset(ccm_querry_info->ccmname2, 0x0, sizeof(ccm_querry_info->ccmname2));
116
117 #if RKAIQ_HAVE_CCM_V1
118 if (ccm_contex->ccmHwConf.ccmEnable && ccm_contex->mCurAtt.mode == RK_AIQ_CCM_MODE_AUTO){
119 ccm_querry_info->finalSat = ccm_contex->accmRest.fSaturation;
120 if (ccm_contex->accmRest.pCcmProfile1) {
121 if (ccm_contex->accmRest.pCcmProfile1->name) {
122 strcpy(ccm_querry_info->ccmname1, ccm_contex->accmRest.pCcmProfile1->name);
123 }
124 }
125 if (ccm_contex->accmRest.pCcmProfile2) {
126 if (ccm_contex->accmRest.pCcmProfile2->name) {
127 strcpy(ccm_querry_info->ccmname2, ccm_contex->accmRest.pCcmProfile2->name);
128 }
129 }
130 else
131 strcpy(ccm_querry_info->ccmname2, ccm_querry_info->ccmname1);
132 }
133 memcpy(ccm_querry_info->y_alpha_curve, ccm_contex->ccmHwConf.alp_y, sizeof(ccm_contex->ccmHwConf.alp_y));
134 memcpy(ccm_querry_info->ccMatrix, ccm_contex->ccmHwConf.matrix, sizeof(ccm_contex->ccmHwConf.matrix));
135 memcpy(ccm_querry_info->ccOffsets, ccm_contex->ccmHwConf.offs, sizeof(ccm_contex->ccmHwConf.offs));
136 ccm_querry_info->ccm_en = ccm_contex->ccmHwConf.ccmEnable;
137 ccm_querry_info->low_bound_pos_bit = ccm_contex->ccmHwConf.bound_bit;
138 ccm_querry_info->right_pos_bit = ccm_contex->ccmHwConf.bound_bit;
139 ccm_querry_info->highy_adj_en = true;
140 ccm_querry_info->asym_enable = false;
141 #endif
142
143 #if RKAIQ_HAVE_CCM_V2
144 if (ccm_contex->ccmHwConf_v2.ccmEnable && ccm_contex->mCurAttV2.mode == RK_AIQ_CCM_MODE_AUTO){
145 ccm_querry_info->finalSat = ccm_contex->accmRest.fSaturation;
146 if (ccm_contex->accmRest.pCcmProfile1) {
147 if (ccm_contex->accmRest.pCcmProfile1->name) {
148 strcpy(ccm_querry_info->ccmname1, ccm_contex->accmRest.pCcmProfile1->name);
149 }
150 }
151 if (ccm_contex->accmRest.pCcmProfile2) {
152 if (ccm_contex->accmRest.pCcmProfile2->name) {
153 strcpy(ccm_querry_info->ccmname2, ccm_contex->accmRest.pCcmProfile2->name);
154 }
155 }
156 else
157 strcpy(ccm_querry_info->ccmname2, ccm_querry_info->ccmname1);
158 }
159 ccm_querry_info->highy_adj_en = ccm_contex->ccmHwConf_v2.highy_adj_en;
160 ccm_querry_info->asym_enable = ccm_contex->ccmHwConf_v2.asym_adj_en;
161 memcpy(ccm_querry_info->y_alpha_curve, ccm_contex->ccmHwConf_v2.alp_y,
162 sizeof(ccm_contex->ccmHwConf_v2.alp_y));
163 memcpy(ccm_querry_info->ccMatrix, ccm_contex->ccmHwConf_v2.matrix,
164 sizeof(ccm_contex->ccmHwConf_v2.matrix));
165 memcpy(ccm_querry_info->ccOffsets, ccm_contex->ccmHwConf_v2.offs,
166 sizeof(ccm_contex->ccmHwConf_v2.offs));
167 ccm_querry_info->ccm_en = ccm_contex->ccmHwConf_v2.ccmEnable;
168 ccm_querry_info->low_bound_pos_bit = ccm_contex->ccmHwConf_v2.bound_bit;
169 ccm_querry_info->right_pos_bit = ccm_contex->ccmHwConf_v2.right_bit;
170 #endif
171
172 ccm_querry_info->color_inhibition_level = ccm_contex->accmRest.color_inhibition_level;
173 ccm_querry_info->color_saturation_level = ccm_contex->accmRest.color_saturation_level;
174
175 return XCAM_RETURN_NO_ERROR;
176 }
177
178
179