📄 mmidc_capture.c
字号:
0,
setting_ptr->st_cap_osd_info.str,
setting_ptr->st_cap_osd_info.str_len,
setting_ptr->st_cap_osd_info.is_ucs2,
&trim_rect
);
break;
default:
DC_ASSERT_LOW(0);
return FALSE;
break;
}
}
return TRUE;
}
/*****************************************************************************/
// Description : set capture character OSD
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
LOCAL int OSD_SetCharacterCapOSD(
int i_zone,
uint8 *str_ptr,
uint16 str_len,
BOOLEAN is_ucs2,
RECT_T *valid_rect_ptr
)
{
DC_OSD_MODE osd_mode = {0};
uint8* p_cr_table = PNULL;
int i = 0;
int i_osd_char_num = 0; //osd character number
//get character number in this osd string
if (is_ucs2)
{
i_osd_char_num = str_len / 2;
}
else
{
i_osd_char_num = str_len;
}
//enable 6 osd slot to display the TEXT
osd_mode.b_enable = TRUE;
osd_mode.e_size_mode = DC_OSD_IMSIZE_16x16;
osd_mode.i_expand_factor = MMIDC_IMG_EXPAND_2;//MMIDC_IMG_EXPAND_1;//CR36667
osd_mode.st_zone.w_width = OSD_MENU_CHAR_CN_WIDTH * 2;
osd_mode.st_zone.w_height = DCHW_MAX_OSD_IMG_PIXEL / OSD_MENU_CHAR_CN_WIDTH * 2;
osd_mode.st_zone.w_start_x = valid_rect_ptr->w_start_x + valid_rect_ptr->w_width - osd_mode.st_zone.w_width * i_osd_char_num - OSD_MENU_CHAR_LEFT_MARGIN;//0 + i_zone * OSD_MENU_CHAR_CN_WIDTH / 2 * 3;
osd_mode.st_zone.w_start_y = valid_rect_ptr->w_start_y + valid_rect_ptr->w_height - osd_mode.st_zone.w_height - OSD_MENU_CHAR_LEFT_MARGIN;
for (i = 0; i < i_osd_char_num; i++)
{
DC_SetOsdZoneMode(i_zone + i, &osd_mode);
osd_mode.st_zone.w_start_x += osd_mode.st_zone.w_width;
}
SCI_ASSERT(i_zone + i <= MAX_OSD_STRING_NUM);
//get osd string image
p_cr_table = SCI_ALLOC(i_osd_char_num * DCHW_MAX_OSD_IMG_PIXEL);
SCI_MEMSET(p_cr_table, 0, i_osd_char_num * DCHW_MAX_OSD_IMG_PIXEL);
OSD_GetCharacterOSD(str_ptr, str_len, is_ucs2, p_cr_table);
//set osd sring image
for (i = 0; i < i_osd_char_num; i++)
{
DC_SetOsdImage(i_zone + i, p_cr_table + i * DCHW_MAX_OSD_IMG_PIXEL);
}
SCI_FREE(p_cr_table);
return i_osd_char_num;
}
/*****************************************************************************/
// Description : do capture
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
PUBLIC BOOLEAN DCAdap_Capture(MMIDC_SETTING_INFO_T *setting_ptr)
{
uint32 result = 0;
DCAdap_SetCaptureParam(setting_ptr);
DCAdap_SetCaptureOSD(setting_ptr);
if(DCAdap_GetZoomLevel()>0)
{
result = DC_DoSnapshotYUV();
}
else
{
result = DC_DoSnapshot();
}
if (0 == result)
{
SCI_TRACE_LOW("mmidc: DCAdap_Capture, capture succeed");
return TRUE;
}
else
{
SCI_TRACE_LOW("mmidc: DCAdap_Capture, capture failed");
return FALSE;
}
}
/*****************************************************************************/
// Description : read snapshot data and save it in one globle memory
// Global resource dependence : s_jpg_buffer_ptr, s_jpg_buffer_len
// Author: bruce.chi
// Note: the pointer returned should be freed outer
/*****************************************************************************/
PUBLIC uint8* DCAdap_MakeSnapshotData(uint32 *len_ptr)
{
DC_FRAME_T *dc_frame_ptr = PNULL;
uint8 *buf_ptr = PNULL;
uint8 *buf_inc_ptr = PNULL;
uint32 buf_len = 0;
SCI_TRACE_LOW("DCAdap_MakeSnapshotData level = %d",DCAdap_GetZoomLevel());
if (DCAdap_GetZoomLevel()>0)
{
buf_ptr = DC_GetYUVBuffer(len_ptr);
s_jpg_buffer_ptr = buf_ptr;
s_jpg_buffer_len = *len_ptr;
return buf_ptr;
}
else
{
if (0 == DC_GetSnapshotData(&dc_frame_ptr))
{
buf_len = dc_frame_ptr->dw_head_len + dc_frame_ptr->dw_total_section_len + dc_frame_ptr->dw_tail_len;
SCI_TRACE_LOW("mmidc_capture.c:DCAdap_MakeSnapshotData, data_len=%d, section[0].pbuf=0x%x, dw_len=%d, section[1].pbuf=%x, dw_len=%d",
buf_len, dc_frame_ptr->sections[0].pbuf, dc_frame_ptr->sections[0].dw_len, dc_frame_ptr->sections[1].pbuf, dc_frame_ptr->sections[1].dw_len);
DC_ASSERT_LOW(buf_len != 0);
if(buf_len <= MMIDC_MAX_PHOTO_SIZE)
{
buf_ptr = MMIDC_AllocJpegMemory(buf_len);
//merge the 4 part of one JPEG
buf_inc_ptr = buf_ptr;
SCI_MEMCPY(buf_inc_ptr, dc_frame_ptr->p_head, dc_frame_ptr->dw_head_len);
buf_inc_ptr += dc_frame_ptr->dw_head_len;
SCI_MEMCPY(buf_inc_ptr, dc_frame_ptr->sections[0].pbuf, dc_frame_ptr->sections[0].dw_len);
buf_inc_ptr += dc_frame_ptr->sections[0].dw_len;
SCI_MEMCPY(buf_inc_ptr, dc_frame_ptr->sections[1].pbuf, dc_frame_ptr->sections[1].dw_len);
buf_inc_ptr += dc_frame_ptr->sections[1].dw_len;
SCI_MEMCPY(buf_inc_ptr, dc_frame_ptr->p_tail, dc_frame_ptr->dw_tail_len);
buf_inc_ptr += dc_frame_ptr->dw_tail_len;
SCI_ASSERT(buf_inc_ptr == buf_ptr + buf_len);
//save
s_jpg_buffer_ptr = buf_ptr;
s_jpg_buffer_len = buf_len;
//return
*len_ptr = buf_len;
DC_FreeFrame(dc_frame_ptr);
return buf_ptr;
}
else
{
DC_ASSERT_LOW(0);
*len_ptr = 0;
return PNULL;
}
}
else
{
SCI_TRACE_LOW("mmidc_capter.c:DC_GetSnapshotData returned false");
*len_ptr = 0;
return PNULL;
}
}
}
/*****************************************************************************/
// Description : free snapshot data allocated by DCAdap_MakeSnapshotData
// Global resource dependence : s_jpg_buffer_ptr, s_jpg_buffer_len
// Author: bruce.chi
// Note: the pointer returned should be freed outer
/*****************************************************************************/
PUBLIC BOOLEAN DCAdap_FreeSnapshotData(void)
{
if(DCAdap_GetZoomLevel()==0)
{
FreeJpegMemory(s_jpg_buffer_ptr);
}
s_jpg_buffer_ptr = PNULL;
s_jpg_buffer_len = 0;
return TRUE;
}
/*****************************************************************************/
// Description : get snapshot data
// Global resource dependence : s_jpg_buffer_ptr, s_jpg_buffer_len
// Author: bruce.chi
// Note: the pointer returned should be freed outer
/*****************************************************************************/
PUBLIC uint8* MMIDC_GetSnapshotData(uint32 *len_ptr)
{
DC_ASSERT_LOW(s_jpg_buffer_ptr != PNULL && s_jpg_buffer_len != 0);
DC_ASSERT_LOW(len_ptr != PNULL);
if(DCAdap_GetZoomLevel()>0)
{
int dc_status = 0;
int s_protect_count = 0;
DCAdap_DCOpen();
#ifndef MMI_NOR_VERSION
DC_DoEncodeZoomData();
#endif
do
{
SCI_Sleep(200);
s_protect_count++;
if (s_protect_count >= 30)
{
break;
}
dc_status = DC_QueryStatus();
}while (((dc_status & DC_STATUS_ENCODE_DONE) == 0));
if (s_protect_count >= 30)
{
return FALSE;
}
DCAdap_SetZoomLevel(0);
s_jpg_buffer_ptr = DCAdap_MakeSnapshotData(len_ptr);
DCAdap_DCClose();
}
else
{
*len_ptr = s_jpg_buffer_len;
}
return s_jpg_buffer_ptr;
}
#endif //_MMIDC_CAPTURE_C_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -