?? pic_playback.c
字號:
{
UINT16 err;
UINT16 nFrameMax;
dscPbGifInfoContext_t *pGifInfo;
UINT16 tarXOffset, tarYoffset;
// 將邏輯坐標(biāo)值轉(zhuǎn)換為物理坐標(biāo)值
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;
// 發(fā)送獲取圖片信息的命令
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;
}
/************************************************************************/
/* 進(jìn)行顯示模式的設(shè)置
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
{
// 獲得產(chǎn)品的面板的尺寸
SPMP_GetPannelSize(&Pannel_X, &Pannel_Y);
}
DEBUG_OUTPUT(("Pannel_x = 0x%x Pannel_y = 0x%x\r\n", Pannel_X, Pannel_Y));
// 進(jìn)行參數(shù)的填寫動作
gfxModeAttr.alpha = 0x00;
gfxModeAttr.colorKeyRed = 0x00;
gfxModeAttr.colorKeyGreen = 0x00;
gfxModeAttr.colorKeyBlue = 0x00;
gfxModeAttr.displayScrnW = Pannel_X;
gfxModeAttr.displayScrnH = Pannel_Y;
// 使用輸入的參數(shù)作為 混色類型、 模式
gfxModeAttr.mixerType = mixType;
gfxModeAttr.mode = mode;
// 使用信號量進(jìn)行設(shè)置
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:
由于使用信號量,執(zhí)行 play back info get 時,將圖片的信息
放置到了全局變量中, 返回此全局變量的值。
note:
*/
/************************************************************************/
static void * getPlaybackInfoptr( void )
{
return gpCamDataRetBuf;
}
/************************************************************************/
/* 輸入將要顯示的 X Y值, 計(jì)算圖片原點(diǎn)在屏幕上的位置值
input:
PicWidth [in] 圖片的 X 值
PicHeight [in] 圖片的 Y 值
pXOffSet [out] 指針 存放原點(diǎn)的 X 值
pYOffSet [out] 指針 存放原點(diǎn)的 Y 值
output:
0 成功, 非0值失敗
func:
note:
-------------------
| |
| p1 ---- p2 |
| | | |
| ---- |
| |
-------------------
邏輯窗口 X = 220 Y = 176
物理窗口 X = 176 Y = 220
某點(diǎn) 邏輯窗口坐標(biāo) (log_x, log_y)
轉(zhuǎn)化 物理窗口坐標(biāo) (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;
// 判斷輸入的參數(shù)是否合法, 非法返回錯誤
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;
}
// 根據(jù)輸入的原點(diǎn)的邏輯坐標(biāo) 和 寬/高, 得到 P2 點(diǎn)的邏輯坐標(biāo)
// 然后將 P2 點(diǎn)的邏輯坐標(biāo) 轉(zhuǎn)換 為 物理坐標(biāo)值
else {
// 獲得 P2 點(diǎn)的邏輯坐標(biāo)值
log_x = DispRect.x + DispRect.width -1;
log_y = DispRect.y;
// 進(jìn)行物理坐標(biāo)與邏輯坐標(biāo)的換算
logxy_2_phyxy(log_x, log_y, &phy_x, &phy_y);
}
// 獲得設(shè)定的區(qū)域的值
get_disp_rect_size(&Pannel_X, &Pannel_Y);
// 進(jìn)行原點(diǎn)值的計(jì)算
*pXOffSet = (Pannel_X - PicWidth) >> 1;
*pYOffSet = (Pannel_Y - PicHeight) >> 1;
*pXOffSet += phy_x;
*pYOffSet += phy_y;
// 返回成功
return APP_DRV_OK;
}
/************************************************************************/
/* 獲得設(shè)定的顯示區(qū)域的大小
*/
/************************************************************************/
static UINT16 get_disp_rect_size(UINT16 *pWidth, UINT16 *pHeight)
{
// 判斷輸入的參數(shù)是否合法
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 值, 計(jì)算在屏幕上應(yīng)該顯示的 X Y 值
input:
srcWidth [in] 源圖片的 X 值
scrHeight [in] 源圖片的 Y 值
pTarWidth [out] 指針 存放結(jié)果的X值
pTarHeight [out] 指針 存放結(jié)果的Y值
output:
0 成功, 非0值失敗
func:
輸入源圖片的 X Y 值,設(shè)定的圖片尺寸
計(jì)算應(yīng)該顯示的結(jié)果的 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;
// 判斷輸入?yún)?shù)是否合法, 非法返回失敗
if (!srcWidth || !srcHeight
|| (NULL == ptarWidth)
|| (NULL == ptarHeight))
{
ERROR_OUTPUT(("cal target size!\r\n"));
return APP_DRV_ERR;
}
// 獲得設(shè)定的區(qū)域的寬高值
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))
{
// 進(jìn)行邊長的
*ptarWidth = srcWidth & LCM_MARK_VALUE;
*ptarHeight = srcHeight & LCM_MARK_VALUE;
DEBUG_OUTPUT(("pic smaller than screen!\r\n"));
return APP_DRV_OK;
}
// 根據(jù)圖片尺寸 和 屏幕尺寸進(jìn)行
w1=(float)Pannel_X/(float)srcWidth;
h1=(float)Pannel_Y/(float)srcHeight;
// 使用較小的比例值
if(w1>=h1) {
i = h1;
}
else {
i = w1;
}
// 進(jìn)行結(jié)果的計(jì)算
tmp_x = (float)srcWidth*i;
tmp_y = (float)srcHeight*i;
// 進(jìn)行邊長的整除處理
*ptarWidth = tmp_x & LCM_MARK_VALUE;
*ptarHeight = tmp_y & LCM_MARK_VALUE;
DEBUG_OUTPUT(("<< caculate target\r\n"));
// 返回成功
return APP_DRV_OK;
}
/************************************************************************/
/* 將邏輯窗口的坐標(biāo)值 轉(zhuǎn)換為 物理坐標(biāo)值
input:
LogX [in] 邏輯窗口的坐標(biāo)值 X
LogY [in] 邏輯窗口的坐標(biāo)值 X
pPhyX [out] 指針 存放得到的物理坐標(biāo)值 X
pPhyY [out] 指針 存放得到的物理坐標(biāo)值 Y
output:
0 成功, 非0值失敗
func:
將邏輯窗口的坐標(biāo)值 轉(zhuǎn)換為 物理坐標(biāo)值
-------------------
| |
| p1 ---- p2 |
| | | |
| ---- |
| |
-------------------
邏輯窗口長度 X = 220 Y = 176
物理窗口長度 X = 176 Y = 220
某點(diǎn) 邏輯窗口坐標(biāo) (log_x, log_y)
轉(zhuǎn)化 物理窗口坐標(biāo) (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));
// 判斷輸入的邏輯坐標(biāo)值是否合法
if ((LogX >= Pannel_Y) || (LogY >= Pannel_X) )
{
ERROR_OUTPUT(("hi boy log2phy xy err!\r\n"));
ERROR_STOP;
return APP_DRV_ERR;
}
// 進(jìn)行坐標(biāo)值的轉(zhuǎn)換
*pPhyX = LogY;
*pPhyY = Pannel_Y - LogX -1;
// 返回成功
return APP_DRV_OK;
}
/************************************************************************/
/* 輸入文件名字符串, 判斷該文件是否為 JPG 文件
input:
pfilename [in] 文件名字符串指針
pExt [in] 文件后綴名指針
output:
0 后綴名符合, 非0值 后綴名不符合
func:
對輸入的文件名和后綴名進(jìn)行判斷
*/
/************************************************************************/
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);
}
/*
* 設(shè)定需要進(jìn)行字模的重新裝載
*/
static void set_font_reload_flag( UINT16 flag )
{
gReloadFontFlag = flag;
return;
}
/*
* 獲取當(dāng)前字模裝載標(biāo)志
*/
static UINT16 get_font_reload_flag( void )
{
return gReloadFontFlag;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -