#include "rk_aiq_comm.h"  
 | 
#include "rkispp-config.h"  
 | 
#include "rkisp2-config.h"  
 | 
#include "SPStreamProcUnit.h"  
 | 
#include "CamHwIsp20.h"  
 | 
namespace RkCam {  
 | 
  
 | 
SPStreamProcUnit::SPStreamProcUnit (SmartPtr<V4l2Device> isp_sp_dev, int type)  
 | 
    : RKStream(isp_sp_dev, type)  
 | 
    , _first(true)  
 | 
{  
 | 
    setPollCallback (this);  
 | 
    _ds_width = 0;  
 | 
    _ds_height = 0;  
 | 
    _ds_width_align = 0;  
 | 
    _ds_height_align = 0;  
 | 
}  
 | 
  
 | 
SPStreamProcUnit::~SPStreamProcUnit ()  
 | 
{  
 | 
}  
 | 
  
 | 
void SPStreamProcUnit::start()  
 | 
{  
 | 
    struct rkispp_trigger_mode tnr_trigger; 
 | 
    tnr_trigger.module = ISPP_MODULE_TNR; 
 | 
    tnr_trigger.on = 1; 
 | 
    int ret = _ispp_dev->io_control(RKISPP_CMD_TRIGGER_MODE, &tnr_trigger);  
 | 
  
 | 
    RKStream::start();  
 | 
    return;  
 | 
}  
 | 
  
 | 
void SPStreamProcUnit::stop()  
 | 
{  
 | 
    struct rkispp_trigger_mode tnr_trigger; 
 | 
    tnr_trigger.module = ISPP_MODULE_TNR; 
 | 
    tnr_trigger.on = 0; 
 | 
    int ret = _ispp_dev->io_control(RKISPP_CMD_TRIGGER_MODE, &tnr_trigger);  
 | 
    RKStream::stop();//stopDeviceOnly&stopThreadOnly  
 | 
    deinit_fbcbuf_fd();  
 | 
}  
 | 
  
 | 
SmartPtr<VideoBuffer>  
 | 
SPStreamProcUnit::new_video_buffer(SmartPtr<V4l2Buffer> buf,  
 | 
                                       SmartPtr<V4l2Device> dev) 
 | 
{  
 | 
    if (_first) {  
 | 
        init_fbcbuf_fd();  
 | 
        _first = false;  
 | 
    }  
 | 
  
 | 
    //image  
 | 
    struct VideoBufferInfo vbufInfo;  
 | 
    vbufInfo.init(V4L2_PIX_FMT_NV12, _ds_width_align, _ds_height_align,  
 | 
                 XCAM_ALIGN_UP(_ds_width_align, 4), _ds_height_align, 0);  
 | 
    SmartPtr<SPImagBufferProxy> img_buf = new SPImagBufferProxy (buf, dev);  
 | 
    struct isp2x_ispgain_buf *ispgain = (struct isp2x_ispgain_buf *)img_buf->get_v4l2_planar_userptr(1);  
 | 
    img_buf->_buf_type = _dev_type;  
 | 
    img_buf->set_buff_fd(img_buf->get_expbuf_fd());  
 | 
    img_buf->set_video_info(vbufInfo);  
 | 
  
 | 
    //ispgain  
 | 
    SmartPtr<V4l2BufferProxy> v4l2buf = img_buf.dynamic_cast_ptr<V4l2BufferProxy>();  
 | 
    _ispgain = new SubVideoBuffer (v4l2buf);  
 | 
    _ispgain->_buf_type = ISP_GAIN;  
 | 
    _ispgain->set_sequence(img_buf->get_sequence());  
 | 
    _ispgain->set_buff_info(get_fd_by_index(ispgain->gain_dmaidx), ispgain->gain_size);  
 | 
  
 | 
    return img_buf;  
 | 
}  
 | 
  
 | 
  
 | 
XCamReturn  
 | 
SPStreamProcUnit::poll_buffer_ready (SmartPtr<VideoBuffer> &buf)  
 | 
{  
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR;  
 | 
  
 | 
    if (_camHw->mHwResLintener) {  
 | 
        _camHw->mHwResLintener->hwResCb(buf);  
 | 
        SmartPtr<VideoBuffer> vbuf = _ispgain.dynamic_cast_ptr<VideoBuffer>();  
 | 
        _camHw->mHwResLintener->hwResCb(vbuf);  
 | 
    }  
 | 
  
 | 
    return ret;  
 | 
}  
 | 
  
 | 
  
 | 
XCamReturn SPStreamProcUnit::prepare(int width, int height, int stride)  
 | 
{  
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR;  
 | 
    if (!width && !height) {  
 | 
        struct v4l2_subdev_format isp_src_fmt;   
 | 
        isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;  
 | 
        isp_src_fmt.pad = 2;  
 | 
        ret = _isp_core_dev->getFormat(isp_src_fmt);  
 | 
        if (ret) {  
 | 
            LOGE("get mIspCoreDev src fmt failed !\n");  
 | 
            return XCAM_RETURN_ERROR_FAILED;  
 | 
        }  
 | 
        _src_width           = isp_src_fmt.format.width;  
 | 
        _src_height          = isp_src_fmt.format.height;  
 | 
        _ds_width            = (_src_width + 3) / 4;  
 | 
        _ds_height           = (_src_height + 7) / 8;  
 | 
        _ds_width_align      = XCAM_ALIGN_UP(_ds_width, 2);      
 | 
        _ds_height_align     = XCAM_ALIGN_UP(_ds_height, 2);  
 | 
        int _stride           = XCAM_ALIGN_UP(_ds_width_align, 32);  
 | 
        LOGD( "set sp format: width %d %d height %d %d, stride %d\n",  
 | 
               _ds_width, _ds_width_align, _ds_height, _ds_height_align, _stride);  
 | 
        ret = _dev->set_format(_ds_width_align, _ds_height_align, V4L2_PIX_FMT_FBCG, V4L2_FIELD_NONE, _stride);  
 | 
        if (ret) {  
 | 
            LOGE("set isp_sp_dev src fmt failed !\n");  
 | 
            ret = XCAM_RETURN_ERROR_FAILED;  
 | 
        }  
 | 
    } else {  
 | 
        LOGD( "set sp format: width %d height %d\n", width, height);  
 | 
        ret = _dev->set_format(width, height, V4L2_PIX_FMT_FBCG, V4L2_FIELD_NONE, stride);  
 | 
        if (ret) {  
 | 
            LOGE("set isp_sp_dev src fmt failed !\n");  
 | 
            ret = XCAM_RETURN_ERROR_FAILED;  
 | 
        }  
 | 
    }  
 | 
    _dev->set_mem_type(V4L2_MEMORY_MMAP);  
 | 
    _dev->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);  
 | 
    _dev->set_buffer_count(6);  
 | 
    _dev->set_mplanes_count(2);  
 | 
    return ret;  
 | 
}  
 | 
  
 | 
void SPStreamProcUnit::set_devices(CamHwIsp20* camHw, SmartPtr<V4l2SubDevice> isp_core_dev, SmartPtr<V4l2SubDevice> ispp_dev)  
 | 
{  
 | 
    _camHw = camHw;  
 | 
    _isp_core_dev = isp_core_dev;  
 | 
    _ispp_dev = ispp_dev;  
 | 
}  
 | 
  
 | 
bool SPStreamProcUnit::init_fbcbuf_fd()  
 | 
{ 
 | 
    struct isp2x_buf_idxfd ispbuf_fd;  
 | 
    int res = -1; 
 | 
  
 | 
    memset(&ispbuf_fd, 0, sizeof(ispbuf_fd));  
 | 
    res = _isp_core_dev->io_control(RKISP_CMD_GET_FBCBUF_FD , &ispbuf_fd);  
 | 
    if (res) {  
 | 
        LOGE("ioctl RKISP_CMD_GET_FBCBUF_FD failed");  
 | 
        return false;  
 | 
    }  
 | 
    LOGD(" fbc buf num=%d",ispbuf_fd.buf_num);  
 | 
    for (uint32_t i = 0; i < ispbuf_fd.buf_num; i++) {  
 | 
        if (ispbuf_fd.dmafd[i] < 0) {  
 | 
            LOGE("fbcbuf_fd[%u]:%d is illegal!", ispbuf_fd.index[i], ispbuf_fd.dmafd[i]);  
 | 
            LOGE("\n*** ASSERT: In File %s,line %d ***\n", __FILE__, __LINE__);  
 | 
            assert(0); 
 | 
        }  
 | 
        _buf_fd_map[ispbuf_fd.index[i]] = ispbuf_fd.dmafd[i];  
 | 
        LOGD("fbcbuf_fd[%u]:%d", ispbuf_fd.index[i], ispbuf_fd.dmafd[i]);  
 | 
    }  
 | 
    return true; 
 | 
}  
 | 
  
 | 
bool SPStreamProcUnit::deinit_fbcbuf_fd()  
 | 
{  
 | 
    std::map<int,int>::iterator it;  
 | 
     for (it = _buf_fd_map.begin(); it != _buf_fd_map.end(); ++it)  
 | 
        ::close(it->second);  
 | 
  
 | 
    _buf_fd_map.clear();  
 | 
    return true;                
 | 
}  
 | 
  
 | 
int SPStreamProcUnit::get_fd_by_index(int index)  
 | 
{  
 | 
    if (index < 0)  
 | 
        return -1;  
 | 
    if (_buf_fd_map.find(index) == _buf_fd_map.end())  
 | 
        return -1;  
 | 
    return _buf_fd_map[index];                 
 | 
}  
 | 
  
 | 
//void SPStreamProcUnit::connect_tnr_stream(SmartPtr<TnrStatsStream> stream)  
 | 
//{  
 | 
//    _tnr_stream_unit = stream;  
 | 
//}  
 | 
  
 | 
XCamReturn SPStreamProcUnit::get_sp_resolution(int &width, int &height, int &aligned_w, int &aligned_h)  
 | 
{  
 | 
    width = _ds_width;  
 | 
    height = _ds_height;  
 | 
    aligned_w = _ds_width_align;  
 | 
    aligned_h = _ds_height_align;  
 | 
    return XCAM_RETURN_NO_ERROR;  
 | 
}  
 | 
}  
 |