1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2019 Rockchip Corporation
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun * You may obtain a copy of the License at
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun * limitations under the License.
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include "NrStreamProcUnit.h"
19*4882a593Smuzhiyun #include "CamHwIsp20.h"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun namespace RkCam {
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #define ISPP_NR_SUBM (0x02)
24*4882a593Smuzhiyun
NrStreamProcUnit(const rk_sensor_full_info_t * s_info)25*4882a593Smuzhiyun NrStreamProcUnit::NrStreamProcUnit (const rk_sensor_full_info_t *s_info)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun mNrStatsDev = new V4l2Device(s_info->ispp_info->pp_nr_stats_path);
28*4882a593Smuzhiyun mNrStatsDev->open();
29*4882a593Smuzhiyun mNrParamsDev = new V4l2Device (s_info->ispp_info->pp_nr_params_path);
30*4882a593Smuzhiyun mNrParamsDev->open();
31*4882a593Smuzhiyun mNrStatsStream = new NrStatsStream(mNrStatsDev, ISPP_POLL_NR_STATS);
32*4882a593Smuzhiyun mNrParamStream = new RKStream(mNrParamsDev, ISPP_POLL_NR_PARAMS);
33*4882a593Smuzhiyun mParamsAssembler = new IspParamsAssembler("NR_PARAMS_ASSEMBLER");
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun
~NrStreamProcUnit()36*4882a593Smuzhiyun NrStreamProcUnit::~NrStreamProcUnit()
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun void
start()41*4882a593Smuzhiyun NrStreamProcUnit::start()
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
46*4882a593Smuzhiyun if (mNrStatsStream.ptr())
47*4882a593Smuzhiyun mNrStatsStream->start();
48*4882a593Smuzhiyun if (mNrParamStream.ptr())
49*4882a593Smuzhiyun //mNrParamStream->startThreadOnly();
50*4882a593Smuzhiyun mNrParamStream->start();
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun // set inital params
53*4882a593Smuzhiyun ret = mParamsAssembler->start();
54*4882a593Smuzhiyun if (ret < 0) {
55*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
56*4882a593Smuzhiyun return;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun if (mParamsAssembler->ready())
60*4882a593Smuzhiyun configToDrv(0);
61*4882a593Smuzhiyun else
62*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no inital nr params ready");
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun void
stop()66*4882a593Smuzhiyun NrStreamProcUnit::stop()
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun if (mNrParamStream.ptr())
69*4882a593Smuzhiyun mNrParamStream->stop();
70*4882a593Smuzhiyun if (mNrStatsStream.ptr())
71*4882a593Smuzhiyun mNrStatsStream->stop();
72*4882a593Smuzhiyun if (mParamsAssembler.ptr())
73*4882a593Smuzhiyun mParamsAssembler->stop();
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun void
pause()77*4882a593Smuzhiyun NrStreamProcUnit::pause()
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun void
resume()82*4882a593Smuzhiyun NrStreamProcUnit::resume()
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun void
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)87*4882a593Smuzhiyun NrStreamProcUnit::set_devices(CamHwIsp20 *camHw, SmartPtr<V4l2SubDevice> isppdev)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun mIsppSubDev = isppdev;
90*4882a593Smuzhiyun mCamHw = camHw;
91*4882a593Smuzhiyun mNrStatsStream->set_device(camHw, isppdev);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
configToDrv(uint32_t frameId)94*4882a593Smuzhiyun XCamReturn NrStreamProcUnit::configToDrv(uint32_t frameId)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
97*4882a593Smuzhiyun XCAM_ASSERT (mParamsAssembler.ptr());
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun SmartPtr<V4l2Buffer> v4l2buf_nr;
100*4882a593Smuzhiyun if (mNrParamsDev.ptr()) {
101*4882a593Smuzhiyun if (!mParamsAssembler->ready()) {
102*4882a593Smuzhiyun LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "have no nr new parameter\n");
103*4882a593Smuzhiyun return XCAM_RETURN_ERROR_PARAM;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun ret = mNrParamsDev->get_buffer(v4l2buf_nr);
107*4882a593Smuzhiyun if (ret) {
108*4882a593Smuzhiyun LOGW_CAMHW_SUBM(ISPP_NR_SUBM, "Can not get ispp nr params buffer\n");
109*4882a593Smuzhiyun return XCAM_RETURN_ERROR_PARAM;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun cam3aResultList ready_results;
113*4882a593Smuzhiyun ret = mParamsAssembler->deQueOne(ready_results, frameId);
114*4882a593Smuzhiyun if (ret != XCAM_RETURN_NO_ERROR) {
115*4882a593Smuzhiyun LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "deque parameter failed\n");
116*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_PARAM;
117*4882a593Smuzhiyun goto ret_nr_buf;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun struct rkispp_params_nrcfg* ispp_nr_params = (struct rkispp_params_nrcfg*)v4l2buf_nr->get_buf().m.userptr;
121*4882a593Smuzhiyun if (mCamHw->merge_results(ready_results, *ispp_nr_params) != XCAM_RETURN_NO_ERROR)
122*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "nr parameter translation error\n");
123*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISPP_NR_SUBM, "nr: frameid %u, en update 0x%x, ens 0x%x, cfg update 0x%x",frameId,
124*4882a593Smuzhiyun ispp_nr_params->head.module_en_update, ispp_nr_params->head.module_ens,
125*4882a593Smuzhiyun ispp_nr_params->head.module_cfg_update);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun if (memcmp(&last_ispp_nr_params, ispp_nr_params, sizeof(last_ispp_nr_params)) == 0) {
128*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nr: no need update !");
129*4882a593Smuzhiyun ret = XCAM_RETURN_NO_ERROR;
130*4882a593Smuzhiyun goto ret_nr_buf;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun last_ispp_nr_params = *ispp_nr_params;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun if ((ispp_nr_params->head.module_cfg_update) || (ispp_nr_params->head.module_en_update))
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun ispp_nr_params->head.frame_id = frameId;
138*4882a593Smuzhiyun ispp_nr_params->gain.index = -1;
139*4882a593Smuzhiyun ispp_nr_params->gain.size = 0;
140*4882a593Smuzhiyun //mNrStatsStream->get_nrgain_fd();
141*4882a593Smuzhiyun //ispp_nr_params->gain.index = mNrStatsStream->get_nrgain_fd();
142*4882a593Smuzhiyun //ispp_nr_params->gain = ispp_params->gain;
143*4882a593Smuzhiyun //TODO set update bits
144*4882a593Smuzhiyun if (mNrParamsDev->queue_buffer (v4l2buf_nr) != 0) {
145*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "RKISP1: nr: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
146*4882a593Smuzhiyun v4l2buf_nr->get_buf().index, errno, strerror(errno));
147*4882a593Smuzhiyun goto ret_nr_buf;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun //setIsppSharpFbcRot(&ispp_nr_params->shp_cfg);
150*4882a593Smuzhiyun } else
151*4882a593Smuzhiyun goto ret_nr_buf;
152*4882a593Smuzhiyun } else
153*4882a593Smuzhiyun ret = XCAM_RETURN_BYPASS;
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun ret_nr_buf:
158*4882a593Smuzhiyun if (v4l2buf_nr.ptr())
159*4882a593Smuzhiyun mNrParamsDev->return_buffer_to_pool (v4l2buf_nr);
160*4882a593Smuzhiyun return ret;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)164*4882a593Smuzhiyun XCamReturn NrStreamProcUnit::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
167*4882a593Smuzhiyun XCAM_ASSERT (mParamsAssembler.ptr());
168*4882a593Smuzhiyun // params device should started befor any params queued
169*4882a593Smuzhiyun if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
170*4882a593Smuzhiyun mParamsAssembler->addReadyCondition(result->getType());
171*4882a593Smuzhiyun mParamsAssembler->queue(result);
172*4882a593Smuzhiyun } else {
173*4882a593Smuzhiyun mParamsAssembler->queue(result);
174*4882a593Smuzhiyun // set all ready params to drv
175*4882a593Smuzhiyun while (mParamsAssembler->ready()) {
176*4882a593Smuzhiyun if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
177*4882a593Smuzhiyun break;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return ret;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun } //namspace RkCam
185