xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/PdafStreamProcUnit.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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