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

📄 mmidc_preview.c

📁 手机Camera部分上层软件代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		//副屏
		p_disp_rect->w_width	= MMI_SUBSCREEN_WIDTH;
		p_disp_rect->w_height	= MMI_SUBSCREEN_HEIGHT;
		break;

	default:
		return FALSE;
		break;
		
	}

	//calc trim rect
	p_trim_rect->w_start_x = 0;
	p_trim_rect->w_start_y = 0;
	if (setting_ptr->is_from_dc)
	{
		e_photo_size = setting_ptr->e_photo_size;
		SCI_ASSERT(e_photo_size < MMIDC_PHOTO_SIZE_MAX);
		
		switch(e_trimrect_type)
		{
		case MMIDC_PREVIEW_NO_AF:			//没有AF情况下的preview
		case MMIDV_PREVIEW_NO_AF:
			need_trunk = TRUE;
			GetDCSensorRect(e_photo_size, &sensor_width, &sensor_height);
            break;

		case MMIDC_CAPTURE_NO_AF:			//capture
			need_trunk = FALSE;
             if (e_photo_size > MMIDC_PHOTO_SIZE_640X480)
            {
                GetDCCapTrimRect(e_photo_size, &sensor_width, &sensor_height);
            }
            else
            {
                sensor_width  = s_dc_sensor_capture_zoom_size[s_zoom_level].w_width;
                sensor_height = s_dc_sensor_capture_zoom_size[s_zoom_level].w_height;
            }
            break;


		case MMIDC_CAPTURE_OSD:
			need_trunk = FALSE;
			if (e_photo_size > MMIDC_PHOTO_SIZE_640X480)
            {
                GetDCCapTrimRect(e_photo_size, &sensor_width, &sensor_height);
            }
            else
            {
                sensor_width = s_dc_sensor_capture_zoom_size[s_zoom_level].w_width;
                sensor_height = s_dc_sensor_capture_zoom_size[s_zoom_level].w_height;
            }

			GetCapTargetRect(e_photo_size, &target_width, &target_height);
			sensor_width = MIN(sensor_width, target_width);
			sensor_height = MIN(sensor_height, target_height);
			break;

		case MMIDC_PREVIEW_AF_CONTINUOUS:	//连续AF的preview
		case MMIDC_PREVIEW_AF_SINGLE:		//单次AF的preview
			need_trunk = FALSE;
			GetDCSensorAFRect(e_photo_size, &sensor_width, &sensor_height);
			break;

		default:
			DC_ASSERT_LOW(0);
			break;
		}
	}
	else
	{
		e_video_size = setting_ptr->e_video_size;
		SCI_ASSERT(e_video_size < MMIVC_VIDEO_SIZE_MAX);

		need_trunk = TRUE;
		GetDVSensorRect(e_video_size, &sensor_width, &sensor_height);
	}
	
 	SCI_TRACE_LOW("DCAdap_SetPreviewParam e_trimrect_type = %d need_trunk =%d ",e_trimrect_type,need_trunk);
	SCI_TRACE_LOW("DCAdap_SetPreviewParam_LW3");
 	
	if (need_trunk)
	{
		if ((sensor_width <= p_disp_rect->w_width) && (sensor_height <= p_disp_rect->w_height))
		{
			p_trim_rect->w_width = sensor_width;
			p_trim_rect->w_height = sensor_height;
		}
		else
		{
			//adjust trim rect
			p_trim_rect->w_width = MIN(
										sensor_width, 
										sensor_height * p_disp_rect->w_width / p_disp_rect->w_height
										);
			p_trim_rect->w_width = right_trunk_16(p_trim_rect->w_width);
			p_trim_rect->w_width = MIN(sensor_width ,p_trim_rect->w_width);

			p_trim_rect->w_height = MIN(
										sensor_width * p_disp_rect->w_height / p_disp_rect->w_width,
										sensor_height
										);
			p_trim_rect->w_height = right_trunk_8(p_trim_rect->w_height);
			p_trim_rect->w_height = MIN(sensor_height, p_trim_rect->w_height);
		}
		//make trim rect be in the sensor middle
	
#ifdef 	MMIDC_ZOOM_SUPPORT
    #ifdef MMI_ENABLE_AUTO_FOCUS
            p_trim_rect->w_start_x = right_trunk_16((sensor_width - p_trim_rect->w_width) / 2);
            p_trim_rect->w_start_y = right_trunk_8((sensor_height - p_trim_rect->w_height) / 2);
    #else
            if (setting_ptr->is_from_dc)
            {
                p_trim_rect->w_start_x = ((s_dc_sensor_capture_zoom_size[0].w_width - p_trim_rect->w_width)/2); // right_trunk_16
                p_trim_rect->w_start_y = ((s_dc_sensor_capture_zoom_size[0].w_height - p_trim_rect->w_height)/2); // right_trunk_16
            }
            else
            {
                p_trim_rect->w_start_x = right_trunk_16((sensor_width - p_trim_rect->w_width) / 2);
                p_trim_rect->w_start_y = right_trunk_8((sensor_height - p_trim_rect->w_height) / 2);
            }
    #endif
#else
		p_trim_rect->w_start_x = right_trunk_16((sensor_width - p_trim_rect->w_width) / 2);
		p_trim_rect->w_start_y = right_trunk_8((sensor_height - p_trim_rect->w_height) / 2);
#endif					
            SCI_TRACE_LOW("DCSetting_GetTrimRect:trim_width=%d,trim_height=%d,start_x=%d,start_y=%d",
                p_trim_rect->w_width, p_trim_rect->w_height, p_trim_rect->w_start_x, p_trim_rect->w_start_y);     
	}
	else
	{
		p_trim_rect->w_width = sensor_width;
		p_trim_rect->w_height = sensor_height;
		
#ifdef 	MMIDC_ZOOM_SUPPORT
    #ifndef MMI_ENABLE_AUTO_FOCUS
        if (0 != s_zoom_level)
        {
            p_trim_rect->w_start_x = right_trunk_16((s_dc_sensor_capture_zoom_size[0].w_width - s_dc_sensor_capture_zoom_size[s_zoom_level].w_width)/2);
            p_trim_rect->w_start_y = right_trunk_8((s_dc_sensor_capture_zoom_size[0].w_height - s_dc_sensor_capture_zoom_size[s_zoom_level].w_height)/2);
        }
    #endif
        SCI_TRACE_LOW("DCSetting_GetTrimRect:trim_width=%d,trim_height=%d,start_x=%d,start_y=%d",
        p_trim_rect->w_width, p_trim_rect->w_height, p_trim_rect->w_start_x, p_trim_rect->w_start_y);
#endif
	}
	
	//re calc the disp rect
	p_disp_rect->w_width = MIN(p_disp_rect->w_width, p_trim_rect->w_width);
	p_disp_rect->w_height = MIN(p_disp_rect->w_height, p_trim_rect->w_height);

	switch(setting_ptr->e_prevwin_mode)
	{
	case PREVIEW_WIN_FULLSCREEN_CHAR_OSDMENU:
	case PREVIEW_WIN_FULLSCREEN_IMAGE_OSDMENU:
		//全屏
		p_disp_rect->w_start_x = (MMIDC_MAINSCREEN_WIDTH - p_disp_rect->w_width) / 2;
		p_disp_rect->w_start_y = (MMIDC_MAINSCREEN_HEIGHT - p_disp_rect->w_height) / 2;
		break;

	case PREVIEW_WIN_PARTSCREEN_CIRCLE_OSD:
		//半屏
		p_disp_rect->w_start_x = (MMIDC_MAINSCREEN_WIDTH - p_disp_rect->w_width) / 2;
		p_disp_rect->w_start_y = (MMIDC_MAINSCREEN_HEIGHT - PARTSCREEN_CIRCLE_OSD_IMG_HEIGHT - MMI_FULLSCREEN_SOFTKEY_BAR_HEIGHT - p_disp_rect->w_height) / 2;
		break;
		
	case PREVIEW_WIN_SUBLCD_NO_OSD:
		//副屏
		p_disp_rect->w_start_x = (MMI_SUBSCREEN_WIDTH - p_disp_rect->w_width) / 2;
		p_disp_rect->w_start_y = (MMI_SUBSCREEN_HEIGHT - p_disp_rect->w_height) / 2;
		break;

	default:
		return FALSE;
		break;
	}
//	p_disp_rect->w_start_x = (MMIDC_MAINSCREEN_WIDTH - p_disp_rect->w_width) / 2;
//	p_disp_rect->w_start_y = (MMI_MAINSCREEN_HEIGHT - p_disp_rect->w_height) / 2;

    SCI_TRACE_LOW("DCSetting_GetTrimRect:disp_width=%d,disp_height=%d,start_x=%d,start_y=%d",
        p_disp_rect->w_width, p_disp_rect->w_height, p_disp_rect->w_start_x, p_disp_rect->w_start_y);
    SCI_TRACE_LOW("DCSetting_GetTrimRect_LW1");	
	return TRUE;
}



/*****************************************************************************/
// 	Description : Get preview/capture trim rect according to setting info
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
PUBLIC BOOLEAN DVSetting_GetTrimRect(RECT_T *p_trim_rect, RECT_T *p_disp_rect, const MMIDC_SETTING_INFO_T *setting_ptr)
{
    uint16 sensor_width = 0;
    uint16 sensor_height = 0;
    uint16 trim_width = 0;
    uint16 trim_height = 0;
    uint16 disp_width = 0;
    uint16 disp_height = 0;

    MMIVC_VIDEO_SIZE_E e_video_size = 0;
    e_video_size = setting_ptr->e_video_size;
    DC_ASSERT_LOW(p_trim_rect != PNULL && setting_ptr != PNULL && e_video_size < MMIVC_VIDEO_SIZE_MAX);

    p_trim_rect->w_start_x = 0;
    p_trim_rect->w_start_y = 0;

    p_disp_rect->w_start_x	= 0;
    p_disp_rect->w_start_y	= 0;

    sensor_width = s_dv_sensor_mode_and_size[e_video_size].i_sensor_width;
    sensor_height = s_dv_sensor_mode_and_size[e_video_size].i_sensor_height;
    disp_width = s_dv_sensor_mode_and_size[e_video_size].i_preview_disp_width;
    disp_height = s_dv_sensor_mode_and_size[e_video_size].i_preview_disp_height;

    trim_width = MIN(sensor_width, sensor_height * disp_width / disp_height);
    trim_height= MIN(sensor_height, sensor_width * disp_height / disp_width);

    trim_width = right_trunk_16(trim_width);
    trim_height = right_trunk_16(trim_height);

    p_trim_rect->w_start_x = right_trunk_16((sensor_width - trim_width) / 2);
    p_trim_rect->w_start_y = right_trunk_16((sensor_height - trim_height) / 2);

    p_trim_rect->w_width = sensor_width;
    p_trim_rect->w_height = sensor_height;

    SCI_TRACE_LOW("DVSetting_GetTrimRect:trim_width=%d,trim_height=%d,start_x=%d,start_y=%d",
        p_trim_rect->w_width, p_trim_rect->w_height, p_trim_rect->w_start_x, p_trim_rect->w_start_y);

    p_disp_rect->w_width = disp_width;
    p_disp_rect->w_height = disp_height;

    p_disp_rect->w_start_x = left_trunk_2((MMIDC_MAINSCREEN_WIDTH - p_disp_rect->w_width) / 2);
    p_disp_rect->w_start_y = left_trunk_2((MMIDC_MAINSCREEN_HEIGHT - p_disp_rect->w_height) / 2);

    SCI_TRACE_LOW("DVSetting_GetTrimRect:disp_width=%d,disp_height=%d,start_x=%d,start_y=%d",
        p_disp_rect->w_width, p_disp_rect->w_height, p_disp_rect->w_start_x, p_disp_rect->w_start_y);

    return TRUE;
}


