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

📄 flmpeg.c

📁 mtk1389L latest sourcecode enjoy
💻 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 + -