xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/NrStreamProcUnit.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Copyright (c) 2019 Rockchip Corporation
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 
18 #include "NrStreamProcUnit.h"
19 #include "CamHwIsp20.h"
20 
21 namespace RkCam {
22 
23 #define ISPP_NR_SUBM  (0x02)
24 
NrStreamProcUnit(const rk_sensor_full_info_t * s_info)25 NrStreamProcUnit::NrStreamProcUnit (const rk_sensor_full_info_t *s_info)
26 {
27     mNrStatsDev = new V4l2Device(s_info->ispp_info->pp_nr_stats_path);
28     mNrStatsDev->open();
29     mNrParamsDev = new V4l2Device (s_info->ispp_info->pp_nr_params_path);
30     mNrParamsDev->open();
31     mNrStatsStream = new NrStatsStream(mNrStatsDev, ISPP_POLL_NR_STATS);
32     mNrParamStream = new RKStream(mNrParamsDev, ISPP_POLL_NR_PARAMS);
33     mParamsAssembler = new IspParamsAssembler("NR_PARAMS_ASSEMBLER");
34 }
35 
~NrStreamProcUnit()36 NrStreamProcUnit::~NrStreamProcUnit()
37 {
38 }
39 
40 void
start()41 NrStreamProcUnit::start()
42 {
43     XCamReturn ret = XCAM_RETURN_NO_ERROR;
44 
45     if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
46         if (mNrStatsStream.ptr())
47             mNrStatsStream->start();
48         if (mNrParamStream.ptr())
49             //mNrParamStream->startThreadOnly();
50             mNrParamStream->start();
51     }
52     // set inital params
53     ret = mParamsAssembler->start();
54     if (ret < 0) {
55         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
56         return;
57     }
58 
59     if (mParamsAssembler->ready())
60         configToDrv(0);
61     else
62         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no inital nr params ready");
63 }
64 
65 void
stop()66 NrStreamProcUnit::stop()
67 {
68     if (mNrParamStream.ptr())
69         mNrParamStream->stop();
70     if (mNrStatsStream.ptr())
71         mNrStatsStream->stop();
72     if (mParamsAssembler.ptr())
73         mParamsAssembler->stop();
74 }
75 
76 void
pause()77 NrStreamProcUnit::pause()
78 {
79 }
80 
81 void
resume()82 NrStreamProcUnit::resume()
83 {
84 }
85 
86 void
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)87 NrStreamProcUnit::set_devices(CamHwIsp20 *camHw, SmartPtr<V4l2SubDevice> isppdev)
88 {
89     mIsppSubDev = isppdev;
90     mCamHw = camHw;
91     mNrStatsStream->set_device(camHw, isppdev);
92 }
93 
configToDrv(uint32_t frameId)94 XCamReturn NrStreamProcUnit::configToDrv(uint32_t frameId)
95 {
96     XCamReturn ret = XCAM_RETURN_NO_ERROR;
97     XCAM_ASSERT (mParamsAssembler.ptr());
98 
99     SmartPtr<V4l2Buffer> v4l2buf_nr;
100     if (mNrParamsDev.ptr()) {
101         if (!mParamsAssembler->ready()) {
102             LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "have no nr new parameter\n");
103             return XCAM_RETURN_ERROR_PARAM;
104         }
105 
106         ret = mNrParamsDev->get_buffer(v4l2buf_nr);
107         if (ret) {
108             LOGW_CAMHW_SUBM(ISPP_NR_SUBM, "Can not get ispp nr params buffer\n");
109             return XCAM_RETURN_ERROR_PARAM;
110         }
111 
112         cam3aResultList ready_results;
113         ret = mParamsAssembler->deQueOne(ready_results, frameId);
114         if (ret != XCAM_RETURN_NO_ERROR) {
115             LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "deque parameter failed\n");
116             ret = XCAM_RETURN_ERROR_PARAM;
117             goto ret_nr_buf;
118         }
119 
120         struct rkispp_params_nrcfg* ispp_nr_params = (struct rkispp_params_nrcfg*)v4l2buf_nr->get_buf().m.userptr;
121         if (mCamHw->merge_results(ready_results, *ispp_nr_params) != XCAM_RETURN_NO_ERROR)
122             LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "nr parameter translation error\n");
123         LOGD_CAMHW_SUBM(ISPP_NR_SUBM, "nr: frameid %u, en update 0x%x, ens 0x%x, cfg update 0x%x",frameId,
124                         ispp_nr_params->head.module_en_update, ispp_nr_params->head.module_ens,
125                         ispp_nr_params->head.module_cfg_update);
126 
127         if (memcmp(&last_ispp_nr_params, ispp_nr_params, sizeof(last_ispp_nr_params)) == 0) {
128             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nr: no need update !");
129             ret = XCAM_RETURN_NO_ERROR;
130             goto ret_nr_buf;
131         }
132 
133         last_ispp_nr_params = *ispp_nr_params;
134 
135         if ((ispp_nr_params->head.module_cfg_update) || (ispp_nr_params->head.module_en_update))
136         {
137             ispp_nr_params->head.frame_id = frameId;
138             ispp_nr_params->gain.index = -1;
139             ispp_nr_params->gain.size = 0;
140             //mNrStatsStream->get_nrgain_fd();
141             //ispp_nr_params->gain.index = mNrStatsStream->get_nrgain_fd();
142             //ispp_nr_params->gain = ispp_params->gain;
143             //TODO set update bits
144             if (mNrParamsDev->queue_buffer (v4l2buf_nr) != 0) {
145                 LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "RKISP1: nr: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
146                                 v4l2buf_nr->get_buf().index, errno, strerror(errno));
147                 goto ret_nr_buf;
148             }
149             //setIsppSharpFbcRot(&ispp_nr_params->shp_cfg);
150         } else
151             goto ret_nr_buf;
152      } else
153         ret = XCAM_RETURN_BYPASS;
154 
155     return XCAM_RETURN_NO_ERROR;
156 
157 ret_nr_buf:
158     if (v4l2buf_nr.ptr())
159         mNrParamsDev->return_buffer_to_pool (v4l2buf_nr);
160     return ret;
161 
162 }
163 
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)164 XCamReturn NrStreamProcUnit::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
165 {
166     XCamReturn ret = XCAM_RETURN_NO_ERROR;
167     XCAM_ASSERT (mParamsAssembler.ptr());
168     // params device should started befor any params queued
169     if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
170         mParamsAssembler->addReadyCondition(result->getType());
171         mParamsAssembler->queue(result);
172     } else {
173         mParamsAssembler->queue(result);
174         // set all ready params to drv
175         while (mParamsAssembler->ready()) {
176             if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
177                 break;
178         }
179     }
180 
181     return ret;
182 }
183 
184 } //namspace RkCam
185