⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera_process.c

📁 MTK6225 支持的200W像素的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 camera_preview_process(camera_preview_process_struct *isp_data)
{
#if (defined(ISP_SUPPORT))
	volatile kal_uint32 *resizer_buf_ptr;
	kal_uint32 event_group;
	MMDI_SCENERIO_ID scene_id=SCENARIO_CAMERA_PREVIEW_ID;
	lcd_frame_update_struct lcd_data;
	kal_uint16 temp_grab_size;
	volatile kal_uint16 i=0,j=0;
	volatile kal_uint8 sensor_check_count;
	kal_uint8 sensor_fail_count;

#if (!defined(YUV_SENSOR_SUPPORT))
	if (sensor_err_check<0)
		return KAL_FALSE;

	if (isp_operation_state!=ISP_STANDBY_STATE)
		ASSERT(0);

	/* the preview image size is great than frame buffer size */
	if ((((isp_data->target_width) * (isp_data->target_height))<<1) > isp_data->frame_buffer_size)
		ASSERT(0);

	memset(&lcd_data, 0, sizeof(lcd_frame_update_struct));	//initial lcd_data

#if (defined(AF_SUPPORT))
	if(isp_data->continue_capture==0)
	{
		if (af_operation_state != AF_STANDBY_STATE)//prevent scenario error
		{
   			camera_operation_setting(CAM_AF_KEY, CAM_AF_RELEASE);
		}
		else
		{
			lens_func->lens_af_move_to((kal_int32)camera_lens.INFO.af_hyper_pos);
			dsc_status.af.index=0xFF;
		}
	}
#endif

#if (!defined(DRV_ISP_6219_SERIES))
	lut_info.videomode=KAL_FALSE;
#endif
#if (!defined(YUV_SENSOR_SUPPORT))
	ae_on_off(KAL_TRUE);
	awb_on_off(KAL_TRUE);
	awb_set_gain();
#endif
	DISABLE_CAMERA_IDLE_INT;
	ENABLE_AE_COUNT;
	ENABLE_CMOS_SESNOR;
	DISABLE_VIEW_FINDER_MODE;

#if  (defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6229_SERIES))
   // Disable AE Count before Start Preview
	DISABLE_AE_COUNT;
	REG_ISP_PREPROCESS_CTRL2 |= REG_PREPROCESS2_AE_COUNT_CLEAR_BIT;
#endif
#if (defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))
	DISABLE_CMOS_SESNOR;
#endif
	sensor_config_data.isp_op_mode=ISP_PREVIEW_MODE;
	sensor_config_data.image_mirror=isp_data->image_mirror;
	sensor_config_data.frame_rate=isp_data->frame_rate;
	exposure_window.image_target_width=isp_data->target_width;
	exposure_window.image_target_height=isp_data->target_height;
	exposure_window.current_exposure_pixel=exposure_window.exposure_pixel=1;
	image_sensor_func->sensor_preview_setting(&exposure_window,&sensor_config_data);

	/* accorind the zoom factor to calculate the grab window area */
	isp_horizontal_subsample=exposure_window.isp_hsub_factor;
   isp_vertical_subsample=exposure_window.isp_vsub_factor;
	isp_digital_zoom_factor=isp_data->zoom_factor;
	isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFE ;
	isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFE ;

	isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFE);
	isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);

	if ((isp_data->target_width * exposure_window.exposure_window_height) >=
		 (isp_data->target_height * exposure_window.exposure_window_width))
	{	/* x limit */
		temp_grab_size=isp_grab_height;
		isp_grab_height=(isp_grab_width * isp_data->target_height/isp_data->target_width)&0xFFFE;
		isp_grab_start_y+=(((temp_grab_size-isp_grab_height)>>1)&0xFFFE);
	}
	else
	{	/* y limit */
		temp_grab_size=isp_grab_width;
		isp_grab_width=(isp_grab_height * isp_data->target_width/isp_data->target_height)&0xFFFE;
		isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFE);
	}

	isp_grab_start_x-=(((isp_grab_width*(isp_horizontal_subsample-1))>>1)&0xFFFE);
	isp_grab_start_y-=((isp_grab_height*(isp_vertical_subsample-1))>>1);

	align_center_point();
	SET_TG_GRAB_PIXEL(isp_grab_start_x,(isp_grab_width*isp_horizontal_subsample));
	SET_TG_GRAB_LINE(isp_grab_start_y,(isp_grab_height*isp_vertical_subsample));
