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