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

📄 usbvideo_cam_if.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
*
* DESCRIPTION
*	This function turn off the power of web camera module.
*  complete or not.
*
* PARAMETERS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void usbvideo_camera_power_off(void)
{
	usbvideo_cam_operation_state=USBVIDEO_CAM_OFF_STATE;
	power_off_isp();
}	/* usbvideo_camera_power_off() */

void init_working_mem(void)
{
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))	
	intmem_init((kal_uint32 *) g_usbvideo_camera_data.intmem_start_address,
					g_usbvideo_camera_data.intmem_size);
	extmem_init((kal_uint32 *) g_usbvideo_camera_data.extmem_start_address,
					g_usbvideo_camera_data.extmem_size);
#endif					
}

void deinit_working_mem(void)
{
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))		
	intmem_deinit();
	extmem_deinit();
#endif	
}

void config_usbvideo_preview_jpeg(usbvideo_camera_process_struct* usbvideo_param)
{
   kal_uint32 event_group;
	volatile kal_uint8 i;
	kal_uint16 temp_grab_size;
	kal_uint8 usbvideo_sub_sample_mode;

	scene_id=SCENARIO_USBVIDEO_CAPTURE_JPEG_ID;
	usbvideo_complete_flag = KAL_FALSE;

	if((usbvideo_param->target_comp_enum)<1)
		usbvideo_param->target_comp_enum = 1;		
	g_usbvideo_camera_data.image_quality=STILL_COMPRESSION[usbvideo_param->target_comp_enum-1].compression;	

	g_usbvideo_camera_data.target_buffer_start_address = (kal_uint32)g_usbvideo_cam_buff;
	g_usbvideo_camera_data.target_size_enum = g_usbvideo_cam_size;	
	g_usbvideo_camera_data.intmem_start_address = usbvideo_param->intmem_start_address;
	g_usbvideo_camera_data.intmem_size = usbvideo_param->intmem_size;
	g_usbvideo_camera_data.extmem_start_address = usbvideo_param->extmem_start_address;
	g_usbvideo_camera_data.extmem_size = usbvideo_param->extmem_size;
	g_usbvideo_camera_data.usbvideo_cam_preview_cb = usbvideo_param->usbvideo_cam_preview_cb;				
	g_usbvideo_camera_data.jpeg_gray_mode=0;

	/* configure sensor */
	exposure_window.image_target_width=g_usbvideo_camera_data.target_width;
	exposure_window.image_target_height=g_usbvideo_camera_data.target_height;
	exposure_window.digital_zoom_factor=isp_digital_zoom_factor;

	// Disable AE Count before Start Preview	
	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	DISABLE_VIEW_FINDER_MODE;   	
	DISABLE_AE_COUNT;
	#endif

	sensor_config_data.image_mirror=usbvideo_param->image_mirror;
	sensor_config_data.frame_rate=0xF0;		// webcam mode
	image_sensor_func->sensor_preview_setting(&exposure_window,&sensor_config_data);

#if (!defined(YUV_SENSOR_SUPPORT))	
	/* accoring the zoom factor to calculate the grab window area */
	isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	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 ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
		 (exposure_window.image_target_height * exposure_window.exposure_window_width))
	{	/* x limit */
		temp_grab_size=isp_grab_height;
		isp_grab_height=isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width;
		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 * exposure_window.image_target_width/exposure_window.image_target_height;
		isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFE);
	}

	SET_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
	SET_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
#else   // YUV_SENSOR_SUPPORT
	/* accoring the zoom factor to calculate the grab window area */
	isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFC);
	isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);

	if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
		 (exposure_window.image_target_height * exposure_window.exposure_window_width))
	{	/* x limit */
		temp_grab_size=isp_grab_height;
		isp_grab_height=(isp_grab_width * exposure_window.image_target_height/exposure_window.image_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 * exposure_window.image_target_width/exposure_window.image_target_height)&0xFFFC;;
		isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFC);
	}

	SET_YUV_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
	SET_YUV_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
#endif  /* YUV_SENSOR_SUPPORT */

#if (defined(MT6228)||defined(MT6229)||defined(MT6230))		
	DISABLE_CMOS_SESNOR;
#endif
	kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
	ENABLE_CAMERA_IDLE_INT;
	SET_CAMERA_CAPTURE_MODE;
	SET_CAMERA_FRAME_RATE(0);
	ENABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))		
	ENABLE_CMOS_SESNOR;
#endif
   kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
                          &event_group,KAL_SUSPEND);
	sensor_config_data.enable_shutter_tansfer=KAL_FALSE;
	image_sensor_func->set_sensor_eshutter(eShutter);
	image_sensor_func->sensor_capture_setting(&exposure_window,&sensor_config_data);

#if (!defined(YUV_SENSOR_SUPPORT))
	/* accoring the zoom factor to calculate the grab window area */
	isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	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 ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
		 (exposure_window.image_target_height * exposure_window.exposure_window_width))
	{	/* x limit */
		temp_grab_size=isp_grab_height;
		isp_grab_height=isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width;
		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 * exposure_window.image_target_width/exposure_window.image_target_height;
		isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFE);
	}

	SET_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
	SET_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
	ae_config(isp_grab_width,isp_grab_height);
	
	/* Init Banding Flicker Setting */
	if(usbvideo_param->banding_freq == CAM_BANDING_50HZ)
	{   /* 50Hz */
        usbvideo_attr_PU_value_list[GET_ATTR_PU_IDX(USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY)] = 1;
    }
    else
    {   /* 60Hz or Disable */
        usbvideo_attr_PU_value_list[GET_ATTR_PU_IDX(USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY)] = 2;
    }        	
    ae_select_band(usbvideo_param->banding_freq);                	
    
#if (!defined(MT6219))			
	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(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	REG_ISP_PREPROCESS_CTRL2 |= REG_PREPROCESS2_AE_COUNT_CLEAR_BIT;
	SET_AE_FRAME_INTERVAL(1);
	REG_ISP_PREPROCESS_CTRL2 &= ~REG_PREPROCESS2_AE_COUNT_CLEAR_BIT;		
	if(camera_oper_data.ae_awb_cal_period<4)
	    camera_oper_data.ae_awb_cal_period = 4;
#endif
	
#if (defined(MT6219))	
	if ((isp_grab_width<=g_usbvideo_camera_data.target_width) && (isp_grab_height<=g_usbvideo_camera_data.target_height))
	{
		usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_1;
		g_usbvideo_camera_data.source_width = isp_grab_width;
		g_usbvideo_camera_data.source_height=isp_grab_height;
	}
	else if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<1)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<1)))
	{
		usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_2;
		g_usbvideo_camera_data.source_width=isp_grab_width>>1;
		g_usbvideo_camera_data.source_height=isp_grab_height>>1;
	}
	else if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<2)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<2)))
	{
		usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_4;
		g_usbvideo_camera_data.source_width=isp_grab_width>>2;
		g_usbvideo_camera_data.source_height=isp_grab_height>>2;
	}
	else // if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<3)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<3)))
	{
		usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_8;
		g_usbvideo_camera_data.source_width=isp_grab_width>>3;
		g_usbvideo_camera_data.source_height=isp_grab_height>>3;
	}
	SET_SUB_SAMPLE_MODE(usbvideo_sub_sample_mode);
#elif  (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	ENABLE_VERTICAL_SUB_SAMPLE;
	ENABLE_HORIZONTAL_SUB_SAMPLE;
	SET_HSUB_SRC_SIZE(isp_grab_width);	
	SET_VSUB_SRC_SIZE(isp_grab_height);
	if((isp_grab_width>(g_usbvideo_camera_data.target_width<<2)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<2)))
	{ /* grab size > taget size *4 => ISP subsample 4x */
		SET_HSUB_DST_SIZE((isp_grab_width>>2)&0xFFFE);
		SET_VSUB_DST_SIZE((isp_grab_height>>2)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width>>2)&0xFFFE;
		g_usbvideo_camera_data.source_height=(isp_grab_height>>2)&0xFFFE;
	}
	else if((isp_grab_width>(g_usbvideo_camera_data.target_width<<1)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<1)))
	{ /* grab size > taget size *2 => ISP subsample 2x */
		SET_HSUB_DST_SIZE((isp_grab_width>>1)&0xFFFE);
		SET_VSUB_DST_SIZE((isp_grab_height>>1)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width>>1)&0xFFFE;
		g_usbvideo_camera_data.source_height=(isp_grab_height>>1)&0xFFFE;
	}
	else if((isp_grab_width>g_usbvideo_camera_data.target_width) || (isp_grab_height>g_usbvideo_camera_data.target_height))	
	{
		SET_HSUB_DST_SIZE((g_usbvideo_camera_data.target_width)&0xFFFE);
		SET_VSUB_DST_SIZE((g_usbvideo_camera_data.target_height)&0xFFFE);
		g_usbvideo_camera_data.source_width=(g_usbvideo_camera_data.target_width)&0xFFFE;
		g_usbvideo_camera_data.source_height=(g_usbvideo_camera_data.target_height)&0xFFFE;
	}
	else
	{
		SET_HSUB_DST_SIZE((isp_grab_width)&0xFFFE);				  
		SET_VSUB_DST_SIZE((isp_grab_height)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width)&0xFFFE;
		g_usbvideo_camera_data.source_height=(isp_grab_height)&0xFFFE;
	}
