📄 monitor.c
字号:
if (_dwMONProc2PCWrongCnt >= MONITOR_RESET_PROC2_CNT) { printf("\nGo H/W Reset Audio Stage by PC Worng %lx times",_dwMONTemp2,MONITOR_RESET_PROC2_CNT); _dwMONFailCounter = MONITOR_FAIL_CHECT_TIMES+3; _dwMONOKCounter = 0; _dwMONProc2PCWrongCnt = 0; } } >>>*/ } if (_dwMONFailCounter >= MONITOR_FAIL_CHECT_TIMES) { // wyc1.10-909, when video remainder is not empty and REG_VLD_MBINT_CTL keep in 0x00001c08 more than 10 times. // Then it mean MPEG dec can't exit the infinite loop and monitor need to force mpegdec break the loop. // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4; // wyc1.20-909, found one case video buffer will keep in video remainder 0x10, so check with KC and he said when video // buffer remainder is more than 6, then decoder will cont decode until less or equal 5. So choose 6 mean video buffer is not // empty and is safe for this mechanism to force decoder entering STOP mode. if ((_dwMONTempRem >= 6) && (_dwMONMDecHangCnt >= 10) && (__bModePlay == MODE_PLAYMOTION)) { _dwMONMDecHangCnt = 0; // __dwPlayMode = MODE_STOP; REG_SRAM_PLAYMODE = MODE_STOP; DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nForce MPEGDEC Enter STOP!"); } // wyc2.17-909S, make recover checking always on when debug mode for fixing video hang in state mechine problem. // the action stage only do in ERROR_CONCEAL defined to avoid un-expected action in #ifdef ERROR_CONCEAL _MONITOR_ReadAudioRem(&_dwMONTempRem1); // video buffer empty and parser just read bits about 1.8s, mean it maybe still picture and don't do error concealment. // wyc1.10-909, when tiem of chapter is less in title domain, mean it maybe still and don't need to do error concealment.#ifndef NO_DISC_MODE //CoCo2.37p if ((_dwMONTempRem < 0x20) && (_dwMONTempRem1<=0) && (__wTimeChapter <= 5)&& (__wTimeTitle <= 10) && (__dwSeqEndCode == TRUE) && (__bModePlay != MODE_PLAYAUDIO) && (__wDiscType & BOOK_DVD)) { // wyc1.10-909, when video almost empty and chapter time is less than 3s. It almost same as still picture and suggest don't need to do error concealment. { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nCancel Recover Action!"); _dwMONFailCounter = 0; } } else#endif //#ifndef NO_DVD //CoCo2.37p { _dwMONFailCounter = 0; _dwMONGoNextStage = TRUE; // elmer2.36, CVD issues if ((__wDiscType & BOOK_2X) && (_dwMONSPCounter >= MONITOR_FAIL_CHECT_TIMES)) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR, "\nCVD in only SP mode!"); _dwMONNextStage = RECOVER_STAGE_NEXT_ITEM; _dwMONSPCounter = 0; } }#endif // }#ifdef ERROR_CONCEAL if (_dwMONOKCounter >=MONITOR_OK_CHECT_TIMES) { _dwMONOKCounter = 0; __dwMONRecoverStage = RECOVER_STAGE_IDLE; _dwMONNextStage = RECOVER_STAGE_SW_RESET; _dwMONRecoverCnt = MONITOR_RETRY_COUNT; _bMaxNextTimes = 0; }#endif // }}#ifdef CT950_STYLEDWORD _dwTimer;extern BYTE __bUSBSRCReadError[MAX_STREAM_COUNT];extern DWORD __dwMMJPGCount, __dwMMPreJPGCount;extern BYTE __bMMJPEGAudioMode;extern DWORD __dwFMJPGShowTime;DWORD __dwAudioFailCnt, __dwVideoFailCnt;BYTE _bAudioReset = FALSE, _bVideoReset = FALSE, _bAllReset = FALSE;BYTE _bAudioResetOK = TRUE, _bVideoResetOK = TRUE, _bAllResetOK = TRUE;DWORD _dwMONPrePCMRem, _dwMONPCMRem;void MONITOR_CheckDMPHang(void){ BYTE bTemp; if (!__btPlaying) return; for (bTemp = 0; bTemp < MAX_STREAM_COUNT; bTemp++) { if (__bUSBSRCReadError[bTemp] == TRUE) { __bUSBSRCReadError[bTemp] = FALSE; // JPEG + MUSIC mode if (__bMMJPEGAudioMode == TRUE) { if (bTemp == 1) // MUSIC __dwAudioFailCnt++; else // JPEG __dwVideoFailCnt++; PRINTF("MONITOR: Data Read Error on Stream %d\n", bTemp); } } else { if (__bAttrPlay & TYPE_CDROM_AUDIO) _bAudioReset = TRUE, _bAudioResetOK = FALSE, __dwAudioFailCnt++; if (__bAttrPlay & TYPE_CDROM_VIDEO) _bVideoReset = TRUE, _bVideoResetOK = FALSE, __dwVideoFailCnt++; PRINTF("MONITOR: Data Read Error\n"); } } if (_bAllResetOK && _bAudioResetOK && (__bAttrPlay & TYPE_CDROM_AUDIO || __bMMJPEGAudioMode == TRUE)) { _MONITOR_ReadAudioRem(&_dwMONTempRem); _dwMONPCMRem = MCU_PCM_BUF_REMAINDER; if (_dwMONPreARemain == _dwMONTempRem || _dwMONPrePCMRem == _dwMONPCMRem) { if (!(_dwMONFailCounter++ % 10)) PRINTF("MONITOR: Audio Rem Hold %lx\n", _dwMONFailCounter); if (_dwMONFailCounter == 30) { PRINTF("MONITOR: Recover Audio Hold ...\n"); _dwMONFailCounter = 0; __dwAudioFailCnt++; _bAudioReset = TRUE; _bAudioResetOK = FALSE; } } else { _bAudioReset = FALSE; _bAudioResetOK = TRUE; _dwMONPreARemain = _dwMONTempRem; _dwMONPrePCMRem = _dwMONPCMRem; _dwMONFailCounter = 0; __dwAudioFailCnt = 0; } } if (_bAllResetOK && _bVideoResetOK && (__bAttrPlay & TYPE_CDROM_VIDEO)) { if ((OS_GetSysTimer() - _dwTimer) > __dwFMJPGShowTime * COUNT_1_SEC) { if (__dwMMJPGCount == __dwMMPreJPGCount) { if (!(_dwMONFailCounter2++ % 2)) PRINTF("MONITOR: Video Rem Hold %lx\n", _dwMONFailCounter2); if (_dwMONFailCounter2 > 10) { PRINTF("MONITOR: Recover Video Hold ...\n"); _dwMONFailCounter2 = 0; _bVideoReset = TRUE; _bVideoResetOK = FALSE; } } else { _bVideoReset = FALSE; _bVideoResetOK = TRUE; __dwMMPreJPGCount = __dwMMJPGCount; _dwMONFailCounter2 = 0; __dwVideoFailCnt = 0; } _dwTimer = OS_GetSysTimer(); } } if (_bAllResetOK && (((__dwAudioFailCnt + __dwVideoFailCnt) > 20 || __dwAudioFailCnt > 10 || __dwVideoFailCnt > 10))) { _bAudioResetOK = FALSE; __dwAudioFailCnt = __dwVideoFailCnt = 0; _bVideoReset = _bAudioReset = FALSE; _bVideoResetOK = _bAudioResetOK = TRUE; _bAllReset = TRUE; }}#endif // CT950_STYLE#endif // ERROR_CONCEAL#ifdef ERROR_CONCEAL#ifdef SUPPORT_STBvoid MONITOR_CheckDVBHang(void){ if(DVB_GetAudioVideoPause() == FALSE && __btPlaying == TRUE && b8InstantReplayStatus == FALSE) { if( DVB_AudioGetPID() != 0) { _MONITOR_ReadAudioRem(&_dwMONTempRem); if (_dwMONPreARemain == _dwMONTempRem) { _dwMONOKCounter = 0; if (ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_RADIO) { _dwInterFailCnt++; _dwMONFailCounter+=2; if ((_dwMONFailCounter % 6) == 2) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } else { _dwInterFailCnt++; _dwMONFailCounter++; if ((_dwMONFailCounter % 3) == 1) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } } else { __bHangCnt = 0; __bNoService = FALSE; _dwMONOKCounter++; _dwMONFailCounter = 0; _dwMONPreARemain = _dwMONTempRem; } } if (ap_ch_get_current_srv_type() != EN_SERVICE_TYPE_RADIO && DVB_VideoGetPID() != 0) { _dwMONTempRem = REG_VLD_MBINT_CTL; if ((_dwMONMDecChkHang == _dwMONTempRem) && (((_dwMONTempRem & 0x00004000)==0x00004000) || ((_dwMONTempRem & 0x00001800)==0x00001800) || ((_dwMONTempRem & 0x00007800)==0x00007800) )) _dwMONMDecHangCnt++; else _dwMONMDecHangCnt=0; _dwMONMDecChkHang = REG_VLD_MBINT_CTL; // wyc2.03-909S // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4; if ( _dwMONTempRem == 0) { _dwInterFailCnt++; _dwMONFailCounter += 5; if ((_dwMONFailCounter % 3) == 1) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S V_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } else if (_dwMONPreVRemain == _dwMONTempRem) { _dwMONOKCounter = 0; _dwInterFailCnt++; _dwMONFailCounter++; if ((_dwMONFailCounter % 3) == 1) { DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S V_Rem Hold, Cnt: %lx!",_dwMONFailCounter); } } else { __bHangCnt = 0; __bNoService = FALSE; _dwMONOKCounter++; _dwMONFailCounter = 0; _dwMONPreVRemain = _dwMONTempRem; } } } if (_dwMONFailCounter >= MONITOR_DVB_FAIL_CHECT_TIMES) { __bHangCnt++; // wyc1.10-909, when video remainder is not empty and REG_VLD_MBINT_CTL keep in 0x00001c08 more than 10 times. // Then it mean MPEG dec can't exit the infinite loop and monitor need to force mpegdec break the loop. // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4; // wyc1.20-909, found one case video buffer will keep in video remainder 0x10, so check with KC and he said when video // buffer remainder is more than 6, then decoder will cont decode until less or equal 5. So choose 6 mean video buffer is not // empty and is safe for this mechanism to force decoder entering STOP mode. if(ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_TV) { if ((_dwMONTempRem >= 6) && (_dwMONMDecHangCnt >= 10)) { _dwMONMDecHangCnt = 0; DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nForce MPEGDEC Enter STOP!"); } __bTVHang = TRUE; } else if( ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_RADIO) { __bRadioHang = TRUE; } if(__bHangCnt > MAXHANGCNT) { __bNoService = TRUE; } // wyc2.17-909S, make recover checking always on when debug mode for fixing video hang in state mechine problem. // the action stage only do in ERROR_CONCEAL defined to avoid un-expected action in #ifdef ERROR_CONCEAL _dwMONFailCounter = 0;#endif // } }#endif#endifvoid MONITOR_CheckWatchDog(void){#ifdef ERROR_CONCEAL#ifdef SUPPORT_WATCH_DOG REG_SRAM_WATCHDOG++; #ifndef NO_DISC_MODE#ifdef SUPPORT_WATCHDOG_BURNIN { //DWORD dwSaveInt; // elmer2.78, support burn-in testing HAL_ReadStorage(SETUP_ADDR_WATCHDOG, &_bWatchdogData, EPROM_WATCHDOG_BYTE); //printf("_bWatchdogData = %lx\n", _bWatchdogData); if (_bWatchdogData == 0x78 && __dwWatchdogTime != 0 && OS_GetSysTimer() - __dwWatchdogTime > COUNT_2_SEC * 30) { _bWatchdogData = 0xFF; printf("Watchdog bites ...\n"); HAL_ReadStorage(SETUP_ADDR_NVPLAYMODE, &__bNVPlayMode, EPROM_NVPLAYMODE_BYTE); HAL_ReadStorage(SETUP_ADDR_REPEATMODE, &__bRepeat, EPROM_REPEATMODE_BYTE); HAL_WriteStorage(SETUP_ADDR_WATCHDOG, &_bWatchdogData, EPROM_WATCHDOG_BYTE); HAL_WriteStorage(SETUP_ADDR_NVPLAYMODE, &_bWatchdogData, EPROM_NVPLAYMODE_BYTE); HAL_WriteStorage(SETUP_ADDR_REPEATMODE, &_bWatchdogData, EPROM_REPEATMODE_BYTE); if (__wDiscType & BOOK_DVD && NV_TitlePlay(1, 1))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -