📄 mmidc_preview.c
字号:
//副屏
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 + -