📄 flmpeg.c
字号:
/**********************************************************************/
/*************** MTK CONFIDENTIAL & COPYRIGHTED ****************/
/*************** ****************/
/*************** $Modtime:: 07/05/21 10:16a $ ****************/
/*************** $Revision:: 4 $ ****************/
/*************** ****************/
/*************** Description : File List ****************/
/*************** MPEG Playback Module ****************/
/*************** ****************/
/*************** Company : MediaTek Inc. ****************/
/*************** Programmer : Jacob Lin ****************/
/**********************************************************************/
/**
* $(PROJ_HOME)/8032/custom/demo/fslist/flmpeg.c
*
* Play module of video clip named "MPEG PLAYER".
*/
#define __FLMPEG_C_
#include "../general.h"
#include "flspec.h"
#include "flcomm.h"
#include "flconfig.h"
#pragma NOAREGS
#ifdef PLAYER_FLMENU
/**
* Internal global functions.
*/
static void vFlMpChgMpgState(BYTE bStt) large;
static BOOL fgFlMpOnIrCmdDone(void) large;
static BOOL fgFlMpOnIrSelDone(void) large;
static BOOL fgFlMpOnIrNext(void) large;
static BOOL fgFlMpOnIrPrev(void) large;
static void vFlMpRetClickItem(void) large;
#ifdef MPS_ERROR_MSG
static void vFlMpsShowError(void) large;
#define MPS_ERR_MAX 9
struct _MPS_ERR
{
BYTE bCode;
WORD wMsg;
};
static code struct _MPS_ERR _rMpsErr[MPS_ERR_MAX] = {
{SV_E_A_CODEC_UNSUP, OSD_MSG_A_CODEC_UNSUP},
{SV_E_V_CODEC_UNSUP, OSD_MSG_V_CODEC_UNSUP},
{SV_E_V_RES_UNSUP, OSD_MSG_V_RES_UNSUP},
{SV_E_NO_AUDIO, OSD_MSG_FILE_NO_AUDIO},
{SV_E_NO_VIDEO, OSD_MSG_FILE_NO_VIDEO},
{SV_E_V_FPS_UNSUP, OSD_MSG_V_FPS_UNSUP},
{SV_E_V_GMC_UNSUP, OSD_MSG_V_GMC_UNSUP},
{SV_E_PROFILE_UNSUP, OSD_MSG_E_PROFILE_UNSUP},
{SV_E_DRM_NOT_ALLOWED, OSD_MSG_E_DRM_NOT_ALLOWED}
};
#else
BYTE code _bMPSErrMsg[1] ;
#endif
/**
* Operation to init module "MPEG player".
*/
BOOL fgFlMpInit(void) large
{
#ifdef MPEG4_TXT_SP
_wStartX = 0;
_wStartY = 0;
_wEndX = MP4_SP_WIDTH;
_wEndY = MP4_SP_HEIGHT;
vFlSetMp4SpParam(WB_MP4_SP, OSD_ALIGN_X_CENTER, OSD_SP_FROM_TOP , 0);
#endif
return TRUE;
}
/**
* Operation when we try to leave object "MPEG player".
*/
WORD wFlMpLeave(BOOL bSuicide) large
{
WORD wItem;
#ifdef MPEG4_TXT_SP
vSetFsCodePage(CODE_PAGE_MENU);
vDeleteWB(WB_MP4_SP);
#endif
vClearWB(WB_NORMAL_HEAD2);
if (_wCurrItem != 0xFFFF)
wItem = _wCurrItem;
else
wItem = (WORD)bSharedInfo(SI_MPIC_ITEM_IDX_HI) * 256 + bSharedInfo(SI_MPIC_ITEM_IDX_LO);
if (bSharedInfo(SI_MPIC_STT) == MPICSTT_PB_STRT)
{
//2006/3/30 modify for CQ(PL00101863):
//when play MPEG file, press001(INTR0), it should show logo.
vFlSendUopCmd(UOP_STOP, 0, UOP_RET_CHG_CMDTGT);
/*
modify it by Bright_liu /2005/10/21/, for CQ(PL00205072)
when play MPEG file, press 001(INTR0), it will show the logo.
*/
// vSendUopCmd(UOP_STOP, 0, 0, 0);
// vSendUopCmd(UOP_STOP, 0, 0, SV_STOP_FORCE);
}
return (wItem);
}
/**
* Enter the MPEG playback control module "file list mpeg".
*/
void vFlMpEnter(WORD wItem) large
{
vDisableWB(FL_MENU_WB);
vDisableWB(FL_INFO_WB);
vOsdShowWb(OSD_WB_DISABLE); // Bright_liu
vOsdShowWb(OSD_WB_RESTORE);
vEnableWB(WB_NORMAL_HEAD2);
// - set the MPEG player as forground module
vFlCtrlSetFg(FLMD_MPEG_PLAYER);
return;
}
void vFlMpRecover(void) large
{
if (bSharedInfo(SI_MPIC_STT) == MPICSTT_PB_STRT)
vFlUpdateVfd(TRUE);
#ifdef MPEG4_TXT_SP
if (fgIsIsoPlay() && fgFlCheckStatus(FL_STATUS_IN_MPEG))
{
vCreateWB(WB_MP4_SP, TRUE);
vSetWBTcColor(WB_MP4_SP);
vSetMsgCol4(WB_MP4_SP, 0, 0, 0, 2);
vSetTransEn(WB_MP4_SP, 0);
vEnableWB(WB_MP4_SP);
}
#endif /* MPEG4_TXT_SP */
}
/**
* Function to handle state change of MPEG player module
*/
void vFlMpChgMpgState(BYTE bStt) large
{
switch (bStt)
{
case MPICSTT_PB_STRT:
#ifdef MPEG4_TXT_SP
// Use WB to display other message
// Always create WB if no any issue.
//if (bSharedInfo(SI_SPST_NS))
{
vSetFsCodePage(0);
vCreateWB(WB_MP4_SP, TRUE);
vSetWBTcColor(WB_MP4_SP);
vSetMsgCol4(WB_MP4_SP, 0, 0, 0, 2);
vSetTransEn(WB_MP4_SP, 0);
vEnableWB(WB_MP4_SP);
}
#endif
#ifdef MPS_ERROR_MSG
vFlMpsShowError();
#endif
#if (defined( DDISC_SUPPORT_QT_CHAPTER) || defined(DIVXMENU_INFO))
//alfonso
vOsdPosClear(OSD_POS_MP4_CHAP);
#endif /* DDISC_SUPPORT_QT_CHAPTER||DIVXMENU_INFO */
_wFlCurAdoDir = 0xFFFF;
_wFlCurAdoIdx = 0xFFFF;
vFlUpdateVfd(FALSE);
break;
case MPICSTT_PB_FSH:
case MPICSTT_PB_ABT:
// - TODO: error handling
if (fgFlClLock(FL_CMDPATH_CHG_CMDTGT))
{
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
}
break;
case MPICSTT_PB_ERR:
#ifdef MPS_ERROR_MSG
vFlMpsShowError();
break;
#endif
default:
// - do nothing here
break;
}
return;
}
static void vFlMpRetClickItem(void) large
{
vFlCmdDone();
vFlClRls();
#if 0
WORD wBlkPtr;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1;
bRCode = bSharedInfo(wBlkPtr ++);
if (bRCode == FLRET_S_OK)
{
switch(bSharedInfo(wBlkPtr ++))
{
case FTYPE_JPG:
_bFlCmdTarget = FL_CMD_TARGET_JPEG;
//vFlSetCmdTarget(FL_CMD_TARGET_JPEG);
break;
case FTYPE_MP3:
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
break;
case FTYPE_MPG:
//vFlSetCmdTarget(FL_CMD_TARGET_MPEG);
break;
}
}
#endif
}
/**
* Handle the notification.
*/
static BOOL fgFlMpOnIrCmdDone(void) large
{
BYTE bPercent;
if (FL_ACK(_dwIrDoneParm) == FL_CMD_ASSERT)
{
// - for FS LIST command notification
switch(bSharedInfo(FL_CMD_BLK_SA))
{
case FLCMD_CLICK_ITEM:
vFlMpRetClickItem();
break;
default:
// - do nothing here
break;
}
}
else
{
// - others
switch (FL_ACK(_dwIrDoneParm))
{
case SI_MPIC_STT:
vFlMpChgMpgState(FL_PARM1(_dwIrDoneParm));
break;
#ifdef MPS_ERROR_MSG
case SI_MPS_ERROR_MSG:
if (bSharedInfo(SI_MPS_ERROR_MSG) == SV_E_V_GMC_UNSUP)
vOsdPosShow(OSD_POS_LAYER2_LINE3, OSD_MSG_V_GMC_UNSUP, OSD_TIMEOUT_SHORT);
break;
#endif
case SI_DDISC_PB_MODULE:
#if 0
if (bSharedInfo(SI_DDISC_PB_MODULE) == SV_DDISC_MODULE_JPG)
{
_bFlCmdTarget = FL_CMD_TARGET_JPEG;
}
else if (bSharedInfo(SI_DDISC_PB_MODULE) == SV_DDISC_MODULE_MP3)
{
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
}
#endif
break;
#ifdef AVI_INFO_READING_INDEX
case SI_MPS_OSD_MESSAGE:
{
bPercent = bSharedInfo(SI_MPS_OSD_MESSAGE) ;
if (bPercent == SV_MPS_OSD_OFF)
{
vOsdPosClear(OSD_POS_LAYER2_LINE3) ;
}
else
{
BYTE pbNum[4];
if (bPercent >= 100) // use OSD_TIMEOUT_SHORT for the last message 100%
{
pbNum[0] = 3;
pbNum[1] = '1';
pbNum[2] = '0';
pbNum[3] = '0';
vOsdPosShowArg(OSD_POS_LAYER2_LINE3, OSD_MSG_MPS_READING_INDEX100, OSD_TIMEOUT_SHORT, pbNum);
}
else
{
bPercent = bHEXToBCD(bPercent);
pbNum[0] = 2;
pbNum[1] = BCD_HI(bPercent) + '0';
pbNum[2] = BCD_LO(bPercent) + '0';
if (pbNum[1] == '0')
{
pbNum[1] = ' ';
}
vOsdPosShowArg(OSD_POS_LAYER2_LINE3, OSD_MSG_MPS_READING_INDEX, OSD_NO_DISAPPEAR, pbNum);
}
}
break ;
}
#endif
default:
// - do nothing here
break;
}
}
return TRUE;
}
/**
* Handle the IR_SEL_DONE for digital button selection.
*/
static BOOL fgFlMpOnIrSelDone(void) large
{
WORD wIdx;
wIdx = (WORD) _rNumInStateCtx.bDig[0] * 100 + _rNumInStateCtx.bDig[1] * 10 + _rNumInStateCtx.bDig[2];
if (_wFlMnListLen >= 1000)
{
wIdx = wIdx * 10 + _rNumInStateCtx.bDig[3];
}
if ((wIdx != 0) && (wIdx <= _wFlMnListLen))
{
wIdx--;
_wCurrItem = wIdx;
_bFlMnCurItemIdx = wIdx % FLMN_ITEM_N;
if (fgFlClLock(FL_CMDPATH_SEL_0))
{
fgFlCmdGetItems(_bFlMnListId, wIdx - _bFlMnCurItemIdx);//, FLCMD_RET_OP_SEL);
}
//vFlCmdClickItem(_bFlMnListId, wIdx, FLCMD_RET_OP_CMDACK);
}
return TRUE;
}
/**
* Handle IR_NEXT.
*/
static BOOL fgFlMpOnIrNext(void) large
{
#ifdef FL_SINGLE_CAN_PREV_NEXT
WORD wCurr, wTotal, wPos;
if (_bFlPbMode == SV_SINGLE)
{
wPos = FL_LIST_FIELD(0);
wCurr = (WORD)bSharedInfo(SI_MPIC_ITEM_IDX_HI)*256 +
bSharedInfo(SI_MPIC_ITEM_IDX_LO);
wTotal = (WORD)bSharedInfo(wPos+5)*256 + bSharedInfo(wPos+4);
if(wCurr < wTotal)
{
//vOsdShowPlayStatus(OSD_SHOW_NEXT_ITEM, OSD_TIMEOUT_SHORT);
vFlMnClickItem(0, wCurr+1);
}
else
{
//vOsdShowError(SV_ERR_GENERAL, FSMENU_MSG_TIMEOUT);
}
return TRUE;
}
return FALSE;
#else
return FALSE;
#endif
}
/**
* IR_PREV handler.
*/
static BOOL fgFlMpOnIrPrev(void) large
{
#ifdef FL_SINGLE_CAN_PREV_NEXT
WORD wCurr, wTotal, wPos;
if (_bFlPbMode == SV_SINGLE)
{
wCurr = (WORD)bSharedInfo(SI_MPIC_ITEM_IDX_HI)*256 +
bSharedInfo(SI_MPIC_ITEM_IDX_LO);
if(wCurr > 0)
{
//vOsdShowPlayStatus(OSD_SHOW_PREV_ITEM, OSD_TIMEOUT_SHORT);
vFlMnClickItem(0, wCurr-1);
}
else
{
// vOsdShowError(SV_ERR_GENERAL, FSMENU_MSG_TIMEOUT);
}
return TRUE;
}
#else
return FALSE;
#endif
}
/**
* The input machine focuses on MPEG player.
*/
BOOL fgFlOnMp(void) large
{
BOOL fgIsGrabbed = FALSE;
// - IR re-mapping
#if 0
if (_bIRKey == IR_ROOT_MENU)
{
// Send 1 stop first, then 2nd stop will enter full stop so will enter menu.
vSendUopCmd(UOP_STOP, 0, 0, SV_STOP_NORMAL);
_bIRKey = IR_STOP;
}
#endif
switch (_bIRKey)
{
case IR_CMD_DONE:
fgIsGrabbed = fgFlMpOnIrCmdDone();
break;
case IR_SELECT_DONE:
fgIsGrabbed = fgFlMpOnIrSelDone();
break;
case IR_NEXT:
fgIsGrabbed = fgFlMpOnIrNext();
break;
case IR_PREV:
fgIsGrabbed = fgFlMpOnIrPrev();
break;
/* pass session */
case IR_STOP:
break;
default:
// - do nothing
break;
}
return fgIsGrabbed;
}
#if 0 // - JACOB: tmp
BOOL fgFlOnMp(void) large
{
BOOL fgIsGrabbed = FALSE;
switch (_bIRKey)
{
case IR_CMD_DONE:
fgIsGrabbed = fgFlMpOnIrCmdDone();
break;
case IR_SELECT_DONE:
break;
case IR_ROOT_MENU:
case IR_STOP:
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
break;
case IR_NEXT:
fgIsGrabbed = fgFlMpOnIrNext();
break;
case IR_PREV:
fgIsGrabbed = fgFlMpOnIrPrev();
break;
default:
// - do nothing here
break;
}
return fgIsGrabbed;
}
#endif //0
#ifdef MPS_ERROR_MSG
void vFlMpsShowError(void) large
{
BYTE i;
BYTE _bMpsErrCode = bSharedInfo(SI_MPS_ERROR_MSG);
for (i=0; i<MPS_ERR_MAX; i++)
{
if (_bMpsErrCode == _rMpsErr[i].bCode)
{
vOsdPosShow(OSD_POS_LAYER2_LINE3, _rMpsErr[i].wMsg, OSD_TIMEOUT_SHORT);
break;
//return _rMpsErr[i].wMsg;
}
}
if (i >= MPS_ERR_MAX) return;
}
#endif
#endif // #ifdef PLAYER_FLMENU
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -