?? 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的支持接口函數(shù)
*
* 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 *
**************************************************************************/
// 設定是否需要進行系統(tǒng)字模數(shù)據(jù)的重新裝載
static UINT16 gReloadFontFlag = 0x00;
// 描述顯示區(qū)域的結構體
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);
// 獲得設定的顯示區(qū)域的大小
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 );
/************************************************************************/
/* 設定邏輯窗口上顯示區(qū)域的 原點和邊長
input:
x [in] 區(qū)域原點(左上角) 在邏輯窗口上的 X 坐標值
y [in] 區(qū)域原點(左上角) 在邏輯窗口上的 Y 坐標值
width [in] 區(qū)域在邏輯窗口的寬
height [in] 區(qū)域在邏輯窗口的高
output:
0 成功, 非0值失敗
func:
設定需要顯示的區(qū)域的原點值 和邊長值
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;
}
// 將輸入的參數(shù)記錄到全局變量中
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
}
}
// 將輸入的參數(shù)記錄到全局變量中
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:
使用此函數(shù)之前,一定要調用 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;
// 判斷輸入的參數(shù)是否正確
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
// 將輸入的文件名設定到系統(tǒng)中
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;
// 以下使用固定的參數(shù)
//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
// 判斷是否需要將字模數(shù)據(jù),進行釋放
{
UINT32 i;
i = tarWidth;
i *= tarHeight;
if ( (i>JPG_MEM_MAX) && (!get_font_reload_flag()) )
{
#ifdef QLZ_DEBUG_00
sio_printf("\r\n --- 將字模數(shù)據(jù)進行釋放!!!\r\n");
#endif
MWUnLoadExtraFont(); // 將字模釋放,增加系統(tǒng)內存
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;
// 目標圖片的參數(shù),使用計算后的結果
pbAttr.tarXOffset = tarXOffset;
pbAttr.tarYOffset = tarYoffset;
pbAttr.tarWidth = 0;
pbAttr.tarHeight = 0;
// 以下使用固定的參數(shù)
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 + -