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
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章