📄 pic_playback.c
字号:
/*-------------------------------------------------*
* $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 + -