1 /*
2  * Copyright (c) 2019-2022 Rockchip Eletronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "abayer2dnrV23/rk_aiq_uapi_abayer2dnr_int_v23.h"
18 #include "abayer2dnrV23/rk_aiq_types_abayer2dnr_algo_prvt_v23.h"
19 #include "RkAiqCalibApi.h"
20 //#include "bayer2dnr_xml2json_v23.h"
21 
22 
23 #if 1
24 
25 #define RAWNR_LUMA_SF_STRENGTH_SLOPE_FACTOR (8.0)
26 
27 
28 XCamReturn
rk_aiq_uapi_abayer2dnrV23_SetAttrib(RkAiqAlgoContext * ctx,const rk_aiq_bayer2dnr_attrib_v23_t * attr,bool need_sync)29 rk_aiq_uapi_abayer2dnrV23_SetAttrib(RkAiqAlgoContext *ctx,
30                                     const rk_aiq_bayer2dnr_attrib_v23_t *attr,
31                                     bool need_sync)
32 {
33 
34     Abayer2dnr_Context_V23_t* pCtx = (Abayer2dnr_Context_V23_t*)ctx;
35 
36     pCtx->eMode = attr->eMode;
37     if(pCtx->eMode == ABAYER2DNR_V23_OP_MODE_AUTO) {
38         pCtx->stAuto = attr->stAuto;
39     } else if(pCtx->eMode == ABAYER2DNR_V23_OP_MODE_MANUAL) {
40         pCtx->stManual.st2DSelect = attr->stManual.st2DSelect;
41     } else if(pCtx->eMode == ABAYER2DNR_V23_OP_MODE_REG_MANUAL) {
42         pCtx->stManual.st2Dfix = attr->stManual.st2Dfix;
43     }
44     pCtx->isReCalculate |= 1;
45 
46     return XCAM_RETURN_NO_ERROR;
47 }
48 
49 XCamReturn
rk_aiq_uapi_abayer2dnrV23_GetAttrib(const RkAiqAlgoContext * ctx,rk_aiq_bayer2dnr_attrib_v23_t * attr)50 rk_aiq_uapi_abayer2dnrV23_GetAttrib(const RkAiqAlgoContext *ctx,
51                                     rk_aiq_bayer2dnr_attrib_v23_t *attr)
52 {
53 
54     Abayer2dnr_Context_V23_t* pCtx = (Abayer2dnr_Context_V23_t*)ctx;
55 
56     attr->eMode = pCtx->eMode;
57     memcpy(&attr->stAuto, &pCtx->stAuto, sizeof(attr->stAuto));
58     memcpy(&attr->stManual, &pCtx->stManual, sizeof(attr->stManual));
59 
60     return XCAM_RETURN_NO_ERROR;
61 }
62 
63 
64 XCamReturn
rk_aiq_uapi_abayer2dnrV23_SetStrength(const RkAiqAlgoContext * ctx,const rk_aiq_bayer2dnr_strength_v23_t * pStrength)65 rk_aiq_uapi_abayer2dnrV23_SetStrength(const RkAiqAlgoContext *ctx,
66                                       const rk_aiq_bayer2dnr_strength_v23_t *pStrength)
67 {
68     Abayer2dnr_Context_V23_t* pCtx = (Abayer2dnr_Context_V23_t*)ctx;
69 
70     float fStrength = 1.0f;
71     float fslope = RAWNR_LUMA_SF_STRENGTH_SLOPE_FACTOR;
72     float fPercent = 0.5f;
73 
74     fPercent = pStrength->percent;
75 
76 
77     if(fPercent <= 0.5) {
78         fStrength = fPercent / 0.5;
79     } else {
80         if(fPercent >= 0.999999)
81             fPercent = 0.999999;
82         fStrength = 0.5 * fslope / (1.0 - fPercent) - fslope + 1;
83     }
84 
85     pCtx->stStrength = *pStrength;
86     pCtx->stStrength.percent = fStrength;
87     pCtx->isReCalculate |= 1;
88 
89     return XCAM_RETURN_NO_ERROR;
90 }
91 
92 
93 
94 
95 XCamReturn
rk_aiq_uapi_abayer2dnrV23_GetStrength(const RkAiqAlgoContext * ctx,rk_aiq_bayer2dnr_strength_v23_t * pStrength)96 rk_aiq_uapi_abayer2dnrV23_GetStrength(const RkAiqAlgoContext *ctx,
97                                       rk_aiq_bayer2dnr_strength_v23_t *pStrength)
98 {
99     Abayer2dnr_Context_V23_t* pCtx = (Abayer2dnr_Context_V23_t*)ctx;
100 
101     float fStrength = 1.0f;
102     float fslope = RAWNR_LUMA_SF_STRENGTH_SLOPE_FACTOR;
103     float fPercent = 0.0f;
104 
105     fStrength = pCtx->stStrength.percent;
106 
107     if(fStrength <= 1) {
108         fPercent = fStrength * 0.5;
109     } else {
110         float tmp = 1.0;
111         tmp = 1 - 0.5 * fslope / (fStrength + fslope - 1);
112         if(abs(tmp - 0.999999) < 0.000001) {
113             tmp = 1.0;
114         }
115         fPercent = tmp;
116     }
117 
118     *pStrength = pCtx->stStrength;
119     pStrength->percent = fPercent;
120 
121     return XCAM_RETURN_NO_ERROR;
122 }
123 
124 XCamReturn
rk_aiq_uapi_abayer2dnrV23_GetInfo(const RkAiqAlgoContext * ctx,rk_aiq_bayer2dnr_info_v23_t * pInfo)125 rk_aiq_uapi_abayer2dnrV23_GetInfo(const RkAiqAlgoContext* ctx,
126                                   rk_aiq_bayer2dnr_info_v23_t* pInfo) {
127 
128     Abayer2dnr_Context_V23_t* pCtx = (Abayer2dnr_Context_V23_t*)ctx;
129 
130     pInfo->iso = pCtx->stExpInfo.arIso[pCtx->stExpInfo.hdr_mode];
131 
132 
133     pInfo->expo_info = pCtx->stExpInfo;
134     return XCAM_RETURN_NO_ERROR;
135 }
136 
137 
138 
139 #endif
140 
141