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

📄 pic_playback.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------*
* $RCSfile: pic_playback.c,v $
* $Date: 2007/01/24 13:32:21 $
* $Author: lanzhu $
* $Log: pic_playback.c,v $
* Revision 1.5  2007/01/24 13:32:21  lanzhu
* 进行图片的TV-OUT 输出时, 如果图片超大,进行字模的内存释放
*
* Revision 1.4  2007/01/21 20:04:30  lanzhu
* 去除打印
*
* Revision 1.3  2007/01/21 09:47:02  lanzhu
* 使图片在TV 上面等比例显示
*
* Revision 1.2  2007/01/18 05:40:19  cuining
* 增加对TV_OUT的支持接口函数
*
* Revision 1.1.1.1  2007/01/17 12:28:43  lanzhu
* 齐兰柱 准备一个新的代码分支
*
* Revision 1.4  2007/01/03 06:19:21  cuining
* 图片播放完毕后,调用SPMP_PicPlayBackEnd();
*
* Revision 1.3  2006/12/18 02:14:27  taiyun
* Modify include filename
*
* Revision 1.2  2006/12/12 01:28:20  lanzhu
* 修改 #include "appCamDsc.h" 所指向的文件
*
* Revision 1.1.1.1  2006/12/05 03:01:16  lanzhu
* no message
*
* Revision 1.1.1.1  2006/12/01 09:49:35  lanzhu
* no message
*
*
*--------------------------------------------------*/

#define DEBUG_TVOUT

#include "SPMP_define.h"

#include <ctype.h>
#include <string.h>

#include "spca_general.h"
#include "sig_api.h"
#include "os_api.h"
#include "hw_disp.h"
#include "gfx_general.h"

#include "dsc_api.h"
#include "system_api.h"
#include "display_api.h"
#include "appGfx.h"
#include "mcatch_cmd.h"
#include "../../include/app/appCamDsc.h"
#include "SysUtility.h"

#include "appdriver.h"

/**********************************************
*
*   图片文件播放失败标志  liuying 2006/11/09
*
**********************************************/
#define PIC_PLAY_SUCCESS 0
#define PIC_PLAY_FAIL    1
/**************************************************************************
 *                   G E N E R A L    C O N S T A N T S                   *
 **************************************************************************/
#define LCM_MARK_VALUE	(0xfff8)

#define ENABLE_FONT_RELOAD		(0x01)
#define DISABLE_FONT_RELOAD		(0x00) 

#define JPG_MEM_MAX			(640l*480)

 /**************************************************************************
 *                             M A C R O S                                *
 **************************************************************************/

 /**************************************************************************
 *                         D A T A   T Y P E S                            *
 **************************************************************************/

/**************************************************************************
 *                        G L O B A L   D A T A                           *
 **************************************************************************/

// 设定是否需要进行系统字模数据的重新装载
static UINT16 gReloadFontFlag = 0x00;

// 描述显示区域的结构体
static struct PBRect_s DispRect;  
static UINT32 SPMPBGJPGBEENPLAYING = 0;
extern UINT16 pic_play_flag;//liuying added 2006/11/09
 /**************************************************************************
 *                 E X T E R N A L   R E F E R E N C E S                  *
 **************************************************************************/
extern UINT8* gpCamDataRetBuf;

/**************************************************************************
 *               F U N C T I O N   D E C L A R A T I O N S                *
 **************************************************************************/

// 获取得到的图片信息的指针
static void * getPlaybackInfoptr( void );

// 计算目标图片的尺寸
static UINT16 caculate_target_size (UINT16 srcWidth, UINT16 srcHeight,
									UINT16 *ptarWidth, UINT16 *ptarHeight);	
// 计算图片原点的坐标值
static UINT16 caculate_offset (	UINT16 PicWidth, UINT16 PicHeight, 
							   UINT16 *pXOffSet, UINT16 *pYOffSet);
// 获得设定的显示区域的大小
static UINT16 get_disp_rect_size(UINT16 *pWidth, UINT16 *pHeight);

// 将逻辑坐标值,转换为物理坐标值
static UINT16 logxy_2_phyxy(UINT16 LogX, UINT16 LogY, 
							UINT16 *pPhyX, UINT16 *pPhyY);

// 判断文件名的后缀是否与输入的扩展名一致	
static UINT16 judge_file_ext_name(UINT8 * pFileName, UINT8 * pExtName);

// BMP WBMP PNG 的播放
static UINT16 SPMP_PNGPlayBack(	UINT16 LogXOffset, 
								   UINT16 LogYOffset, 
								   UINT8 *pFileName );

// 设定字模装载标志
static void set_font_reload_flag( UINT16 flag );
// 获取字模装载标志
static UINT16 get_font_reload_flag( void );

/************************************************************************/
/*			设定逻辑窗口上显示区域的 原点和边长
  input:
			x		[in] 区域原点(左上角) 在逻辑窗口上的 X 坐标值	
			y		[in] 区域原点(左上角) 在逻辑窗口上的 Y 坐标值	
			width	[in] 区域在逻辑窗口的宽 
			height	[in] 区域在逻辑窗口的高 
  output:
			0 成功, 非0值失败
  func:
			设定需要显示的区域的原点值 和边长值
  status:	
                                                                        */
/************************************************************************/
UINT16 SPMP_JPGSetRect(UINT16 x, UINT16 y, 
						   UINT16 width, UINT16 height)
{

/*
	UINT16 Pannel_X,Pannel_Y;

	// 获得本产品的屏幕尺寸( 物理尺寸值 )
	SPMP_GetPannelSize(&Pannel_X, &Pannel_Y);

	sio_printf("\r\n  PANNEL_X = %d Y = %d\r\n", Pannel_X, Pannel_Y);	

	// !!! 注意此处的判断 
	if ( ((x+width)>Pannel_Y) 
		|| ((y+height)>Pannel_X) 
		|| !width || !height ) 
	{
		ERROR_OUTPUT(("hi man SetRect err!\r\n"));
		ERROR_STOP;
		return APP_DRV_ERR;
	}

	// 将输入的参数记录到全局变量中
	DispRect.x		= x;
	DispRect.y		= y;
	DispRect.width	= width;
	DispRect.height	= height;
 */

	// 返回成功
	return APP_DRV_OK;
}

/*
 *	
 */
UINT16 SPMP_JPGSetRectEx(UINT16 x, UINT16 y, 
						   UINT16 width, UINT16 height)
{

	UINT16 Pannel_X,Pannel_Y;

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n >>>>>> JPGSetRectEx \r\n");
#endif

	// 获得本产品的屏幕尺寸( 物理尺寸值 )
	SPMP_GetPannelSize(&Pannel_X, &Pannel_Y);

#ifdef QLZ_DEBUG_00
	sio_printf(" Pannel 宽 = %d  高 = %d\r\n", Pannel_X, Pannel_Y);	
#endif

	// 如果是设置回LCM界面, 并且需要进行字模的装载 
	if(	(SPMP_PANNEL_Y == width) && ( SPMP_PANNEL_X == height) )
	{
		if ( get_font_reload_flag() ) 
		{
			set_font_reload_flag( DISABLE_FONT_RELOAD );
			MWLoadExtraFont( );			
#ifdef QLZ_DEBUG_00
	sio_printf(" -------- reload FONT OK!!! \r\n");	
#endif			
		}
	}

	// 将输入的参数记录到全局变量中
	DispRect.x		= x;
	DispRect.y		= y;
	DispRect.width	= width;
	DispRect.height	= height;

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n <<<<<<< JPGSetRectEx \r\n");	
#endif

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*		将一张JPG 图片全屏播放到屏幕上
  input:
			pFileName	[in]	JPG 文件名字符串的指针
  output:
			0 成功, 非0值失败  
  func:	
			自动进行目标的 X Y 边长的调整, 和图片原点坐标值的计算
  note:	
			使用此函数之前,一定要调用 GFXModeSet 
                                                                        */
/************************************************************************/
UINT16 SPMP_JPGPlayBack(UINT8 * pFileName)
{
	UINT16 err;
	UINT16 tarWidth, tarHeight;	
	UINT16 tmp_Width, tmp_Height;	

	UINT16 x_offset, y_offset;
	dscPbInfoContext_t	*pInfo;
	camDscPbParam_t pbAttr;
	
	// 判断输入的参数是否正确	
	if ((NULL == pFileName) || !strlen(pFileName) ) {
		ERROR_OUTPUT(("jpg pk err1\r\n"));
		return APP_DRV_ERR;
	}

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n >>> JPG playback fname = %s\r\n", pFileName);
#endif

	// 将输入的文件名设定到系统中
	SPMP_sysFileNamePtrSet(MCATCH_CMD_CAM_GROUP, pFileName);

	// 获得JPG 图片的信息	
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_IMAGE_INFO_GET, (UINT8 *)NULL, (UINT16)NULL);		
	// 判断是否出错
	if ( err ) {
		pic_play_flag = PIC_PLAY_FAIL;//liuying added 2006/11/09
		return pic_play_flag;
	}

	// 返回信息的地址指针
	pInfo = (dscPbInfoContext_t	*) getPlaybackInfoptr();

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n 图片信息 width = %d height = %d\r\n", pInfo->width, pInfo->height);	
#endif

	if( (MCATCH_TV_OUT_NTSC == dispTargetGet()) 
		|| (MCATCH_TV_OUT_PAL== dispTargetGet()) )
	{
		tmp_Width = pInfo->width;
		tmp_Height = pInfo->height;		
		pbAttr.rotate			= MCATCH_ROTATE_NONE;		
	}		
	else{
		// LCM 的状况, 需要进行选着
		tmp_Width = pInfo->height;
		tmp_Height = pInfo->width;
		#if ROTATE_DEASIL	/*顺时针旋转90度*/
		pbAttr.rotate			= MCATCH_ROTATE_90;
		#else			/*逆时针旋转90度*/
		pbAttr.rotate			= MCATCH_ROTATE_270;
		#endif	
	}	

	// 计算目标的宽高值
	caculate_target_size(tmp_Width, tmp_Height, &tarWidth, &tarHeight);		
	// 计算 图片原点的位置值	
	caculate_offset(tarWidth, tarHeight, &x_offset, &y_offset);

#ifdef QLZ_DEBUG_00
	sio_printf(" 计算后的目标 W = %d H = %d\r\n", tarWidth, tarHeight);	
	sio_printf(" 计算后的偏移 X = %d Y = %d\r\n", x_offset, y_offset);	
#endif

	// 源图片的信息使用获得的结果	
	pbAttr.srcXOffset	= 0x00;
	pbAttr.srcYOffset	= 0x00;
	pbAttr.srcWidth		= pInfo->width;
	pbAttr.srcHeight	= pInfo->height;

	pbAttr.tarXOffset		= x_offset;
	pbAttr.tarYOffset		= y_offset;
	pbAttr.tarWidth			= tarWidth;
	pbAttr.tarHeight		= tarHeight;

	// 以下使用固定的参数
	//pbAttr.rotate			 = MCATCH_ROTATE_270;
	pbAttr.effect			 = 0;
	pbAttr.thumbSelected	 = 0;
	pbAttr.zoomStep          = 10;
	pbAttr.panStep           = 10;
	pbAttr.isShow            = 1;
	pbAttr.optStorage        = MCATCH_DATA_DIRECTION_CARD;     	


#ifdef QLZ_DEBUG_00
	sio_printf("\r\n --- 进行图片的显示\r\n");	
#endif

	
	// 判断是否需要将字模数据,进行释放
	{
		UINT32 i;
		i = tarWidth;
		i *= tarHeight;

		if ( (i>JPG_MEM_MAX) && (!get_font_reload_flag()) ) 
		{
			
#ifdef QLZ_DEBUG_00
	sio_printf("\r\n --- 将字模数据进行释放!!!\r\n");	
#endif			
			MWUnLoadExtraFont();	// 将字模释放,增加系统内存					
			set_font_reload_flag( ENABLE_FONT_RELOAD );	// 将字模重新装载标志置1			
		}
	}

	// 进行图片的播放 
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_PLAYBACK_START, (UINT8 *)&pbAttr, (UINT16)sizeof(pbAttr));
	if (err) 
	{
#ifdef QLZ_DEBUG_00
		sio_printf("\r\n --- 图片显示出错 err = 0x%x\r\n", err);	
#endif
		pic_play_flag = PIC_PLAY_FAIL;//liuying added 2006/11/09
		return pic_play_flag;
	}

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n --- 图片显示成功!\r\n");	
#endif
	
	SPMPBGJPGBEENPLAYING = 1;
	pic_play_flag = PIC_PLAY_SUCCESS;//liuying added 2006/11/27
	SPMP_PicPlayBackEnd();

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/* BMP WBMP PNG GIF 的播放

  input:
		  LogXOffset	[in]	图片原点的 逻辑X 坐标值
		  LogYOffset	[in]	图片原点的 逻辑Y 坐标值	
		  pFileName	[in]	图片文件名字符串
  output:
		  0 成功, 非0值失败 
  func:
		  
                                                                        */
/************************************************************************/
UINT16 SPMP_PicPlayBack(UINT16 LogXOffset, UINT16 LogYOffset,UINT8 *pFileName )
{
	// 判断是否为 GIF 文件
	if ( !judge_file_ext_name(pFileName, "GIF") ) 
	{
		return	SPMP_GIFPlayBack(LogXOffset, LogYOffset, pFileName);
	}

	return	SPMP_PNGPlayBack(LogXOffset, LogYOffset, pFileName);
}


/************************************************************************/
/*	输入一个文件名字符串,将此图片播放到屏幕上
  input:
			LogXOffset	[in]	图片原点的 逻辑X 坐标值
			LogYOffset	[in]	图片原点的 逻辑Y 坐标值	
			pFileName	[in]	图片文件名字符串
  output:
			0 成功, 非0值失败  
  func:
  note:
                                                                        */
/************************************************************************/
static UINT16 SPMP_PNGPlayBack(	UINT16 LogXOffset, 
									UINT16 LogYOffset, 
									UINT8 *pFileName )
{
	UINT16 err;
	dscPbInfoContext_t	*pInfo;	
	UINT16 tarXOffset, tarYoffset;
	camDscPbParam_t pbAttr;

	// 将逻辑坐标值转换为物理坐标值	
	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);
	
	// 获得图片的信息	
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_IMAGE_INFO_GET, (UINT8 *)NULL, (UINT16)NULL);
	if ( err) {
		ERROR_REPORT;
		return err;
	}


	// 返回信息的地址指针
	pInfo = (dscPbInfoContext_t	*) getPlaybackInfoptr();	

	DEBUG_OUTPUT(("width %d hight %d \r\n", pInfo->width, pInfo->height));

	// 源图片的信息使用获得的结果	
	pbAttr.srcXOffset	= 0x00;
	pbAttr.srcYOffset	= 0x00;
	pbAttr.srcWidth		= pInfo->width;
	pbAttr.srcHeight	= pInfo->height;
	
	// 目标图片的参数,使用计算后的结果
	pbAttr.tarXOffset		= tarXOffset;
	pbAttr.tarYOffset		= tarYoffset;
	pbAttr.tarWidth			= 0;
	pbAttr.tarHeight		= 0;	

	// 以下使用固定的参数
	pbAttr.rotate			 = 0;
	pbAttr.effect			 = 0;
	pbAttr.thumbSelected	 = 0;
	pbAttr.zoomStep          = 0;
	pbAttr.panStep           = 0;
	pbAttr.isShow            = 1;
	pbAttr.optStorage        = MCATCH_DATA_DIRECTION_CARD;     	
	
	// 进行图片的播放 
	err = SPMP_SendSignal((UINT16)MCATCH_CMD_PLAYBACK_START, 
						(UINT8 *)&pbAttr,
						(UINT16)sizeof(pbAttr));

	if ( err) {
		ERROR_REPORT;
		return err;
	}

	// 返回成功
	return err;
}

/************************************************************************/
/*	输入一个文件名字符串,将此图片播放到屏幕上
  input:
			LogXOffset	[in]	图片原点的 逻辑X 坐标值
			LogYOffset	[in]	图片原点的 逻辑Y 坐标值	
			pFileName	[in]	图片文件名字符串
  output:
			0 成功, 非0值失败  
  func:
  note:
																		*/
/************************************************************************/
UINT16 SPMP_GIFPlayBack(UINT16 LogXOffset, 
							UINT16 LogYOffset, 
							UINT8 *pFileName )

⌨️ 快捷键说明

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