#if (!defined(YUV_SENSOR_SUPPORT))
	ae_config((isp_grab_width*isp_horizontal_subsample),(isp_grab_height*isp_vertical_subsample));
#endif
#if (!(defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6228_SERIES)))
	DISABLE_1024_GAMMA_TABLE;
#endif

#if (!(defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6225_SERIES)))
	apply_camera_shading_to_reg(CAMERA_COMP_PREVIEW_NORMAL_SET);
	if(camera_oper_data.preview_defect_table_enable==KAL_TRUE)
	{
		load_defect_table_para(DEFECT_MODE_PREVIEW);
		ENABLE_DEFECT_CORRECTION;
	}
	else
		DISABLE_DEFECT_CORRECTION;
#endif

#if (defined(DRV_ISP_6219_SERIES))
	/* according the maximum size of resizer input we define to calculate the the image size
	   of resizer input */
	if ((isp_grab_width<=MAX_RESIZER_INPUT_WIDTH) && (isp_grab_height<=MAX_RESIZER_INPUT_HEIGHT))
	{
		isp_sub_sample_mode=CAMERA_SUB_SAMPLE_1_1;
		isp_preview_config_data.source_width=isp_grab_width;
		isp_preview_config_data.source_height=isp_grab_height;
	}
	else if ((isp_grab_width<=(MAX_RESIZER_INPUT_WIDTH<<1)) && (isp_grab_height<=(MAX_RESIZER_INPUT_HEIGHT<<1)))
	{
		isp_sub_sample_mode=CAMERA_SUB_SAMPLE_1_2;
		isp_preview_config_data.source_width=isp_grab_width>>1;
		isp_preview_config_data.source_height=isp_grab_height>>1;
	}
	else if ((isp_grab_width<=(MAX_RESIZER_INPUT_WIDTH<<2)) && (isp_grab_height<=(MAX_RESIZER_INPUT_HEIGHT<<2)))
	{
		isp_sub_sample_mode=CAMERA_SUB_SAMPLE_1_4;
		isp_preview_config_data.source_width=isp_grab_width>>2;
		isp_preview_config_data.source_height=isp_grab_height>>2;
	}
	else if ((isp_grab_width<=(MAX_RESIZER_INPUT_WIDTH<<3)) && (isp_grab_height<=(MAX_RESIZER_INPUT_HEIGHT<<3)))
	{
		isp_sub_sample_mode=CAMERA_SUB_SAMPLE_1_8;
		isp_preview_config_data.source_width=isp_grab_width>>3;
		isp_preview_config_data.source_height=isp_grab_height>>3;
	}
	SET_SUB_SAMPLE_MODE(isp_sub_sample_mode);
#elif  (defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES)||defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))
	ENABLE_VERTICAL_SUB_SAMPLE;
	ENABLE_HORIZONTAL_SUB_SAMPLE;
	SET_HSUB_SRC_SIZE((isp_grab_width*isp_horizontal_subsample));	
	SET_VSUB_SRC_SIZE((isp_grab_height*isp_vertical_subsample));
	if((isp_grab_width>(isp_data->target_width<<2)) || (isp_grab_height>(isp_data->target_height<<2)))
	{ /* grab size > taget size *4 => ISP subsample 4x */
		SET_HSUB_DST_SIZE(isp_grab_width>>2);
		SET_VSUB_DST_SIZE(isp_grab_height>>2);
		isp_preview_config_data.source_width=isp_grab_width>>2;
		isp_preview_config_data.source_height=isp_grab_height>>2;
	}
	else if((isp_grab_width>(isp_data->target_width<<1)) || (isp_grab_height>(isp_data->target_height<<1)))
	{ /* grab size > taget size *2 => ISP subsample 2x */
		SET_HSUB_DST_SIZE(isp_grab_width>>1);
		SET_VSUB_DST_SIZE(isp_grab_height>>1);
		isp_preview_config_data.source_width=isp_grab_width>>1;
		isp_preview_config_data.source_height=isp_grab_height>>1;
	}
	else
	{
		if((isp_grab_width>=((isp_data->target_width)+2)) && (isp_grab_height>=((isp_data->target_height)+2)))
		{
			SET_HSUB_DST_SIZE(isp_data->target_width+2);
			SET_VSUB_DST_SIZE(isp_data->target_height+2);
			isp_preview_config_data.source_width=isp_data->target_width+2;
			isp_preview_config_data.source_height=isp_data->target_height+2;
		}
		else
		{
			if((isp_grab_width==(isp_data->target_width)) && (isp_grab_height==(isp_data->target_height)))
			{
				SET_HSUB_DST_SIZE(isp_grab_width-2);
				SET_VSUB_DST_SIZE(isp_grab_height-2);
				isp_preview_config_data.source_width=isp_grab_width-2;
				isp_preview_config_data.source_height=isp_grab_height-2;
			}
			else
			{
				SET_HSUB_DST_SIZE(isp_grab_width);
				SET_VSUB_DST_SIZE(isp_grab_height);
				isp_preview_config_data.source_width=isp_grab_width;
				isp_preview_config_data.source_height=isp_grab_height;
			}
		}
	}
