1*4882a593Smuzhiyun #include "rk_aiq_comm.h"
2*4882a593Smuzhiyun #include "rkispp-config.h"
3*4882a593Smuzhiyun #include "rkisp2-config.h"
4*4882a593Smuzhiyun #include "SPStreamProcUnit.h"
5*4882a593Smuzhiyun #include "CamHwIsp20.h"
6*4882a593Smuzhiyun namespace RkCam {
7*4882a593Smuzhiyun
SPStreamProcUnit(SmartPtr<V4l2Device> isp_sp_dev,int type,int isp_ver)8*4882a593Smuzhiyun SPStreamProcUnit::SPStreamProcUnit (SmartPtr<V4l2Device> isp_sp_dev, int type, int isp_ver)
9*4882a593Smuzhiyun : RKStream(isp_sp_dev, type)
10*4882a593Smuzhiyun , _first(true)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun setPollCallback (this);
13*4882a593Smuzhiyun _ds_width = 0;
14*4882a593Smuzhiyun _ds_height = 0;
15*4882a593Smuzhiyun _ds_width_align = 0;
16*4882a593Smuzhiyun _ds_height_align = 0;
17*4882a593Smuzhiyun _isp_ver = isp_ver;
18*4882a593Smuzhiyun }
19*4882a593Smuzhiyun
~SPStreamProcUnit()20*4882a593Smuzhiyun SPStreamProcUnit::~SPStreamProcUnit ()
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun }
23*4882a593Smuzhiyun
start()24*4882a593Smuzhiyun void SPStreamProcUnit::start()
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun if (_isp_ver == ISP_V20) {
27*4882a593Smuzhiyun struct rkispp_trigger_mode tnr_trigger;
28*4882a593Smuzhiyun tnr_trigger.module = ISPP_MODULE_TNR;
29*4882a593Smuzhiyun tnr_trigger.on = 1;
30*4882a593Smuzhiyun int ret = _ispp_dev->io_control(RKISPP_CMD_TRIGGER_MODE, &tnr_trigger);
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun if (ldg_enable) {
34*4882a593Smuzhiyun pAfTmp = (uint8_t*)malloc(_ds_width_align * _ds_height_align * sizeof(pAfTmp[0]) * 3 / 2);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun RKStream::start();
38*4882a593Smuzhiyun return;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
stop()41*4882a593Smuzhiyun void SPStreamProcUnit::stop()
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun if (_isp_ver == ISP_V20) {
44*4882a593Smuzhiyun struct rkispp_trigger_mode tnr_trigger;
45*4882a593Smuzhiyun tnr_trigger.module = ISPP_MODULE_TNR;
46*4882a593Smuzhiyun tnr_trigger.on = 0;
47*4882a593Smuzhiyun int ret = _ispp_dev->io_control(RKISPP_CMD_TRIGGER_MODE, &tnr_trigger);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun RKStream::stop();//stopDeviceOnly&stopThreadOnly
51*4882a593Smuzhiyun if (_isp_ver == ISP_V20)
52*4882a593Smuzhiyun deinit_fbcbuf_fd();
53*4882a593Smuzhiyun if (pAfTmp) {
54*4882a593Smuzhiyun free(pAfTmp);
55*4882a593Smuzhiyun pAfTmp = NULL;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun SmartPtr<VideoBuffer>
new_video_buffer(SmartPtr<V4l2Buffer> buf,SmartPtr<V4l2Device> dev)60*4882a593Smuzhiyun SPStreamProcUnit::new_video_buffer(SmartPtr<V4l2Buffer> buf,
61*4882a593Smuzhiyun SmartPtr<V4l2Device> dev)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun if (_isp_ver == ISP_V21) {
64*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> img_buf = new V4l2BufferProxy (buf, dev);
65*4882a593Smuzhiyun img_buf->_buf_type = _dev_type;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun return img_buf;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun if (_first) {
71*4882a593Smuzhiyun init_fbcbuf_fd();
72*4882a593Smuzhiyun _first = false;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun //image
76*4882a593Smuzhiyun struct VideoBufferInfo vbufInfo;
77*4882a593Smuzhiyun vbufInfo.init(V4L2_PIX_FMT_NV12, _ds_width_align, _ds_height_align,
78*4882a593Smuzhiyun XCAM_ALIGN_UP(_ds_width_align, 4), _ds_height_align, 0);
79*4882a593Smuzhiyun SmartPtr<SPImagBufferProxy> img_buf = new SPImagBufferProxy (buf, dev);
80*4882a593Smuzhiyun struct isp2x_ispgain_buf *ispgain = (struct isp2x_ispgain_buf *)img_buf->get_v4l2_planar_userptr(1);
81*4882a593Smuzhiyun img_buf->_buf_type = _dev_type;
82*4882a593Smuzhiyun img_buf->set_buff_fd(img_buf->get_expbuf_fd());
83*4882a593Smuzhiyun img_buf->set_video_info(vbufInfo);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun //ispgain
86*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> v4l2buf = img_buf.dynamic_cast_ptr<V4l2BufferProxy>();
87*4882a593Smuzhiyun _ispgain = new SubVideoBuffer (v4l2buf);
88*4882a593Smuzhiyun _ispgain->_buf_type = ISP_GAIN;
89*4882a593Smuzhiyun _ispgain->set_sequence(img_buf->get_sequence());
90*4882a593Smuzhiyun _ispgain->set_buff_info(get_fd_by_index(ispgain->gain_dmaidx), ispgain->gain_size);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun return img_buf;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
get_lowpass_fv(uint32_t sequence,SmartPtr<V4l2BufferProxy> buf_proxy)95*4882a593Smuzhiyun int SPStreamProcUnit::get_lowpass_fv(uint32_t sequence, SmartPtr<V4l2BufferProxy> buf_proxy)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V20
98*4882a593Smuzhiyun SmartPtr<LensHw> lensHw = _focus_dev.dynamic_cast_ptr<LensHw>();
99*4882a593Smuzhiyun uint8_t *image_buf = (uint8_t *)buf_proxy->get_v4l2_planar_userptr(0);
100*4882a593Smuzhiyun rk_aiq_af_algo_meas_t meas_param;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun _afmeas_param_mutex.lock();
103*4882a593Smuzhiyun meas_param = _af_meas_params;
104*4882a593Smuzhiyun _afmeas_param_mutex.unlock();
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun if (meas_param.sp_meas.enable) {
107*4882a593Smuzhiyun meas_param.wina_h_offs /= img_ds_size_x;
108*4882a593Smuzhiyun meas_param.wina_v_offs /= img_ds_size_y;
109*4882a593Smuzhiyun meas_param.wina_h_size /= img_ds_size_x;
110*4882a593Smuzhiyun meas_param.wina_v_size /= img_ds_size_y;
111*4882a593Smuzhiyun get_lpfv(sequence, image_buf, af_img_width, af_img_height,
112*4882a593Smuzhiyun af_img_width_align, af_img_height_align, pAfTmp, sub_shp4_4,
113*4882a593Smuzhiyun sub_shp8_8, high_light, high_light2, &meas_param);
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun lensHw->setLowPassFv(sub_shp4_4, sub_shp8_8, high_light, high_light2, sequence);
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun #endif
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun return 0;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun XCamReturn
poll_buffer_ready(SmartPtr<VideoBuffer> & buf)123*4882a593Smuzhiyun SPStreamProcUnit::poll_buffer_ready (SmartPtr<VideoBuffer> &buf)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V20
128*4882a593Smuzhiyun if (ldg_enable) {
129*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> buf_proxy = buf.dynamic_cast_ptr<V4l2BufferProxy>();
130*4882a593Smuzhiyun get_lowpass_fv(buf->get_sequence(), buf_proxy);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun #endif
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun if (_isp_ver == ISP_V20) {
135*4882a593Smuzhiyun if (_camHw->mHwResLintener) {
136*4882a593Smuzhiyun _camHw->mHwResLintener->hwResCb(buf);
137*4882a593Smuzhiyun SmartPtr<VideoBuffer> vbuf = _ispgain.dynamic_cast_ptr<VideoBuffer>();
138*4882a593Smuzhiyun _camHw->mHwResLintener->hwResCb(vbuf);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun return ret;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
prepare(CalibDbV2_Af_LdgParam_t * ldg_param,CalibDbV2_Af_HighLightParam_t * highlight,int width,int height,int stride)145*4882a593Smuzhiyun XCamReturn SPStreamProcUnit::prepare(CalibDbV2_Af_LdgParam_t *ldg_param, CalibDbV2_Af_HighLightParam_t *highlight, int width, int height, int stride)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
148*4882a593Smuzhiyun uint32_t pixelformat, plane_cnt;
149*4882a593Smuzhiyun uint32_t ds_size_w = 4;
150*4882a593Smuzhiyun uint32_t ds_size_h = 4;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun if (_isp_ver == ISP_V20) {
153*4882a593Smuzhiyun pixelformat = V4L2_PIX_FMT_FBCG;
154*4882a593Smuzhiyun plane_cnt = 2;
155*4882a593Smuzhiyun } else {
156*4882a593Smuzhiyun pixelformat = V4L2_PIX_FMT_NV12;
157*4882a593Smuzhiyun plane_cnt = 1;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun if (!width && !height) {
161*4882a593Smuzhiyun struct v4l2_subdev_format isp_src_fmt;
162*4882a593Smuzhiyun isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
163*4882a593Smuzhiyun isp_src_fmt.pad = 2;
164*4882a593Smuzhiyun ret = _isp_core_dev->getFormat(isp_src_fmt);
165*4882a593Smuzhiyun if (ret) {
166*4882a593Smuzhiyun LOGE("get mIspCoreDev src fmt failed !\n");
167*4882a593Smuzhiyun return XCAM_RETURN_ERROR_FAILED;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun _src_width = isp_src_fmt.format.width;
170*4882a593Smuzhiyun _src_height = isp_src_fmt.format.height;
171*4882a593Smuzhiyun _ds_width = (_src_width + ds_size_w - 1) / ds_size_w;
172*4882a593Smuzhiyun _ds_height = (_src_height + ds_size_h - 1) / ds_size_h;
173*4882a593Smuzhiyun _ds_width_align = (_ds_width + 7) & (~7);
174*4882a593Smuzhiyun _ds_height_align = (_ds_height + 7) & (~7);
175*4882a593Smuzhiyun int _stride = XCAM_ALIGN_UP(_ds_width_align, 64);
176*4882a593Smuzhiyun img_ds_size_x = ds_size_w;
177*4882a593Smuzhiyun img_ds_size_y = ds_size_h;
178*4882a593Smuzhiyun LOGD( "set sp format: _src_width %d, _src_height %d, width %d %d height %d %d, stride %d\n",
179*4882a593Smuzhiyun _src_width, _src_height, _ds_width, _ds_width_align, _ds_height, _ds_height_align, _stride);
180*4882a593Smuzhiyun ret = _dev->set_format(_ds_width_align, _ds_height_align, pixelformat, V4L2_FIELD_NONE, 0);
181*4882a593Smuzhiyun if (ret) {
182*4882a593Smuzhiyun LOGE("set isp_sp_dev src fmt failed !\n");
183*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_FAILED;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun struct v4l2_format format;
187*4882a593Smuzhiyun _dev->get_format (format);
188*4882a593Smuzhiyun set_af_img_size(format.fmt.pix_mp.width, format.fmt.pix_mp.height,
189*4882a593Smuzhiyun format.fmt.pix_mp.plane_fmt[0].bytesperline, format.fmt.pix_mp.height);
190*4882a593Smuzhiyun } else {
191*4882a593Smuzhiyun LOGD( "set sp format: width %d height %d\n", width, height);
192*4882a593Smuzhiyun ret = _dev->set_format(width, height, pixelformat, V4L2_FIELD_NONE, stride);
193*4882a593Smuzhiyun if (ret) {
194*4882a593Smuzhiyun LOGE("set isp_sp_dev src fmt failed !\n");
195*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_FAILED;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun _dev->set_mem_type(V4L2_MEMORY_MMAP);
199*4882a593Smuzhiyun _dev->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
200*4882a593Smuzhiyun _dev->set_buffer_count(6);
201*4882a593Smuzhiyun _dev->set_mplanes_count(plane_cnt);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun ldg_enable = ldg_param->enable;
204*4882a593Smuzhiyun if (ldg_enable) {
205*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_xl = ldg_param->ldg_xl;
206*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_yl = ldg_param->ldg_yl;
207*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_kl = ldg_param->ldg_kl;
208*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_xh = ldg_param->ldg_xh;
209*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_yh = ldg_param->ldg_yh;
210*4882a593Smuzhiyun _af_meas_params.sp_meas.ldg_kh = ldg_param->ldg_kh;
211*4882a593Smuzhiyun _af_meas_params.sp_meas.highlight_th = highlight->ther0;
212*4882a593Smuzhiyun _af_meas_params.sp_meas.highlight2_th = highlight->ther1;
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun return ret;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isp_core_dev,SmartPtr<V4l2SubDevice> ispp_dev,SmartPtr<V4l2SubDevice> lensdev)218*4882a593Smuzhiyun void SPStreamProcUnit::set_devices(CamHwIsp20* camHw, SmartPtr<V4l2SubDevice> isp_core_dev, SmartPtr<V4l2SubDevice> ispp_dev, SmartPtr<V4l2SubDevice> lensdev)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun _camHw = camHw;
221*4882a593Smuzhiyun _isp_core_dev = isp_core_dev;
222*4882a593Smuzhiyun _ispp_dev = ispp_dev;
223*4882a593Smuzhiyun _focus_dev = lensdev;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
init_fbcbuf_fd()226*4882a593Smuzhiyun bool SPStreamProcUnit::init_fbcbuf_fd()
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun struct isp2x_buf_idxfd ispbuf_fd;
229*4882a593Smuzhiyun int res = -1;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun memset(&ispbuf_fd, 0, sizeof(ispbuf_fd));
232*4882a593Smuzhiyun res = _isp_core_dev->io_control(RKISP_CMD_GET_FBCBUF_FD , &ispbuf_fd);
233*4882a593Smuzhiyun if (res) {
234*4882a593Smuzhiyun LOGE("ioctl RKISP_CMD_GET_FBCBUF_FD failed");
235*4882a593Smuzhiyun return false;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun LOGD(" fbc buf num=%d",ispbuf_fd.buf_num);
238*4882a593Smuzhiyun for (uint32_t i = 0; i < ispbuf_fd.buf_num; i++) {
239*4882a593Smuzhiyun if (ispbuf_fd.dmafd[i] < 0) {
240*4882a593Smuzhiyun LOGE("fbcbuf_fd[%u]:%d is illegal!", ispbuf_fd.index[i], ispbuf_fd.dmafd[i]);
241*4882a593Smuzhiyun LOGE("\n*** ASSERT: In File %s,line %d ***\n", __FILE__, __LINE__);
242*4882a593Smuzhiyun assert(0);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun _buf_fd_map[ispbuf_fd.index[i]] = ispbuf_fd.dmafd[i];
245*4882a593Smuzhiyun LOGD("fbcbuf_fd[%u]:%d", ispbuf_fd.index[i], ispbuf_fd.dmafd[i]);
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun return true;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
deinit_fbcbuf_fd()250*4882a593Smuzhiyun bool SPStreamProcUnit::deinit_fbcbuf_fd()
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun std::map<int,int>::iterator it;
253*4882a593Smuzhiyun for (it = _buf_fd_map.begin(); it != _buf_fd_map.end(); ++it)
254*4882a593Smuzhiyun ::close(it->second);
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun _buf_fd_map.clear();
257*4882a593Smuzhiyun return true;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun
get_fd_by_index(int index)260*4882a593Smuzhiyun int SPStreamProcUnit::get_fd_by_index(int index)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun if (index < 0)
263*4882a593Smuzhiyun return -1;
264*4882a593Smuzhiyun if (_buf_fd_map.find(index) == _buf_fd_map.end())
265*4882a593Smuzhiyun return -1;
266*4882a593Smuzhiyun return _buf_fd_map[index];
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun //void SPStreamProcUnit::connect_tnr_stream(SmartPtr<TnrStatsStream> stream)
270*4882a593Smuzhiyun //{
271*4882a593Smuzhiyun // _tnr_stream_unit = stream;
272*4882a593Smuzhiyun //}
273*4882a593Smuzhiyun
get_sp_resolution(int & width,int & height,int & aligned_w,int & aligned_h)274*4882a593Smuzhiyun XCamReturn SPStreamProcUnit::get_sp_resolution(int &width, int &height, int &aligned_w, int &aligned_h)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun width = _ds_width;
277*4882a593Smuzhiyun height = _ds_height;
278*4882a593Smuzhiyun aligned_w = _ds_width_align;
279*4882a593Smuzhiyun aligned_h = _ds_height_align;
280*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
update_af_meas_params(rk_aiq_af_algo_meas_t * af_meas)283*4882a593Smuzhiyun void SPStreamProcUnit::update_af_meas_params(rk_aiq_af_algo_meas_t *af_meas)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun SmartLock locker (_afmeas_param_mutex);
286*4882a593Smuzhiyun if (af_meas && (0 != memcmp(af_meas, &_af_meas_params, sizeof(rk_aiq_af_algo_meas_t)))) {
287*4882a593Smuzhiyun _af_meas_params = *af_meas;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
set_af_img_size(int w,int h,int w_align,int h_align)291*4882a593Smuzhiyun void SPStreamProcUnit::set_af_img_size(int w, int h, int w_align, int h_align)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun af_img_width = w;
294*4882a593Smuzhiyun af_img_height = h;
295*4882a593Smuzhiyun af_img_width_align = w_align;
296*4882a593Smuzhiyun af_img_height_align = h_align;
297*4882a593Smuzhiyun LOGI("af_img_width %d af_img_height %d af_img_width_align: %d af_img_height_align: %d\n",
298*4882a593Smuzhiyun w, h, w_align, h_align);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun }
302