www.pudn.com > 8032.RAR > fljview.c


/**********************************************************************/ 
/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/ 
/***************                                       ****************/ 
/***************  $Modtime:: 04/07/20 5:09p    $       ****************/ 
/***************  $Revision:: 21               $       ****************/ 
/***************                                       ****************/ 
/***************   Description : File List             ****************/ 
/***************                 JPEG & Digest module  ****************/ 
/***************                                       ****************/ 
/***************       Company : MediaTek Inc.         ****************/ 
/***************    Programmer : Jacob Lin             ****************/ 
/**********************************************************************/ 
/** 
 *          $(PROJ_HOME)/8032/custom/demo/fslist/fljview.c 
 * 
 *          Object JPEG viewer 
 */ 
#define __FLJVIEW_C__ 
 
#include "../general.h" 
#include "flspec.h" 
#include "flcomm.h" 
#include "flconfig.h" 
 
#pragma NOAREGS 
 
#ifdef PLAYER_FLMENU 
 
// MACRO DEFIMITIONS 
//  for _bFlJvOn 
#define FLJV_OBJ_MV         0x1 // - obj main video 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
#define FLJV_OBJ_DGTMN      0x2 // - obj digest menu 
#define FLJV_OBJ_HPMN       0x3 // - obj help menu 
//  for _bFlJvDgtMnOn 
#define FLJVDGTMN_OBJ_MN    0x1 // - object menu 
#define FLJVDGTMN_BTN_SS    0x2 // - btn "SLIDE SHOW" 
#define FLJVDGTMN_BTN_HP    0x3 // - btn "HELP" 
#define FLJVDGTMN_BTN_NT    0x4 // - btn "NEXT" 
#define FLJVDGTMN_BTN_PV    0x5 // - btn "PREV" 
#endif 
#define FLJV_MAX_TRANS_EFF  17 
#if 0 
#define FLJV_MAX_TRANS_EFF  16 
// #define FLJV_MAX_TRANS_EFF  17   // random 
#endif //0 
 
// GLOBAL VARIABLES 
//  focus control 
static xdata BYTE _bFlJvOn;         // - focus on obj of JVIEW 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
static xdata BYTE _bFlJvDgtMnOn;    // - focus on obj of DIGEST MENU 
//  digest menu control 
static xdata BYTE _bFlJvDgtItemIdx; // - digest item index 
#endif 
 
static xdata BYTE _bFlJvTransEff; // - the current transition effect. 
///*static*/ xdata BYTE _bFlJvDgtItemNs;  // - digest item number 
 
 
// MEMBER FUNCTIONS 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
//  utilities 
static void vFlJvDgtOn(void) large; 
static void vFlJvShowDgtMn(void) large; 
static void vFlJvBuryDgtMn(void) large; 
static void vFlJvDrawDgtBtns(BYTE bLangIdx) large; 
static void vFlJvDgtMnHil(void) large; 
static void vFlJvDgtMnMnHil(void) large; 
static WORD wFlJvGetDgtItemIdx(BYTE bItemIdx) large; 
#endif 
//  event handler 
//  sub-obj "JVIEW MV" 
static BOOL fgFlJvMvIrCmdDoneHdr(void) large; 
static BOOL fgFlJvOnIrSelDone(void) large; 
#ifndef GCY_EDIT 
static BOOL fgFlJvOnIrTransEff(void) large; 
#endif 
static BOOL fgFlJvOnIrPlay(void) large; 
static BOOL fgFlJvOnIrPause(void) large; 
 
 
//  sub-obj "JVIEW DIGEST MENU" 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
static BOOL fgFlJvDgtMnIrCmdDoneHdr(void) large; 
static void vFlJvDgtMnIrEnterHdr(void) large; 
static void vFlJvDgtMnIrDirHdr(void) large; 
static void vFlJvDgtMnMnIrDirHdr(void) large; 
static void vFlJvDgtMnBtnsIrDirHdr(void) large; 
#endif 
 
//  sub object state machine 
static BOOL fgFlJvOnMv(void) large; 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
static BOOL fgFlJvOnDgtMn(void) large; 
#endif 
static void vFlJvChgJpgState(BYTE bStt) large; 
 
static void vFlJvRetClickItem(void) large; 
 
/** 
 * Transition effect  
 */ 
struct _sTransEffect 
{ 
  BYTE  bCode; 
  WORD  wMsg; 
}; 
 
#if defined(TRANSITION_SPECIAL_EFFECT) 
#if 1 // - JACOB: enable new effect "dissolve" 
static code struct _sTransEffect _rFlJvTransEff[FLJV_MAX_TRANS_EFF] = { 
  {  2, OSD_MSG_WIPE_TOP }, 
  {  3, OSD_MSG_WIPE_BOTTOM }, 
  {  0, OSD_MSG_WIPE_LEFT }, 
  {  1, OSD_MSG_WIPE_RIGHT }, 
  {  4, OSD_MSG_DGL_WIP_LEFT_TOP }, 
  {  5, OSD_MSG_DGL_WIP_RIGHT_TOP }, 
  {  6, OSD_MSG_DGL_WIP_LEFT_BOTTOM }, 
  {  7, OSD_MSG_DGL_WIP_RIGHT_BOTTOM }, 
  {  8, OSD_MSG_EXTEND_FROM_CENTER_H }, 
  {  9, OSD_MSG_EXTEND_FROM_CENTER_V },    
  { 10, OSD_MSG_COMPRESS_TO_CENTER_H }, 
  { 11, OSD_MSG_COMPRESS_TO_CENTER_V }, 
  { 12, OSD_MSG_WINDOW_H }, 
  { 13, OSD_MSG_WINDOW_V }, 
  { 14, OSD_MSG_EDGE_TO_CENTER }, 
  { 26, OSD_MSG_MOVE_IN_FROM_TOP}, 
  { 0xFE,  OSD_MSG_NONE } 
}; 
#else 
static code struct _sTransEffect _rFlJvTransEff[FLJV_MAX_TRANS_EFF] = { 
  {  2, OSD_MSG_WIPE_TOP }, 
  {  3, OSD_MSG_WIPE_BOTTOM }, 
  {  0, OSD_MSG_WIPE_LEFT }, 
  {  1, OSD_MSG_WIPE_RIGHT }, 
  {  4, OSD_MSG_DGL_WIP_LEFT_TOP }, 
  {  5, OSD_MSG_DGL_WIP_RIGHT_TOP }, 
  {  6, OSD_MSG_DGL_WIP_LEFT_BOTTOM }, 
  {  7, OSD_MSG_DGL_WIP_RIGHT_BOTTOM }, 
  {  8, OSD_MSG_EXTEND_FROM_CENTER_H }, 
  {  9, OSD_MSG_EXTEND_FROM_CENTER_V },    
  { 10, OSD_MSG_COMPRESS_TO_CENTER_H }, 
  { 11, OSD_MSG_COMPRESS_TO_CENTER_V }, 
  { 12, OSD_MSG_WINDOW_H }, 
  { 13, OSD_MSG_WINDOW_V }, 
  { 14, OSD_MSG_EDGE_TO_CENTER }, 
  { 0xFE,  OSD_MSG_NONE }, 
#if (FLJV_MAX_TRANS_EFF == 17)      
  { 0xFF   OSD_MSG_RANDOM }, 
#endif 
}; 
#endif //0 
#endif /*#if defined(TRANSITION_SPECIAL_EFFECT)*/ 
 
/** 
 * Turn on the digest mode. 
 */ 
 #ifdef JPEG_DDISC_DIGEST_ENABLE 
void vFlJvDgtOn(void) large 
{ 
  if (bSharedInfo(SI_JPG_MODE) != JPEGMOD_DIGEST) 
  { 
    vClearWB(WB_OVERLAY_MSG1); 
    // - send the UOP_DIGEST to turn on the digest mode 
    vSendUopCmd(UOP_DIGEST, 0x0,  
                bSharedInfo(SI_JPG_ITEM_IDX_LO),  
                bSharedInfo(SI_JPG_ITEM_IDX_HI)); 
  } 
  else 
  { 
    //vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT); 
  } 
 
  return; 
} 
 
/** 
 * Show all visual components of the digest menu. 
 */ 
void vFlJvShowDgtMn(void) large 
{ 
  // - adjust the OSD component state 
  BYTE  i; 
   
  for (i=0; i<32; i++) 
    vDeleteWB(i); 
 
//  vCreateWBEx(WB_OVERLAY_MSG2); 
  vCreateWBEx(WB_OVERLAY_MSG1); 
  vCreateWBEx(WB_NORMAL_HEAD1); 
  vCreateWBEx(WB_NORMAL_HEAD2); 
    
  vCreateWBEx(FL_DGTMN_WB); 
  vEnableWB(FL_DGTMN_WB); 
     
  //vDisableWB(WB_NORMAL_VOL); 
  //vEnableWB(FL_DGTMN_WB); 
  vFlJvDrawDgtBtns(bEepromReadByte(OSD_LANG_POSITION)); 
   
  // - turn on the hilit select state 
  vSetSharedInfo(SI_HLI_STATE, SV_ON); 
 
  // - set the focus 
  _bFlJvOn = FLJV_OBJ_DGTMN; 
  _bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
 
  // - reset the item number counter and index 
  _bFlJvDgtItemIdx = 0; 
//  _bFlJvDgtItemNs = 0; 
 
  return; 
} 
#endif 
/** 
 * Recover the display of object "file list jpeg viewer". 
 */ 
void vFlJvRecover(void) large 
{ 
 
  // - resume jpg decoding 
  vSendUopCmd(UOP_PAUSE, 0x01, 0x02, 0x00); 
#ifdef JPEG_DDISC_DIGEST_ENABLE   
  vSetHLCol(FLDGTMN_HILIT, FLDGTMN_HILIT_COL);   
 
  if (bSharedInfo(SI_JPG_MODE) == JPEGMOD_DIGEST) 
  { 
    // - recover to digest menu 
    vDisableWB(WB_NORMAL_VOL); 
    vEnableWB(FL_DGTMN_WB); 
    //vShowWbHili(FL_DGTMN_WB, FLDGTMN_HILIT); 
    vFlJvDgtMnHil(); 
 
    // - draw the buttons on digest menu 
    vFlJvDrawDgtBtns(bEepromReadByte(OSD_LANG_POSITION)); 
  } 
  else  
#endif   
  if (bSharedInfo(SI_DISC_TYPE) == SV_PCD) 
  { 
    // - resume jpg decoding 
    //vSendUopCmd(UOP_PAUSE, 0x01, 0x02, 0x00); 
    //if (bSharedInfo(SI_JPG_STT) == JPEGSTT_DEC_STRT) 
      vFlUpdateVfd(TRUE); 
  } 
  else  
  { 
    // - do nothing here 
  } 
 
  return; 
} 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
/** 
 * Bury the digest menu (hide or disable all visual components of 
 *  digest menu). 
 */ 
void vFlJvBuryDgtMn(void) large 
{ 
  // - adjust the OSD component state 
  vHideHL(FLDGTMN_HILIT); 
  vDisableWB(FL_DGTMN_WB); 
 
  // - turn off the hilit selection mode 
  vSetSharedInfo(SI_HLI_STATE, SV_OFF); 
 
  // - the focus 
  _bFlJvOn = FLJV_OBJ_MV; 
 
  return; 
} 
 
/** 
 * Draw the buttons on the digest menu. 
 */ 
void vFlJvDrawDgtBtns(BYTE bLangIdx) large 
{ 
#ifndef SETUP_USE_TAB 
  // - draw bitmap for function buttons 
  if (bLangIdx == EV_OSD_CHINESE) 
  { 
    // - chinese version 
    vOsdPasteBmpXY(DGT_BTN_SS_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_SLIDESHOW_CH); 
    vOsdPasteBmpXY(DGT_BTN_HP_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_MENU_CH); 
    vOsdPasteBmpXY(DGT_BTN_PV_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_PREV_CH); 
    vOsdPasteBmpXY(DGT_BTN_NT_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_NEXT_CH); 
  } 
  else 
#endif 
  { 
    // - other language 
    vOsdPasteBmpXY(DGT_BTN_SS_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_SLIDESHOW); 
    vOsdPasteBmpXY(DGT_BTN_HP_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_MENU); 
    vOsdPasteBmpXY(DGT_BTN_PV_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_PREV); 
    vOsdPasteBmpXY(DGT_BTN_NT_L, DGT_BTN_T, 
                   FL_DGTMN_WB, BMP_NEXT); 
  } 
 
  return; 
} 
 
/** 
 * Hilit the activated item. (image item or function buttons) 
 */ 
void vFlJvDgtMnHil(void) large 
{ 
  if (_bFlJvOn != FLJV_OBJ_DGTMN) 
    return; 
 
  switch (_bFlJvDgtMnOn) 
  { 
  case FLJVDGTMN_OBJ_MN: 
    // - hilit the current item 
    vFlJvDgtMnMnHil(); 
    return; // - not yet 
  case FLJVDGTMN_BTN_PV: 
    _wStartX = DGT_BTN_PV_L; 
    _wEndX = _wStartX + DGT_BTN_PV_W; 
    _wStartY = DGT_BTN_T; 
    _wEndY = _wStartY + DGT_BTN_PV_H; 
    // - shift the border if for buttons 
    _wStartX -= DGT_BTN_HL_LB; 
    _wEndX += DGT_BTN_HL_RB;  
    break; 
  case FLJVDGTMN_BTN_NT: 
    _wStartX = DGT_BTN_NT_L; 
    _wEndX = _wStartX + DGT_BTN_NT_W; 
    _wStartY = DGT_BTN_T; 
    _wEndY = _wStartY + DGT_BTN_NT_H; 
    // - shift the border if for buttons 
    _wStartX -= DGT_BTN_HL_LB; 
    _wEndX += DGT_BTN_HL_RB;  
    break; 
  case FLJVDGTMN_BTN_HP: 
    _wStartX = DGT_BTN_HP_L; 
    _wEndX = _wStartX + DGT_BTN_HP_W; 
    _wStartY = DGT_BTN_T; 
    _wEndY = _wStartY + DGT_BTN_HP_H; 
    // - shift the border if for buttons 
    _wStartX -= DGT_BTN_HL_LB; 
    _wEndX += DGT_BTN_HL_RB;  
    break; 
  case FLJVDGTMN_BTN_SS: 
    _wStartX = DGT_BTN_SS_L; 
    _wEndX = _wStartX + DGT_BTN_SS_W; 
    _wStartY = DGT_BTN_T; 
    _wEndY = _wStartY + DGT_BTN_SS_H; 
    // - shift the border if for buttons 
    _wStartX -= DGT_BTN_HL_LB; 
    _wEndX += DGT_BTN_HL_RB;  
    break; 
  default: 
    // - error 
    return; 
  } 
 
  // - show hilit, and turn on the hilit select state 
  vShowWbHili(FL_DGTMN_WB, FLDGTMN_HILIT); 
  vSetHLRng(FLDGTMN_HILIT, FL_DGTMN_WB); 
 
  return; 
} 
 
/** 
 * Hilit the image item on digest menu. 
 */ 
void vFlJvDgtMnMnHil(void) large 
{ 
  if (_bFlJvDgtItemIdx >= (bSharedInfo(SI_THUMBNAIL_16_IDX_HI) + 1)) 
    return; 
 
#ifdef JPG_BUFFER_NTSC 
  //if (bSharedInfo(SI_TV_SYSTEM) != SV_PAL) 
  if (bSharedInfo(SI_NTSC_PAL) == SV_NTSC)  
#else   
  //if (bSharedInfo(SI_TV_SYSTEM) == SV_NTSC) 
  if (bSharedInfo(SI_NTSC_PAL) == SV_NTSC) 
#endif 
  { 
    // - for NTSC 
    WORD wWidth, wHeight; 
    BYTE bXDim, bYDim; 
 
    wWidth = DGT_ITEM_W; 
    wHeight = DGT_ITEM_H; 
 
    bXDim = _bFlJvDgtItemIdx % DGT_MN_X_DIM_NS; 
    bYDim = _bFlJvDgtItemIdx / DGT_MN_X_DIM_NS; 
 
    _wStartX = bXDim*(wWidth + DGT_ITEM_H_GAP) + DGT_ITEM_SX;// - HL_XB_SZ; 
    _wEndX = _wStartX + wWidth + 3 * HL_XB_SZ; 
    _wStartY = bYDim*DGT_ITEM_V_GAP + DGT_ITEM_SY - HL_YB_SZ; 
    _wEndY = _wStartY + wHeight + 2*HL_YB_SZ; 
 
    // - shift NTSC OSD offset 
    _wStartX += OSD_NTSC_H_OFST; 
    _wEndX += OSD_NTSC_H_OFST;       
  } 
  else 
  { 
    // - for PAL 
    DWRD dwTmpY, dwTmpY1; 
    BYTE bXDim, bYDim; 
     
    bXDim = _bFlJvDgtItemIdx % DGT_MN_X_DIM_NS; 
    bYDim = _bFlJvDgtItemIdx / DGT_MN_X_DIM_NS; 
 
    _wStartX = bXDim*(DGT_ITEM_W + DGT_ITEM_H_GAP) + DGT_ITEM_SX -  
      HL_PN_XOFST - HL_XB_SZ; 
    _wEndX = _wStartX + DGT_ITEM_W + 4*HL_XB_SZ; 
    dwTmpY = (DWRD)(bYDim*DGT_ITEM_V_GAP + DGT_ITEM_SY - HL_YB_SZ); 
    dwTmpY1 = (DWRD)(dwTmpY + DGT_ITEM_H + 2*HL_YB_SZ); 
    _wStartY = (WORD)((dwTmpY*HL_PN_YSUP)/HL_PN_YSDOWN) - HL_PN_YOFST; 
    _wEndY = (WORD)((dwTmpY1*HL_PN_YSUP)/HL_PN_YSDOWN) - HL_PN_YOFST; 
 
    // - shift PAL OSD offset 
    _wStartX += OSD_PAL_H_OFST; 
    _wEndX += OSD_PAL_H_OFST; 
  } 
 
  // - display the hilit 
  vSetHLRng(FLDGTMN_HILIT, 0xFF); 
  vShowHL(FLDGTMN_HILIT); 
 
  return; 
} 
 
/** 
 * Demo how to read the exe list index of image item on digest menu. 
 */ 
WORD wFlJvGetDgtItemIdx(BYTE bItemIdx) large 
{ 
  WORD wIdx; 
 
  if (bItemIdx >= (bSharedInfo(SI_THUMBNAIL_16_IDX_HI) + 1)) 
    return 0xFFFF; 
 
  bLoByte(wIdx) = bSharedInfo(SI_JPG_THUMBNAIL_START + 2*bItemIdx); 
  bHiByte(wIdx) = bSharedInfo(SI_JPG_THUMBNAIL_START + (2*bItemIdx+1)); 
   
  return wIdx; 
} 
 
/** 
 * Init Obj JVIEW. 
 */ 
 #endif //JPEG_DDISC_DIGEST_ENABLE  
BOOL fgFlJvInit(void) large 
{ 
  // - init UI component 
#ifndef WB_ALLOC_MIN 
  vCreateWB(FL_DGTMN_WB, TRUE); 
  vSetWBTcColor(FL_DGTMN_WB); 
  vDisableWB(FL_DGTMN_WB); 
 
  vSetTransEn(FL_DGTMN_WB, 0); 
   
  // - draw the buttons on digest menu 
  vFlJvDrawDgtBtns(bEepromReadByte(OSD_LANG_POSITION)); 
#endif 
 
  // - control flags 
  _bFlJvOn = FLJV_OBJ_MV; 
#if defined(TRANSITION_SPECIAL_EFFECT) 
  _bFlJvTransEff = 0; 
  vSetSharedInfo(SI_JPG_TRANSITION_EFFECT, _rFlJvTransEff[_bFlJvTransEff].bCode); 
#endif 
 
  return TRUE; 
} 
 
/** 
 * Leave the object (called when we try to move the focus away). 
 */ 
WORD wFlJvLeave(BOOL bSuicide) large 
{ 
  WORD  wItem; 
  if (_wCurrItem != 0xFFFF) 
    wItem = _wCurrItem; 
  else 
    wItem = (WORD)bSharedInfo(SI_JPG_ITEM_IDX_HI) * 256 + bSharedInfo(SI_JPG_ITEM_IDX_LO); 
 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC); 
#endif   
   
  // - 1. stop the decoding if the decoder is going 
#if 0 
  if (bSuicide) 
  { 
//    vSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, 0x0, 0x0); 
//    vFlMnSetUopRetJob(UOP_STOP, UOP_RET_CHG_CMDTGT); 
    vFlSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, UOP_RET_CHG_CMDTGT); 
  } 
#endif 
  if (bSuicide) 
  { 
    vSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, 0x0, 0x0); 
  } 
 
  // - 2. hide the hilit for digest menu 
  vHideHL(FLDGTMN_HILIT); 
   
  // - TOFIX: the index may be ambigous to reflect the current item 
  return (wItem); 
} 
 
/** 
 * Enter the object (called when we try to move the focus in). 
 */ 
void vFlJvEnter(WORD wItem) large 
{ 
#ifdef WB_ALLOC_MIN 
  #if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_STATIC); 
  #endif 
   
  vOsdShowWb(OSD_WB_RESET); 
 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
  vCreateWBEx(FL_DGTMN_WB); 
  vSetTransEn(FL_DGTMN_WB, 0); 
  // - draw the buttons on digest menu 
  vFlJvDrawDgtBtns(bEepromReadByte(OSD_LANG_POSITION)); 
#endif   
#endif   
    
  _rOsdStateCtx.bTimeType = OSD_SHOW_DISABLE; 
 
  //vEnableWB(WB_OVERLAY_MSG2); 
 
  // - set hilit color 
  vSetHLCol(FLDGTMN_HILIT, FLDGTMN_HILIT_COL); 
 
#if 1//(DRAM_SZ != DRAM_2M)  
  if (!fgIsInSetupMenu()) 
  { 
    vEnableWB(WB_NORMAL_HEAD1); 
    vEnableWB(WB_NORMAL_HEAD2); 
  } 
#endif 
 
#ifdef JPEG_DDISC_DIGEST_ENABLE   
  if (bSharedInfo(SI_JPG_MODE) == JPEGMOD_DIGEST) 
  { 
    vDisableWB(WB_NORMAL_VOL); 
    //vDeleteWB(WB_NORMAL_VOL); 
    vEnableWB(FL_DGTMN_WB); 
    vFlJvDgtMnHil(); 
  } 
#endif   
 
#if 1//defined(TRANSITION_SPECIAL_EFFECT) 
  // - set shared info to config RISC 
  vSetSharedInfo(SI_PREVIEW_MODE, FALSE); 
  vSetSharedInfo(SI_JPG_ROTATE_AUTO_SLIDE, (0x80|FL_JPEG_SLIDESHOW_INTERVAL)); 
  //vSetSharedInfo(SI_JPG_DIGEST_BG, 0x1); 
#endif   
  // - set the foreground module as JPEG DECODER 
  vFlCtrlSetFg(FLMD_JPEG_DECODER); 
  while(bSharedInfo(SI_DDISC_PB_MODULE) != SV_DDISC_MODULE_JPG); 
#ifdef SUPPORT_PCD 
  if (bSharedInfo(SI_DISC_TYPE) == SV_PCD) 
  { 
    if (bSharedInfo(SI_JPG_MODE) != JPEGMOD_DIGEST) 
    { 
      vSetSharedInfo(SI_PREVIEW_MODE, FALSE); 
      vSendUopCmd(UOP_PLAY, 0x0, 0x0, 0x0); 
    } 
 
    if (fgIsInSetupMenu()) 
    { 
      // - pause jpg decoding 
      vSendUopCmd(UOP_PAUSE, 0x01, 0x01, 0x00);  
      //vFsMenuFreezeDec(TRUE); 
    } 
  } 
#endif  
  _bFlVdoPbcStt = SV_PLAY; 
 
  if (_rFlCmdLock.bPath != FL_CMDPATH_SEL_1) 
  { 
    vFlClRls(); 
  } 
  return; 
} 
 
/** 
 * We send a click item command from object "jpeg viewer" and handle the 
 *  return here. 
 */ 
static void vFlJvRetClickItem(void) large 
{ 
  vFlCmdDone(); 
  vFlClRls(); 
 
  return; 
} 
 
/** 
 * Handle the JPEG state change notification. 
 */ 
static void vFlJvChgJpgState(BYTE bStt) large 
{ 
  WORD wIdx; 
  BYTE bMode; 
 
  // - get the index of the current item of JPEG module and  
  //    the operation mode 
  bLoByte(wIdx) = bSharedInfo(SI_JPG_ITEM_IDX_LO); 
  bHiByte(wIdx) = bSharedInfo(SI_JPG_ITEM_IDX_HI); 
  bMode = bSharedInfo(SI_JPG_MODE); 
   
  switch (bStt) 
  { 
    case JPEGSTT_DEC_STRT: 
      if ((bMode == JPEGMOD_NORMAL) || (bMode == JPEGMOD_SLIDESHOW)) 
      { 
#ifdef FLJV_SHOW_DEC_STATUS 
        vOsdPosShow(OSD_POS_PBC_2, OSD_MSG_JPG_DECODING, OSD_NO_DISAPPEAR); 
#endif 
        vFlUpdateVfd(FALSE); 
      } 
#ifdef JPEG_DDISC_DIGEST_ENABLE       
      else if (bMode == JPEGMOD_DIGEST) 
      { 
        if (_bFlJvDgtItemIdx == 0) 
        { 
          vFlJvDgtMnMnHil(); 
        } 
      } 
#endif       
      break; 
    case JPEGSTT_DEC_FSH: 
    case JPEGSTT_DEC_ABT: 
      if (bMode == JPEGMOD_NORMAL) 
      { 
#ifdef FLJV_SHOW_DEC_STATUS 
        vOsdPosShow(OSD_POS_PBC_2, OSD_MSG_JPG_DECODING, 1); 
#endif 
      } 
#ifdef JPEG_DDISC_DIGEST_ENABLE       
      else if (bMode == JPEGMOD_DIGEST) 
      { 
       // - TODO: do nothing here 
      } 
      break; 
#endif       
    case JPEGSTT_DEC_ERR: 
      break; 
    default: 
      // - wrong case 
      break; 
  } 
 
  return; 
} 
 
