1100 lines
42 KiB
C++
1100 lines
42 KiB
C++
/*
|
|
* 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 "FakeCamHwIsp20.h"
|
|
#include "Isp20Evts.h"
|
|
#include "FakeSensorHw.h"
|
|
#include "rk_isp20_hw.h"
|
|
#include "Isp20_module_dbg.h"
|
|
#include "mediactl/mediactl-priv.h"
|
|
#include <linux/v4l2-subdev.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/stat.h>
|
|
|
|
namespace RkCam {
|
|
FakeCamHwIsp20::FakeCamHwIsp20() : isp_index(0)
|
|
{
|
|
ENTER_CAMHW_FUNCTION();
|
|
_rx_memory_type = V4L2_MEMORY_DMABUF;
|
|
_tx_memory_type = V4L2_MEMORY_DMABUF;
|
|
mNoReadBack = false;
|
|
EXIT_CAMHW_FUNCTION();
|
|
}
|
|
|
|
FakeCamHwIsp20::~FakeCamHwIsp20()
|
|
{
|
|
ENTER_CAMHW_FUNCTION();
|
|
setupOffLineLink(isp_index, false);
|
|
EXIT_CAMHW_FUNCTION();
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::init(const char* sns_ent_name)
|
|
{
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
|
|
ret = CamHwIsp20::init(sns_ent_name);
|
|
if (ret)
|
|
return ret;
|
|
|
|
// special for fake sensor
|
|
SmartPtr<BaseSensorHw> sensorHw;
|
|
mSensorDev->close();
|
|
sensorHw = new FakeSensorHw();
|
|
mSensorDev = sensorHw;
|
|
mSensorDev->open();
|
|
mIspStatsStream->set_event_handle_dev(sensorHw);
|
|
|
|
return XCAM_RETURN_NO_ERROR;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
|
|
{
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
SmartPtr<BaseSensorHw> sensorHw;
|
|
|
|
ENTER_CAMHW_FUNCTION();
|
|
|
|
SmartPtr<FakeSensorHw> fakeSensorHw = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
|
|
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
|
|
if ((it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
|
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
|
|
return XCAM_RETURN_ERROR_SENSOR;
|
|
}
|
|
|
|
rk_sensor_full_info_t *s_info = it->second.ptr();
|
|
isp_index = s_info->isp_info->logic_id;
|
|
#ifndef USE_RAWSTREAM_LIB
|
|
setupOffLineLink(isp_index, true);
|
|
#endif
|
|
init_mipi_devices(s_info);
|
|
fakeSensorHw->set_mipi_tx_devs(_mipi_tx_devs);
|
|
|
|
#ifndef USE_RAWSTREAM_LIB
|
|
mRawCapUnit->set_tx_devices(_mipi_tx_devs);
|
|
mRawProcUnit->set_rx_devices(_mipi_rx_devs);
|
|
mRawProcUnit->setPollCallback(this);
|
|
#endif
|
|
ret = CamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
|
|
if (ret)
|
|
return ret;
|
|
|
|
if (mIspSofStream.ptr())
|
|
mIspSofStream->setPollCallback (NULL);
|
|
|
|
EXIT_CAMHW_FUNCTION();
|
|
return ret;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::poll_buffer_ready (SmartPtr<V4l2BufferProxy> &buf, int dev_index)
|
|
{
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
// notify fakesensor one frame has been processed by ISP
|
|
return fakeSensor->on_dqueue(dev_index, buf);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::init_mipi_devices(rk_sensor_full_info_t *s_info)
|
|
{
|
|
/*
|
|
* for _mipi_tx_devs, index 0 refer to short frame always, inedex 1 refer
|
|
* to middle frame always, index 2 refert to long frame always.
|
|
* for CIF usecase, because mipi_id0 refert to long frame always, so we
|
|
* should know the HDR mode firstly befor building the relationship between
|
|
* _mipi_tx_devs array and mipi_idx. here we just set the mipi_idx to
|
|
* _mipi_tx_devs, we will build the real relation in start.
|
|
* for CIF usecase, rawwr2_path is always connected to _mipi_tx_devs[0],
|
|
* rawwr0_path is always connected to _mipi_tx_devs[1], and rawwr1_path is always
|
|
* connected to _mipi_tx_devs[0]
|
|
*/
|
|
//short frame
|
|
_mipi_tx_devs[0] = new FakeV4l2Device ();
|
|
_mipi_tx_devs[0]->open();
|
|
_mipi_tx_devs[0]->set_mem_type(_tx_memory_type);
|
|
_mipi_tx_devs[0]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
|
|
|
_mipi_rx_devs[0] = new V4l2Device (s_info->isp_info->rawrd2_s_path);//rkisp_rawrd2_s
|
|
_mipi_rx_devs[0]->open();
|
|
_mipi_rx_devs[0]->set_mem_type(_rx_memory_type);
|
|
//mid frame
|
|
_mipi_tx_devs[1] = new FakeV4l2Device ();
|
|
_mipi_tx_devs[1]->open();
|
|
_mipi_tx_devs[1]->set_mem_type(_tx_memory_type);
|
|
_mipi_tx_devs[1]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
|
|
|
_mipi_rx_devs[1] = new V4l2Device (s_info->isp_info->rawrd0_m_path);//rkisp_rawrd0_m
|
|
_mipi_rx_devs[1]->open();
|
|
_mipi_rx_devs[1]->set_mem_type(_rx_memory_type);
|
|
//long frame
|
|
_mipi_tx_devs[2] = new FakeV4l2Device ();
|
|
_mipi_tx_devs[2]->open();
|
|
_mipi_tx_devs[2]->set_mem_type(_tx_memory_type);
|
|
_mipi_tx_devs[2]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
|
|
|
_mipi_rx_devs[2] = new V4l2Device (s_info->isp_info->rawrd1_l_path);//rkisp_rawrd1_l
|
|
_mipi_rx_devs[2]->open();
|
|
_mipi_rx_devs[2]->set_mem_type(_rx_memory_type);
|
|
for (int i = 0; i < 3; i++) {
|
|
if (_linked_to_isp) {
|
|
if (_rawbuf_type == RK_AIQ_RAW_FILE) {
|
|
_mipi_tx_devs[0]->set_use_type(2);
|
|
_mipi_tx_devs[i]->set_buffer_count(1);
|
|
_mipi_rx_devs[i]->set_buffer_count(1);
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
_mipi_tx_devs[0]->set_use_type(1);
|
|
_mipi_tx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
|
|
_mipi_rx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
|
|
} else {
|
|
_mipi_tx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
|
|
_mipi_rx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
|
|
}
|
|
} else {
|
|
_mipi_tx_devs[i]->set_buffer_count(VIPCAP_TX_BUF_NUM);
|
|
_mipi_rx_devs[i]->set_buffer_count(VIPCAP_TX_BUF_NUM);
|
|
}
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
rk_aiq_exposure_sensor_descriptor sns_des;
|
|
fakeSensor->get_sensor_desc(&sns_des);
|
|
_mipi_tx_devs[i]->set_format(sns_des.sensor_output_width,
|
|
sns_des.sensor_output_height,
|
|
sns_des.sensor_pixelformat);
|
|
_mipi_rx_devs[i]->set_format(sns_des.sensor_output_width,
|
|
sns_des.sensor_output_height,
|
|
sns_des.sensor_pixelformat);
|
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::poll_event_ready (uint32_t sequence, int type)
|
|
{
|
|
struct v4l2_event event;
|
|
event.u.frame_sync.frame_sequence = sequence;
|
|
|
|
mIspSofStream->stop();
|
|
SmartPtr<VideoBuffer> buf =
|
|
mIspSofStream->new_video_buffer(event, NULL);
|
|
|
|
CamHwBase::poll_buffer_ready(buf);
|
|
|
|
return XCAM_RETURN_NO_ERROR;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::enqueueRawBuffer(void *rawdata, bool sync)
|
|
{
|
|
ENTER_XCORE_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
struct rk_aiq_vbuf vbuf;
|
|
memset(&vbuf, 0, sizeof(vbuf));
|
|
parse_rk_rawdata(rawdata, &vbuf);
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
fakeSensor->enqueue_rawbuffer(&vbuf, sync);
|
|
poll_event_ready(vbuf.buf_info[0].frame_id, V4L2_EVENT_FRAME_SYNC);
|
|
EXIT_XCORE_FUNCTION();
|
|
return ret;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::enqueueRawFile(const char *path)
|
|
{
|
|
ENTER_XCORE_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
struct rk_aiq_vbuf vbuf;
|
|
memset(&vbuf, 0, sizeof(vbuf));
|
|
if (0 != access(path, F_OK)) {
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "file: %s is not exist!", path);
|
|
return XCAM_RETURN_ERROR_PARAM;
|
|
}
|
|
|
|
FILE *fp = fopen(path, "rb");
|
|
if (!fp) {
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "open file: %s failed", path);
|
|
return XCAM_RETURN_ERROR_FAILED;
|
|
}
|
|
|
|
ret = parse_rk_rawfile(fp, &vbuf);
|
|
if (ret != XCAM_RETURN_NO_ERROR) {
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Failed to parse rk rawfile!");
|
|
fclose(fp);
|
|
return ret;
|
|
}
|
|
fclose(fp);
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
fakeSensor->enqueue_rawbuffer(&vbuf, true);
|
|
poll_event_ready(vbuf.buf_info[0].frame_id, V4L2_EVENT_FRAME_SYNC);
|
|
EXIT_XCORE_FUNCTION();
|
|
return ret;
|
|
}
|
|
|
|
void
|
|
FakeCamHwIsp20::parse_rk_rawdata(void *rawdata, struct rk_aiq_vbuf *vbuf)
|
|
{
|
|
unsigned short tag = 0;
|
|
struct _block_header header;
|
|
uint8_t *p = (uint8_t *)rawdata;
|
|
uint8_t *actual_raw[3] = {NULL, NULL, NULL};
|
|
int actual_raw_len[3] = {0, 0, 0};
|
|
bool is_actual_rawdata = false;
|
|
bool bExit = false;
|
|
while(!bExit){
|
|
tag = *((unsigned short*)p);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM, "tag=0x%04x\n",tag);
|
|
switch (tag)
|
|
{
|
|
case START_TAG:
|
|
p = p+TAG_BYTE_LEN;
|
|
memset(_st_addr, 0, sizeof(_st_addr));
|
|
memset(&_rawfmt, 0, sizeof(_rawfmt));
|
|
memset(&_finfo, 0, sizeof(_finfo));
|
|
break;
|
|
case NORMAL_RAW_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p = p + sizeof(struct _block_header);
|
|
if (header.block_length == sizeof(struct _st_addrinfo)) {
|
|
_st_addr[0] = *((struct _st_addrinfo*)p);
|
|
}else{
|
|
//actual raw data
|
|
is_actual_rawdata = true;
|
|
actual_raw[0] = p;
|
|
actual_raw_len[0] = header.block_length;
|
|
}
|
|
p = p + header.block_length;
|
|
|
|
break;
|
|
}
|
|
case HDR_S_RAW_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p = p + sizeof(struct _block_header);
|
|
if (header.block_length == sizeof(struct _st_addrinfo)) {
|
|
_st_addr[0] = *((struct _st_addrinfo*)p);
|
|
}else{
|
|
//actual raw data
|
|
is_actual_rawdata = true;
|
|
actual_raw[0] = p;
|
|
actual_raw_len[0] = header.block_length;
|
|
}
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case HDR_M_RAW_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p = p + sizeof(struct _block_header);
|
|
if (header.block_length == sizeof(struct _st_addrinfo)) {
|
|
_st_addr[1] = *((struct _st_addrinfo*)p);
|
|
}else{
|
|
//actual raw data
|
|
is_actual_rawdata = true;
|
|
actual_raw[1] = p;
|
|
actual_raw_len[1] = header.block_length;
|
|
}
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case HDR_L_RAW_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p = p + sizeof(struct _block_header);
|
|
if (header.block_length == sizeof(struct _st_addrinfo)) {
|
|
_st_addr[2] = *((struct _st_addrinfo*)p);
|
|
}else{
|
|
//actual raw data
|
|
is_actual_rawdata = true;
|
|
actual_raw[2] = p;
|
|
actual_raw_len[2] = header.block_length;
|
|
}
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case FORMAT_TAG:
|
|
{
|
|
_rawfmt = *((struct _raw_format *)p);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM, "hdr_mode=%d,bayer_fmt=%d\n",_rawfmt.hdr_mode,_rawfmt.bayer_fmt);
|
|
p = p + sizeof(struct _block_header) + _rawfmt.size;
|
|
break;
|
|
}
|
|
case STATS_TAG:
|
|
{
|
|
_finfo = *((rk_aiq_frame_info_t *)p);
|
|
p = p + sizeof(struct _block_header) + _finfo.size;
|
|
break;
|
|
}
|
|
case ISP_REG_FMT_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p += sizeof(struct _block_header);
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case ISP_REG_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p += sizeof(struct _block_header);
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case ISPP_REG_FMT_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p += sizeof(struct _block_header);
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case ISPP_REG_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p += sizeof(struct _block_header);
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case PLATFORM_TAG:
|
|
{
|
|
header = *((struct _block_header *)p);
|
|
p += sizeof(struct _block_header);
|
|
p = p + header.block_length;
|
|
break;
|
|
}
|
|
case END_TAG:
|
|
{
|
|
bExit = true;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Not support TAG(0x%04x)\n", tag);
|
|
bExit = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
vbuf->frame_width = _rawfmt.width;
|
|
vbuf->frame_height = _rawfmt.height;
|
|
vbuf->base_addr = rawdata;
|
|
if (_rawfmt.hdr_mode == 1) {
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[0].data_addr = actual_raw[0];
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
vbuf->buf_info[0].data_length = actual_raw_len[0];
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[0].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
|
|
}
|
|
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[0].data_fd = _st_addr[0].fd;
|
|
vbuf->buf_info[0].data_addr = NULL;
|
|
}
|
|
vbuf->buf_info[0].data_length = _st_addr[0].size;
|
|
}
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"data_addr=%p,fd=%d,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
} else if (_rawfmt.hdr_mode == 2) {
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[0].data_addr = actual_raw[0];
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
vbuf->buf_info[0].data_length = actual_raw_len[0];
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[0].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
|
|
}
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[0].data_addr = NULL;
|
|
vbuf->buf_info[0].data_fd = _st_addr[0].fd;
|
|
}
|
|
vbuf->buf_info[0].data_length = _st_addr[0].size;
|
|
}
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.hdr_gain_s;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.hdr_exp_s;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.hdr_gain_s_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.hdr_exp_s_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[1].data_addr = actual_raw[1];//actual_raw[1]
|
|
vbuf->buf_info[1].data_fd = 0;
|
|
vbuf->buf_info[1].data_length = actual_raw_len[1];//actual_raw_len[1]
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[1].data_addr = (uint8_t*)(long)(_st_addr[1].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[1].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[1].haddr << 32) + _st_addr[1].laddr);
|
|
}
|
|
vbuf->buf_info[1].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[1].data_addr = NULL;
|
|
vbuf->buf_info[1].data_fd = _st_addr[1].fd;
|
|
}
|
|
vbuf->buf_info[1].data_length = _st_addr[1].size;
|
|
}
|
|
vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
|
|
vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
|
|
vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
|
|
vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
|
|
vbuf->buf_info[1].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[1].data_addr,
|
|
vbuf->buf_info[1].data_fd,
|
|
vbuf->buf_info[1].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[1].exp_gain,
|
|
vbuf->buf_info[1].exp_time,
|
|
vbuf->buf_info[1].exp_gain_reg,
|
|
vbuf->buf_info[1].exp_time_reg);
|
|
} else if (_rawfmt.hdr_mode == 3) {
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[0].data_addr = actual_raw[0];
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
vbuf->buf_info[0].data_length = actual_raw_len[0];
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[0].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
|
|
}
|
|
vbuf->buf_info[0].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[0].data_addr = NULL;
|
|
vbuf->buf_info[0].data_fd = _st_addr[0].fd;
|
|
}
|
|
vbuf->buf_info[0].data_length = _st_addr[0].size;
|
|
}
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.hdr_gain_s;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.hdr_exp_s;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.hdr_gain_s_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.hdr_exp_s_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[1].data_addr = actual_raw[1];
|
|
vbuf->buf_info[1].data_fd = 0;
|
|
vbuf->buf_info[1].data_length = actual_raw_len[1];
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[1].data_addr = (uint8_t*)(long)(_st_addr[1].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[1].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[1].haddr << 32) + _st_addr[1].laddr);
|
|
}
|
|
vbuf->buf_info[1].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[1].data_addr = NULL;
|
|
vbuf->buf_info[1].data_fd = _st_addr[1].fd;
|
|
}
|
|
vbuf->buf_info[1].data_length = _st_addr[1].size;
|
|
}
|
|
vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
|
|
vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
|
|
vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
|
|
vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
|
|
vbuf->buf_info[1].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[1].data_addr,
|
|
vbuf->buf_info[1].data_fd,
|
|
vbuf->buf_info[1].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[1].exp_gain,
|
|
vbuf->buf_info[1].exp_time,
|
|
vbuf->buf_info[1].exp_gain_reg,
|
|
vbuf->buf_info[1].exp_time_reg);
|
|
|
|
if (is_actual_rawdata) {
|
|
vbuf->buf_info[2].data_addr = actual_raw[2];
|
|
vbuf->buf_info[2].data_fd = 0;
|
|
vbuf->buf_info[2].data_length = actual_raw_len[2];
|
|
} else {
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
|
|
if (sizeof(uint8_t*) == 4) {
|
|
vbuf->buf_info[2].data_addr = (uint8_t*)(long)(_st_addr[2].laddr);
|
|
} else if (sizeof(uint8_t*) == 8) {
|
|
vbuf->buf_info[2].data_addr =
|
|
(uint8_t*)(((uint64_t)_st_addr[2].haddr << 32) + _st_addr[2].laddr);
|
|
}
|
|
vbuf->buf_info[2].data_fd = 0;
|
|
} else if (_rawbuf_type == RK_AIQ_RAW_FD) {
|
|
vbuf->buf_info[2].data_addr = NULL;
|
|
vbuf->buf_info[2].data_fd = _st_addr[2].fd;
|
|
}
|
|
vbuf->buf_info[2].data_length = _st_addr[2].size;
|
|
}
|
|
vbuf->buf_info[2].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[2].exp_gain = (float)_finfo.hdr_gain_l;
|
|
vbuf->buf_info[2].exp_time = (float)_finfo.hdr_exp_l;
|
|
vbuf->buf_info[2].exp_gain_reg = (uint32_t)_finfo.hdr_gain_l_reg;
|
|
vbuf->buf_info[2].exp_time_reg = (uint32_t)_finfo.hdr_exp_l_reg;
|
|
vbuf->buf_info[2].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[2].data_addr,
|
|
vbuf->buf_info[2].data_fd,
|
|
vbuf->buf_info[2].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[2].exp_gain,
|
|
vbuf->buf_info[2].exp_time,
|
|
vbuf->buf_info[2].exp_gain_reg,
|
|
vbuf->buf_info[2].exp_time_reg);
|
|
}
|
|
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::parse_rk_rawfile(FILE *fp, struct rk_aiq_vbuf *vbuf)
|
|
{
|
|
unsigned short tag = 0;
|
|
struct _block_header header;
|
|
bool bExit = false;
|
|
|
|
if (!_mipi_rx_devs[0]->is_activated()) {
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "device(%s) hasn't activated(%d) yet!!!\n",
|
|
XCAM_STR (_mipi_rx_devs[0]->get_device_name()),
|
|
_mipi_rx_devs[0]->is_activated());
|
|
return XCAM_RETURN_ERROR_FAILED;
|
|
}
|
|
|
|
while(!bExit){
|
|
int ret = fread(&tag, sizeof(tag), 1, fp);
|
|
if (ret == 0)
|
|
break;
|
|
fseek(fp, TAG_BYTE_LEN*(-1), SEEK_CUR);//backforwad to tag start
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM, "tag=0x%04x\n",tag);
|
|
switch (tag)
|
|
{
|
|
case START_TAG:
|
|
fseek(fp, TAG_BYTE_LEN, SEEK_CUR);
|
|
memset(_st_addr, 0, sizeof(_st_addr));
|
|
memset(&_rawfmt, 0, sizeof(_rawfmt));
|
|
memset(&_finfo, 0, sizeof(_finfo));
|
|
break;
|
|
case NORMAL_RAW_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
if (header.block_length > 0) {
|
|
vbuf->buf_info[0].data_addr = (uint8_t*)_mipi_rx_devs[0]->get_buffer_by_index(0)->get_expbuf_usrptr();
|
|
fread(vbuf->buf_info[0].data_addr, header.block_length, 1, fp);
|
|
vbuf->buf_info[0].data_length = header.block_length;
|
|
}
|
|
break;
|
|
}
|
|
case HDR_S_RAW_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
if (header.block_length > 0) {
|
|
vbuf->buf_info[0].data_addr = (uint8_t*)_mipi_rx_devs[0]->get_buffer_by_index(0)->get_expbuf_usrptr();
|
|
fread(vbuf->buf_info[0].data_addr, header.block_length, 1, fp);
|
|
vbuf->buf_info[0].data_length = header.block_length;
|
|
}
|
|
break;
|
|
}
|
|
case HDR_M_RAW_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
if (header.block_length > 0) {
|
|
vbuf->buf_info[1].data_addr = (uint8_t*)_mipi_rx_devs[1]->get_buffer_by_index(0)->get_expbuf_usrptr();
|
|
fread(vbuf->buf_info[1].data_addr, header.block_length, 1, fp);
|
|
vbuf->buf_info[1].data_length = header.block_length;
|
|
}
|
|
break;
|
|
}
|
|
case HDR_L_RAW_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
if (header.block_length > 0) {
|
|
vbuf->buf_info[2].data_addr = (uint8_t*)_mipi_rx_devs[1]->get_buffer_by_index(0)->get_expbuf_usrptr();
|
|
fread(vbuf->buf_info[2].data_addr, header.block_length, 1, fp);
|
|
vbuf->buf_info[2].data_length = header.block_length;
|
|
}
|
|
break;
|
|
}
|
|
case FORMAT_TAG:
|
|
{
|
|
fread(&_rawfmt, sizeof(_rawfmt), 1, fp);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM, "hdr_mode=%d,bayer_fmt=%d\n",_rawfmt.hdr_mode,_rawfmt.bayer_fmt);
|
|
break;
|
|
}
|
|
case STATS_TAG:
|
|
{
|
|
fread(&_finfo, sizeof(_finfo), 1, fp);
|
|
break;
|
|
}
|
|
case ISP_REG_FMT_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
fseek(fp, header.block_length, SEEK_CUR);
|
|
break;
|
|
}
|
|
case ISP_REG_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
fseek(fp, header.block_length, SEEK_CUR);
|
|
break;
|
|
}
|
|
case ISPP_REG_FMT_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
fseek(fp, header.block_length, SEEK_CUR);
|
|
break;
|
|
}
|
|
case ISPP_REG_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
fseek(fp, header.block_length, SEEK_CUR);
|
|
break;
|
|
}
|
|
case PLATFORM_TAG:
|
|
{
|
|
fread(&header, sizeof(header), 1, fp);
|
|
fseek(fp, header.block_length, SEEK_CUR);
|
|
break;
|
|
}
|
|
case END_TAG:
|
|
{
|
|
bExit = true;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Not support TAG(0x%04x)\n", tag);
|
|
bExit = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
vbuf->frame_width = _rawfmt.width;
|
|
vbuf->frame_height = _rawfmt.height;
|
|
if (_rawfmt.hdr_mode == 1) {
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"data_addr=%p,fd=%d,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
}else if (_rawfmt.hdr_mode == 2) {
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
|
|
vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
|
|
vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
|
|
vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
|
|
vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
|
|
vbuf->buf_info[1].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[1].data_addr,
|
|
vbuf->buf_info[1].data_fd,
|
|
vbuf->buf_info[1].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[1].exp_gain,
|
|
vbuf->buf_info[1].exp_time,
|
|
vbuf->buf_info[1].exp_gain_reg,
|
|
vbuf->buf_info[1].exp_time_reg);
|
|
}else if (_rawfmt.hdr_mode == 3) {
|
|
vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
|
|
vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
|
|
vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
|
|
vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
|
|
vbuf->buf_info[0].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[0].data_addr,
|
|
vbuf->buf_info[0].data_fd,
|
|
vbuf->buf_info[0].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[0].exp_gain,
|
|
vbuf->buf_info[0].exp_time,
|
|
vbuf->buf_info[0].exp_gain_reg,
|
|
vbuf->buf_info[0].exp_time_reg);
|
|
|
|
vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
|
|
vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
|
|
vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
|
|
vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
|
|
vbuf->buf_info[1].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[1].data_addr,
|
|
vbuf->buf_info[1].data_fd,
|
|
vbuf->buf_info[1].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[1].exp_gain,
|
|
vbuf->buf_info[1].exp_time,
|
|
vbuf->buf_info[1].exp_gain_reg,
|
|
vbuf->buf_info[1].exp_time_reg);
|
|
|
|
vbuf->buf_info[2].frame_id = _rawfmt.frame_id;
|
|
vbuf->buf_info[2].exp_gain = (float)_finfo.hdr_gain_l;
|
|
vbuf->buf_info[2].exp_time = (float)_finfo.hdr_exp_l;
|
|
vbuf->buf_info[2].exp_gain_reg = (uint32_t)_finfo.hdr_gain_l_reg;
|
|
vbuf->buf_info[2].exp_time_reg = (uint32_t)_finfo.hdr_exp_l_reg;
|
|
vbuf->buf_info[2].valid = true;
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: data_addr=%p,fd=%d,,length=%d\n",
|
|
vbuf->buf_info[2].data_addr,
|
|
vbuf->buf_info[2].data_fd,
|
|
vbuf->buf_info[2].data_length);
|
|
LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
|
|
vbuf->buf_info[2].exp_gain,
|
|
vbuf->buf_info[2].exp_time,
|
|
vbuf->buf_info[2].exp_gain_reg,
|
|
vbuf->buf_info[2].exp_time_reg);
|
|
}
|
|
|
|
return XCAM_RETURN_NO_ERROR;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::registRawdataCb(void (*callback)(void *))
|
|
{
|
|
ENTER_XCORE_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
ret = fakeSensor->register_rawdata_callback(callback);
|
|
EXIT_XCORE_FUNCTION();
|
|
return ret;
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp20::rawdataPrepare(rk_aiq_raw_prop_t prop)
|
|
{
|
|
ENTER_XCORE_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
|
|
|
|
_rawbuf_type = prop.rawbuf_type;
|
|
if (_rawbuf_type == RK_AIQ_RAW_ADDR)
|
|
{
|
|
_rx_memory_type = V4L2_MEMORY_USERPTR;
|
|
_tx_memory_type = V4L2_MEMORY_USERPTR;
|
|
}
|
|
else if (_rawbuf_type == RK_AIQ_RAW_FD)
|
|
{
|
|
_rx_memory_type = V4L2_MEMORY_DMABUF;
|
|
_tx_memory_type = V4L2_MEMORY_DMABUF;
|
|
}
|
|
else if(_rawbuf_type == RK_AIQ_RAW_DATA)
|
|
{
|
|
_rx_memory_type = V4L2_MEMORY_MMAP;
|
|
_tx_memory_type = V4L2_MEMORY_USERPTR;
|
|
}
|
|
else if(_rawbuf_type == RK_AIQ_RAW_FILE)
|
|
{
|
|
_rx_memory_type = V4L2_MEMORY_MMAP;
|
|
_tx_memory_type = V4L2_MEMORY_USERPTR;
|
|
}
|
|
else {
|
|
LOGE_CAMHW_SUBM(FAKECAM_SUBM,"Not support raw data type:%d", _rawbuf_type);
|
|
return XCAM_RETURN_ERROR_PARAM;
|
|
}
|
|
SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
|
|
ret = fakeSensor->prepare(prop);
|
|
EXIT_XCORE_FUNCTION();
|
|
return ret;
|
|
}
|
|
|
|
XCamReturn FakeCamHwIsp20::setupOffLineLink(int isp_index, bool enable)
|
|
{
|
|
media_device* device = NULL;
|
|
media_entity* entity = NULL;
|
|
media_pad* src_pad = NULL;
|
|
media_pad* sink_pad = NULL;
|
|
int lvds_max_entities = 6;
|
|
int lvds_entity = 0;
|
|
|
|
device = media_device_new(mIspHwInfos.isp_info[isp_index].media_dev_path);
|
|
if (!device) return XCAM_RETURN_ERROR_FAILED;
|
|
|
|
/* Enumerate entities, pads and links. */
|
|
media_device_enumerate(device);
|
|
entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
|
|
if (!entity) {
|
|
goto FAIL;
|
|
}
|
|
|
|
sink_pad = (media_pad*)media_entity_get_pad(entity, 0);
|
|
if (!sink_pad) {
|
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkisp-isp-subdev sink pad failed!\n");
|
|
goto FAIL;
|
|
}
|
|
|
|
for (lvds_entity = 0; lvds_entity < lvds_max_entities; lvds_entity++) {
|
|
char entity_name[128] = {0};
|
|
src_pad = NULL;
|
|
if (!lvds_entity) {
|
|
snprintf(entity_name, 128, "rkcif-mipi-lvds");
|
|
} else {
|
|
snprintf(entity_name, 128, "rkcif-mipi-lvds%d", lvds_entity);
|
|
}
|
|
entity = media_get_entity_by_name(device, entity_name, strlen(entity_name));
|
|
if (entity) {
|
|
src_pad = (media_pad*)media_entity_get_pad(entity, 0);
|
|
if (!src_pad) {
|
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-mipi-lvds%d source pad s failed!\n",
|
|
lvds_entity);
|
|
goto FAIL;
|
|
}
|
|
}
|
|
|
|
if (src_pad && sink_pad) {
|
|
if (enable) {
|
|
media_setup_link(device, src_pad, sink_pad, 0);
|
|
} else
|
|
media_setup_link(device, src_pad, sink_pad, MEDIA_LNK_FL_ENABLED);
|
|
}
|
|
}
|
|
|
|
media_device_unref(device);
|
|
return XCAM_RETURN_NO_ERROR;
|
|
FAIL:
|
|
media_device_unref(device);
|
|
return XCAM_RETURN_ERROR_FAILED;
|
|
}
|
|
|
|
FakeCamHwIsp21::FakeCamHwIsp21()
|
|
: FakeCamHwIsp20() {
|
|
}
|
|
|
|
FakeCamHwIsp21::~FakeCamHwIsp21()
|
|
{
|
|
ENTER_CAMHW_FUNCTION();
|
|
EXIT_CAMHW_FUNCTION();
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::init(const char* sns_ent_name)
|
|
{
|
|
return FakeCamHwIsp20::init(sns_ent_name);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
|
|
{
|
|
return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::enqueueRawBuffer(void *rawdata, bool sync)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::enqueueRawFile(const char *path)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawFile(path);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::registRawdataCb(void (*callback)(void *))
|
|
{
|
|
return FakeCamHwIsp20::registRawdataCb(callback);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::rawdataPrepare(rk_aiq_raw_prop_t prop)
|
|
{
|
|
return FakeCamHwIsp20::rawdataPrepare(prop);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp21::poll_event_ready (uint32_t sequence, int type)
|
|
{
|
|
return FakeCamHwIsp20::poll_event_ready (sequence, type);
|
|
}
|
|
|
|
FakeCamHwIsp3x::FakeCamHwIsp3x()
|
|
: FakeCamHwIsp20() {
|
|
}
|
|
|
|
FakeCamHwIsp3x::~FakeCamHwIsp3x()
|
|
{
|
|
ENTER_CAMHW_FUNCTION();
|
|
EXIT_CAMHW_FUNCTION();
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::init(const char* sns_ent_name)
|
|
{
|
|
return FakeCamHwIsp20::init(sns_ent_name);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
|
|
{
|
|
return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::enqueueRawBuffer(void *rawdata, bool sync)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::enqueueRawFile(const char *path)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawFile(path);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::registRawdataCb(void (*callback)(void *))
|
|
{
|
|
return FakeCamHwIsp20::registRawdataCb(callback);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::rawdataPrepare(rk_aiq_raw_prop_t prop)
|
|
{
|
|
return FakeCamHwIsp20::rawdataPrepare(prop);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp3x::poll_event_ready (uint32_t sequence, int type)
|
|
{
|
|
return FakeCamHwIsp20::poll_event_ready (sequence, type);
|
|
}
|
|
|
|
FakeCamHwIsp32::FakeCamHwIsp32()
|
|
: FakeCamHwIsp20() {
|
|
}
|
|
|
|
FakeCamHwIsp32::~FakeCamHwIsp32()
|
|
{
|
|
ENTER_CAMHW_FUNCTION();
|
|
EXIT_CAMHW_FUNCTION();
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::init(const char* sns_ent_name)
|
|
{
|
|
return FakeCamHwIsp20::init(sns_ent_name);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
|
|
{
|
|
return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::enqueueRawBuffer(void *rawdata, bool sync)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::enqueueRawFile(const char *path)
|
|
{
|
|
return FakeCamHwIsp20::enqueueRawFile(path);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::registRawdataCb(void (*callback)(void *))
|
|
{
|
|
return FakeCamHwIsp20::registRawdataCb(callback);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::rawdataPrepare(rk_aiq_raw_prop_t prop)
|
|
{
|
|
return FakeCamHwIsp20::rawdataPrepare(prop);
|
|
}
|
|
|
|
XCamReturn
|
|
FakeCamHwIsp32::poll_event_ready (uint32_t sequence, int type)
|
|
{
|
|
return FakeCamHwIsp20::poll_event_ready (sequence, type);
|
|
}
|
|
|
|
} //namspace RkCam
|