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

📄 pic_playback.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	UINT16 err;
	UINT16 nFrameMax;
	dscPbGifInfoContext_t *pGifInfo;

	UINT16 tarXOffset, tarYoffset;
	
	// 将逻辑坐标值转换为物理坐标值	
	logxy_2_phyxy(LogXOffset, LogYOffset, &tarXOffset, &tarYoffset);


	// step 2: set file name to system   ( MCATCH_CMD_CAM_GROUP)
	SPMP_sysFileNamePtrSet(MCATCH_CMD_CAM_GROUP, pFileName);
	
	// step 3: get GIF info 
	nFrameMax = MAX_GIF_FRAME_NUMBER;	
	err = SPMP_SendSignal(MCATCH_CMD_GIF_IMAGE_INFO_GET, (UINT8 *)&nFrameMax, (UINT16)sizeof(nFrameMax));
	if( err ){
		ERROR_REPORT;
		return err;
	}	


	// step 4: get GIF info
	pGifInfo = (dscPbGifInfoContext_t *) getPlaybackInfoptr();	

	// step 5: play start
	camDscPbGifParam_t	PbGifPara;

	PbGifPara.srcXOffset	= 0x00;
	PbGifPara.srcYOffset	= 0x00;
	PbGifPara.srcWidth		= pGifInfo->width;
	PbGifPara.srcHeight		= pGifInfo->height;

	PbGifPara.tarWidth		= pGifInfo->width;
	PbGifPara.tarHeight		= pGifInfo->height;
	PbGifPara.isShow		= 1;
	PbGifPara.optStorage	= MCATCH_DATA_DIRECTION_CARD;
	PbGifPara.nRepeat		= 1;
	PbGifPara.nInterval		= 2000;

	PbGifPara.tarXOffset	= tarXOffset;
	PbGifPara.tarYOffset	= tarYoffset;

	err = SPMP_SendSignal(MCATCH_CMD_GIF_PLAYBACK_START, 
						(UINT8 *)&PbGifPara, 
						(UINT16) sizeof(PbGifPara));
	if( err ){
		ERROR_REPORT;
		return err;
	}	

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*	获得图片的尺寸值
  input:
			pWidth	[out]	指针 存放图片的 X 值
			pHeight	[out]	指针 存放图片的 Y 值 	
  output;
			0 成功, 非0值失败
  func:		
  note:
                                                                        */
/************************************************************************/
UINT16 SPMP_GetPicXY(UINT16 *pWidth, UINT16 *pHeight)
{
	UINT16 err;

	// 返回信息的地址指针
	dscPbInfoContext_t	*pInfo;

	// 发送获取图片信息的命令
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_IMAGE_INFO_GET, (UINT8 *)NULL, (UINT16)NULL);			
	if( err ){
		ERROR_REPORT;
		return err;
	}	

	// 获得信息的指针
	pInfo = (dscPbInfoContext_t	*) getPlaybackInfoptr();	
	// 获得图片的宽、高 值
	*pWidth		= pInfo->width;
	*pHeight	= pInfo->height;	
	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*  进行显示模式的设置
  input:
			mixType	[in]	混色的类型值
			mode	[in]	显示模式	
  output:
			0 成功, 非0值失败
  func:
  note:
                                                                        */
