1 #include "aynr3/rk_aiq_uapi_aynr_int_v3.h"
2 #include "aynr3/rk_aiq_types_aynr_algo_prvt_v3.h"
3
4 #if 1
5 #define AYNRV3_CHROMA_SF_STRENGTH_SLOPE_FACTOR (5.0)
6
7
sigma_curve_calc(double * pSigma_curve,int16_t * pLumaPoint,float * pSigma)8 int sigma_curve_calc(double* pSigma_curve, int16_t* pLumaPoint, float* pSigma)
9 {
10 int i = 0;
11 short isoCurveSectValue;
12 short isoCurveSectValue1;
13 float ave1, ave2, ave3, ave4;
14 int bit_calib = 12;
15 int bit_proc;
16 int bit_shift;
17
18 if(pSigma_curve == NULL || pLumaPoint == NULL || pSigma == NULL) {
19 LOGE_ANR("%s:%d null point\n", __FUNCTION__, __LINE__);
20 }
21
22 bit_proc = YNR_V3_SIGMA_BITS; // for V3, YNR_SIGMA_BITS = 10
23 bit_shift = bit_calib - bit_proc;
24
25 isoCurveSectValue = (1 << (bit_calib - YNR_V3_ISO_CURVE_POINT_BIT));
26 isoCurveSectValue1 = (1 << bit_calib);
27
28 for (i = 0; i < YNR_V3_ISO_CURVE_POINT_NUM; i++) {
29 if (i == (YNR_V3_ISO_CURVE_POINT_NUM - 1)) {
30 ave1 = (float)isoCurveSectValue1;
31 } else {
32 ave1 = (float)(i * isoCurveSectValue);
33 }
34 pLumaPoint[i] = (short)ave1;
35 ave2 = ave1 * ave1;
36 ave3 = ave2 * ave1;
37 ave4 = ave3 * ave1;
38 pSigma[i] = pSigma_curve[0] * ave4
39 + pSigma_curve[1] * ave3
40 + pSigma_curve[2] * ave2
41 + pSigma_curve[3] * ave1
42 + pSigma_curve[4];
43
44 if (pSigma[i] < 0) {
45 pSigma[i] = 0;
46 }
47
48 if (bit_shift > 0) {
49 pLumaPoint[i] >>= bit_shift;
50 } else {
51 pLumaPoint[i] <<= ABS(bit_shift);
52 }
53 }
54
55 return 0;
56 }
57
58 XCamReturn
rk_aiq_uapi_aynrV3_SetAttrib(RkAiqAlgoContext * ctx,rk_aiq_ynr_attrib_v3_t * attr,bool need_sync)59 rk_aiq_uapi_aynrV3_SetAttrib(RkAiqAlgoContext *ctx,
60 rk_aiq_ynr_attrib_v3_t *attr,
61 bool need_sync)
62 {
63
64 Aynr_Context_V3_t* pCtx = (Aynr_Context_V3_t*)ctx;
65
66 pCtx->eMode = attr->eMode;
67 if(pCtx->eMode == AYNRV3_OP_MODE_AUTO) {
68 pCtx->stAuto = attr->stAuto;
69 RK_YNR_Params_V3_t *pParams = &attr->stAuto.stParams;
70 if(!pParams->sigma_use_point) {
71 for(int j = 0; j < RK_YNR_V3_MAX_ISO_NUM ; j++) {
72 double *pSigma_curve = pParams->arSigmaFormulaISO[j].sigma_curve;
73 sigma_curve_calc(pSigma_curve, pParams->arYnrParamsISO[j].lumaPoint, pParams->arYnrParamsISO[j].sigma);
74 }
75 }
76 } else if(pCtx->eMode == AYNRV3_OP_MODE_MANUAL) {
77 pCtx->stManual.stSelect = attr->stManual.stSelect;
78 } else if(pCtx->eMode == AYNRV3_OP_MODE_REG_MANUAL) {
79 pCtx->stManual.stFix = attr->stManual.stFix;
80 }
81 pCtx->isReCalculate |= 1;
82
83 return XCAM_RETURN_NO_ERROR;
84 }
85
86 XCamReturn
rk_aiq_uapi_aynrV3_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_ynr_attrib_v3_t * attr)87 rk_aiq_uapi_aynrV3_GetAttrib(const RkAiqAlgoContext *ctx,
88 rk_aiq_ynr_attrib_v3_t *attr)
89 {
90
91 Aynr_Context_V3_t* pCtx = (Aynr_Context_V3_t*)ctx;
92
93 attr->eMode = pCtx->eMode;
94 memcpy(&attr->stAuto, &pCtx->stAuto, sizeof(attr->stAuto));
95 memcpy(&attr->stManual, &pCtx->stManual, sizeof(attr->stManual));
96
97 return XCAM_RETURN_NO_ERROR;
98 }
99
100
101 XCamReturn
rk_aiq_uapi_aynrV3_SetLumaSFStrength(const RkAiqAlgoContext * ctx,rk_aiq_ynr_strength_v3_t * pStrength)102 rk_aiq_uapi_aynrV3_SetLumaSFStrength(const RkAiqAlgoContext *ctx,
103 rk_aiq_ynr_strength_v3_t *pStrength)
104 {
105 Aynr_Context_V3_t* pCtx = (Aynr_Context_V3_t*)ctx;
106
107 float fStrength = 1.0f;
108 float fPercent = 0.5;
109 float fslope = AYNRV3_CHROMA_SF_STRENGTH_SLOPE_FACTOR;
110
111 fPercent = pStrength->percent;
112
113
114 if(fPercent <= 0.5) {
115 fStrength = fPercent / 0.5;
116 } else {
117 if(fPercent >= 0.999999)
118 fPercent = 0.999999;
119 fStrength = 0.5 * fslope / (1.0 - fPercent) - fslope + 1;
120 }
121
122 pCtx->stStrength = *pStrength;
123 pCtx->stStrength.percent = fStrength;
124 pCtx->isReCalculate |= 1;
125
126 return XCAM_RETURN_NO_ERROR;
127 }
128
129
130
131 XCamReturn
rk_aiq_uapi_aynrV3_GetLumaSFStrength(const RkAiqAlgoContext * ctx,rk_aiq_ynr_strength_v3_t * pStrength)132 rk_aiq_uapi_aynrV3_GetLumaSFStrength(const RkAiqAlgoContext *ctx,
133 rk_aiq_ynr_strength_v3_t *pStrength)
134 {
135 Aynr_Context_V3_t* pCtx = (Aynr_Context_V3_t*)ctx;
136
137 float fStrength = 1.0f;
138 float fPercent = 0.5;
139 float fslope = AYNRV3_CHROMA_SF_STRENGTH_SLOPE_FACTOR;
140
141 fStrength = pCtx->stStrength.percent;
142
143 if(fStrength <= 1) {
144 fPercent = fStrength * 0.5;
145 } else {
146 float tmp = 1.0;
147 tmp = 1 - 0.5 * fslope / (fStrength + fslope - 1);
148 if(abs(tmp - 0.999999) < 0.000001) {
149 tmp = 1.0;
150 }
151 fPercent = tmp;
152 }
153
154 *pStrength = pCtx->stStrength;
155 pStrength->percent = fPercent;
156
157 return XCAM_RETURN_NO_ERROR;
158 }
159
160 XCamReturn
rk_aiq_uapi_aynrV3_GetInfo(const RkAiqAlgoContext * ctx,rk_aiq_ynr_info_v3_t * pInfo)161 rk_aiq_uapi_aynrV3_GetInfo(const RkAiqAlgoContext *ctx,
162 rk_aiq_ynr_info_v3_t *pInfo)
163 {
164 Aynr_Context_V3_t* pCtx = (Aynr_Context_V3_t*)ctx;
165
166
167 pInfo->iso = pCtx->stExpInfo.arIso[pCtx->stExpInfo.hdr_mode];
168 pInfo->expo_info = pCtx->stExpInfo;
169
170 return XCAM_RETURN_NO_ERROR;
171 }
172
173
174 #endif
175
176