/** 
 * IR_CMD_DONE handler of "JVIEW MAIN VIDEO". 
 */ 
BOOL fgFlJvMvIrCmdDoneHdr(void) large 
{ 
  BYTE  bTemp; 
   
  if (FL_ACK(_dwIrDoneParm) == FL_CMD_ASSERT) 
  { 
    // - get file list command assertion here 
    switch(bSharedInfo(FL_CMD_BLK_SA)) 
    { 
      case FLCMD_CLICK_ITEM: 
        vFlJvRetClickItem(); 
        break; 
      default: 
        // - TODO: other case 
        break; 
    } 
  } 
  else 
  { 
    // - notification 
    switch (FL_ACK(_dwIrDoneParm)) 
    { 
      case SI_MP3_STT: 
        _fgFlMdChg = TRUE; 
        break; 
      case SI_JPG_STT: 
        vFlJvChgJpgState(FL_PARM1(_dwIrDoneParm)); 
        break; 
#ifdef JPEG_DDISC_DIGEST_ENABLE         
      case SI_JPG_MODE: 
        if (FL_PARM1(_dwIrDoneParm) == JPEGMOD_DIGEST) 
        { 
          vFlJvShowDgtMn(); 
        } 
        break; 
#endif         
      case SI_JPG_SLIDE_SHOW_DONE: 
#ifdef JPEG_DDISC_DIGEST_ENABLE             
        if (bSharedInfo(SI_DISC_TYPE) == SV_PCD) 
        { 
          // - for PCD, turn on digest mode 
          vFlJvDgtOn(); 
        } 
        else 
#endif          
        { 
          // - for DATA disc, stop the module totally and change command target 
          //  back to file menu 
          vSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, 0x0, 0x0); 
           
          //if (fgFlClLock(FL_CMDPATH_RPLC_CMDTGT))//cl 0512 test 
            vFlSetCmdTarget(FL_CMD_TARGET_MENU); 
        } 
        break; 
      case SI_DDISC_PB_MODULE: 
        break; 
  #ifdef FLJV_SHOW_ROTATE_PAN_MSG 
      case SI_JPG_ROTATE_PAN_ACK: 
        bTemp = bSharedInfo(SI_JPG_ROTATE_PAN_ACK); 
        if ((bTemp &0xF0) == 0x10) // JPG_ACK_ROTATING 
        { 
          vFlShowError(OSD_POS_ERROR, OSD_MSG_ROTATING, 4); 
        } 
        else 
        { 
          switch (bTemp & 0x0F) 
          { 
            case SV_UP: 
              vFlShowError(OSD_POS_ERROR, OSD_MSG_PAN_UP, 4);  
              break; 
            case SV_DOWN: 
              vFlShowError(OSD_POS_ERROR, OSD_MSG_PAN_DOWN, 4); 
              break; 
            case SV_LEFT: 
              vFlShowError(OSD_POS_ERROR, OSD_MSG_PAN_LEFT, 4); 
              break; 
            case SV_RIGHT: 
              vFlShowError(OSD_POS_ERROR, OSD_MSG_PAN_RIGHT, 4); 
              break; 
          } 
        } 
        break; 
  #endif 
      case FL_CMD_ASSERT: 
        // - "FS LIST" command ack, this should not happen here 
      default: 
        // - other notification and command ack. 
        return FALSE; 
    } 
  } 
 
  return TRUE; 
} 
 
static BOOL fgFlJvOnIrSelDone(void) large 
{ 
  WORD  wIdx; 
  WORD  wFldrNs; 
   
  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)) 
  { 
#if 0 
    if (fgIsPcdPlay()) 
    { 
      vFlCmdClickItem(_bFlMnListId, wIdx); 
    } 
    else 
#endif     
    { 
      wIdx--; 
#ifdef JPEG_DDISC_DIGEST_ENABLE       
      if (bSharedInfo(SI_JPG_MODE) == JPEGMOD_DIGEST) 
      { 
        if (wIdx > (bSharedInfo(SI_THUMBNAIL_16_IDX_HI))) 
          return TRUE; 
 
        wIdx = wFlJvGetDgtItemIdx(wIdx); 
      } 
#endif             
      _wCurrItem = wIdx; 
      _bFlMnCurItemIdx = wIdx % FLMN_ITEM_N; 
       
      if (fgFlClLock(FL_CMDPATH_SEL_0)) 
      { 
        fgFlCmdGetItems(_bFlMnListId, wIdx - _bFlMnCurItemIdx);//, FLCMD_RET_OP_SEL); 
      } 
    } 
//    vSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, 0x0, 0x0); 
    //vFlCmdClickItem(_bFlMnListId, wIdx, FLCMD_RET_OP_CMDACK); 
  } 
 
  return TRUE; 
} 
 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
/** 
 * IR_CMD_DONE handler of object "JVIEWER DIGEST MENU". 
 * 
 * RETURN: the return value indicates if we grabbed this IR. 
 */ 