/*****************************************************************************/
// 	Description : Get record target rect according to setting info
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
PUBLIC BOOLEAN DVSetting_GEtTargetRect(uint16 *p_width, uint16 *p_height, const MMIDC_SETTING_INFO_T *setting_ptr)
{
	MMIVC_VIDEO_SIZE_E e_video_size = 0;
	e_video_size = setting_ptr->e_video_size;

	DC_ASSERT_LOW(p_width != PNULL && p_height != PNULL && setting_ptr != PNULL && e_video_size < MMIVC_VIDEO_SIZE_MAX);

	*p_width = s_dv_sensor_mode_and_size[e_video_size].i_target_width;
	*p_height =  s_dv_sensor_mode_and_size[e_video_size].i_target_height;

	return TRUE;	
}

/*****************************************************************************/
// 	Description : Get record display rect according to setting info
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
PUBLIC void DVSetting_GetDispRect(uint16 *p_width, uint16 *p_height, uint16 video_width, uint16 wideo_height)
{
    uint32 i = 0;

    for (i = 0; i < MMIVC_VIDEO_SIZE_MAX; i++)
    {
        if (s_dv_sensor_mode_and_size[i].i_target_width == video_width
            &&s_dv_sensor_mode_and_size[i].i_target_height == wideo_height)
        {
            break;
        }
    }

    if (i < MMIVC_VIDEO_SIZE_MAX)
    {
        *p_width = s_dv_sensor_mode_and_size[i].i_preview_disp_width;
        *p_height =  s_dv_sensor_mode_and_size[i].i_preview_disp_height;
    }
    else
    {
        *p_width = MMIDC_MAINSCREEN_WIDTH;
        *p_height = MMIDC_MAINSCREEN_HEIGHT;
    }
}

/*****************************************************************************/
// 	Description : right trunk a number with 16
//	Global resource dependence : 
//  Author:bruce.chi
//	Note: 
/*****************************************************************************/
__inline LOCAL uint16 right_trunk_16(uint16 in_num)
{
	return (in_num + 15) / 16 * 16;
}

__inline LOCAL uint16 right_trunk_8(uint16 in_num)
{
	return (in_num + 7) / 8 * 8;
}

/*****************************************************************************/
// 	Description : left trunk a number with 2
//	Global resource dependence : 
//  Author:bruce.chi
//	Note: 
/*****************************************************************************/
__inline LOCAL uint16 left_trunk_2(uint16 in_num)
{
	return in_num / 2 * 2;
}

/*****************************************************************************/
// 	Description : use DC Driver interface to set sensor effect
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:	这个函数用于Stop了Preview以后,再次Start
/*****************************************************************************/
LOCAL BOOLEAN DCAdap_SetALLSensorEffect(MMIDC_SETTING_INFO_T *setting_ptr)
{
	DC_SENSOR_MODE_E e_sensor_sequence = 0;

	//i_contrast、e_effect 和 i_brightness先后起作用
	e_sensor_sequence = DCAdap_GetSensorBrightnessSequence(setting_ptr);
	DC_SetImageEffect(e_sensor_sequence);

	e_sensor_sequence = DCAdap_GetSensorContrastSequence(setting_ptr);
	DC_SetImageEffect(e_sensor_sequence);

	e_sensor_sequence = DCAdap_GetSensorSepiaSequence(setting_ptr);
	DC_SetImageEffect(e_sensor_sequence);
	
	return TRUE;
}

/*****************************************************************************/
// 	Description : set preview param, set osd, set sensor effect
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:	for MMI upper level
/*****************************************************************************/
PUBLIC BOOLEAN DCAdap_SetAllPreviewParam(void)
{
   
	//这个函数的实现依赖于MMIDC_SETTING_INFO_T
	MMIDC_SETTING_INFO_T *setting_ptr;

	// get preview setting
	setting_ptr = MMIDC_GetSettingInfo();
     SCI_TRACE_LOW("LW TRACE :DCAdap_SetALLPreviewPARAM__AAAAAAAAAAAAAAAAAAAA");
	/*set parameters*/
	if (!DCAdap_SetPreviewParam(setting_ptr))
	{
		SCI_TRACE_LOW("LW  TRACE:DCAdap_SetALLPreviewPARAM__AAAAAAAAAAAAAAAABBBBBBBBBBBBBBB");
		return FALSE;
	}

	/*set effect*/
	if (!DCAdap_SetALLSensorEffect(setting_ptr))
	{
		SCI_TRACE_LOW("LW  TRACE:DCAdap_SetALLPreviewPARAM__AAAAAAAAAAAAAAAACCCCCCCCCCCCCCC");
		return FALSE;
	}

	return TRUE;
}


/*****************************************************************************/
// 	Description : use DC Driver interface to start preview
//	Global resource dependence : 
//  Author: bruce.chi

⌨️ 快捷键说明

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