📄 flmpeg.c
字号:
/**********************************************************************/
/*************** MTK CONFIDENTIAL & COPYRIGHTED ****************/
/*************** ****************/
/*************** $Modtime:: 08-05-22 13:39 $ ****************/
/*************** $Revision:: 1 $ ****************/
/*************** ****************/
/*************** 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 DDISC_FTYPE_MPG_SUPPORT
#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 MPEG_FNT_SUB_CHK
BYTE bSpkConfig(WORD wEEPos, BYTE bValue) large;
#endif
#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
#ifdef MP3_LYRICS_V2_SUPPORT
if (bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
_wStartX = 0;
_wStartY = 0;
_wEndX = MP3_LRC_INFO_WIDTH - 40;//FSMENU_BASIC_WB_WIDTH + 8; //PengDeng
_wEndY = MP3_LRC_INFO_HEIGHT;//85
vFlSetMp4SpParam(MP3LRC_INTRO_WB, 1, 0 , 0);
}
else
#endif
{
_wStartX = 0;
_wStartY = 0;
// Fix Me
#if 1
_wEndX = MP4_SP_WIDTH;
_wEndY = MP4_SP_HEIGHT * 2;
vFlSetMp4SpParam(WB_MP4_SP, OSD_ALIGN_X_CENTER, OSD_SP_FROM_TOP , 0);
#else
_wEndX = NORMAL_VOL_WIDTH;
_wEndY = NORMAL_VOL_HEIGHT;
vFlSetMp4SpParam(WB_NORMAL_VOL, OSD_ALIGN_X_LEFT, OSD_SP_FROM_TOP , 0);
#endif
}
#endif
return TRUE;
}
/**
* Operation when we try to leave object "MPEG player".
*/
WORD wFlMpLeave(BOOL bSuicide) large
{
WORD wItem;
#ifdef MPEG4_TXT_SP
#ifdef SUPPORT_RUSSIAN_FILE_NAME
vSetFsCodePage(CODE_PAGE_MENU);
#endif
vDeleteWB(WB_MP4_SP);
#if (DRAM_SZ == DRAM_2M) || defined(USE_DRAM_CFG1)
vOsdSetMemBlk(OSD_MEM_BLK_STATIC, OSD_MEM_DEFAULT);
#endif
#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)
{
//vFlSendUopCmd(UOP_STOP, 0, UOP_RET_CHG_CMDTGT);
vSendUopCmd(UOP_STOP, 0, 0, 0);
}
vDisableWB(WB_NORMAL_HEAD1);
vDisableWB(WB_NORMAL_HEAD2);
vDisableWB(WB_NORMAL_PBC1);
vDisableWB(WB_NORMAL_PBC2);
vDisableWB(WB_NORMAL_VOL);
#if (DRAM_SZ == DRAM_2M) || defined(USE_DRAM_CFG1)
#ifndef USE_DRAM_8M_BUFFER
vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC, OSD_MEM_DEFAULT);
#endif
#endif
return (wItem);
}
/**
* Enter the MPEG playback control module "file list mpeg".
*/
void vFlMpEnter(WORD wItem) large
{
#ifdef MP3_LYRICS_V2_SUPPORT
if (bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
vDisableWB(MP3LRC_MENU_WB);
}
else
#endif
{
vDisableWB(FL_MENU_WB);
}
vDisableWB(FL_INFO_WB);
#if (DRAM_SZ == DRAM_2M) || defined(USE_DRAM_CFG1)
vOsdSetMemBlk(OSD_MEM_BLK_STATIC, OSD_MEM_DEFAULT);
#endif
vOsdShowWb(OSD_WB_RESTORE);
vEnableWB(WB_NORMAL_HEAD2);
// - set the MPEG player as forground module
vFlCtrlSetFg(FLMD_MPEG_PLAYER);
_fgFlWaitStop = FALSE ;
_fgFlOpenMic = TRUE ; // Indicate need to open Mic after leaving MPS.
return;
}
void vFlMpRecover(void) large
{
if (bSharedInfo(SI_MPIC_STT) == MPICSTT_PB_STRT)
vFlUpdateVfd(TRUE);
}
/**
* Function to handle state change of MPEG player module
*/
void vFlMpChgMpgState(BYTE bStt) large
{
switch (bStt)
{
case MPICSTT_PB_STRT:
_wFlCurAdoDir = 0xFFFF;
_wFlCurAdoIdx = 0xFFFF;
vFlUpdateVfd(FALSE);
#ifdef MPEG4_TXT_SP
if (bSharedInfo(SI_TXT_SP_EXIST))
{
#ifdef SUPPORT_RUSSIAN_FILE_NAME
vSetFsCodePage(4);
#endif
#if (DRAM_SZ == DRAM_2M) || defined(USE_DRAM_CFG1)
vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC, OSD_MEM_DEFAULT);
#endif
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);
}
else
{
vDeleteWB(WB_MP4_SP);
}
#endif
#ifdef MPS_ERROR_MSG
vFlMpsShowError();
#endif
#ifdef MPEG_FNT_SUB_CHK
fgEepromWriteByte(FNT_SPK_POSITION, SPK_LARGE);
fgEepromWriteByte(SUB_SPK_POSITION, EV_OFF);
bSpkConfig(FNT_SPK_POSITION, SPK_LARGE);
#endif
break;
case MPICSTT_PB_ABT:
// 20050325, IS00001571, wait until MPS is stopped, then we switch back to menu
if (_fgFlWaitStop)
{
_fgFlWaitStop = FALSE ;
if (fgFlClLock(FL_CMDPATH_SEL_0))
{
fgFlCmdGetItems(_bFlMnListId, _wCurrItem - _bFlMnCurItemIdx);//, FLCMD_RET_OP_SEL);
}
break ;
}
case MPICSTT_PB_FSH:
// - TODO: error handling
// PL00003927, clear play status or next time vFlMpEnter will restore WB that still have play status in it
vOsdPosClear(OSD_POS_PLAY_STATUS);
if (fgFlClLock(FL_CMDPATH_CHG_CMDTGT))
{
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
}
break;
case MPICSTT_PB_ERR:
#ifdef MPS_ERROR_MSG
vFlMpsShowError();
#endif
// 20050503, PL00000140, set PBC state to SV_STOP so that we accept setup key in case the file can't playback
if (bSharedInfo(SI_PBC_STATE) == SV_PRE_PLAY)
vSetSharedInfo(SI_PBC_STATE, SV_STOP) ;
default:
// - do nothing here
break;
}
return;
}
static void vFlMpRetClickItem(void) large
{
vFlCmdDone();
vFlClRls();
// 20050415, if use into key on menu to select MPS item. It'll change target to MPS after get item. vFlMpEnter() will be called before clicked.
// If we call vOsdSetMemBlk() before RISC's MPS is activated, the command will be invalid. So we call it after click return.
#ifdef MPEG4_TXT_SP
#if (DRAM_SZ == DRAM_2M) || defined(USE_DRAM_CFG1)
vFlSetCmdTarget(FL_CMD_TARGET_MPEG);
#endif
#endif
#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 bModule;
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_LINE1, 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:
{
BYTE bPercent = bSharedInfo(SI_MPS_OSD_MESSAGE) ;
if (bPercent == SV_MPS_OSD_OFF)
{
vOsdPosClear(OSD_POS_LAYER2_LINE1) ;
}
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_LINE1, 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_LINE1, 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;
#ifdef MP3_LYRICS_V2_SUPPORT
if (bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
_bFlMnCurItemIdx = wIdx % FLMP3LRCMN_ITEM_N;
}
else
#endif
{
_bFlMnCurItemIdx = wIdx % FLMN_ITEM_N;
}
// 20050325, IS00001571, If need to switch back to parent menu, we need to wait MPS stop because MPS need to wait DSP stop, for some
// bitstream, it takes more time, when we issue UOP_STOP, SI_MPIC_STT will become MPICSTT_PB_ABT, then we switch to menu
//20050407, IS00002269, expand this to all item
if (/*wIdx == 0 && */(bSharedInfo(SI_MPIC_STT) == MPICSTT_PB_STRT))
{
vSendUopCmd(UOP_STOP, 0, 0, 0) ;
_fgFlWaitStop = TRUE ;
return TRUE ;
}
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 (_bIRKey == IR_ROOT_MENU)
{
_bIRKey = IR_STOP;
}
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_LINE1, _rMpsErr[i].wMsg, OSD_TIMEOUT_SHORT);
break;
//return _rMpsErr[i].wMsg;
}
}
if (i >= MPS_ERR_MAX) return;
}
#endif
#endif // #ifdef PLAYER_FLMENU
#endif //DDISC_FTYPE_MPG_SUPPORT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -