⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flmpeg.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 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 + -