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