/************************************************************************/
UINT16 SPMP_GFXModeSet( UINT16 mixType, UINT16 mode )
{
	UINT16	err;

	gfxParam_t	gfxModeAttr;
	UINT16	Pannel_X, Pannel_Y;


	if(dispTargetGet()!=MCATCH_PANEL_MAIN)
	{
		Pannel_X = SPMP_TV_DISP_W;
		Pannel_Y= SPMP_TV_DISP_H;
	}
	else
	{
		// 获得产品的面板的尺寸
		SPMP_GetPannelSize(&Pannel_X, &Pannel_Y);
	}
	DEBUG_OUTPUT(("Pannel_x = 0x%x Pannel_y = 0x%x\r\n", Pannel_X, Pannel_Y));


	// 进行参数的填写动作
	gfxModeAttr.alpha = 0x00;
	gfxModeAttr.colorKeyRed = 0x00;
	gfxModeAttr.colorKeyGreen = 0x00;
	gfxModeAttr.colorKeyBlue = 0x00;
	gfxModeAttr.displayScrnW = Pannel_X;
	gfxModeAttr.displayScrnH = Pannel_Y;
	// 使用输入的参数作为 混色类型、 模式
	gfxModeAttr.mixerType		= mixType;	
	gfxModeAttr.mode			= mode;  

	// 使用信号量进行设置 
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_GFX_MODE_SET, (UINT8 *)&(gfxModeAttr), (UINT16)sizeof(gfxModeAttr));		

	return err;
}


/************************************************************************/
/*	停止图片的播放
  input:
			void 
  output:
			0 成功
  func:		
			停止图片的播放
                                                                        */
/************************************************************************/
UINT16 SPMP_PicPlayBackEnd( void )
{
	UINT16 err;
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_PLAYBACK_END, 
						(UINT8 *)NULL, 
						(UINT16)NULL);	
	SPMPBGJPGBEENPLAYING = 0;

	return err;
}

/************************************************************************/
/* 返回图片信息的地址指
  input:
			void
  output:
			地址指针
  func:			
			由于使用信号量,执行 play back info get 时,将图片的信息
			放置到了全局变量中, 返回此全局变量的值。
  note:
                                                                        */
/************************************************************************/
static void * getPlaybackInfoptr( void )
{
	return gpCamDataRetBuf;	
}

/************************************************************************/
/*	输入将要显示的 X Y值, 计算图片原点在屏幕上的位置值

  input:
			PicWidth	[in]	图片的 X 值	
			PicHeight	[in]	图片的 Y 值
		
			pXOffSet	[out]	指针 存放原点的 X 值
			pYOffSet	[out]	指针 存放原点的 Y 值
  output:
			0 成功, 非0值失败
  func:
  note:
			 -------------------
			|					|
			| p1  ---- p2 		|
			|	 |	  |			|
			|	  ----			|
			|					|
			 -------------------	

			逻辑窗口  X = 220  Y = 176
			物理窗口  X = 176  Y = 220

			某点 逻辑窗口坐标 (log_x, log_y)
			转化 物理窗口坐标 (phy_x, phy_y)

			phy_x	=	log_y
			phy_y	=	220 - log_x

                                                                        */
/************************************************************************/
static UINT16 caculate_offset (	UINT16 PicWidth, UINT16 PicHeight, 
								UINT16 *pXOffSet, UINT16 *pYOffSet)
{
	UINT16 Pannel_X, Pannel_Y;

	UINT16 log_x, log_y;
	UINT16 phy_x, phy_y;

	// 判断输入的参数是否合法, 非法返回错误
	if (!PicWidth || !PicHeight
		|| (NULL == pXOffSet)
		|| (NULL == pYOffSet)) 
	{
		ERROR_OUTPUT(("cal offset err!\r\n"));
		return APP_DRV_ERR;		
	}

	if( (MCATCH_TV_OUT_NTSC == dispTargetGet()) 
		|| (MCATCH_TV_OUT_PAL== dispTargetGet()) )
	{
		phy_x = 0x00;
		phy_y = 0x00;
	}		
	// 根据输入的原点的逻辑坐标 和 宽/高, 得到 P2 点的逻辑坐标
	// 然后将 P2 点的逻辑坐标 转换 为 物理坐标值
	else {
		// 获得 P2 点的逻辑坐标值
		log_x = DispRect.x + DispRect.width -1;
		log_y = DispRect.y;
		// 进行物理坐标与逻辑坐标的换算	
		logxy_2_phyxy(log_x, log_y, &phy_x, &phy_y);
	}

	// 获得设定的区域的值
	get_disp_rect_size(&Pannel_X, &Pannel_Y);

	// 进行原点值的计算
	*pXOffSet = (Pannel_X - PicWidth) >> 1;
	*pYOffSet = (Pannel_Y - PicHeight) >> 1;

	*pXOffSet += phy_x;
	*pYOffSet += phy_y;

	// 返回成功
	return APP_DRV_OK;		
}