#endif
#endif /* YUV_SENSOR_SUPPORT */

	isp_preview_config_data.image_mirror=isp_data->image_mirror;
	isp_preview_config_data.frame_rate=isp_data->frame_rate;
	isp_preview_config_data.target_width=isp_data->target_width;
	isp_preview_config_data.target_height=isp_data->target_height;

	isp_preview_config_data.lcd_id=isp_data->lcd_id;
	isp_preview_config_data.lcm_start_x=isp_data->lcm_start_x;
	isp_preview_config_data.lcm_start_y=isp_data->lcm_start_y;
	isp_preview_config_data.lcm_end_x=isp_data->lcm_end_x;
	isp_preview_config_data.lcm_end_y=isp_data->lcm_end_y;
	isp_preview_config_data.roi_offset_x=isp_data->roi_offset_x;
	isp_preview_config_data.roi_offset_y=isp_data->roi_offset_y;
	isp_preview_config_data.update_layer=isp_data->update_layer;
	isp_preview_config_data.hw_update_layer=isp_data->hw_update_layer;
	isp_preview_config_data.rotate_value=isp_data->rotate_value;
	isp_preview_config_data.continue_capture=isp_data->continue_capture;
	isp_preview_config_data.intmem_start_address=isp_data->intmem_start_address;
	isp_preview_config_data.intmem_size=isp_data->intmem_size;
	isp_preview_config_data.extmem_start_address=isp_data->extmem_start_address;
	isp_preview_config_data.extmem_size=isp_data->extmem_size;
	isp_preview_config_data.zoom_factor=isp_data->zoom_factor;
	isp_preview_config_data.target_width=isp_data->target_width;
	isp_preview_config_data.target_height=isp_data->target_height;
	isp_preview_config_data.preview_offset_x=isp_data->preview_offset_x;
	isp_preview_config_data.preview_offset_y=isp_data->preview_offset_y;
	isp_preview_config_data.camera_offset_x=isp_data->camera_offset_x;
	isp_preview_config_data.camera_offset_y=isp_data->camera_offset_y;
	isp_preview_config_data.frame_buffer_address=isp_data->frame_buffer_address;
	isp_preview_config_data.frame_buffer_size=isp_data->frame_buffer_size;
	isp_preview_config_data.frame_buffer_address1=isp_data->frame_buffer_address1;
	isp_preview_config_data.frame_buffer_size1=isp_data->frame_buffer_size1;
	isp_preview_config_data.roi_background_color=isp_data->roi_background_color;
	isp_preview_config_data.lcd_update=isp_data->lcd_update;
	isp_preview_config_data.cam_preview_cb=isp_data->cam_preview_cb;
#if (!defined(DRV_ISP_6219_SERIES))
	cam_preview_cb=isp_data->cam_preview_cb;
#endif
#if (!defined(YUV_SENSOR_SUPPORT))
#if (defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES))
	intmem_init((kal_uint32 *) isp_preview_config_data.intmem_start_address,
					isp_preview_config_data.intmem_size);
	extmem_init((kal_uint32 *) isp_preview_config_data.extmem_start_address,
					isp_preview_config_data.extmem_size);