BOOL fgFlJvDgtMnIrCmdDoneHdr(void) large 
{ 
  BYTE  bItemNs; 
   
  if (FL_ACK(_dwIrDoneParm) == FL_CMD_ASSERT) 
  { 
    // - get file list command assertion here 
    switch(bSharedInfo(FL_CMD_BLK_SA)) 
    { 
      case FLCMD_CLICK_ITEM: 
        vFlJvRetClickItem(); 
        break; 
      default: 
        // - TODO: other case 
        break; 
    } 
  } 
  else 
  { 
  switch (FL_ACK(_dwIrDoneParm)) 
  { 
    case SI_JPG_STT: 
      // - state of the JPEG module changed 
      if (FL_PARM1(_dwIrDoneParm) == JPEGSTT_DEC_STRT) 
      { 
        bItemNs = bSharedInfo(SI_THUMBNAIL_16_IDX_HI) + 1; 
        if (bItemNs == 1) 
        { 
          _bFlJvDgtItemIdx = 0; 
          _bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
          vFlJvDgtMnMnHil();  // - first time to hilit the item 
        } 
        // - read in the list index of the thumbnail item 
        //wFlJvGetDgtItemIdx(bItemNs - 1);       
  #if 0 
        // - when JPEG decoding starts under digest mode, increase the item 
        //    number counter 
        _bFlJvDgtItemNs ++; 
        //if (_bFlJvDgtItemNs == 1) 
        if ((_bFlJvDgtItemNs % DGT_MN_NS) == 1) 
          vFlJvDgtMnMnHil(); // - first tme to hilit the item 
        // - read in the list index of the thumbnail item 
        vFlJvDgtRdIdx(_bFlJvDgtItemNs - 1); 
  #endif 
      } 
      break; 
 
    case SI_JPG_MODE: 
      // - the module back from digest mode 
#ifdef JPEG_DDISC_DIGEST_ENABLE             
      if (FL_PARM1(_dwIrDoneParm) != JPEGMOD_DIGEST) 
      { 
        // - bury the menu 
        vFlJvBuryDgtMn(); 
        vEnableWB(WB_NORMAL_VOL); 
      } 
      break; 
#endif 
       
    case SI_JPG_SLIDE_SHOW_DONE: 
      // - slide show done 
      //vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT); 
      break; 
    case FL_CMD_ASSERT: 
      // - "FS LIST" command ack, this should not happen here 
    default: 
      // - other notification and command ack. 
      return FALSE; 
    } 
  } 
 
  return TRUE; 
} 
 
#if 0 // - JACOB: for backup 
BOOL fgFlJvDgtMnIrCmdDoneHdr(void) large 
{ 
  switch (FL_ACK(_dwIrDoneParm)) 
  { 
  case SI_JPG_STT: 
    // - state of the JPEG module changed 
    if (FL_PARM1(_dwIrDoneParm) == JPEGSTT_DEC_STRT) 
    { 
      // - when JPEG decoding starts under digest mode, increase the item 
      //    number counter 
      _bFlJvDgtItemNs ++; 
      if (_bFlJvDgtItemNs == 1) 
        vFlJvDgtMnMnHil(); // - first tme to hilit the item 
      // - read in the list index of the thumbnail item 
      vFlJvDgtRdIdx(_bFlJvDgtItemNs - 1); 
    } 
    break; 
  case SI_JPG_MODE: 
    // - the module back from digest mode 
    if (FL_PARM1(_dwIrDoneParm) != JPEGMOD_DIGEST) 
    { 
      // - bury the menu 
      vFlJvBuryDgtMn(); 
    } 
    break; 
  case SI_JPG_SLIDE_SHOW_DONE: 
    // - slide show done 
    //vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT); 
    break; 
  case FL_CMD_ASSERT: 
    // - "FS LIST" command ack, this should not happen here 
  default: 
    // - other notification and command ack. 
    return FALSE; 
  } 
 
  return TRUE; 
} 
#endif //0 
 
 
//////////////////////////////////////////////////////////////////////////////// 
// Jpeg View IR Key Handler 
 
/** 
 * IR_ENTER handlder of "JVIEWER DIGEST MENU". 
 */ 
void vFlJvDgtMnIrEnterHdr(void) large 
{ 
  switch (_bFlJvDgtMnOn) 
  { 
  case FLJVDGTMN_OBJ_MN: 
    // - select item from item menu 
    vSendUopCmd(UOP_DIGITAL_BTN, _bFlJvDgtItemIdx, 0x0, 0x0); 
    break; 
  case FLJVDGTMN_BTN_SS: 
    vSendUopCmd(UOP_PLAY, bSharedInfo(SI_THUMBNAIL_1_IDX_HI), bSharedInfo(SI_THUMBNAIL_1_IDX_LO), 0x00); 
    break; 
  case FLJVDGTMN_BTN_HP: 
    // - show help menu 
    vFlSetCmdTarget(FL_CMD_TARGET_HELP); 
    //vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT); 
    break; 
  case FLJVDGTMN_BTN_NT: 
    //_bFlJvDgtItemIdx = 0; 
    //_bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
    vSendUopCmd(UOP_NEXT, 0x0, 0x0, 0x0); 
    break; 
  case FLJVDGTMN_BTN_PV: 
    //_bFlJvDgtItemIdx = 0; 
    //_bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
    vSendUopCmd(UOP_PREVIOUS, 0x0, 0x0, 0x0); 
    break; 
  default: 
    // - error handling 
    break; 
  } 
 
  return; 
} 
#endif //JPEG_DDISC_DIGEST_ENABLE 
/** 
 * General IR_TRANS_EFF handler of "JVIEW and JVIEW DIGEST MENU". 
 */ 
#ifndef GCY_EDIT 
static BOOL fgFlJvOnIrTransEff(void) large 
{ 
#if defined(TRANSITION_SPECIAL_EFFECT) 
   _bFlJvTransEff = (++_bFlJvTransEff) % FLJV_MAX_TRANS_EFF; 
  vSetSharedInfo(SI_JPG_TRANSITION_EFFECT, _rFlJvTransEff[_bFlJvTransEff].bCode); 
  vFlShowError(OSD_POS_ERROR, _rFlJvTransEff[_bFlJvTransEff].wMsg, 4); 
#endif 
  return TRUE; 
} 
#endif 
 
static BOOL fgFlJvOnIrPlay(void) large 
{ 
  //if (bSharedInfo(SI_PBC_STATE) == SV_PAUSE) 
  if (_bFlVdoPbcStt == SV_PAUSE) 
  { 
    vSendUopCmd(UOP_PLAY, 0x00, bSharedInfo(SI_JPG_ITEM_IDX_LO), bSharedInfo(SI_JPG_ITEM_IDX_HI)); 
    _bFlVdoPbcStt = SV_PLAY ;   //nicle[04\07\27] fix jpeg pause once, can't pause anymore. 
  } 
 
  return TRUE; 
} 
 
/** 
 * IR_PAUSE handler of "JVIEW". 
 * 
 * NOTE: PCD only. to stop the slide show but do _NOT_ show digest. 
 */ 
