/* * Copyright (c) 2019 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "NrStatsStream.h" #include "rkispp-config.h" #include "CamHwIsp20.h" namespace RkCam { static void Nr_imag_buf_process ( void* pUserContext, XCamVideoBuffer* pVideoBuffer ) { NrStatsStream* nrStreamProc = (NrStatsStream*)pUserContext; nrStreamProc->queue_NRImg_fd(pVideoBuffer->get_fd(pVideoBuffer), pVideoBuffer->frame_id); } NrStatsStream::NrStatsStream (SmartPtr dev, int type) : RKStream(dev, type) , _fd_init_flag(true) , _NrImage(nullptr) { setPollCallback (this); } NrStatsStream::~NrStatsStream() { } void NrStatsStream::start() { RKStream::start(); } void NrStatsStream::stop() { RKStream::stopThreadOnly(); deinit_nrbuf_fd(); _list_mutex.lock(); _NrImg_ready_map.clear(); _list_mutex.unlock(); RKStream::stopDeviceOnly(); } void NrStatsStream::set_device(CamHwIsp20* camHw, SmartPtr dev) { _camHw = camHw; _ispp_dev = dev; } SmartPtr NrStatsStream::new_video_buffer(SmartPtr buf, SmartPtr dev) { if (_fd_init_flag) { init_nrbuf_fd(); _fd_init_flag = false; struct v4l2_subdev_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.pad = 0; fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; XCamReturn ret = _ispp_dev->getFormat(fmt); if (ret) { LOGE("get ispp_dev fmt failed !\n"); } _ispp_fmt = fmt; LOGD("ispp fmt info: fmt 0x%x, %dx%d !", fmt.format.code, fmt.format.width, fmt.format.height); //struct v4l2_format format; //memset(&format, 0, sizeof(format)); //ret = _dev->get_format(format); //if (ret) { // LOGE("get ispp_dev get_format failed !\n"); //} else { // LOGE("nr fmt info: fmt 0x%x, %dx%d !", // format.fmt.pix.pixelformat, format.fmt.pix.width, format.fmt.pix.height); //} } SmartPtr nrstats = new V4l2BufferProxy (buf, dev); nrstats->_buf_type = _dev_type; return nrstats; } XCamReturn NrStatsStream::poll_buffer_ready (SmartPtr &buf) { if (_camHw->mHwResLintener) { _camHw->mHwResLintener->hwResCb(buf); //NR image SmartPtr nrstats = buf.dynamic_cast_ptr(); struct rkispp_stats_nrbuf *stats; stats = (struct rkispp_stats_nrbuf *)(nrstats->get_v4l2_userptr()); struct VideoBufferInfo vbufInfo; vbufInfo.init(V4L2_PIX_FMT_NV12, _ispp_fmt.format.width, _ispp_fmt.format.height, _ispp_fmt.format.width, _ispp_fmt.format.height, stats->image.size); SmartPtr nrImage = new SubVideoBuffer( _buf_num, stats->image.index, get_NRimg_fd_by_index(stats->image.index), vbufInfo); nrImage->set_sequence(stats->frame_id); nrImage->_buf_type = ISP_NR_IMG; _camHw->mHwResLintener->hwResCb(nrImage); } return XCAM_RETURN_NO_ERROR; } bool NrStatsStream::init_nrbuf_fd() { struct rkispp_buf_idxfd isppbuf_fd; int res = -1; memset(&isppbuf_fd, 0, sizeof(isppbuf_fd)); res = _ispp_dev->io_control(RKISPP_CMD_GET_NRBUF_FD , &isppbuf_fd); if (res) return false; LOGD("%s: buf_num=%d",__FUNCTION__, isppbuf_fd.buf_num); _buf_num = isppbuf_fd.buf_num; for (uint32_t i=0; i::iterator it; _list_mutex.lock(); it = _NrImg_ready_map.find(frameid); if (it == _NrImg_ready_map.end()) fd = -1; else fd = it->second; _list_mutex.unlock(); return fd; } }; //namspace RkCam