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

📄 mmidc_capture.c

📁 手机Camera部分上层软件代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -