1. sensor_lib.h 中定义 声明 sensor 及 mct_pipeline.c 将要使用的函数及变量
static int get_scale_tbl(sensor_dimension_t* tbl);
typedef struct {
........
uint32_t scale_tbl_cnt; 添加
int (*get_scale_tbl)(sensor_dimension_t *); ///添加
} sensor_lib_t;
2.引用相关的头文件
在ov4688_lib.h 中 引用相关的头文件 (#include "sensor_lib.h")
#include "sensor_lib.h"
static sensor_lib_t sensor_lib_ptr = 这前声明或定义相关操作
#define OV4688_MAX_DGAIN_DECIMATOR 2048
/// { 5312, 2988}, // 16 MP with 16:9 aspect ratio. 5312 / 2988 = 1.777777
/// {4160, 3120}, 4:3 4160 / 3120 = 1.333333
3840×2160 (超高清 4K) 3840 / 2160 1.77777
static sensor_dimension_t scale_size_tbl[] = { / step 1
{5312, 2988},
{3840, 2160},
};
static sensor_lib_t sensor_lib_ptr = 这前声明或定义相关操作 {
。。。。。。。。。。。。。。。
.scale_tbl_cnt = ARRAY_SIZE(scale_size_tbl),
// int (*get_scale_tbl)(sensor_dimension_t *);
// .get_scale_tbl = get_scale_tbl,
//.get_scale_tbl = get_scale_tbl(sensor_dimension_t* tbl),
//.get_scale_tbl = get_scale_tbl,
.get_scale_tbl = get_scale_tbl,
};
// int (*get_scale_tbl)(sensor_dimension_t *);
#if 0
static void test(sensor_dimension_t* tbl) {
get_scale_tbl(tbl);
}
#endif
#endif
3. ov4688_lib.c 实现相关操作
static int get_scale_tbl(sensor_dimension_t* tbl) {
uint32_t i;
if(sensor_lib_ptr.scale_tbl_cnt == 0)
return -1;
for(i = 0; i < sensor_lib_ptr.scale_tbl_cnt; i++){
tbl[i] = scale_size_tbl[i];
}
return 0;
}
sensor.c 中 使用上面所实现的方法 lib->sensor_lib_ptr->get_scale_tbl
添加到 sensor 的兼容表中,也就是中这个table或者叫数组可以有这组添加的数字,这样
adb shell dumpsys media.cmaera 才能取到这组数据,app才能通过 paramerter.set("picture-size","1920*720")设置
static int32_t sensor_get_capabilities(void *slib, void *data){
if(lib->sensor_lib_ptr->get_scale_tbl &&
lib->sensor_lib_ptr->scale_tbl_cnt > 0){
if(lib->sensor_lib_ptr->scale_tbl_cnt > MAX_SCALE_SIZES_CNT){
lib->sensor_lib_ptr->scale_tbl_cnt = MAX_SCALE_SIZES_CNT;
}
rc = lib->sensor_lib_ptr->get_scale_tbl(scale_tbl);
if(rc){
return rc;
}
sensor_cap->scale_picture_sizes_cnt = lib->sensor_lib_ptr->scale_tbl_cnt;
for(i = 0; i < lib->sensor_lib_ptr->scale_tbl_cnt; i++){
sensor_cap->scale_picture_sizes[i].width = scale_tbl[i].width; /sensor ov4688_lib.h 配置的 width //scale_picture_sizes
sensor_cap->scale_picture_sizes[i].height= scale_tbl[i].height; /sensor ov4688_lib.h 配置的 height
}
SERR("carltest >>>>>>>>>>>>>>>>>> ");
SERR("carltest width = %d height = %d ",sensor_cap->scale_picture_sizes[i].width ,sensor_cap->scale_picture_sizes[i].height);
}
SERR("carltest >>>>>>>>>>>>>>>>>> sensor_get_capabilities 22 ");
/*raw fmts*/
sensor_cap->supported_raw_fmts_cnt = 0;
}
mct_pipeline.c _____________>>>>>>>>>
**/
static boolean mct_pipeline_fill_caps_sensor(mct_pipeline_t *pipeline)
{
uint32_t i = 0, j = 0;
size_t scale_picture_sizes_cnt =
MIN(local_data->sensor_cap.scale_picture_sizes_cnt, MAX_SCALE_SIZES_CNT);
hal_data->scale_picture_sizes_cnt = scale_picture_sizes_cnt;
memcpy(hal_data->scale_picture_sizes,
local_data->sensor_cap.scale_picture_sizes,
scale_picture_sizes_cnt * sizeof (cam_dimension_t));
CLOGI(CAM_MCT_MODULE,"carl mct_pipeline_fill_caps_sensor >>> 22 scale_picture_sizes_cnt %d ",scale_picture_sizes_cnt);
CLOGI(CAM_MCT_MODULE,"carl 0 >>> width = %d height = %d ",hal_data->scale_picture_sizes[0].width,hal_data->scale_picture_sizes[0].height);
CLOGI(CAM_MCT_MODULE,"carl 1 >>> width = %d height = %d ",hal_data->scale_picture_sizes[1].width,hal_data->scale_picture_sizes[1].height);
CLOGI(CAM_MCT_MODULE,"carl 2 >>> width = %d height = %d ",hal_data->scale_picture_sizes[2].width,hal_data->scale_picture_sizes[2].height);
/* Set RAW formats */
size_t supported_raw_fmt_cnt =
}
///上面 vendor 层实现完毕
HAL 层就可以根据 vendor 的表进行处理,实现插值
QCameraParameters.cpp (camera\qcamera2\hal):int32_t QCameraParameters::initDefaultParameters()
// Set supported picture sizes //本身 sensor 所支持的 picture_size 列表
if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
String8 pictureSizeValues = createSizesString(
m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
//String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, size_t len)
//createSizesString(m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
LOGH("supported pic sizes: %s", pictureSizeValues.string());//
// Set default picture size to the smallest resolution
CameraParameters::setPictureSize(
m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
} else {
LOGW("supported picture sizes cnt is 0 or exceeds max!!!");
}
// Need check if scale should be enabled /// 是否需要插值 scale_picture_sizes_cnt 是否获取到数据
if (m_pCapability->scale_picture_sizes_cnt > 0 &&
m_pCapability->scale_picture_sizes_cnt <= MAX_SCALE_SIZES_CNT){
//get scale size, enable scaling. And re-set picture size table with scale sizes
m_reprocScaleParam.setScaleEnable(true); ///打开插值功能
int rc_s = m_reprocScaleParam.setScaleSizeTbl(
m_pCapability->scale_picture_sizes_cnt, m_pCapability->scale_picture_sizes,
m_pCapability->picture_sizes_tbl_cnt, m_pCapability->picture_sizes_tbl);
if(rc_s == NO_ERROR){
cam_dimension_t *totalSizeTbl = m_reprocScaleParam.getTotalSizeTbl();
size_t totalSizeCnt = m_reprocScaleParam.getTotalSizeTblCnt();
String8 pictureSizeValues = createSizesString(totalSizeTbl, totalSizeCnt); //成功将 插值 字符串拷贝到 pictureSizeValues
set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
/
// set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
///
LOGH("scaled supported pic sizes: %s", pictureSizeValues.string());
}else{
m_reprocScaleParam.setScaleEnable(false);///关闭插值功能
LOGW("reset scaled picture size table failed.");
}
}else{
m_reprocScaleParam.setScaleEnable(false);
}
setScaleSizeTbl ->方法 将取得 sensor本身所支持的 picture-size 及将要插值的表
checkScaleSizeTable --》判断是否符合 4:3 或者 16:9 等的要求
01-04 10:36:06.990 756 2818 I mm-camera: <CPP >< INFO> 362: cpp_hardware_set_clock: Set clock 465000000 BW avg 338114880 BW inst 338114880
01-04 10:36:06.990 733 2805 I QCamera : <HAL><INFO> int32_t qcamera::QCameraPostProcessor::getJpegEncodingConfig(mm_jpeg_encode_params_t &, qcamera::QCameraStream *, qcamera::QCameraStream *): 596: Src Buffer cnt = 1, res = 5312X2988 len = 23969792 rot = 0 src_dim = 5312X2988 dst_dim = 5312X2988
01-04 10:36:06.
01-04 10:36:07.150 733 2974 I QCamera : <HAL><INFO> int32_t qcamera::QCameraPostProcessor::encodeData(qcamera_jpeg_data_t *, uint8_t &): 2625: Main image idx = 0 src w/h (5312x2988), dst w/h (5312x2988)
01-06 10:52:01.218 765 3657 I mm-camera: <IFACE >< INFO> 593: iface_dump_axi_plane_config: plane[0]: width = 2304, height = 1296
01-06 10:52:01.259 735 2808 I QCamera : <HAL><INFO> int32_t qcamera::QCameraPostProcessor::getJpegEncodingConfig(mm_jpeg_encode_params_t &, qcamera::QCameraStream *, qcamera::QCameraStream *): 596: Src Buffer cnt = 1, res = 2304X1296 len = 4644864 rot = 0 src_dim = 2304X1296 dst_dim = 2304X1296
ret = getParameter(m_OutputCrop);
01-06 10:52:01.204 765 2844 D mm-camera: <SENSOR>< HIGH> 1765: modules_sensor_set_new_resolution: SENSOR_SET_RESOLUTION:w*d:2304*1296, mask:c,fast AEC:0,FastAec mode:0
01-06 10:52:01.371 765 2844 I mm-camera: <CPP >< INFO> 870: cpp_module_handle_isp_out_dim_event: [STREAM_PARAMS] stream type 9, width 2304, height 1296,stride 2304, scanline 1344, planes 2
01-06 10:52:01.384 735 3666 I jpeg_hw : jpege_lib_hw_fe_buffer_cfg:295] w 2304 h 1296 stride 2304 scanline 1344