xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/NrStatsStream.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 
19*4882a593Smuzhiyun #include "NrStatsStream.h"
20*4882a593Smuzhiyun #include "rkispp-config.h"
21*4882a593Smuzhiyun #include "CamHwIsp20.h"
22*4882a593Smuzhiyun namespace RkCam {
23*4882a593Smuzhiyun 
Nr_imag_buf_process(void * pUserContext,XCamVideoBuffer * pVideoBuffer)24*4882a593Smuzhiyun static void Nr_imag_buf_process
25*4882a593Smuzhiyun (
26*4882a593Smuzhiyun     void*                  pUserContext,
27*4882a593Smuzhiyun     XCamVideoBuffer* pVideoBuffer
28*4882a593Smuzhiyun )
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun     NrStatsStream* nrStreamProc = (NrStatsStream*)pUserContext;
31*4882a593Smuzhiyun     nrStreamProc->queue_NRImg_fd(pVideoBuffer->get_fd(pVideoBuffer), pVideoBuffer->frame_id);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
NrStatsStream(SmartPtr<V4l2Device> dev,int type)34*4882a593Smuzhiyun NrStatsStream::NrStatsStream (SmartPtr<V4l2Device> dev, int type)
35*4882a593Smuzhiyun     : RKStream(dev, type)
36*4882a593Smuzhiyun     , _fd_init_flag(true)
37*4882a593Smuzhiyun     , _NrImage(nullptr)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun     setPollCallback (this);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
~NrStatsStream()42*4882a593Smuzhiyun NrStatsStream::~NrStatsStream()
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun void
start()47*4882a593Smuzhiyun NrStatsStream::start()
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun     RKStream::start();
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun void
stop()53*4882a593Smuzhiyun NrStatsStream::stop()
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun     RKStream::stopThreadOnly();
56*4882a593Smuzhiyun     deinit_nrbuf_fd();
57*4882a593Smuzhiyun     _list_mutex.lock();
58*4882a593Smuzhiyun     _NrImg_ready_map.clear();
59*4882a593Smuzhiyun     _list_mutex.unlock();
60*4882a593Smuzhiyun     RKStream::stopDeviceOnly();
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
set_device(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> dev)63*4882a593Smuzhiyun void NrStatsStream::set_device(CamHwIsp20* camHw, SmartPtr<V4l2SubDevice> dev)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun     _camHw = camHw;
66*4882a593Smuzhiyun     _ispp_dev = dev;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun SmartPtr<VideoBuffer>
new_video_buffer(SmartPtr<V4l2Buffer> buf,SmartPtr<V4l2Device> dev)70*4882a593Smuzhiyun NrStatsStream::new_video_buffer(SmartPtr<V4l2Buffer> buf,
71*4882a593Smuzhiyun                                        SmartPtr<V4l2Device> dev)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun     if (_fd_init_flag) {
74*4882a593Smuzhiyun         init_nrbuf_fd();
75*4882a593Smuzhiyun         _fd_init_flag = false;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun         struct v4l2_subdev_format fmt;
78*4882a593Smuzhiyun         memset(&fmt, 0, sizeof(fmt));
79*4882a593Smuzhiyun         fmt.pad = 0;
80*4882a593Smuzhiyun         fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
81*4882a593Smuzhiyun         XCamReturn ret = _ispp_dev->getFormat(fmt);
82*4882a593Smuzhiyun         if (ret) {
83*4882a593Smuzhiyun             LOGE("get ispp_dev fmt failed !\n");
84*4882a593Smuzhiyun         }
85*4882a593Smuzhiyun         _ispp_fmt = fmt;
86*4882a593Smuzhiyun         LOGD("ispp fmt info: fmt 0x%x, %dx%d !",
87*4882a593Smuzhiyun                         fmt.format.code, fmt.format.width, fmt.format.height);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun         //struct v4l2_format format;
90*4882a593Smuzhiyun         //memset(&format, 0, sizeof(format));
91*4882a593Smuzhiyun         //ret = _dev->get_format(format);
92*4882a593Smuzhiyun         //if (ret) {
93*4882a593Smuzhiyun         //    LOGE("get ispp_dev get_format failed !\n");
94*4882a593Smuzhiyun         //} else {
95*4882a593Smuzhiyun         //    LOGE("nr fmt info: fmt 0x%x, %dx%d !",
96*4882a593Smuzhiyun         //                    format.fmt.pix.pixelformat, format.fmt.pix.width, format.fmt.pix.height);
97*4882a593Smuzhiyun         //}
98*4882a593Smuzhiyun     }
99*4882a593Smuzhiyun     SmartPtr<V4l2BufferProxy> nrstats = new V4l2BufferProxy (buf, dev);
100*4882a593Smuzhiyun     nrstats->_buf_type = _dev_type;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     return nrstats;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun XCamReturn
poll_buffer_ready(SmartPtr<VideoBuffer> & buf)106*4882a593Smuzhiyun NrStatsStream::poll_buffer_ready (SmartPtr<VideoBuffer> &buf)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun     if (_camHw->mHwResLintener) {
109*4882a593Smuzhiyun         _camHw->mHwResLintener->hwResCb(buf);
110*4882a593Smuzhiyun         //NR image
111*4882a593Smuzhiyun         SmartPtr<V4l2BufferProxy> nrstats = buf.dynamic_cast_ptr<V4l2BufferProxy>();
112*4882a593Smuzhiyun         struct rkispp_stats_nrbuf *stats;
113*4882a593Smuzhiyun         stats = (struct rkispp_stats_nrbuf *)(nrstats->get_v4l2_userptr());
114*4882a593Smuzhiyun         struct VideoBufferInfo vbufInfo;
115*4882a593Smuzhiyun         vbufInfo.init(V4L2_PIX_FMT_NV12, _ispp_fmt.format.width, _ispp_fmt.format.height,
116*4882a593Smuzhiyun                      _ispp_fmt.format.width, _ispp_fmt.format.height, stats->image.size);
117*4882a593Smuzhiyun         SmartPtr<VideoBuffer> nrImage = new SubVideoBuffer(
118*4882a593Smuzhiyun             _buf_num, stats->image.index, get_NRimg_fd_by_index(stats->image.index), vbufInfo);
119*4882a593Smuzhiyun         nrImage->set_sequence(stats->frame_id);
120*4882a593Smuzhiyun         nrImage->_buf_type = ISP_NR_IMG;
121*4882a593Smuzhiyun         _camHw->mHwResLintener->hwResCb(nrImage);
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
init_nrbuf_fd()127*4882a593Smuzhiyun bool NrStatsStream::init_nrbuf_fd()
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun     struct rkispp_buf_idxfd isppbuf_fd;
130*4882a593Smuzhiyun     int res = -1;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     memset(&isppbuf_fd, 0, sizeof(isppbuf_fd));
133*4882a593Smuzhiyun     res = _ispp_dev->io_control(RKISPP_CMD_GET_NRBUF_FD , &isppbuf_fd);
134*4882a593Smuzhiyun     if (res)
135*4882a593Smuzhiyun         return false;
136*4882a593Smuzhiyun     LOGD("%s: buf_num=%d",__FUNCTION__, isppbuf_fd.buf_num);
137*4882a593Smuzhiyun     _buf_num = isppbuf_fd.buf_num;
138*4882a593Smuzhiyun     for (uint32_t i=0; i<isppbuf_fd.buf_num; i++) {
139*4882a593Smuzhiyun         if (isppbuf_fd.dmafd[i] < 0) {
140*4882a593Smuzhiyun             LOGE("nrbuf_fd[%u]:%d is illegal!",isppbuf_fd.index[i],isppbuf_fd.dmafd[i]);
141*4882a593Smuzhiyun             LOGE("\n*** ASSERT: In File %s,line %d ***\n", __FILE__, __LINE__);
142*4882a593Smuzhiyun             assert(0);
143*4882a593Smuzhiyun         }
144*4882a593Smuzhiyun         _idx_array[i] = isppbuf_fd.index[i];
145*4882a593Smuzhiyun         _fd_array[i] = isppbuf_fd.dmafd[i];
146*4882a593Smuzhiyun         LOGD("nrbuf_fd[%u]:%d",isppbuf_fd.index[i],isppbuf_fd.dmafd[i]);
147*4882a593Smuzhiyun     }
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun     return true;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
get_NRimg_fd_by_index(int index)152*4882a593Smuzhiyun int NrStatsStream::get_NRimg_fd_by_index(int index)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun     int ret = -1;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     if (index < 0)
157*4882a593Smuzhiyun         return ret;
158*4882a593Smuzhiyun     for (int i=0; i<_buf_num; i++) {
159*4882a593Smuzhiyun         if (_idx_array[i] == index)
160*4882a593Smuzhiyun             return _fd_array[i];
161*4882a593Smuzhiyun     }
162*4882a593Smuzhiyun     return ret;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun 
deinit_nrbuf_fd()165*4882a593Smuzhiyun bool NrStatsStream::deinit_nrbuf_fd()
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun     for (int i=0; i<_buf_num; i++) {
168*4882a593Smuzhiyun         ::close(_fd_array[i]);
169*4882a593Smuzhiyun     }
170*4882a593Smuzhiyun     _buf_num = 0;
171*4882a593Smuzhiyun     return true;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
queue_NRImg_fd(int fd,uint32_t frameid)174*4882a593Smuzhiyun int NrStatsStream::queue_NRImg_fd(int fd, uint32_t frameid)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun     if (fd < 0)
177*4882a593Smuzhiyun         return -1;
178*4882a593Smuzhiyun     _list_mutex.lock();
179*4882a593Smuzhiyun     _NrImg_ready_map[frameid] = fd;
180*4882a593Smuzhiyun     _list_mutex.unlock();
181*4882a593Smuzhiyun     return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 
get_NRImg_fd(uint32_t frameid)185*4882a593Smuzhiyun int NrStatsStream::get_NRImg_fd(uint32_t frameid)
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun     int fd = -1;
188*4882a593Smuzhiyun     std::map<uint32_t, int>::iterator it;
189*4882a593Smuzhiyun     _list_mutex.lock();
190*4882a593Smuzhiyun     it = _NrImg_ready_map.find(frameid);
191*4882a593Smuzhiyun     if (it == _NrImg_ready_map.end())
192*4882a593Smuzhiyun         fd = -1;
193*4882a593Smuzhiyun     else
194*4882a593Smuzhiyun         fd = it->second;
195*4882a593Smuzhiyun     _list_mutex.unlock();
196*4882a593Smuzhiyun     return fd;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun } //namspace RkCam
200