xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/aynr3/rk_aiq_uapi_aynr_int_v3.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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