static BOOL fgFlJvOnIrPause(void) large 
{ 
#ifdef FLJV_PAUSE_PLAY_SHOW_NEXT 
  WORD  wIdx, wTotal; 
#endif 
#if defined(SOPPORT_PCD) 
  if (fgIsInputStateValid(INPUT_STATE_PCD_ZOOM)) 
  { 
    vFlShowError(OSD_POS_ERROR, OSD_MSG_ERROR, OSD_TIMEOUT_SHORT);  
    return TRUE; 
  }   
#endif   
  if (_bFlVdoPbcStt == SV_PAUSE) 
  { 
/*#ifdef FLJV_PAUSE_PLAY_SHOW_NEXT 
    wIdx = (WORD) bSharedInfo(SI_JPG_ITEM_IDX_HI) * 256 + (WORD) bSharedInfo(SI_JPG_ITEM_IDX_LO); 
    // todo : check if wIdx is the last picture 
    wIdx ++; 
    vSendUopCmd(UOP_PLAY, 0x00, bLoByte(wIdx), bHiByte(wIdx)); 
#else 
    vSendUopCmd(UOP_PLAY, 0x00, bSharedInfo(SI_JPG_ITEM_IDX_LO), bSharedInfo(SI_JPG_ITEM_IDX_HI)); 
#endif 
    _bFlVdoPbcStt = SV_PLAY;*/  //nicle[04\07\22]  pr18 
    return TRUE; 
  } 
  //else if (bSharedInfo(SI_PBC_STATE) == SV_PLAY) 
  else if (_bFlVdoPbcStt == SV_PLAY) 
  { 
    vSendUopCmd(UOP_PAUSE, 0x0, 0x0, 0x0); 
    _bFlVdoPbcStt = SV_PAUSE; 
    return TRUE; 
  } 
 
  return FALSE; 
} 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
/** 
 * IR_DIR (LEFT, RIGHT, UP and DOWN) handler of "JVIEW DIGEST MENU". 
 */ 
void vFlJvDgtMnIrDirHdr(void) large 
{ 
  switch (_bFlJvDgtMnOn) 
  { 
  case FLJVDGTMN_OBJ_MN: 
    vFlJvDgtMnMnIrDirHdr(); 
    break; 
  case FLJVDGTMN_BTN_SS: 
  case FLJVDGTMN_BTN_HP: 
  case FLJVDGTMN_BTN_NT: 
  case FLJVDGTMN_BTN_PV: 
    vFlJvDgtMnBtnsIrDirHdr(); 
    break; 
  default: 
    // - error handling 
    break; 
  } 
 
  return; 
} 
 
/** 
 * IR_DIR (LEFT, RIGHT, UP and DOWN) handler of "JVIEW DIGEST MENU ITEM MENU". 
 * 
 * NOTE: Adjust the global variable _bFlJvDgtItemIdx to indicate 
 *   the current item. 
 */ 
void vFlJvDgtMnMnIrDirHdr(void) large 
{ 
  BYTE  bItemNs = bSharedInfo(SI_THUMBNAIL_16_IDX_HI) + 1;  
   
  switch (_bIRKey) 
  { 
  case IR_RIGHT: 
    // - move to next right item 
    _bFlJvDgtItemIdx ++; 
    if ((_bFlJvDgtItemIdx % DGT_MN_X_DIM_NS) == 0) 
      _bFlJvDgtItemIdx -= DGT_MN_X_DIM_NS; 
    else if (_bFlJvDgtItemIdx >= bItemNs) 
      _bFlJvDgtItemIdx -= (bItemNs % DGT_MN_X_DIM_NS); 
    break; 
  case IR_LEFT: 
    // - move to next left item 
    _bFlJvDgtItemIdx = ((_bFlJvDgtItemIdx % DGT_MN_X_DIM_NS) == 0) ?  
      (_bFlJvDgtItemIdx + (DGT_MN_X_DIM_NS - 1)) :  
        (_bFlJvDgtItemIdx - 1); 
    if (_bFlJvDgtItemIdx >= bItemNs) 
      _bFlJvDgtItemIdx = bItemNs -1; 
      //_bFlJvDgtItemIdx -= (DGT_MN_NS - bItemNs); 
    break; 
  case IR_UP: 
    // - move to upper item 
    if (_bFlJvDgtItemIdx < DGT_MN_X_DIM_NS) // - first row 
      // - move to function buttons 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_SS; 
    else 
      _bFlJvDgtItemIdx -= DGT_MN_X_DIM_NS; 
    break; 
  case IR_DOWN: 
    // - move to lower item 
    if ((_bFlJvDgtItemIdx + DGT_MN_X_DIM_NS) >= bItemNs) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_SS; 
    else 
      _bFlJvDgtItemIdx += DGT_MN_X_DIM_NS; 
    break; 
  default: 
    // - this should _NOT_ happen 
    return; 
  } 
 
  vFlJvDgtMnHil(); 
 
  return; 
} 
 
/** 
 * IR_DIR (LEFT, RIGHT, UP and DOWN) handler of "JVIEW DIGEST MENU BUTTONS". 
 */ 
void vFlJvDgtMnBtnsIrDirHdr(void) large 
{ 
  switch (_bIRKey) 
  { 
  case IR_RIGHT: 
    // - move the next button 
    if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_SS) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_HP; 
    else if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_HP) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_PV; 
    else if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_PV) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_NT; 
    else 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_SS; 
    break; 
  case IR_LEFT: 
    // - move to previous button 
    if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_SS) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_NT; 
    else if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_HP) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_SS; 
    else if (_bFlJvDgtMnOn == FLJVDGTMN_BTN_PV) 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_HP; 
    else 
      _bFlJvDgtMnOn = FLJVDGTMN_BTN_PV; 
    break; 
  case IR_UP: 
  case IR_DOWN: 
  default: 
    // - move to menu 
    _bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
    break; 
  } 
 
  vFlJvDgtMnHil(); 
 
  return; 
} 
#endif 
/** 
 * Focus on object "MAIN VIDEO - JVIEWER". 
 */ 