#endif

	lcd_data.module_id=LCD_UPDATE_MODULE_MEDIA;
	lcd_data.lcd_id=isp_preview_config_data.lcd_id;
	lcd_data.fb_update_mode=LCD_HW_TRIGGER_MODE;
	lcd_data.lcm_start_x=isp_preview_config_data.lcm_start_x;
	lcd_data.lcm_start_y=isp_preview_config_data.lcm_start_y;
	lcd_data.lcm_end_x=isp_preview_config_data.lcm_end_x;
	lcd_data.lcm_end_y=isp_preview_config_data.lcm_end_y;
	lcd_data.roi_offset_x=isp_preview_config_data.roi_offset_x;
	lcd_data.roi_offset_y=isp_preview_config_data.roi_offset_y;
	lcd_data.update_layer=isp_preview_config_data.update_layer;
	lcd_data.hw_update_layer=isp_preview_config_data.hw_update_layer;
	lcd_data.block_mode_flag=KAL_TRUE;
	lcd_data.lcd_block_mode_cb=NULL;
#if (!defined(DRV_ISP_6219_SERIES))
	lcd_data.roi_background_color=isp_data->roi_background_color;
#endif

#if (defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES))
	lcd_data.memory_output=KAL_FALSE;
#endif
#endif /* YUV_SENSOR_SUPPORT */

	isp_preview_config_data.contrast_level=isp_data->contrast_level;
	isp_preview_config_data.brightness_level=isp_data->brightness_level;
	isp_preview_config_data.hue_value=isp_data->hue_value;
	isp_preview_config_data.saturation_value=isp_data->saturation_value;
	isp_preview_config_data.wb_mode=isp_data->wb_mode;
	isp_preview_config_data.ev_value=isp_data->ev_value;
	isp_preview_config_data.banding_freq=isp_data->banding_freq;
	isp_preview_config_data.image_effect=isp_data->image_effect;
	isp_preview_config_data.night_mode=isp_data->night_mode;

#if (!defined(DRV_ISP_6219_SERIES))
	/* ISP Setting */
	isp_preview_config_data.dsc_mode      				= isp_data->dsc_mode;
	isp_preview_config_data.ae_metering_mode 			= isp_data->ae_metering_mode;
	isp_preview_config_data.af_mode      				= isp_data->af_mode;
	isp_preview_config_data.af_metering_mode 			= isp_data->af_metering_mode;
	isp_preview_config_data.tv_setting      			= isp_data->tv_setting;
	isp_preview_config_data.av_setting      			= isp_data->av_setting;
	isp_preview_config_data.iso_setting      			= isp_data->iso_setting;
	isp_preview_config_data.flash_mode      			= isp_data->flash_mode;

	isp_preview_config_data.af_zone0_x      			= isp_data->af_zone0_x;
	isp_preview_config_data.af_zone0_y      			= isp_data->af_zone0_y;
	isp_preview_config_data.af_zone1_x      			= isp_data->af_zone1_x;
	isp_preview_config_data.af_zone1_y      			= isp_data->af_zone1_y;
	isp_preview_config_data.af_zone2_x      			= isp_data->af_zone2_x;
	isp_preview_config_data.af_zone2_y      			= isp_data->af_zone2_y;
	isp_preview_config_data.af_zone3_x      			= isp_data->af_zone3_x;
	isp_preview_config_data.af_zone3_y      			= isp_data->af_zone3_y;
	isp_preview_config_data.af_zone4_x      			= isp_data->af_zone4_x;
	isp_preview_config_data.af_zone4_y      			= isp_data->af_zone4_y;
	isp_preview_config_data.cam_focus_cb				= isp_data->cam_focus_cb;
	cam_focus_cb												= isp_data->cam_focus_cb;
#endif
#if (defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))
	isp_preview_config_data.tv_output						=	isp_data->tv_output;
	isp_preview_config_data.tv_output_width				=	isp_data->tv_output_width;
	isp_preview_config_data.tv_output_height				=	isp_data->tv_output_height;
	isp_preview_config_data.tv_output_offset_x			=	isp_data->tv_output_offset_x;
	isp_preview_config_data.tv_output_offset_y			=	isp_data->tv_output_offset_y;
	isp_preview_config_data.tv_output_buffer1_address	=	isp_data->tv_output_buffer1_address;
	isp_preview_config_data.tv_output_buffer2_address	=	isp_data->tv_output_buffer2_address;
	isp_preview_config_data.tv_output_buffer_size		=	isp_data->tv_output_buffer_size;

	/* Prepare IPP Data */
	ipp_preview_data.intmem_start_address 				= isp_data->intmem_start_address;
	ipp_preview_data.intmem_size          				= isp_data->intmem_size;
	ipp_preview_data.extmem_start_address 				= isp_data->extmem_start_address;
	ipp_preview_data.extmem_size          				= isp_data->extmem_size;

	ipp_preview_data.image_src_width		 				= isp_preview_config_data.source_width;
	ipp_preview_data.image_src_height	 				= isp_preview_config_data.source_height;
	ipp_preview_data.preview_width		 				= isp_preview_config_data.target_width;
	ipp_preview_data.preview_height	 					= isp_preview_config_data.target_height;

	ipp_preview_data.image_pitch_mode  					= isp_data->image_pitch_mode;
	ipp_preview_data.image_data_format 					= isp_data->image_data_format;
	ipp_preview_data.image_pitch_bytes 					= isp_data->image_pitch_bytes;

	ipp_preview_data.overlay_frame_mode			  		= isp_data->overlay_frame_mode;
	ipp_preview_data.overlay_color_depth				= isp_data->overlay_color_depth;
	ipp_preview_data.overlay_frame_source_key	  		= isp_data->overlay_frame_source_key;
	ipp_preview_data.overlay_frame_width				= isp_data->overlay_frame_width;
	ipp_preview_data.overlay_frame_height				= isp_data->overlay_frame_height;
	ipp_preview_data.overlay_frame_buffer_address	= isp_data->overlay_frame_buffer_address;

	ipp_preview_data.frame_buffer_address				= isp_data->frame_buffer_address;
	ipp_preview_data.frame_buffer_size					= isp_data->frame_buffer_size;
	ipp_preview_data.frame_buffer_address1				= isp_data->frame_buffer_address1;
	ipp_preview_data.frame_buffer_size1					= isp_data->frame_buffer_size1;

	ipp_preview_data.tv_output                      = isp_data->tv_output;
	ipp_preview_data.tv_output_width						= isp_data->tv_output_width;
	ipp_preview_data.tv_output_height					= isp_data->tv_output_height;
	ipp_preview_data.tv_output_offset_x					= isp_data->tv_output_offset_x;
	ipp_preview_data.tv_output_offset_y					= isp_data->tv_output_offset_y;
	ipp_preview_data.tv_output_buffer1_address		= isp_data->tv_output_buffer1_address;
	ipp_preview_data.tv_output_buffer2_address		= isp_data->tv_output_buffer2_address;
	ipp_preview_data.tv_rotate_buffer1_address = isp_data->tv_rotate_buffer1_address;
	ipp_preview_data.tv_rotate_buffer2_address = isp_data->tv_rotate_buffer2_address;
	ipp_preview_data.tv_output_buffer_size				= isp_data->tv_output_buffer_size;

#if (!defined(YUV_SENSOR_SUPPORT))
	/* Prepare LCD Data */
	lcd_data.hw_trigger_src 								= LCD_HW_TRIGGER_IBW2;
	lcd_data.memory_output=KAL_FALSE;

#if (defined(TV_OUT_SUPPORT))
	if ((isp_data->tv_output==KAL_TRUE)&&
		 ((tv_output_config_data.tv_output_mode==TV_OUTPUT_MODE1)||
		  (tv_output_config_data.tv_output_mode==TV_OUTPUT_MODE4)))
	{
		lcd_data.tv_output=KAL_TRUE;
		lcd_data.tv_output_width=isp_data->tv_output_width;
		lcd_data.tv_output_height=isp_data->tv_output_height;
		lcd_data.tv_output_offset_x=isp_data->tv_output_offset_x;
		lcd_data.tv_output_offset_y=isp_data->tv_output_offset_y;
		lcd_data.tv_output_frame_buffer1_address=isp_data->tv_output_buffer1_address;
		lcd_data.tv_output_frame_buffer2_address=isp_data->tv_output_buffer2_address;
		lcd_data.tv_output_frame_buffer_size=isp_data->tv_output_buffer_size;

		ipp_preview_data.tv_output=KAL_FALSE;
	}
	else
	{
		lcd_data.tv_output=KAL_FALSE;
	}
#endif /* TV_OUT_SUPPORT */
#endif /* YUV_SENSOR_SUPPORT */
#endif

#if (!defined(YUV_SENSOR_SUPPORT))
#if (defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6227_SERIES))
	config_image_dma(scene_id,isp_data->target_width,isp_data->target_height);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -