1 #include "rk_aiq_comm.h"
2 #include "rkispp-config.h"
3 #include "rkisp2-config.h"
4 #include "PdafStreamProcUnit.h"
5 #include "CamHwIsp20.h"
6 #include "code_to_pixel_format.h"
7 #include "rkcif-config.h"
8
9 namespace RkCam {
10
PdafStreamProcUnit(int type)11 PdafStreamProcUnit::PdafStreamProcUnit (int type)
12 {
13 mPdafDev = NULL;
14 mPdafStream = NULL;
15 mStartFlag = false;
16 mStartStreamFlag = false;
17 mBufType = type;
18 mHelperThd = new PdafStreamHelperThd(this);
19 mHelperThd->triger_start();
20 mHelperThd->start();
21 }
22
~PdafStreamProcUnit()23 PdafStreamProcUnit::~PdafStreamProcUnit ()
24 {
25 mHelperThd->triger_stop();
26 mHelperThd->stop();
27 }
28
set_devices(CamHwIsp20 * camHw)29 void PdafStreamProcUnit::set_devices(CamHwIsp20* camHw)
30 {
31 mCamHw = camHw;
32 }
33
34 XCamReturn
prepare(rk_sensor_pdaf_info_t * pdaf_inf)35 PdafStreamProcUnit::prepare(rk_sensor_pdaf_info_t *pdaf_inf)
36 {
37 XCamReturn ret = XCAM_RETURN_NO_ERROR;
38 uint32_t pixelformat;
39
40 stop();
41 mPdafDev = new V4l2Device(pdaf_inf->pdaf_vdev);
42 mPdafDev->open();
43 mPdafStream = new RKPdafStream(mPdafDev, ISP_POLL_PDAF_STATS);
44 mPdafStream->setPollCallback (this);
45
46 mPdafMeas.pdLRInDiffLine = pdaf_inf->pdaf_lrdiffline;
47 mPdafMeas.pdWidth = pdaf_inf->pdaf_width;
48 mPdafMeas.pdHeight = pdaf_inf->pdaf_height;
49 ret = mPdafDev->set_format(pdaf_inf->pdaf_width, pdaf_inf->pdaf_height,
50 pdaf_inf->pdaf_pixelformat, V4L2_FIELD_NONE, 0);
51
52 return ret;
53 }
54
start()55 void PdafStreamProcUnit::start()
56 {
57 int mem_mode;
58
59 mStreamMutex.lock();
60 if (mPdafStream.ptr() && !mStartFlag) {
61 mPdafDev->io_control (RKCIF_CMD_GET_CSI_MEMORY_MODE, &mem_mode);
62 if (mem_mode != CSI_LVDS_MEM_WORD_LOW_ALIGN) {
63 mem_mode = CSI_LVDS_MEM_WORD_LOW_ALIGN;
64 mPdafDev->io_control (RKCIF_CMD_SET_CSI_MEMORY_MODE, &mem_mode);
65 LOGI_AF("memory mode of pdaf video need low align, mem_mode %d", mem_mode);
66 }
67
68 XCam::SmartPtr<PdafStreamParam> attrPtr = new PdafStreamParam;
69
70 attrPtr->valid = true;
71 attrPtr->stream_flag = true;
72 mHelperThd->clear_attr();
73 mHelperThd->push_attr(attrPtr);
74
75 mStartFlag = true;
76 }
77 mStreamMutex.unlock();
78 }
79
stop()80 void PdafStreamProcUnit::stop()
81 {
82 mStreamMutex.lock();
83 if (mPdafStream.ptr() && mStartFlag) {
84 XCam::SmartPtr<PdafStreamParam> attrPtr = new PdafStreamParam;
85
86 attrPtr->valid = true;
87 attrPtr->stream_flag = false;
88 mHelperThd->clear_attr();
89 mHelperThd->push_attr(attrPtr);
90
91 mStartFlag = false;
92 }
93 mStreamMutex.unlock();
94 }
95
96 XCamReturn
poll_buffer_ready(SmartPtr<V4l2BufferProxy> & buf,int dev_index)97 PdafStreamProcUnit::poll_buffer_ready (SmartPtr<V4l2BufferProxy> &buf, int dev_index)
98 {
99 XCamReturn ret = XCAM_RETURN_NO_ERROR;
100
101 if (mCamHw->mHwResLintener) {
102 SmartPtr<VideoBuffer> video_buf = buf.dynamic_cast_ptr<VideoBuffer>();
103 SmartPtr<PdafBufferProxy> pdaf_buf = buf.dynamic_cast_ptr<PdafBufferProxy>();
104
105 pdaf_buf->pdaf_meas = mPdafMeas;
106 mCamHw->mHwResLintener->hwResCb(video_buf);
107 }
108
109 return ret;
110 }
111
112 XCamReturn
deinit()113 PdafStreamProcUnit::deinit()
114 {
115 mHelperThd->triger_stop();
116 mHelperThd->stop();
117 stop_stream();
118
119 return XCAM_RETURN_NO_ERROR;
120 }
121
start_stream()122 XCamReturn PdafStreamProcUnit::start_stream()
123 {
124 mStreamMutex.lock();
125 if (mPdafStream.ptr() && !mStartStreamFlag) {
126 mPdafStream->start();
127 mStartStreamFlag = true;
128 LOGD_AF("start pdaf stream device");
129 }
130 mStreamMutex.unlock();
131
132 return XCAM_RETURN_NO_ERROR;
133 }
134
stop_stream()135 XCamReturn PdafStreamProcUnit::stop_stream()
136 {
137 mStreamMutex.lock();
138 if (mPdafStream.ptr() && mStartStreamFlag) {
139 mPdafStream->stop();
140 mStartStreamFlag = false;
141 LOGD_AF("stop pdaf stream device");
142 }
143 mStreamMutex.unlock();
144
145 return XCAM_RETURN_NO_ERROR;
146 }
147
loop()148 bool PdafStreamHelperThd::loop()
149 {
150 XCamReturn ret = XCAM_RETURN_NO_ERROR;
151
152 const static int32_t timeout = -1;
153 XCam::SmartPtr<PdafStreamParam> attrib = mAttrQueue.pop (timeout);
154
155 if (!attrib.ptr()) {
156 LOGI_AF("PdafStreamHelperThd got empty attrib, stop thread");
157 return false;
158 }
159
160 if (attrib->valid) {
161 if (attrib->stream_flag) {
162 ret = mPdafStreamProc->start_stream();
163 } else {
164 ret = mPdafStreamProc->stop_stream();
165 }
166 }
167
168 if (ret == XCAM_RETURN_NO_ERROR)
169 return true;
170
171 LOGI_AF("PdafStreamHelperThd stop");
172
173 return false;
174 }
175
176 }
177