/************************************************************************/
/*	获得设定的显示区域的大小 
                                                                        */
/************************************************************************/
static UINT16 get_disp_rect_size(UINT16 *pWidth, UINT16 *pHeight)
{
	// 判断输入的参数是否合法
	if ((NULL == pWidth) || (NULL == pHeight)) 
	{
		return APP_DRV_ERR;
	}

	if( (MCATCH_TV_OUT_NTSC == dispTargetGet()) 
		|| (MCATCH_TV_OUT_PAL== dispTargetGet()) )
	{
		// 获得输入的边长值
		*pWidth		= DispRect.width;				
		*pHeight	= DispRect.height;
	}		
	else
	{
		// 获得输入的边长值
		*pHeight	= DispRect.width;
		*pWidth		= DispRect.height;		
	}	
	
	return APP_DRV_OK;
}

/************************************************************************/
/*	输入图片的 X Y 值, 计算在屏幕上应该显示的 X Y 值
  input:
			srcWidth	[in]	源图片的 X 值
			scrHeight	[in]	源图片的 Y 值

			pTarWidth	[out]	指针 存放结果的X值
			pTarHeight	[out]	指针 存放结果的Y值
  output:
			0 成功, 非0值失败

  func:		
			输入源图片的 X Y 值,设定的图片尺寸 
			计算应该显示的结果的 X Y 值
                                                                        */
/************************************************************************/
static UINT16 caculate_target_size (UINT16 srcWidth, UINT16 srcHeight,
									UINT16 *ptarWidth, UINT16 *ptarHeight)
{
    float w1,h1,i;
	UINT16 Pannel_X, Pannel_Y;
	UINT16 tmp_x, tmp_y;

	// 判断输入参数是否合法, 非法返回失败
	if (!srcWidth || !srcHeight 
		|| (NULL == ptarWidth) 
		|| (NULL == ptarHeight)) 
	{
		ERROR_OUTPUT(("cal target size!\r\n"));
		return APP_DRV_ERR;
	}

	// 获得设定的区域的宽高值
	get_disp_rect_size(&Pannel_X, &Pannel_Y);

#ifdef	QLZ_DEBUG_00
	sio_printf("\r\n 1111111 Pannel X = %d Y = %d \r\n", Pannel_X, Pannel_Y);
	sio_printf("\r\n 2222222 SRCX = %d SRCY = %d \r\n", srcWidth, srcHeight);	
#endif	

	// 如果输入的图片正好与屏幕相等,直接使用屏幕的值
	if ((Pannel_X == srcWidth) && (Pannel_Y == srcHeight) ) 
	{
		*ptarWidth	= Pannel_X;
		*ptarHeight	= Pannel_Y;
		DEBUG_OUTPUT(("pic just ok!\r\n"));
		return APP_DRV_OK;		// 直接返回成功
	}

	// 如果输入的图片尺寸小于屏幕的尺寸,直接使用图片的尺寸
	if ((srcWidth <= Pannel_X) && (srcHeight <= Pannel_Y)) 
	{
		// 进行边长的
		*ptarWidth	= srcWidth & LCM_MARK_VALUE;
		*ptarHeight	= srcHeight & LCM_MARK_VALUE;

		DEBUG_OUTPUT(("pic smaller than screen!\r\n"));

		return APP_DRV_OK;
	}

	// 根据图片尺寸 和 屏幕尺寸进行
	w1=(float)Pannel_X/(float)srcWidth;
    h1=(float)Pannel_Y/(float)srcHeight;

	//  使用较小的比例值 
	if(w1>=h1) {
		i = h1;
    }
	else {
		i = w1;
	}

	// 进行结果的计算
	tmp_x	= (float)srcWidth*i;
	tmp_y	= (float)srcHeight*i;

	// 进行边长的整除处理
	*ptarWidth	= tmp_x & LCM_MARK_VALUE;
	*ptarHeight	= tmp_y & LCM_MARK_VALUE;

	DEBUG_OUTPUT(("<< caculate target\r\n"));

	// 返回成功
	return APP_DRV_OK;		
} 

/************************************************************************/
/* 将逻辑窗口的坐标值 转换为 物理坐标值
  input:
			LogX	[in]	逻辑窗口的坐标值 X 
			LogY	[in]	逻辑窗口的坐标值 X 

			pPhyX	[out]	指针 存放得到的物理坐标值 X
			pPhyY	[out]	指针 存放得到的物理坐标值 Y
  output:
			0 成功, 非0值失败
  func:
			将逻辑窗口的坐标值 转换为 物理坐标值

  -------------------
  |					|
  | p1  ---- p2 	|
  |	 |	  |			|
  |	  ----			|
  |					|
  -------------------	

	逻辑窗口长度  X = 220  Y = 176
	物理窗口长度  X = 176  Y = 220
	
	某点 逻辑窗口坐标 (log_x, log_y)
	转化 物理窗口坐标 (phy_x, phy_y)
	  
	phy_x	=	log_y
	phy_y	=	220 - log_x
                                                                        */
/************************************************************************/
static UINT16 logxy_2_phyxy(UINT16 LogX, UINT16 LogY, UINT16 *pPhyX, UINT16 *pPhyY)
{
	UINT16 Pannel_X, Pannel_Y;

	// 获得Pannel 的尺寸值
	SPMP_GetPannelSize(&Pannel_X, &Pannel_Y);

	DEBUG_OUTPUT(("LX LY PX PY %d %d %d %d\r\n", LogX, LogY, Pannel_X, Pannel_Y));

	// 判断输入的逻辑坐标值是否合法	
	if ((LogX >= Pannel_Y) || (LogY >= Pannel_X) ) 
	{
		ERROR_OUTPUT(("hi boy log2phy xy err!\r\n"));
		ERROR_STOP;
		return APP_DRV_ERR;
	}
	
	// 进行坐标值的转换	
	*pPhyX = LogY;
	*pPhyY = Pannel_Y - LogX -1;
	
	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/* 输入文件名字符串, 判断该文件是否为 JPG 文件

  input:
			pfilename	[in]	文件名字符串指针
			pExt		[in]	文件后缀名指针
  output:
			0 后缀名符合, 非0值 后缀名不符合
  func:
			对输入的文件名和后缀名进行判断
                                                                        */
/************************************************************************/
static UINT16 judge_file_ext_name(UINT8 * pFileName, UINT8 * pExtName)
{
	UINT16 i,j;
	UINT8 *ptemp;
	UINT8 buffer[0x10];

	// 获得长度制
	i = strlen( pFileName );
	j = strlen( pExtName );

	// 文件名小于等于后缀名的长度, 直接返回不是
	if (i <= j) {
		return (-1);
	}

	// 获得比较的起始指针
	ptemp = pFileName + i - j;
	memset(buffer, 0x00, sizeof(buffer));

	// 将文件名的后缀变成大写的格式
	for(i=0x00; i<j; i++){
		buffer[i] = toupper(ptemp[i]);
	}

	return (UINT16)	strcmp(buffer, pExtName);
}


/*
 *	设定需要进行字模的重新装载
 */
static void set_font_reload_flag( UINT16 flag )
{
	gReloadFontFlag = flag;
	return;
}

/*
 *	获取当前字模装载标志
 */
static UINT16 get_font_reload_flag( void )
{
	return gReloadFontFlag;
}

⌨️ 快捷键说明

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