BOOL fgFlJvOnMv(void) large 
{ 
  BOOL fgIsGrabbed = TRUE; 
 
#ifndef JPEG_DDISC_DIGEST_ENABLE 
 // if (bSharedInfo(SI_DISC_TYPE) != SV_PCD)//oneway 
  { 
    if (_bIRKey == IR_STOP) 
      _bIRKey = IR_ROOT_MENU; 
  } 
#endif 
#if 0//oneway 
  if (bSharedInfo(SI_DISC_TYPE) == SV_PCD) 
  { 
    if (_bIRKey == IR_ROOT_MENU) 
      _bIRKey = IR_STOP; 
  } 
#endif 
 
  switch (_bIRKey) 
  { 
  case IR_CMD_DONE: 
    fgIsGrabbed = fgFlJvMvIrCmdDoneHdr(); 
    break; 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
  case IR_STOP: 
    // - turn on digest menu 
    vFlJvDgtOn(); 
    break; 
#endif     
#if 0 
  case IR_LEFT: 
  case IR_RIGHT: 
  case IR_UP: 
  case IR_DOWN: 
    fgIsGrabbed = FALSE; 
    break; 
#endif 
  case IR_NEXT: 
    vSendUopCmd(UOP_NEXT, 0, 0, 0); 
    break; 
  case IR_PREV: 
    vSendUopCmd(UOP_PREVIOUS, 0, 0, 0); 
    break; 
  case IR_ROOT_MENU: 
    // - back to file menu state 
    fgIsGrabbed = TRUE; 
    // - stop the JPEG module and turn back to "PBC_STOP_STATE" 
    //      the JPEG module will go back to background and 
    //      we will get the PB_MODULE notification 
    //vSendUopCmd(UOP_STOP, SV_JPG_STOP_ALL_STATE, 0x0, 0x0); 
    if (fgFlClLock(FL_CMDPATH_RPLC_CMDTGT)) 
      vFlSetCmdTarget(FL_CMD_TARGET_MENU); 
    //vFlCtrlRefocus(IR_ROOT_MENU); 
    break; 
  case IR_PROGRAM: 
#if 1//(DRAM_SZ == DRAM_4M) 
 // case IR_ZOOM_IN: 
 //   vFlShowError(OSD_POS_ERROR, OSD_MSG_ERROR, OSD_TIMEOUT_SHORT);   
 //   fgIsGrabbed = TRUE; 
#else 
    fgIsGrabbed = fgFlJvOnIrTransEff(); 
    vOsdShowError(SV_ERR_INVALID_OPERATION, OSD_TIMEOUT_SHORT); 
    break; 
#endif     
  case IR_PLAY_ENTER: 
  case IR_PLAY: 
  case IR_ENTER: 
  case IR_PLAY_PAUSE: 
    fgIsGrabbed = fgFlJvOnIrPlay(); 
    break; 
  case IR_PAUSE: 
    fgIsGrabbed = fgFlJvOnIrPause(); 
    break; 
  case IR_MUTE: 
  case IR_FF: 
  case IR_FR: 
    #if 1//def JPG_INFO 
    vFlShowError(OSD_POS_ERROR, OSD_MSG_ERROR, OSD_TIMEOUT_SHORT);   
    #endif 
/* 
    if (bSharedInfo(SI_DISC_TYPE) == SV_PCD) 
      vFlShowError(OSD_POS_ERROR, SV_ERR_DISC_NOT_SUPPORT, OSD_TIMEOUT_SHORT); 
    else 
      vFlShowError(OSD_POS_ERROR, SV_ERR_GENERAL, OSD_TIMEOUT_SHORT); 
*/ 
    fgIsGrabbed = TRUE; 
    break; 
  case IR_SELECT_DONE: 
    fgIsGrabbed = fgFlJvOnIrSelDone(); 
    break; 
  case IR_DISPLAY: 
    break; 
  default: 
    fgIsGrabbed = FALSE; 
    break; 
  } 
 
  return fgIsGrabbed; 
} 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
/** 
 * Focus on JVIEW digest menu. 
 */ 
BOOL fgFlJvOnDgtMn(void) large 
{ 
  BOOL fgIsGrabbed = TRUE; 
 
  switch (_bIRKey) 
  { 
  case IR_CMD_DONE: 
    fgIsGrabbed = fgFlJvDgtMnIrCmdDoneHdr(); 
    break; 
  case IR_PLAY: 
  case IR_ENTER: 
  case IR_PLAY_ENTER:   
  case IR_PLAY_PAUSE:   
    vFlJvDgtMnIrEnterHdr(); 
    break; 
  case IR_SELECT_DONE: 
    fgIsGrabbed = fgFlJvOnIrSelDone(); 
    break; 
  case IR_STOP: 
    break; 
  case IR_LEFT: 
  case IR_RIGHT: 
  case IR_UP: 
  case IR_DOWN: 
    vFlJvDgtMnIrDirHdr(); 
    break; 
  case IR_NEXT: 
  case IR_PREV: 
    //_bFlJvDgtItemIdx = 0; 
    //_bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
    fgIsGrabbed = FALSE; 
    break; 
  case IR_ROOT_MENU: 
    if (bSharedInfo(SI_DISC_TYPE) != SV_PCD) 
    { 
      if (fgFlClLock(FL_CMDPATH_RPLC_CMDTGT)) 
      { 
        vFlSetCmdTarget(FL_CMD_TARGET_MENU); 
      } 
    } 
    else 
    { 
      vFlShowError(OSD_POS_ERROR, OSD_MSG_ERROR, OSD_TIMEOUT_SHORT); 
    }   
    break; 
  default: 
    fgIsGrabbed = FALSE; 
    break; 
  } 
 
  return fgIsGrabbed; 
} 
#endif 
/** 
 * IR dispatcher when the focus is on the object. 
 */ 
BOOL fgFlOnJv(void) large 
{ 
  BOOL fgIsGrabbed; 
 
  switch (_bFlJvOn) 
  { 
  case FLJV_OBJ_MV: 
    fgIsGrabbed = fgFlJvOnMv(); 
    break; 
#ifdef JPEG_DDISC_DIGEST_ENABLE     
  case FLJV_OBJ_DGTMN: 
    fgIsGrabbed = fgFlJvOnDgtMn(); 
    break; 
#endif     
  default: 
    fgIsGrabbed = FALSE; 
    break; 
  } 
 
  // - the second level handler 
  if (fgIsGrabbed == FALSE) 
  { 
    switch (_bIRKey) 
    { 
    case IR_CMD_DONE: 
      fgIsGrabbed = TRUE; 
      break; 
    default: 
      // - keep the fgIsGrabbed as "FALSE" to pass the IRs 
      break; 
    } 
  } 
 
  return fgIsGrabbed; 
} 
#ifdef JPEG_DDISC_DIGEST_ENABLE 
void vFlJvChgLang(BYTE bLang) large 
{ 
  vFlJvDrawDgtBtns(bLang); 
} 
#endif 
#if 0 
void vFlJvHandleUopRet(BYTE bUopId) large 
{ 
  if (_bFlWaitUopRet == bUopId) 
  { 
    switch(bUopId) 
    { 
       
      case UOP_NEXT: 
      case UOP_PREVIOUS: 
//        _bFlJvDgtItemIdx = 0; 
//        _bFlJvDgtMnOn = FLJVDGTMN_OBJ_MN; 
        break; 
 
/* 
      case UOP_STOP: 
        switch (_bFlUopRetJob) 
        { 
        } 
        break; 
*/ 
    } 
  } 
} 
#endif 
 
#endif  // #ifdef PLAYER_FLMENU