#endif

	/* Wait stable frame */
	ae_on_off(KAL_TRUE);
	awb_on_off(KAL_TRUE);   	

#else   // YUV_SENSOR_SUPPORT
	/* accoring the zoom factor to calculate the grab window area */
	isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
	isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFC);
	isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);

	if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
		 (exposure_window.image_target_height * exposure_window.exposure_window_width))
	{	/* x limit */
		temp_grab_size=isp_grab_height;
		isp_grab_height=(isp_grab_width * exposure_window.image_target_height/exposure_window.image_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 * exposure_window.image_target_width/exposure_window.image_target_height)&0xFFFC;
		isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFC);
	}
	SET_YUV_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
	SET_YUV_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
	
    /* (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230)) */
	ENABLE_VERTICAL_SUB_SAMPLE;
	ENABLE_HORIZONTAL_SUB_SAMPLE;
	SET_HSUB_SRC_SIZE(isp_grab_width);	
	SET_VSUB_SRC_SIZE(isp_grab_height);
	if((isp_grab_width>(g_usbvideo_camera_data.target_width<<2)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<2)))
	{ /* grab size > taget size *4 => ISP subsample 4x */
		SET_HSUB_DST_SIZE((isp_grab_width>>2)&0xFFFC);
		SET_VSUB_DST_SIZE((isp_grab_height>>2)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width>>2)&0xFFFC;
		g_usbvideo_camera_data.source_height=(isp_grab_height>>2)&0xFFFE;
	}
	else if((isp_grab_width>(g_usbvideo_camera_data.target_width<<1)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<1)))
	{ /* grab size > taget size *2 => ISP subsample 2x */
		SET_HSUB_DST_SIZE((isp_grab_width>>1)&0xFFFC);
		SET_VSUB_DST_SIZE((isp_grab_height>>1)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width>>1)&0xFFFC;
		g_usbvideo_camera_data.source_height=(isp_grab_height>>1)&0xFFFE;
	}
	else if((isp_grab_width>g_usbvideo_camera_data.target_width) || (isp_grab_height>g_usbvideo_camera_data.target_height))	
	{
		SET_HSUB_DST_SIZE((g_usbvideo_camera_data.target_width)&0xFFFC);
		SET_VSUB_DST_SIZE((g_usbvideo_camera_data.target_height)&0xFFFE);
		g_usbvideo_camera_data.source_width=(g_usbvideo_camera_data.target_width)&0xFFFC;
		g_usbvideo_camera_data.source_height=(g_usbvideo_camera_data.target_height)&0xFFFE;
	}
	else
	{
		SET_HSUB_DST_SIZE((isp_grab_width)&0xFFFC);				  
		SET_VSUB_DST_SIZE((isp_grab_height)&0xFFFE);
		g_usbvideo_camera_data.source_width=(isp_grab_width)&0xFFFC;
		g_usbvideo_camera_data.source_height=(isp_grab_height)&0xFFFE;
	}		
#endif  /* YUV_SENSOR_SUPPORT */   

	wait_first_frame_flag = KAL_TRUE;
	isp_preview_frame = 0;
	for(i=0;i<camera_oper_data.capture_delay_frame;i++)
	{
	   DISABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))		
		DISABLE_CMOS_SESNOR;
#endif
	   kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
		ENABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))		
		ENABLE_CMOS_SESNOR;
#endif
   	kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
      	                    &event_group,KAL_SUSPEND);
   }

	// Enable AE Count before Start Preview
	#if  (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	ENABLE_AE_COUNT;
	#endif			
   
   DISABLE_VIEW_FINDER_MODE;
   DISABLE_CAMERA_IDLE_INT;

#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
	init_working_mem();

	jpeg_encode_config_data.image_width=g_usbvideo_camera_data.target_width;
	jpeg_encode_config_data.image_height=g_usbvideo_camera_data.target_height;

⌨️ 快捷键说明

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