📄 vcd_main.c
字号:
VD_Stop();
VideoDecSetCmd ( VIDDEC_SENDER_APP, EV_VIDEO_DEC_SET_SEQ_HDR, SEQ_HDR_SET_NAVI );
VD_Resume();
break;
case EV_SENDER_DECODER:
Vcd_Emergency();
continue;
#if _SUPPORT_SOUTH_AMERICAN_DISC
case EV_SENDER_PLAY_2X:
S5H_Stop();
South_American_disc = TRUE;
Vcd_play(gVcdPlayStart, gVcdPlayEnd);
continue;
#endif /* _SUPPORT_SOUTH_AMERICAN_DISC */
//By MayMeng 051205 for Along(can not read disc):
case EV_SENDER_FECANNOTREAD:
Vcd_CanNotReadEmergency();
continue;
case EV_SENDER_GCDNAVI:
//gVcdCurrentState.pbc = TRUE;
//VcdFree(gVcdInfo);
//Vcd_GetDiskInfo();
Vcd_play(gVcdPlayStart, gVcdPlayEnd);
OsdMsgDsp(DSP_RETURN);
continue;
default:
#if 0
Vcd_HandleMsgFromRC(VcdMsg);
continue;
#else
if(RC_KEY_RECEIVED == VcdMsg.param)
{
switch(VcdMsg.ext1)
{
#if _SUPPORT_REPEAT_AB
case UOP_VCD_REPEAT_AB:
Vcd_HandleRepeatAB();
continue;
#endif
#if _VCD_SUPPORT_PROGRAM_RANDOM_
case UOP_VCD_PLAYMODE:
Vcd_PlayMode(&VcdMsg);
return;
#endif
#if _SUPPORT_PGM_RANDOM
#if SEPERATE_PGM_RAN
case UOP_VCD_PROG:
Vcd_HandleProgramKey();
//PHK PROGRAM TEST 20051102
continue;
case UOP_VCD_RAN:
Vcd_HandleRandomKey();
continue;
#else
case UOP_VCD_PLAYMODE:
Vcd_HandlePlaymode();
continue;
#endif/* SEPERATE_PGM_RAN */
#endif /* _SUPPORT_PGM_RANDOM */
#if _SUPPORT_INTRO_
case UOP_VCD_INTRO:
Vcd_HandleIntro();
// Vcd_HandleDigest();
continue;
#endif/* _SUPPORT_INTRO_ */
#if DIGEST_PREVIEW
case UOP_VCD_DIGEST:
#if YDF_PBCON_PREVIEW
Vcd_HandleDigest();
#else
if( PBC_PBCON == Vcd_GetPBCState())
{
OsdMsgDsp(DSP_PROHIBITION);
}
else
Vcd_HandleDigest();
#endif
continue;
#endif/* DIGEST_PREVIEW*/
#if _SUPPORT_REMAIN_TIME_
#endif/* _SUPPORT_REMAIN_TIME_ */
case UOP_PLAY:
Vcd_HandlePlay();
continue;
case UOP_PAUSE:
Vcd_HandlePause();
continue;
case UOP_STOP:
Vcd_HandleStop();
S5H_FEStop(); // pwc
continue;
//return;
case UOP_VCD_FORWARD_SCAN:
Vcd_HandleFF();
continue;
case UOP_VCD_BACKWARD_SCAN:
Vcd_HandleFR();
continue;
case UOP_VCD_SLOW:
Vcd_HandleSlow();
continue;
case UOP_VCD_STEP:
Vcd_HandleStep();
continue;
case UOP_VCD_ZOOM:
Vcd_HandleZoom();
continue;
case UOP_VCD_LEFT:
// Vcd_HandleLeft();
Vcd_HandlePan ( VP_PAN_LEFT );
continue;
case UOP_VCD_RIGHT:
// Vcd_HandleRight();
Vcd_HandlePan ( VP_PAN_RIGHT);
continue;
case UOP_VCD_UP:
// Vcd_HandleUp();
Vcd_HandlePan ( VP_PAN_UP);
continue;
case UOP_VCD_DOWN:
// Vcd_HandleDown();
Vcd_HandlePan ( VP_PAN_DOWN );
continue;
#if _SUPPORT_REMAIN_TIME_
case UOP_VCD_REMTIME:
//#if 1
if ((!bOsdOn) || ((Osdoff_rem) && (gVcdDisplayTime >= DISC_REMAIN_TIME)))
{
if(!bOsdOn)
{
bOsdOn = TRUE;
Osdoff_rem = TRUE;
}
else
{
Osdoff_rem = FALSE;
bOsdOn = FALSE;
gVcdDisplayTime--;
}
// #endif
osd_msg.mode = DSP_FOROSD;
if(bOsdOn)
osd_msg.control = CTRL_OSDON_TEST;
else
osd_msg.control = CTRL_OSDOFF_TEST;
SysSendMsg(&gQ_OSD, &osd_msg, sizeof(OsdMsg_t), SYS_NO_WAIT);
}
Vcd_HandleRemainTime();
if(!Osdoff_rem)
Vcd_PbcOff_HandleMsgFromDMA(); //when press REM key, updata time immediatly
continue;
#endif/* _SUPPORT_REMAIN_TIME_ */
#if _SUPPORT_FREEZE_
case UOP_VCD_FREEZE:
Vcd_HandleFreeze();
continue;
#endif/* _SUPPORT_FREEZE_ */
#if _SUPPORT_SCORE_
case UOP_VCD_SCORE:
#if _AUDIO_KARAOKE_
if(gEcho_level)
Vcd_HandleScore();
else
OsdMsgDsp(DSP_PROHIBITION);
#endif
continue;
#endif/* _SUPPORT_SCORE_ */
#if _SUPPORT_GOTO_
case UOP_VCD_GOTO:
if(bVcd_normal_end)//maymeng 051028
{
//bVcd_normal_end= FALSE;
OsdMsgDsp(DSP_GOTO);
OsdMsgDsp(DSP_STOP);
break;
}
Vcd_HandleGoto();
continue;
#endif/* _SUPPORT_GOTO_ */
}
}
#endif
}
//*******************************************
if( PBC_PBCON == Vcd_GetPBCState())
{
Vcd_PbcOn_HandleMsg(&VcdMsg);
}
else //VCD_PBCOFF
{
Vcd_PbcOff_HandleMsg(&VcdMsg);
}
}
}
}
void Vcd_HandleNotification(S5H_Notification_t type, void * data)
{
VCD_Msg VcdMsg;
extern UCHAR gVCD_DMAcounter;
switch(type)
{
case NOTIFICATION_ENDLBA:
Vcd_EndOfPlay();
break;
case NOTIFICATION_START_TIME :
VcdMsg.sender = EV_SENDER_DMA;
VcdMsg.param = BE_VCD_TIME;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
// SysPrintf("1");
break;
#if MAY_POWER_RESUME//maymeng 051011 added
#if 0
case NOTIFICATION_SAVE_RESUMEINFO :
VcdMsg.sender = EV_SENDER_SAVEINFO;
VcdMsg.param = BE_VCD_RESUME;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
// SysPrintf("2");
break;
#endif
#endif
case NOTIFICATION_EMERGENCY:
VcdMsg.sender = EV_SENDER_DECODER;
// VcdMsg.param = BE_VCD_TIME;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
break;
#if _SUPPORT_SOUTH_AMERICAN_DISC
case NOTIFICATION_PLAY_2X:
VcdMsg.sender = EV_SENDER_PLAY_2X;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
break;
#endif
//BY maymeng 051205 for ALong(can not read disc):
case NOTIFICATION_SERVO_CANNOT_READ:
VcdMsg.sender = EV_SENDER_FECANNOTREAD;
//VcdMsg.param = BE_VCD_TIME;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
break;
case NOTIFICATION_HIGH_STILL_PIC_ERR:
Vcd_play(gVcdPlayStart, gVcdPlayEnd);
break;
#if 0
case :
//from VBV Buffer, if finish decoding all data
break;
case :
//from VD, after decode one I-frame , this for FF, FR
//send msg to VCD_navi : VCD_PLAY_I_FRAME
break;
#endif
case NOTIFICATION_VIDDEC_USE_NAV_INFO:
VcdMsg.sender = EV_SENDER_VID_DEC;
// VcdMsg.param = BE_VCD_TIME;
SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT ); /* send msg to VCD navi */
break;
default:
break;
}
}
extern BOOL AVL_Get_Rec_Status(void);
extern ulong AVL_Emergency_MSF(void);
extern unsigned long gStill_picture;
UCHAR gEmerg_cnt =0;//maytest
ULONG Emerg1_save=0;//maytest
void Vcd_Emergency(void)
{
ULONG Emergmsf1;
S5H_MSF_t Emergmsf2;
UCHAR8 temp_trkno = (gVcdTrackInfo.CurrTrack_no);
//maymeng 051026 for emergency-playing problem in pause and step mode:
if((MAIN_PAUSE == Vcd_GetMainState())||(SUB2_TRICK_STEP == Vcd_GetSub2State()) )
return;
//end
if(AVL_Get_Rec_Status())
return;
Emergmsf1=AVL_Emergency_MSF();
if(Emerg1_save == Emergmsf1)//maytest
gEmerg_cnt++;
else
{
Emerg1_save = Emergmsf1;
gEmerg_cnt =1;
}
Emergmsf2.min=((Emergmsf1>>16)&0xff);
Emergmsf2.sec=((Emergmsf1>>8)&0xff);
Emergmsf2.frame=(Emergmsf1&0xff);
#if VCD_NAV_DEBUG
SysPrintf("Emergency!\n");
#endif
if (!gStill_picture )
{
if((PBC_DIGEST == Vcd_GetPBCState())||(PBC_INTRO == Vcd_GetPBCState())
||(SUB2_TRICK_STEP < Vcd_GetSub2State()))
{
if (MsfToLba(gVcdPlayStart)>MsfToLba(gVcdPlayEnd))
LbaToMsf((MsfToLba(Emergmsf2) -45), &gVcdPlayStart);
else
LbaToMsf((MsfToLba(Emergmsf2) + 30), &gVcdPlayStart);
}
else
{//maymeng 051223 for very bad disc
if( 1 == gEmerg_cnt)
LbaToMsf((MsfToLba(Emergmsf2) + 75), &gVcdPlayStart);
else
{
LbaToMsf((MsfToLba(Emergmsf2) + (75*(2*gEmerg_cnt-1))), &gVcdPlayStart);
gEmerg_cnt = 0;
}
}
//maymeng 051129 for continuous Emergency happened between the trks:
if(Vcd_OverTrackEndCheck(MsfToLba(gVcdPlayStart)))
{
if(temp_trkno == gVcdTrackInfo.Total_track_cnt)
{
if(SUB1_TRACK_REPEAT_ALL == Vcd_GetSub1State())
Vcd_UpdateTrackInfo(1);
else//BY MayMeng 051201
{
Vcd_HandleStop();
S5H_FEStop();
return;
}
}
else
{
temp_trkno ++;
Vcd_UpdateTrackInfo(temp_trkno);
}
gVcdPlayStart = gVcdTrackInfo.CurrTrack_startMSF;
gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;
}
}
Vcd_play(gVcdPlayStart, gVcdPlayEnd);
}
//BY maymeng 051205 for Along(can not read disc):
void Vcd_CanNotReadEmergency(void)
{
UCHAR8 temp_trkno = (gVcdTrackInfo.CurrTrack_no);
if(temp_trkno == gVcdTrackInfo.Total_track_cnt)
{
if(SUB1_TRACK_REPEAT_ALL == Vcd_GetSub1State())
{
Vcd_UpdateTrackInfo(1);
}
else
{
Vcd_HandleStop();
S5H_FEStop();
return;
}
}
else
{
temp_trkno ++;
Vcd_UpdateTrackInfo(temp_trkno);
}
gVcdPlayStart = gVcdTrackInfo.CurrTrack_startMSF;
gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;
Vcd_play(gVcdPlayStart, gVcdPlayEnd);
}
#if MAY_POWER_RESUME//maymeng 051011 added
extern UCHAR SL_readEepromByte( UCHAR addr );
extern void SL_writeEepromByte( UCHAR addr, UCHAR data );
extern volatile BYTE total_trk_counter;
extern volatile BYTE total_min;
extern volatile BYTE total_sec;
extern volatile BYTE total_frm;
/******************************************************************************
* Function name : Vcd_Save_ResumeInfo
* Arguments :
* IN
* OUT
* INOUT
* Return : void
* By : maymeng 051015
* Description : save the current vcd-playing-info to the eeprom
******************************************************************************
*/
void Vcd_Save_ResumeInfo(void)
{
if((VCD_DISC == GetDiscType())|| (CD_DA== GetDiscType()))
{
SL_writeEepromByte( EEPROM_PLAY_TRK, (UCHAR)gVcdTrackInfo.CurrTrack_no);
SL_writeEepromByte( EEPROM_PLAY_MIN, (UCHAR)gVcdCurSubQ.abs_msf.min);
SL_writeEepromByte( EEPROM_PLAY_SEC, (UCHAR)gVcdCurSubQ.abs_msf.sec);
//SL_writeEepromByte( EEPROM_PLAY_FRM, (UCHAR)gVcdCurSubQ.abs_msf.frame );
//Vcd_saveEepromValidId();
// #if VCD_NAV_DEBUG
// SysPrintf("SaveCnt = %2d \n",(UCHAR)gVcdTrackInfo.CurrTrack_no);
// #endif
}
}
/******************************************************************************
* Function name : Vcd_Load_ResumeInfo
* Arguments :
* IN
* OUT
* INOUT
* Return : void
* By : maymeng 051015
* Description : load the previous vcd-playing-info when getting-disc-info
******************************************************************************
*/
void Vcd_Load_ResumeInfo(void)
{
UCHAR i;
if((VCD_DISC == GetDiscType())|| (CD_DA== GetDiscType()))
{
i = SL_readEepromByte( EEPROM_PLAY_TRK);
Vcd_UpdateTrackInfo(i);
#if VCD_NAV_DEBUG
SysPrintf("LoadCnt = %2d \n",gVcdTrackInfo.CurrTrack_no);
#endif
gVcdResumeSubQ.abs_msf.min = SL_readEepromByte( EEPROM_PLAY_MIN);
gVcdResumeSubQ.abs_msf.sec = SL_readEepromByte( EEPROM_PLAY_SEC);
//gVcdResumeSubQ.abs_msf.frame = SL_readEepromByte( EEPROM_PLAY_FRM);
}
}
/******************************************************************************
* Function name : Vcd_saveEepromValidId
* Arguments :
* IN
* OUT
* INOUT
* Return : void
* By : maymeng 051015
* Description : save the valid id to eeprom
******************************************************************************
*/
void Vcd_saveEepromValidId( void )
{
BYTE1 index = 0;
for( index = 0; index < EEPROM_VALID_CHECK_COUNT; index++ )
SL_writeEepromByte( (UCHAR) (EEPROM_ADDRESS_VALID_CHECK+index),(UCHAR) (EEPROM_VALID_DATA_CHECK) );
/* EEPROM PARK */
SL_readEepromByte( EEPROM_ADDRESS_PARK );
}
/******************************************************************************
* Function name : Vcd_saveEepromValidId
* Arguments :
* IN
* OUT
* INOUT
* Return : BOOL
* By : maymeng 051015
* Description : do the check of eeprom valid id
******************************************************************************
*/
BOOL Vcd_checkEepromValidId( VOID )
{
BOOL ret_value = TRUE;
UCHAR temp;
BYTE1 index = 0;
for( index = 0; index < EEPROM_VALID_CHECK_COUNT; index++ )
{
temp = SL_readEepromByte( (UCHAR)(EEPROM_ADDRESS_VALID_CHECK + index) );
if( temp != EEPROM_VALID_DATA_CHECK )
{
ret_value = FALSE;
break;
}
}
/* EEPROM PARK */
SL_readEepromByte( EEPROM_ADDRESS_PARK );
return ret_value;
}
#endif//#if MAY_POWER_RESUME//maymeng 051011 end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -