camera插值流程理解记录

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
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值