www.pudn.com > 6027_HD65.rar > digest.c


/**********************************************************************/ 
/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/ 
/***************                                       ****************/ 
/***************  $Modtime:: 04/07/19 2:58p    $       ****************/ 
/***************  $Revision:: 10               $       ****************/ 
/***************                                       ****************/ 
/***************   Description : Digest function       ****************/ 
/***************                 module                ****************/ 
/***************                                       ****************/ 
/***************       Company : MediaTek Inc.         ****************/ 
/***************    Programmer :                       ****************/ 
/**********************************************************************/ 
 
#include "general.h" 
 
#ifdef PLAYER_DIGEST 
 
#pragma NOAREGS 
 
enum { 
  DGST_STATE_TYPE, 
  DGST_STATE_MENU, 
  DGST_STATE_DISP, 
  DGST_STATE_INIT, 
  DGST_STATE_RESUME, 
  DGST_STATE_EXIT, 
  DGST_STATE_NUM, 
  DGST_STATE_MAX 
}; 
 
enum { 
  DGST_TYPE_NONE, 
  DGST_TYPE_TRACK, 
  DGST_TYPE_TITLE, 
  DGST_TYPE_CHAPTER, 
  DGST_TYPE_TIME_DISC, 
  DGST_TYPE_TIME_TRK, 
  DGST_TYPE_TIME_TTL, 
  DGST_TYPE_TIME_PTT, 
  DGST_TYPE_BOOKMARK, 
  DGST_TYPE_PROGRAM, 
  DGST_TYPE_STROBE, 
#ifdef SUPPORT_DVD_AUDIO 
  DA_DGST_TYPE_NONE, 
  DA_DGST_TYPE_GROUP, 
  DA_DGST_TYPE_TRACK, 
  DA_DGST_TYPE_TIME_GRP, 
  DA_DGST_TYPE_TIME_TRK, 
  DA_DGST_TYPE_INDEX, 
  DA_DGST_TYPE_SPOTLIGHT, 
  DA_DGST_TYPE_BOOKMARK, 
#endif   
  DGST_TYPE_MAX 
}; 
 
enum { 
  DGST_TYPE_MENU_DVD, 
  DGST_TYPE_MENU_VCD 
}; 
 
enum { 
  DGST_MENU_BTN_PREV, 
  DGST_MENU_BTN_EXIT, 
  DGST_MENU_BTN_MENU, 
  DGST_MENU_BTN_NEXT, 
  DGST_MENU_BTN_MAX 
}; 
 
 
//static xdata strucDigest _rDigest; 
xdata strucDigest _rDigest;  // megaa dgst time mark number 
 
#define DGST_DEFAULT_SHOW_TIME    3 
#define DGST_DEFAULT_INTERVAL     120 /* 120 * 5sec = 600sec = 10min */ 
 
#define IR_TIMEOUT_DGST_INIT     8 
#define IR_TIMEOUT_DGST_RESUME   8 
 
// ********************************************************************* 
// Local Function Prototype: Type Select Sub-state Functions 
// ********************************************************************* 
void vDgstShowTypePage(BYTE bPage) large; 
void vDgstShowDispMark(BYTE bItem) large; 
BOOL fgDgstTypeSelect(BYTE bType) large; 
BOOL fgDgstPlayControl(BYTE bCmd, bParm) large; 
void vDgstGotoTypeItem(BYTE bItem) large; 
void vDgstTypeInit(BYTE fgInit) large; 
void vDgstTypeExit(void) large; 
BOOL fgDgstTypeState(void) large; 
void vDgstShowMenuPageType(void) large; 
void vDgstShowMenuPageButton(void) large; 
void vDgstMenuGotoItem(BYTE bItem) large; 
void vDgstMenuBtnActive(void) large; 
void vDgstMenuInit(BYTE fgInit) large; 
void vDgstMenuExit(BYTE fgResume) large; 
BOOL fgDgstMenuState(void) large; 
void vDgstDispGotoItem(BYTE bItem); 
void vDgstDispInit(BYTE fgInit) large; 
void vDgstDispExit(void) large; 
BOOL fgDgstDispState(void) large; 
void vDgstInitInit(BYTE fgInit) large; 
void vDgstInitExit(void) large; 
BOOL fgDgstInitState(void) large; 
void vDgstResumeInit(BYTE fgInit) large; 
void vDgstResumeExit(void) large; 
BOOL fgDgstResumeState(void) large; 
void vDgstNumInit(BYTE fgInit) large; 
void vDgstNumExit(BYTE bSelNo) large; 
BOOL fgDgstNumState(void) large; 
 
// ********************************************************************* 
// Type Select Menu Items 
// ********************************************************************* 
typedef struct { 
  WORD wMsg; 
  BYTE bType; 
} strucDgstType; 
 
static code strucDgstType prDvdDgstTypePlay[] = { 
  { OSD_MSG_DGST_TITLE, DGST_TYPE_TITLE }, 
  { OSD_MSG_DGST_CHAPTER, DGST_TYPE_CHAPTER }, 
  { OSD_MSG_DGST_TIME_TTL, DGST_TYPE_TIME_TTL }, 
  { OSD_MSG_DGST_TIME_PTT, DGST_TYPE_TIME_PTT }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK }, 
#endif 
//  { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM }, 
//  { OSD_MSG_DGST_STROBE, DGST_TYPE_STROBE }, 
}; 
 
static code strucDgstType prDvdDgstTypeStop[] = { 
  { OSD_MSG_DGST_TITLE, DGST_TYPE_TITLE }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK }, 
#endif 
//  { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM } 
}; 
 
#ifdef SUPPORT_DVD_AUDIO 
static code strucDgstType prDADgstTypePlay[] = { 
  { OSD_MSG_DGST_GROUP,     DA_DGST_TYPE_GROUP },  
  { OSD_MSG_DGST_TRACK,     DA_DGST_TYPE_TRACK }, 
  { OSD_MSG_DGST_TIME_GRP,  DA_DGST_TYPE_TIME_GRP }, 
  { OSD_MSG_DGST_TIME_TRK,  DA_DGST_TYPE_TIME_TRK },  
//  { OSD_MSG_DGST_INDEX,     DA_DGST_TYPE_INDEX }, 
//  { OSD_MSG_DGST_SPOTLIGHT, DA_DGST_TYPE_SPOTLIGHT }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK,  DA_DGST_TYPE_BOOKMARK }, 
#endif 
}; 
 
static code strucDgstType prDADgstTypeStop[] = { 
  { OSD_MSG_DGST_GROUP,     DA_DGST_TYPE_GROUP }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK,  DA_DGST_TYPE_BOOKMARK }, 
#endif 
//  { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM } 
}; 
#endif 
 
static code strucDgstType prVcdDgstTypePlay[] = { 
  { OSD_MSG_DGST_TRACK, DGST_TYPE_TRACK }, 
  { OSD_MSG_DGST_TIME_DISC, DGST_TYPE_TIME_DISC }, 
  { OSD_MSG_DGST_TIME_TRK, DGST_TYPE_TIME_TRK }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK }, 
#endif 
//  { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM  }, 
//  { OSD_MSG_DGST_STROBE, DGST_TYPE_STROBE } 
}; 
 
static code strucDgstType prVcdDgstTypeStop[] = { 
  { OSD_MSG_DGST_TRACK, DGST_TYPE_TRACK }, 
  { OSD_MSG_DGST_TIME_DISC, DGST_TYPE_TIME_DISC }, 
#ifdef PLAYER_BOOKMARK 
  { OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK }, 
#endif 
//  { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM } 
}; 
 
typedef struct { 
  strucDgstType code *prList; 
  BYTE bNo; 
} strucDgstTypeMenu; 
 
static code strucDgstTypeMenu prDgstTypeMenu[] = { 
  { prDvdDgstTypePlay, TBL_SIZE(prDvdDgstTypePlay) }, 
  { prDvdDgstTypeStop, TBL_SIZE(prDvdDgstTypeStop) }, 
#ifdef SUPPORT_DVD_AUDIO 
  { prDADgstTypePlay, TBL_SIZE(prDADgstTypePlay) }, 
  { prDADgstTypeStop, TBL_SIZE(prDADgstTypeStop) }, 
#endif   
  { prVcdDgstTypePlay, TBL_SIZE(prVcdDgstTypePlay) }, 
  { prVcdDgstTypeStop, TBL_SIZE(prVcdDgstTypeStop) } 
}; 
 
enum { 
  DGST_TYPE_PAGE_DVD_PLAY, 
  DGST_TYPE_PAGE_DVD_STOP, 
#ifdef SUPPORT_DVD_AUDIO 
  DGST_TYPE_PAGE_DVD_AUDIO_PLAY, 
  DGST_TYPE_PAGE_DVD_AUDIO_STOP, 
#endif 
  DGST_TYPE_PAGE_VCD_PLAY, 
  DGST_TYPE_PAGE_VCD_STOP, 
  DGST_TYPE_PAGE_MAX 
}; 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vDgstMenuBtnUnsel(BYTE bNewState) large 
{ 
  if ((_rDigest.bState == DGST_STATE_MENU) || 
      (bNewState == DGST_STATE_MENU)) 
  { 
#ifdef NUI_OSD_STYLE 
    vSetMsgCol4(WB_DGST_MENU, 0, 0, 2, 3); 
#else 
    vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3); 
#endif 
    vUnselButton(WB_DGST_MENU, _rDigest.bCurItem); 
  } 
   
  _rDigest.bState = bNewState; 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstShowTypePage(BYTE bPage) large 
{ 
  BYTE bIdx; 
  BYTE bDispIdx; 
  BYTE bTypeValid; 
 
  if (bPage >= DGST_TYPE_PAGE_MAX) 
  { 
    bPage = DGST_TYPE_PAGE_DVD_STOP; 
  } 
 
  _rDigest.bPageNo = bPage; 
 
  vOsdPosPaste(OSD_POS_DGST_TYPE_LINE_1, OSD_MSG_DGST_SEL_TYPE); 
 
  bDispIdx = 0; 
  bTypeValid = 0; 
 
  for (bIdx = 0; bIdx < prDgstTypeMenu[bPage].bNo; bIdx++) 
  { 
    if ( 
#ifdef SUPPORT_DVD_AUDIO         
        (((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DA_DGST_TYPE_BOOKMARK) || 
#endif 
        (((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DGST_TYPE_BOOKMARK)) 
    { 
      if (fgIsBookmarkItemValid(BOOKMARK_ITEM_NO) == FALSE) 
      { 
        continue; 
      } 
    } 
    else if ((((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DGST_TYPE_NONE) || 
#ifdef SUPPORT_DVD_AUDIO 
             (((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DA_DGST_TYPE_NONE) || 
#endif 
             (((prDgstTypeMenu[bPage].prList)[bIdx].bType) >= DGST_TYPE_MAX)) 
    { 
      /* not valid entry, array end */ 
      break; 
    } 
 
    vOsdPosPaste(OSD_POS_DGST_TYPE_LINE_1 + 1 + bDispIdx, 
                 (prDgstTypeMenu[bPage].prList)[bIdx].wMsg); 
    bTypeValid |= (1 << bIdx); 
    bDispIdx++; 
  } 
 
  _rDigest.bSelNoMax = bDispIdx; 
  _rDigest.bTypeParm = bTypeValid; 
} 
 
// ********************************************************************* 
// Function : 
// Description : Currently we only support 2x3 window 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstShowDispMark(BYTE bItem) large 
{ 
  BYTE pbTmp[3]; 
  BYTE bType; 
  WORD wTmp; 
 
  bItem = bItem % DGST_VIEW_NS; 
 
  switch(_rDigest.bType) 
  { 
    case DGST_TYPE_TRACK: 
    case DGST_TYPE_TITLE: 
    case DGST_TYPE_CHAPTER: 
    case DGST_TYPE_BOOKMARK: 
    case DGST_TYPE_PROGRAM: 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_GROUP: 
    case DA_DGST_TYPE_TRACK: 
#endif 
      bType = OSD_DGST_MARK_NO; 
      break; 
 
    case DGST_TYPE_TIME_DISC: 
    case DGST_TYPE_TIME_TRK: 
      bType = OSD_DGST_MARK_TIME2; 
      break; 
 
    case DGST_TYPE_TIME_TTL: 
    case DGST_TYPE_TIME_PTT: 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_TIME_GRP: 
    case DA_DGST_TYPE_TIME_TRK: 
#endif     
      bType = OSD_DGST_MARK_TIME3; 
      break; 
 
#if 0 
    case DA_DGST_TYPE_INDEX: 
      break; 
 
    case DA_DGST_TYPE_SPOTLIGHT: 
      break; 
 
    case DA_DGST_TYPE_BOOKMARK: 
      break; 
#endif 
 
    case DGST_TYPE_STROBE: 
    default: 
      bType = OSD_DGST_MARK_NONE; 
      break; 
  } 
 
  switch (bType) 
  { 
    case OSD_DGST_MARK_NO: 
      pbTmp[0] = _rDigest.bPageNo * DGST_VIEW_NS + bItem + 1; 
      break; 
 
    case OSD_DGST_MARK_TIME2: 
      wTmp = ((WORD)_rDigest.bTypeParm * DGST_SLICE_TIME) * (_rDigest.bPageNo * DGST_VIEW_NS + bItem); 
      pbTmp[0] = (BYTE)(wTmp / 60); /* minute  */ 
      wTmp -= 60 * pbTmp[0]; 
      pbTmp[0] = bHEXToBCD(pbTmp[0]); 
      pbTmp[1] = bHEXToBCD(wTmp);      /* seconds */ 
      break; 
 
    case OSD_DGST_MARK_TIME3: 
      wTmp = ((WORD)_rDigest.bTypeParm * DGST_SLICE_TIME) * ((WORD)_rDigest.bPageNo * DGST_VIEW_NS + bItem); 
      pbTmp[0] = (BYTE)(wTmp / 3600); /* hour  */ 
      wTmp -= 3600 * pbTmp[0]; 
      pbTmp[0] = bHEXToBCD(pbTmp[0]); 
      pbTmp[1] = (BYTE)(wTmp / 60);   /* minute */ 
      wTmp -= 60 * pbTmp[1]; 
      pbTmp[1] = bHEXToBCD(pbTmp[1]); 
      pbTmp[2] = bHEXToBCD(wTmp);        /* second */ 
      break; 
 
    case OSD_DGST_MARK_NONE: 
    default: 
      vOsdShowDgstMark(bItem, bType, 0); 
      return; 
  } 
 
  vOsdShowDgstMark(bItem, bType, pbTmp); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstTypeSelect(BYTE bType) large 
{ 
#if 0   
  WORD wTotalSec; 
#endif   
  BYTE bDom = bSharedInfo(SI_DVD_DOM); 
  BYTE bParm1 = 0; 
  BYTE bParm2 = 0; 
  BYTE bParm3 = DGST_DEFAULT_SHOW_TIME; 
  BOOL fgRet = TRUE; 
 
  _rDigest.bType = bType; 
 
  switch (bType) 
  { 
    case DGST_TYPE_TRACK: 
      bParm1 = (SV_DGST_TRACK << 4) | DGST_VIEW_NS; 
      break; 
 
    case DGST_TYPE_TITLE: 
      bParm1 = (SV_DGST_TITLE << 4) | DGST_VIEW_NS; 
      break; 
 
    case DGST_TYPE_CHAPTER: /* play state only */ 
      bParm1 = (SV_DGST_CHAPTER << 4) | DGST_VIEW_NS; 
      /* default is current title */ 
      break; 
 
    case DGST_TYPE_TIME_DISC: 
      bParm1 = (SV_DGST_TIME_DISK << 4) | DGST_VIEW_NS; 
      bParm2 = DGST_DEFAULT_INTERVAL; 
      break; 
 
    case DGST_TYPE_TIME_TRK: /* play state only */ 
      bParm1 = (SV_DGST_TIME_TRK << 4) | DGST_VIEW_NS; 
#if 1 
      bParm2 = DGST_DEFAULT_INTERVAL; 
      /* default is current track */ 
#else 
      wTotalSec = bSharedInfo(SI_TIME_TOTAL_TRACK_HH) * 60; //min 
      wTotalSec += bSharedInfo(SI_TIME_TOTAL_TRACK_MM); //min 
      wTotalSec *= 60; //sec 
      wTotalSec += bSharedInfo(SI_TIME_TOTAL_TRACK_SS); //sec 
      wTotalSec /= 5; //n 5sec 
      bParm2 = wTotalSec/(DGST_VIEW_NS-1); // DGST_DEFAULT_INTERVAL; 
#endif       
      break; 
 
    case DGST_TYPE_TIME_TTL: 
      bParm1 = (SV_DGST_TIME_TTL << 4) | DGST_VIEW_NS; 
      bParm2 = DGST_DEFAULT_INTERVAL; 
      /* default is current title */ 
      break; 
 
    case DGST_TYPE_TIME_PTT: 
      bParm1 = (SV_DGST_TIME_PTT << 4) | DGST_VIEW_NS; 
      bParm2 = DGST_DEFAULT_INTERVAL; 
      /* default is current chapter */ 
      break; 
 
    case DGST_TYPE_BOOKMARK: 
      if (fgIsBookmarkItemValid(BOOKMARK_ITEM_NO) == TRUE) 
      { 
        bParm1 = (SV_DGST_BOOKMARK << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
 
    case DGST_TYPE_PROGRAM: 
      bParm1 = (SV_DGST_PROGRAM << 4) | DGST_VIEW_NS; 
      break; 
 
    case DGST_TYPE_STROBE: 
      bParm1 = (SV_DGST_STROBE << 4) | DGST_VIEW_NS; 
      bParm3 = 0; 
      break; 
 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_GROUP: 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        bParm1 = (SV_DGST_GROUP << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
 
    case DA_DGST_TYPE_TRACK: 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        bParm1 = (SV_DGST_TRACK << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
#endif 
 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_TIME_GRP: 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        bParm1 = (SV_DGST_TIME_GRP << 4) | DGST_VIEW_NS; 
        bParm2 = 1; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
 
    case DA_DGST_TYPE_TIME_TRK: 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        bParm1 = (SV_DGST_TIME_TRK << 4) | DGST_VIEW_NS; 
        bParm2 = 1; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
 
    case DA_DGST_TYPE_INDEX: 
      if (bDom == SV_ATSTT_DOM) 
      { 
        bParm1 = (SV_DGST_INDEX << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
 
      break; 
 
    case DA_DGST_TYPE_SPOTLIGHT: 
      if (bDom == SV_ATSTT_DOM) 
      { 
        bParm1 = (SV_DGST_SPOTLIGHT << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
 
    case DA_DGST_TYPE_BOOKMARK: 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        bParm1 = (SV_DGST_BOOKMARK << 4) | DGST_VIEW_NS; 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
#endif 
    default: 
      _rDigest.bType = DGST_TYPE_NONE; 
      break; 
  } 
 
  if (fgRet == TRUE) 
  { 
    _rDigest.bTypeParm = bParm2; 
 
    if (_rDigest.bType == DGST_TYPE_NONE) 
    { 
      /* error condition! */ 
      vSetExitInputState(); 
    } 
    else 
    { 
      vSendUopCmd(UOP_DIGEST, bParm1, bParm2, bParm3); 
    } 
  } 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstPlayControl(BYTE bCmd, bParm) large 
{ 
  BOOL fgRet = TRUE; 
 
  switch (bCmd) 
  { 
    case SV_DGST_RESUME: 
      /* send resume play */ 
#if 0 
      if (_rDigest.fgResume == TRUE) 
      { 
        vSendUopCmd(UOP_RESUME_PLAY, 0, 0, 0); 
      } 
      else 
      { 
        /* TODO: show logo or ? */ 
        vSendUopCmd(UOP_STOP, 0, 0, 0); 
      } 
#else 
      vSendUopCmd(UOP_DIGEST, 0, 0, 0); 
#endif 
      break; 
 
    case SV_DGST_PLAY: 
    { 
      if (bParm < 1) 
      { 
        bParm = 1; 
      } 
      else if (bParm > _rDigest.bSelNoMax) 
      { 
        bParm = _rDigest.bSelNoMax; 
      } 
 
      if (_rDigest.bType == DGST_TYPE_BOOKMARK) 
      { 
        if (fgIsBookmarkItemValid(bParm - 1) == FALSE) 
        { 
          fgRet = FALSE; 
          break; 
        } 
      } 
 
      vSendUopCmd(UOP_DIGITAL_BTN, bParm, 0, 0); 
      break; 
    } /* SV_DGST_PLAY */ 
 
    case SV_DGST_NEXT: 
      vSendUopCmd(UOP_NEXT, 0, 0, 0); 
      _rDigest.bPageNo += 1; 
      break; 
 
    case SV_DGST_PREV: 
      vSendUopCmd(UOP_PREVIOUS, 0, 0, 0); 
      _rDigest.bPageNo -= 1; 
      break; 
 
    default: 
      break; 
  } /* switch (bCmd) */ 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstGotoTypeItem(BYTE bItem) large 
{ 
  if (bItem >= _rDigest.bSelNoMax) 
  { 
    return; 
  } 
 
  vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_DGST_TYPE_LINE_1 + 1 + bItem, 0); 
 
  _rDigest.bCurItem = bItem; 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstTypeInit(BYTE fgInit) large 
{ 
  BYTE bPbcState = bSharedInfo(SI_PBC_STATE); 
 
  /* chnage OSD mode to user mode */ 
  vOsdShowWb(OSD_WB_USER); 
 
  _rDigest.bState = DGST_STATE_TYPE; 
  _rDigest.bType = DGST_TYPE_NONE; 
 
//#ifdef ALL_WB_USE_TRUECOLOR 
//  vCreateWB(WB_DGST_TYPE, TRUE); 
//  vSetWBTcColor(WB_DGST_TYPE); 
//#else 
//  vCreateWB(WB_DGST_TYPE, FALSE); 
//#endif 
  vCreateWBEx(WB_DGST_TYPE); 
 
#ifdef FONT_NO_BORDER 
  vSetMsgCol4(WB_DGST_TYPE, 0, 1, 1, 3); 
#else 
  vSetMsgCol4(WB_DGST_TYPE, 0, 1, 2, 3); 
#endif 
  vEnableWB(WB_DGST_TYPE); 
 
  if (fgIsDvdPlay()) 
  { 
#ifdef SUPPORT_DVD_AUDIO 
    if (bSharedInfo(SI_DISC_TYPE) == SV_DVD_AUDIO) 
    { 
      if (_rDigest.fgResume == TRUE) 
      { 
        vDgstShowTypePage(DGST_TYPE_PAGE_DVD_AUDIO_PLAY); 
      } 
      else 
      { 
        vDgstShowTypePage(DGST_TYPE_PAGE_DVD_AUDIO_STOP); 
      } 
    } 
    else 
#endif 
    { 
      if (_rDigest.fgResume == TRUE) 
      { 
        vDgstShowTypePage(DGST_TYPE_PAGE_DVD_PLAY); 
      } 
      else 
      { 
        vDgstShowTypePage(DGST_TYPE_PAGE_DVD_STOP); 
      } 
    } 
  } 
#ifdef VCD_SUPPORT   
  else if (fgIsVcdPlay()) 
  { 
    if (_rDigest.fgResume == TRUE) 
    { 
      vDgstShowTypePage(DGST_TYPE_PAGE_VCD_PLAY); 
    } 
    else 
    { 
      vDgstShowTypePage(DGST_TYPE_PAGE_VCD_STOP); 
    } 
  } 
#endif   
 
  vDgstGotoTypeItem(0); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstTypeExit(void) large 
{ 
  vDeleteWB(WB_DGST_TYPE); 
 
  /* restore OSD mode */ 
  vOsdShowWb(OSD_WB_RESTORE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstTypeState(void) large 
{ 
  BOOL fgRet = TRUE; 
  BYTE bIdx, bDispIdx, bTypeValid; 
 
  switch (_bIRKey) 
  { 
    case IR_UP: 
      if (_rDigest.bCurItem > 0) 
      { 
        vDgstGotoTypeItem(_rDigest.bCurItem - 1); 
      } 
      break; 
 
    case IR_DOWN: 
      if (_rDigest.bCurItem + 1 < _rDigest.bSelNoMax) 
      { 
        vDgstGotoTypeItem(_rDigest.bCurItem + 1); 
      } 
      break; 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
    { 
      bDispIdx = 0; 
      bTypeValid = _rDigest.bTypeParm; 
 
      for (bIdx = 0; bIdx < prDgstTypeMenu[_rDigest.bPageNo].bNo; bIdx++) 
      { 
        if (bTypeValid & (1 << bIdx)) 
        { 
          bDispIdx++; 
          if (bDispIdx == (_rDigest.bCurItem + 1)) 
          { 
            break; 
          } 
        } 
      } 
 
      if ((bDispIdx > 0) && (bDispIdx <= _rDigest.bSelNoMax)) 
      { 
        /* send UOP command first */ 
        if (fgDgstTypeSelect((prDgstTypeMenu[_rDigest.bPageNo].prList)[bIdx].bType) == TRUE) 
        { 
          /* wait it return */ 
          vDgstTypeExit(); 
          /* wait UOP return */ 
          vDgstInitInit(TRUE); 
          break; 
        } 
      } 
 
      /* range check invalid, force escape input state */ 
      vSetExitInputState(); 
      break; 
    } 
 
    case IR_TIME_OUT: 
      vSetExitInputState(); 
      break; 
 
    default: 
    { 
      fgRet = FALSE; 
      break; 
    } 
  } /* switch (_bIRKey) */ 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Button Select Sub-state Functions 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static code WORD pwDgstMenuPageType[DGST_TYPE_MAX] = { 
  0xffff,                 /* DGST_TYPE_NONE       */ 
  OSD_MSG_TYPE_TRK,       /* DGST_TYPE_TRACK      */ 
  OSD_MSG_TYPE_TTL,       /* DGST_TYPE_TITLE      */ 
  OSD_MSG_TYPE_PTT,       /* DGST_TYPE_CHAPTER    */ 
  OSD_MSG_TYPE_TIME_DISC, /* DGST_TYPE_TIME_DISC  */ 
  OSD_MSG_TYPE_TIME_TRK,  /* DGST_TYPE_TIME_TRK   */ 
  OSD_MSG_TYPE_TIME_TTL,  /* DGST_TYPE_TIME_TTL   */ 
  OSD_MSG_TYPE_TIME_PTT,  /* DGST_TYPE_TIME_PTT   */ 
  OSD_MSG_TYPE_BOOKMARK,  /* DGST_TYPE_BOOKMARK   */ 
  OSD_MSG_TYPE_PROGRAM,   /* DGST_TYPE_PROGRAM    */ 
  OSD_MSG_TYPE_STROBE,    /* DGST_TYPE_STROBE     */ 
#ifdef SUPPORT_DVD_AUDIO 
  0xffff,                 /* DA_DGST_TYPE_NONE      */ 
  OSD_MSG_DGST_GROUP,     /* DA_DGST_TYPE_GROUP     */ 
  OSD_MSG_DGST_TRACK,     /* DA_DGST_TYPE_TRAC      */ 
  OSD_MSG_DGST_TIME_GRP,  /* DA_DGST_TYPE_TIME_GRP  */ 
  OSD_MSG_DGST_TIME_TRK,  /* DA_DGST_TYPE_TIME_TRK  */ 
  OSD_MSG_DGST_INDEX,     /* DA_DGST_TYPE_INDEX     */ 
  OSD_MSG_DGST_SPOTLIGHT, /* DA_DGST_TYPE_SPOTLIGHT */ 
  OSD_MSG_TYPE_PROGRAM    /* DA_DGST_TYPE_BOOKMARK  */ 
#endif 
}; 
 
void vDgstShowMenuPageType(void) large 
{ 
  BYTE bParm = 0; 
  WORD wMsg = 0xffff; 
 
  if (_rDigest.bType < DGST_TYPE_MAX) 
  { 
    wMsg = pwDgstMenuPageType[_rDigest.bType]; 
  } 
 
  switch (_rDigest.bType) 
  { 
    case DGST_TYPE_CHAPTER: 
    case DGST_TYPE_TIME_TTL: 
      bParm = bSharedInfo(SI_TT_NO); 
      break; 
 
    case DGST_TYPE_TIME_PTT: 
      bParm = bSharedInfo(SI_CHAP_NO); 
      break; 
 
    case DGST_TYPE_TIME_TRK: 
      bParm = bSharedInfo(SI_TRACK_NO); 
      break; 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_GROUP: 
    case DA_DGST_TYPE_TIME_GRP: 
      bParm = bSharedInfo(SI_GRP_NO); 
      break; 
       
    case DA_DGST_TYPE_TRACK: 
    case DA_DGST_TYPE_TIME_TRK: 
      bParm = bSharedInfo(SI_TRACK_NO); 
      break; 
#endif 
#if 0        
    case DA_DGST_TYPE_INDEX: 
    case DA_DGST_TYPE_SPOTLIGHT: 
    case DA_DGST_TYPE_BOOKMARK: 
#endif 
 
    default: 
      break; 
  } 
 
  vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3); 
  vOsdShowDgstMenuType(wMsg, bParm); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstShowMenuPageButton(void) large 
{ 
  vSetBtnCol(WB_DGST_MENU, 15, 0, 2, 3); 
#ifdef NUI_OSD_STYLE 
  vSetMsgCol4(WB_DGST_MENU, 15, 0, 2, 3); 
#else 
  vSetMsgCol4(WB_DGST_MENU, 15, 0, 0, 3); 
#endif 
   
  _wStartY = 2 * LINE_HEIGHT ; 
  _wEndY = 3 * LINE_HEIGHT-1; 
   
  /* PREV button */ 
  _wStartX = 0.5 * EFONT_WIDTH; 
  _wEndX = 7 * EFONT_WIDTH; 
  if (_rDigest.bPageNo > 0) 
  { 
    //vOsdPosPaste(OSD_POS_DGST_BTN_1, OSD_MSG_PREV_PAGE); 
    vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_PREV, 0, OSD_MSG_PREV_PAGE, 10, 0); 
    vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_PREV); 
    _rDigest.fgPrevValid = TRUE; 
  } 
  else 
  { 
    //vOsdPosClear(OSD_POS_DGST_BTN_1); 
    vRectangle(WB_DGST_MENU, 0, 0, 1, 0); 
    _rDigest.fgPrevValid = FALSE; 
  } 
 
  /* EXIT button */ 
  //vOsdPosPaste(OSD_POS_DGST_BTN_2, OSD_MSG_EXIT); 
  _wStartX = 7.5 * EFONT_WIDTH; 
  _wEndX = _wStartX + 6 * EFONT_WIDTH; 
  vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_EXIT, 0, OSD_MSG_EXIT, 10, 0); 
  vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_EXIT); 
 
  /* MENU button */ 
  //vOsdPosPaste(OSD_POS_DGST_BTN_3, OSD_MSG_MENU); 
  _wStartX = 14.5 * EFONT_WIDTH; 
  _wEndX = _wStartX + 6 * EFONT_WIDTH; 
  vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_MENU, 0, OSD_MSG_MENU, 10, 0); 
  vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_MENU); 
 
  /* NEXT button */ 
#ifdef NUI_OSD_STYLE 
  _wStartX = 20.5 * EFONT_WIDTH; 
#else 
  _wStartX = 21.5 * EFONT_WIDTH; 
#endif 
  _wEndX = _wStartX + 6.5 * EFONT_WIDTH; 
  if ((_rDigest.bPageNo + 1) * DGST_VIEW_NS < _rDigest.bSelNoMax) 
  { 
    //vOsdPosPaste(OSD_POS_DGST_BTN_4, OSD_MSG_NEXT_PAGE); 
    vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_NEXT, 0, OSD_MSG_NEXT_PAGE, 10, 0); 
    vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_NEXT); 
    _rDigest.fgNextValid = TRUE; 
  } 
  else 
  { 
    //vOsdPosClear(OSD_POS_DGST_BTN_4); 
    vRectangle(WB_DGST_MENU, 0, 0, 1, 0); 
    _rDigest.fgNextValid = FALSE; 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstMenuGotoItem(BYTE bItem) large 
{ 
#ifdef NUI_OSD_STYLE 
  vSetMsgCol4(WB_DGST_MENU, 0, 0, 2, 3); 
#else 
  vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3); 
#endif 
   
  switch(_rDigest.bCurItem) 
  { 
    case DGST_MENU_BTN_PREV: 
      if (_rDigest.fgPrevValid != FALSE) 
      { 
        vUnselButton(WB_DGST_MENU, _rDigest.bCurItem); 
      } 
      break; 
    case DGST_MENU_BTN_NEXT: 
      if (_rDigest.fgNextValid != FALSE) 
      { 
        vUnselButton(WB_DGST_MENU, _rDigest.bCurItem); 
      }       
      break; 
    case DGST_MENU_BTN_EXIT: 
    case DGST_MENU_BTN_MENU: 
    default: 
      vUnselButton(WB_DGST_MENU, _rDigest.bCurItem); 
  } 
 
  if (bItem == DGST_MENU_BTN_PREV) 
  { 
    if (_rDigest.fgPrevValid == TRUE) 
    { 
      _rDigest.bCurItem = DGST_MENU_BTN_PREV; 
    } 
    else 
    { 
      _rDigest.bCurItem = DGST_MENU_BTN_PREV + 1; 
    } 
  } 
  else if (bItem >= DGST_MENU_BTN_NEXT) 
  { 
    if (_rDigest.fgNextValid == TRUE) 
    { 
      _rDigest.bCurItem = DGST_MENU_BTN_NEXT; 
    } 
    else 
    { 
      _rDigest.bCurItem = DGST_MENU_BTN_NEXT - 1; 
    } 
  } 
  else 
  { 
    _rDigest.bCurItem = bItem; 
  } 
 
  /* change state */ 
  _rDigest.bState = DGST_STATE_MENU; 
 
  //vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_DGST_BTN_1 + _rDigest.bCurItem, 0); 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
#ifdef NUI_OSD_STYLE 
  vSetMsgCol4(WB_DGST_MENU, 15, 15, 2, 3); 
#else 
  vSetMsgCol4(WB_DGST_MENU, 15, 15, 15, 3); 
#endif 
  vSelButton(WB_DGST_MENU, _rDigest.bCurItem); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstNextPage(void) large 
{ 
  if (_rDigest.fgNextValid == TRUE) 
  { 
    _rDigest.fgDispValid = FALSE; 
 
    fgDgstPlayControl(SV_DGST_NEXT, 0); 
    vOsdShowDgstMark(0, OSD_DGST_MARK_CLEAR, 0); 
    vDgstShowMenuPageButton(); 
    vDgstDispInit(FALSE); 
    if ((_rDigest.bState == DGST_STATE_MENU) && (_rDigest.bCurItem == DGST_MENU_BTN_NEXT)) 
    { 
      vDgstMenuGotoItem(DGST_MENU_BTN_NEXT); 
    } 
    else 
    { 
      vDgstMenuGotoItem(DGST_MENU_BTN_EXIT); 
    } 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstPrevPage(void) large 
{ 
  if (_rDigest.fgPrevValid == TRUE) 
  { 
    _rDigest.fgDispValid = FALSE; 
 
    fgDgstPlayControl(SV_DGST_PREV, 0); 
    vOsdShowDgstMark(0, OSD_DGST_MARK_CLEAR, 0); 
    vDgstShowMenuPageButton(); 
    vDgstDispInit(FALSE); 
    if ((_rDigest.bState == DGST_STATE_MENU) && (_rDigest.bCurItem == DGST_MENU_BTN_PREV)) 
    { 
      vDgstMenuGotoItem(DGST_MENU_BTN_PREV); 
    } 
    else 
    { 
      vDgstMenuGotoItem(DGST_MENU_BTN_EXIT); 
    } 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstMenuBtnActive(void) large 
{ 
  switch (_rDigest.bCurItem) 
  { 
    case DGST_MENU_BTN_PREV: 
      vDgstPrevPage(); 
      break; 
 
    case DGST_MENU_BTN_EXIT: 
      vDgstMenuExit(TRUE); 
      _rDigest.bState = DGST_STATE_EXIT; 
      /* escape in fgDigestState() */ 
      break; 
 
    case DGST_MENU_BTN_MENU: 
      vDgstDispExit(); 
      vDgstMenuExit(TRUE); 
      if (_rDigest.fgResume == TRUE) 
      { 
        _rDigest.bState = DGST_STATE_RESUME; 
        vDgstResumeInit(TRUE); 
      } 
      else 
      { 
        vDgstTypeInit(TRUE); 
      } 
      break; 
 
    case DGST_MENU_BTN_NEXT: 
      vDgstNextPage(); 
      break; 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstMenuInit(BYTE fgInit) large 
{ 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC); 
#endif   
   
  if (fgInit == TRUE) 
  { 
    /* initial variables */ 
    _rDigest.fgDispValid = FALSE; 
    _rDigest.bSelNoMax = bSharedInfo(SI_USR_DIGEST_NS); 
    _rDigest.bPageNo = 0; 
 
#ifdef ALL_WB_USE_TRUECOLOR 
    vCreateWB(WB_DGST_MENU, TRUE); 
    vSetWBTcColor(WB_DGST_MENU); 
#else 
    vCreateWB(WB_DGST_MENU, FALSE); 
#endif 
#ifdef NUI_OSD_STYLE 
    vSetMsgCol4(WB_DGST_MENU,0,0,2,3); // 2 is the theme_fontoutline_color  
#endif 
 
    vDgstShowMenuPageType(); 
    vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, 0); /* show select range, no hili */ 
    vDgstShowMenuPageButton(); 
 
#ifdef IR_SUPPORT_SHIFT_KEY 
    if (fgIsKeyTblShift()) 
    { 
      vSetShiftKeyMode(TRUE); 
    } 
    else /* normal key table */ 
    { 
      vSetShiftKeyMode(FALSE); 
    } 
#endif /* IR_SUPPORT_SHIFT_KEY */ 
 
    vDgstDispInit(TRUE); 
 
    /* chnage OSD mode to full screen mode */ 
    vOsdShowWb(OSD_WB_FULL_SCR); 
     
    /* original enable WB in osdcore.c, now enable it here */ 
    vEnableWB(WB_DGST_DISP1); 
    vEnableWB(WB_DGST_DISP1A); 
    vEnableWB(WB_DGST_DISP2); 
    vEnableWB(WB_DGST_DISP2A); 
    vEnableWB(WB_DGST_MENU); 
  } 
 
  vDgstMenuGotoItem(DGST_MENU_BTN_EXIT); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstMenuExit(BYTE fgResume) large 
{ 
  if (fgResume) 
  { 
    fgDgstPlayControl(SV_DGST_RESUME, 0); 
  } 
 
  vDeleteWB(WB_DGST_MENU); 
   
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_STATIC); 
#endif 
   
  /* restore OSD mode */ 
  vOsdShowWb(OSD_WB_RESTORE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstMenuState(void) large 
{ 
  BOOL fgRet = TRUE; 
 
  switch (_bIRKey) 
  { 
    case IR_UP: 
    { 
      vDgstNumInit(FALSE); 
      break; 
    } 
 
    case IR_DOWN: 
      if (_rDigest.fgDispValid) 
      { 
        /* change to display state */ 
        vDgstMenuBtnUnsel(DGST_STATE_DISP); 
        vDgstDispGotoItem(0); 
      } 
      break; 
 
    case IR_LEFT: 
      if (_rDigest.bCurItem > 0) 
      { 
        vDgstMenuGotoItem(_rDigest.bCurItem - 1); 
      } 
      break; 
 
    case IR_RIGHT: 
      if (_rDigest.bCurItem < DGST_MENU_BTN_MAX - 1) 
      { 
        vDgstMenuGotoItem(_rDigest.bCurItem + 1); 
      } 
      break; 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
    { 
      vDgstMenuBtnActive(); 
      break; 
    } 
 
    case IR_NEXT: 
      vDgstNextPage(); 
      break; 
 
    case IR_PREV: 
      vDgstPrevPage(); 
      break; 
 
    case IR_TIME_OUT: 
      vSetExitInputState(); 
      break; 
 
    default: 
    { 
      if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5)  // megaa ADD5 
      { 
        vDgstNumInit(TRUE); 
        fgRet = fgDgstNumState(); 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
    } 
  } /* switch (_bIRKey) */ 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Display Select Sub-state Functions 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstDispGotoItem(BYTE bItem) 
{ 
  BYTE bType; 
 
  if (bItem >= _rDigest.bPageItemMax) 
  { 
    bItem = _rDigest.bPageItemMax - 1; 
  } 
 
  switch(_rDigest.bType) 
  { 
    case DGST_TYPE_TRACK: 
    case DGST_TYPE_TITLE: 
    case DGST_TYPE_CHAPTER: 
    case DGST_TYPE_BOOKMARK: 
    case DGST_TYPE_PROGRAM: 
#ifdef SUPPORT_DVD_AUDIO 
    case DA_DGST_TYPE_GROUP: 
    case DA_DGST_TYPE_TRACK:   
    case DA_DGST_TYPE_BOOKMARK: 
#endif 
      bType = OSD_DGST_MARK_NO; 
      break; 
 
    case DGST_TYPE_TIME_DISC: 
    case DGST_TYPE_TIME_TRK: 
#ifdef SUPPORT_DVD_AUDIO     
    case DA_DGST_TYPE_TIME_GRP: 
    case DA_DGST_TYPE_TIME_TRK: 
#endif 
      bType = OSD_DGST_MARK_TIME2; 
      break; 
 
    case DGST_TYPE_TIME_TTL: 
    case DGST_TYPE_TIME_PTT: 
      bType = OSD_DGST_MARK_TIME3; 
      break; 
 
#if 0 
    case DA_DGST_TYPE_INDEX: 
    case DA_DGST_TYPE_SPOTLIGHT: 
#endif 
    case DGST_TYPE_STROBE: 
    default: 
      bType = OSD_DGST_MARK_NONE; 
      break; 
  } 
 
  if (bType != OSD_DGST_MARK_NONE) 
  { 
    vOsdShowDgstMark(bItem, bType | OSD_DGST_MARK_HILI, 0); 
  } 
 
  /* change state */ 
  _rDigest.bState = DGST_STATE_DISP; 
  _rDigest.bCurItem = bItem; 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstDispInit(BYTE fgInit) large 
{ 
  BYTE bIdx; 
 
  /* the white board has been created in vDgstMenuInit(), just show hili */ 
  if (fgInit == TRUE) 
  { 
#ifdef ALL_WB_USE_TRUECOLOR 
    vCreateWB(WB_DGST_DISP1, TRUE); 
    vSetWBTcColor(WB_DGST_DISP1); 
    vSetTcPal(WB_DGST_DISP1, 1, BLEND_2, TRUECOLOR_BLACK); 
    vCreateWB(WB_DGST_DISP1A, TRUE); 
    vSetWBTcColor(WB_DGST_DISP1A); 
    vSetTcPal(WB_DGST_DISP1A, 1, BLEND_2, TRUECOLOR_BLACK); 
#else 
    vCreateWB(WB_DGST_DISP1, FALSE); 
    vSetPal(WB_DGST_DISP1, 1, BLEND_2, 0); 
    vCreateWB(WB_DGST_DISP1A, FALSE); 
    vSetPal(WB_DGST_DISP1A, 1, BLEND_2, 0); 
#endif 
#ifdef NUI_OSD_STYLE 
    vSetMsgCol4(WB_DGST_DISP1, 0, 1, 1, 3); 
#else 
    vSetMsgCol4(WB_DGST_DISP1, 0, 0, 1, 3); 
#endif 
    vSetTransEn(WB_DGST_DISP1, 0); 
    vClearWB(WB_DGST_DISP1); 
    vSetMsgCol4(WB_DGST_DISP1A, 0, 0, 1, 3); 
    vSetTransEn(WB_DGST_DISP1A, 0); 
    vClearWB(WB_DGST_DISP1A); 
     
#ifdef ALL_WB_USE_TRUECOLOR 
    vCreateWB(WB_DGST_DISP2, TRUE); 
    vSetWBTcColor(WB_DGST_DISP2); 
    vSetTcPal(WB_DGST_DISP2, 1, BLEND_2, TRUECOLOR_BLACK); 
    vCreateWB(WB_DGST_DISP2A, TRUE); 
    vSetWBTcColor(WB_DGST_DISP2A); 
    vSetTcPal(WB_DGST_DISP2A, 1, BLEND_2, TRUECOLOR_BLACK); 
#else 
    vCreateWB(WB_DGST_DISP2, FALSE); 
    vSetPal(WB_DGST_DISP2, 1, BLEND_2, 0); 
    vCreateWB(WB_DGST_DISP2A, FALSE); 
    vSetPal(WB_DGST_DISP2A, 1, BLEND_2, 0); 
#endif 
#ifdef NUI_OSD_STYLE 
    vSetMsgCol4(WB_DGST_DISP2, 0, 1, 1, 3); 
#else 
    vSetMsgCol4(WB_DGST_DISP2, 0, 0, 1, 3); 
#endif 
    vSetTransEn(WB_DGST_DISP2, 0); 
    vClearWB(WB_DGST_DISP2); 
    vSetMsgCol4(WB_DGST_DISP2A, 0, 0, 1, 3); 
    vSetTransEn(WB_DGST_DISP2A, 0); 
    vClearWB(WB_DGST_DISP2A); 
 
    /* enable WB in vDgstMenuInit()  */ 
  } 
 
  if (_rDigest.bSelNoMax >= (_rDigest.bPageNo + 1) * DGST_VIEW_NS) 
  { 
    _rDigest.bPageItemMax = DGST_VIEW_NS; 
  } 
  else 
  { 
    _rDigest.bPageItemMax = _rDigest.bSelNoMax - _rDigest.bPageNo * DGST_VIEW_NS; 
  } 
 
  // Hack code, show all mark at the same time 
  vOsdSetSt(OSD_ST_BURST); 
  for (bIdx = 0; bIdx < _rDigest.bPageItemMax; bIdx++) 
  { 
    vDgstShowDispMark(bIdx); 
  } 
  // Hack code 
  vOsdSetSt(OSD_ST_NML); 
 
  /* vDgstDispGotoItem(0); */ 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstDispExit(void) large 
{ 
  vDeleteWB(WB_DGST_DISP1); 
  vDeleteWB(WB_DGST_DISP2); 
  vDeleteWB(WB_DGST_DISP1A); 
  vDeleteWB(WB_DGST_DISP2A); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstDispState(void) large 
{ 
  BOOL fgRet = TRUE; 
 
  switch (_bIRKey) 
  { 
    case IR_UP: 
      if (_rDigest.bCurItem >= DGST_COL_NS) 
      { 
        vDgstDispGotoItem(_rDigest.bCurItem - DGST_COL_NS); 
      } 
      break; 
 
    case IR_LEFT: 
      if (_rDigest.bCurItem > 0) 
      { 
        vDgstDispGotoItem(_rDigest.bCurItem - 1); 
      } 
      break; 
 
    case IR_RIGHT: 
      if (_rDigest.bCurItem + 1 < _rDigest.bPageItemMax) 
      { 
        vDgstDispGotoItem(_rDigest.bCurItem + 1); 
      } 
      break; 
 
    case IR_DOWN: 
      if (_rDigest.bCurItem + DGST_COL_NS < _rDigest.bPageItemMax) 
      { 
        vDgstDispGotoItem(_rDigest.bCurItem + DGST_COL_NS); 
      } 
      else 
      { 
        vDgstNumInit(FALSE); 
      } 
      break; 
 
    case IR_NEXT: 
      vDgstNextPage(); 
      break; 
 
    case IR_PREV: 
      vDgstPrevPage(); 
      break; 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
    { 
      if (fgDgstPlayControl(SV_DGST_PLAY, _rDigest.bCurItem + _rDigest.bPageNo * DGST_VIEW_NS + 1) == TRUE) 
      { 
        vDgstDispExit(); 
        vDgstMenuExit(FALSE); 
        _rDigest.bState = DGST_STATE_EXIT; 
 
        vSetExitInputState(); 
      } 
      break; 
    } 
 
    case IR_TIME_OUT: 
      vSetExitInputState(); 
      break; 
 
    default: 
    { 
      if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5)  // megaa ADD5 
      { 
        vDgstNumInit(TRUE); 
        fgRet = fgDgstNumState(); 
      } 
      else 
      { 
        fgRet = FALSE; 
      } 
      break; 
    } 
  } /* switch (_bIRKey) */ 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Wait Digest Initial Sub-state Functions 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstInitInit(BYTE fgInit) large 
{ 
  _rDigest.bState = DGST_STATE_INIT; 
 
  /* set input timeout */ 
  vIrSetTimeOut(IR_TIMEOUT_DGST_INIT); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstInitExit(void) large 
{ 
  vIrSetTimeOut(IR_TIMER_VOID); 
 
  /* if UOP return OK and not timeout, switch to menu state */ 
  vDgstMenuInit(TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstInitState(void) large 
{ 
  BOOL fgRet = TRUE; 
 
  switch (_bIRKey) 
  { 
    case IR_TIME_OUT: 
      vSetExitInputState(); 
      break; 
 
    case IR_DONE: 
      vDgstInitExit(); 
      break; 
 
    default: 
      break; 
  } 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Wait Digest Resume Sub-state Functions 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstResumeInit(BYTE fgInit) large 
{ 
  /* set input timeout */ 
  vIrSetTimeOut(IR_TIMEOUT_DGST_RESUME); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstResumeExit(void) large 
{ 
  vIrSetTimeOut(IR_TIMER_VOID); 
 
  /* if UOP return OK and not timeout, switch to type state */ 
  vDgstTypeInit(TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstResumeState(void) large 
{ 
  BOOL fgRet = TRUE; 
 
  switch (_bIRKey) 
  { 
    case IR_TIME_OUT: 
      vSetExitInputState(); 
      break; 
 
    case IR_DONE: 
      vDgstResumeExit(); 
      break; 
 
    default: 
      break; 
  } 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Number Select Input state 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstNumInit(BYTE fgInit) large 
{ 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
  vDgstMenuBtnUnsel(DGST_STATE_NUM); 
 
#ifdef NO_ADD10_KEY 
  vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
  vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
 
  vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, OSD_DGST_SEL_HILI | 0); /* with hi-li */ 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDgstNumExit(BYTE bSelNo) large 
{ 
  vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, 0); /* without hi-li */ 
 
  if ((bSelNo > 0) && (bSelNo <= _rDigest.bSelNoMax)) 
  { 
    if (fgDgstPlayControl(SV_DGST_PLAY, bSelNo) == TRUE) 
    { 
      vDgstDispExit(); 
      vDgstMenuExit(FALSE); 
 
      /* note still in the same state */ 
      vSetExitInputState(); 
 
      return; 
    } 
  } 
 
  /* select fail */ 
  if ((_bIRKey == IR_UP) && (_rDigest.fgDispValid == TRUE)) 
  { 
    vDgstDispGotoItem(0); 
  } 
  else 
  { 
    vDgstMenuGotoItem(DGST_MENU_BTN_EXIT); 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDgstNumState(void) large 
{ 
  BOOL fgRetValue = TRUE; 
 
  switch (_bIRKey) 
  { 
    case IR_CLEAR: 
#ifdef NO_ADD10_KEY 
      vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
      vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
      vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, _rNumInStateCtx.wNum, OSD_DGST_SEL_HILI | 0); /* with hi-li */ 
      break; 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
    { 
      if (_rNumInStateCtx.rState.fgComplete) 
      { 
        if ((_rNumInStateCtx.wNum > 0) && 
            (_rNumInStateCtx.wNum <= _rDigest.bSelNoMax) && 
            (_rNumInStateCtx.rState.fgCancel == FALSE)) 
        { 
          vDgstNumExit(_rNumInStateCtx.wNum); 
        } 
        else 
        { 
          vDgstNumExit(0); 
        } 
      } 
      break; 
    } /* IR_ENTER */ 
 
    case IR_DONE: 
      /* ignore it */ 
      break; 
 
    default: 
    { 
      if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5)  // megaa ADD5 
      { 
        if (_rNumInStateCtx.rState.fgComplete) 
        { 
#ifdef NO_ADD10_KEY 
          vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
          vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
        } 
 
        fgNumInState(); 
 
        vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, _rNumInStateCtx.wNum, 
                               OSD_DGST_SEL_HILI | _rNumInStateCtx.rState.bDigNum); /* with hi-li */ 
      } 
      else /* > IR_ADD10 and not IR_ADD5 */ 
      { 
        vDgstNumExit(0); 
        fgRetValue = FALSE; 
      } 
      break; 
    } /* default */ 
  } /* switch (_bIRKey) */ 
 
  return (fgRetValue); 
} 
 
// ********************************************************************* 
// Module Entry Functions 
// ********************************************************************* 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDigestInit(BYTE fgInit) large 
{ 
  BYTE bPbcState = bSharedInfo(SI_PBC_STATE); 
  BYTE bDom = bSharedInfo(SI_DVD_DOM); 
 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC); 
#endif   
 
  /* TODO: need to check is play and in not menu */ 
  if (fgIsDiscPlay(bPbcState) || (bPbcState == SV_STOP_RESUME)) 
  { 
    if (fgIsDvdPlay()) 
    { 
      if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM)) 
      { 
        _rDigest.fgResume = TRUE; 
      } 
      else 
      { 
        _rDigest.fgResume = FALSE; 
      } 
    } 
#ifdef VCD_SUPPORT     
    else if (fgIsVcdPlay()) 
    { 
      if ((bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON) && 
          (bSharedInfo(SI_VCD_DOM) == SV_SELECT_LIST)) 
      { 
        _rDigest.fgResume = FALSE; 
      } 
      else 
      { 
        _rDigest.fgResume = TRUE; 
      } 
    } 
#endif     
  } 
  else 
  { 
    _rDigest.fgResume = FALSE; 
  } 
 
  /* set digest control mode */ 
  vSetSharedInfo(SI_USR_DIGEST_CTRL, SV_DGST_ONCE); 
 
  /* set hilight color */ 
  vSetHLCol(HL_1, 0x0000); /* green */ 
 
  /* initial sub-state */ 
  vDgstTypeInit(TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDigestExit(void) large 
{ 
  if (_rDigest.bState == DGST_STATE_TYPE) 
  { 
    vDgstTypeExit(); 
  } 
  else if ((_rDigest.bState == DGST_STATE_MENU) || (_rDigest.bState == DGST_STATE_DISP)) 
  { 
    /* let WB disappear quickly, disable is faster than delete */ 
    vOsdSetSt(OSD_ST_BURST); 
    vDisableWB(WB_DGST_DISP1); 
    vDisableWB(WB_DGST_DISP2); 
    vDisableWB(WB_DGST_DISP1A); 
    vDisableWB(WB_DGST_DISP2A); 
    vDisableWB(WB_DGST_MENU); 
    vOsdSetSt(OSD_ST_NML); 
    /* let WB disappear quickly end*/ 
 
    vDgstDispExit(); 
    vDgstMenuExit(TRUE); 
  } 
  else if (_rDigest.bState == DGST_STATE_EXIT) 
  { 
     vDeleteWB(WB_DGST_DISP1); 
     vDeleteWB(WB_DGST_DISP2); 
     vDeleteWB(WB_DGST_DISP1A); 
     vDeleteWB(WB_DGST_DISP2A); 
     vDeleteWB(WB_DGST_MENU); 
  } 
  else if (_rDigest.bState == DGST_STATE_NUM) 
  { 
    /* let WB disappear quickly, disable is faster than delete */ 
    vOsdSetSt(OSD_ST_BURST); 
    vDisableWB(WB_DGST_DISP1); 
    vDisableWB(WB_DGST_DISP2); 
    vDisableWB(WB_DGST_DISP1A); 
    vDisableWB(WB_DGST_DISP2A); 
    vDisableWB(WB_DGST_MENU); 
    vOsdSetSt(OSD_ST_NML); 
    /* let WB disappear quickly end*/ 
 
    vDgstDispExit(); 
    if (_rNumInStateCtx.rState.fgComplete) 
    { 
      /* number is selected OK */ 
      vDgstMenuExit(FALSE); 
    } 
    else 
    { 
      vDgstMenuExit(TRUE); 
    } 
  } 
 
  /* assume change color is disabled */ 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
 
  /* status recall, temp add */ 
  if (_rDigest.fgResume == TRUE) 
  { 
    vStatusDispRecall(); 
  } 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_STATIC); 
#endif   
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgDigestState(void) large 
{ 
  BOOL fgRet = TRUE; 
 
  /* sub-state function */ 
  switch (_rDigest.bState) 
  { 
    case DGST_STATE_TYPE: 
      fgRet = fgDgstTypeState(); 
      break; 
 
    case DGST_STATE_MENU: 
      fgRet = fgDgstMenuState(); 
      break; 
 
    case DGST_STATE_DISP: 
      fgRet = fgDgstDispState(); 
      break; 
 
    case DGST_STATE_INIT: 
      fgRet = fgDgstInitState(); 
      break; 
 
    case DGST_STATE_RESUME: 
      fgRet = fgDgstResumeState(); 
      break; 
 
    case DGST_STATE_NUM: 
      fgRet = fgDgstNumState(); 
      break; 
 
    default: 
      vSetExitInputState(); 
      return (TRUE); 
  } 
 
  if (fgRet == FALSE) 
  { 
    switch (_bIRKey) 
    { 
      case IR_DIGEST: 
      { 
        vSetExitInputState(); 
        fgRet = TRUE; 
        break; 
      } 
 
      default: 
#if 0 
        if (fgIsAVContrlKey(_bIRKey)) 
        { 
          /* pass the A/V control key */ 
          fgRet = FALSE; 
        } 
#else 
        fgRet = TRUE; /* not allow setup menu and A/V control key */ 
#endif 
        break; 
    } 
  } 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDigestHandleUpdate(BYTE bItem, BYTE bVal) large 
{ 
  switch (bItem) 
  { 
    case DGST_UPD_NO: 
      /* the page last item */ 
      if (bVal == (_rDigest.bPageNo * DGST_VIEW_NS + _rDigest.bPageItemMax - 1)) 
      { 
        _rDigest.fgDispValid = TRUE; 
      } 
      break; 
 
    default: 
      break; 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vDigestUsrPbcChange(void) large 
{ 
  if ((bSharedInfo(SI_USR_PBC_CTRL) != SV_USR_DIGEST) &&  
      (_rDigest.bState == DGST_STATE_EXIT)) 
  { 
    fgSetPlayPostKey(IR_TIME_OUT); 
  } 
} 
 
#else /* PLAYER_DIGEST dummy function */ 
 
static code BYTE pbDigestCodeSegment[1] = { FALSE }; /* for code segment */ 
 
void vDigestInit(BYTE fgInit) large { return; } 
 
BOOL fgDigestState(void) large { return (pbDigestCodeSegment[0]); } 
void vDigestExit(void) large { return; } 
 
void vDigestHandleUpdate(BYTE bItem, BYTE bVal) large { return; } 
void vDigestUsrPbcChange(void) large { return; } 
 
#endif /* PLAYER_DIGEST */