【Mstar】【MSD3463】【切HMDI Timing闪黑屏】
切换某些HMDI Timing会闪黑屏,加黑屏到适到当的地方: 修改红色字体部分: apiXC_Hdmi.c BOOLEAN MApi_XC_HDMI_Monitor( INPUT_SOURCE_TYPE_t enInputSourceType) { BOOLEAN bResult = TRUE; if ( !g_HdmiPollingStatus.bIsHDMIMode ) return FALSE; // count down some timers (everytime executed this function takes HDMI_POLLING_COUNTER ms) g_AVMUTEMissingCounter = (g_AVMUTEMissingCounter > HDMI_POLLING_COUNTER) ? (g_AVMUTEMissingCounter - HDMI_POLLING_COUNTER) : 0; g_AVIMissingCounter = (g_AVIMissingCounter > HDMI_POLLING_COUNTER) ? (g_AVIMissingCounter - HDMI_POLLING_COUNTER) : 0; g_ACPMissingCounter = (g_ACPMissingCounter > HDMI_POLLING_COUNTER) ? (g_ACPMissingCounter - HDMI_POLLING_COUNTER) : 0; // Get Packet Info MApi_XC_HDMI_CheckPacketInfo(); if( (m_eAudioSource>=E_AUDIOSOURCE_HDMI) && (m_eAudioSource<=E_AUDIOSOURCE_HDMI3)) { _MDrv_HDMI_audio_downsample(); } if(g_HdmiPacketInfo.enPKT_Value.PKT_GC_VALUE) { msg_hdmi(printf(" PKT_GC_VALUE == FALSE %bu \r\n", g_HdmiPacketInfo.enPKT_Value.PKT_GC_VALUE)); if ( g_HdmiPacketInfo.enPKT_Status.AVMuteStatus ) // AV Mute control { bResult = FALSE; msg_hdmi(printf(" AVMuteStatus %bu \r\n", g_HdmiPacketInfo.enPKT_Status.AVMuteStatus)); if ( !g_HdmiPollingStatus.bMuteHDMIVideo ) { g_HdmiPollingStatus.bMuteHDMIVideo = 1; g_HdmiPollingStatus.u8LostHDMICounter = 0; if( (m_eAudioSource>=E_AUDIOSOURCE_HDMI) && (m_eAudioSource<=E_AUDIOSOURCE_HDMI3)) { // MW_AUD_SetSoundMute(SOUND_MUTE_TV, E_MUTE_ON); #if 1 //Update By WangBoJing if (MApi_XC_IsFreezeImg(MAIN_WINDOW)) { MApi_XC_FreezeImg(FALSE, MAIN_WINDOW); //Update By WangBoJing MApp_SetImageFrozen(FALSE); } #endif msAPI_AUD_AdjustAudioFactor(E_ADJUST_AUDIOMUTE, E_AUDIO_BYVCHIP_MUTEON, E_AUDIOMUTESOURCE_ACTIVESOURCE); } MsOS_DelayTask(DELAY_FOR_ENTERING_MUTE); // MApi_XC_GenerateBlackVideo(ENABLE, MAIN_WINDOW); //msAPI_Scaler_SetScreenMute(E_SCREEN_MUTE_HDMI_AVMUTE, ENABLE, 0, MAIN_WINDOW); } goto exit_SetHDMI_Video; } } // For audio to play, has to check audioPktErr, // audioSamplePKT (audio data) and ACR_PKT (audio clock) // // Sometimes the player will send audio signal after video showed up like this: // // (after video showed up) // audioPktErr | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (0 forever) // ACR_PKT | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (1 forever) // audioSamplePKT | 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 (1 forever) // // The unstable time is un-predictable. // // In this case, we use u8AudioStbCnt to wait for stable. // But if the player is always un-stable, we'll have no chance to play audio. // // So, if u8AudioForceEnableCnt (audioPktErr=0, ACR_PKT=1, audioSamplePKT=1) // greater than HDMI_AUDIO_FORCE_ENABLE, after that, we'll turn on audio only if // (audioPktErr=0, ACR_PKT=1, audioSamplePKT=1), else, we'll turn audio off. // // By doing so, the user could hear the abnormal sounds even the input audio // is always un-stable. if((g_HdmiPacketInfo.enPKT_Status.AudioPacketErr ) || (!(g_HdmiPacketInfo.enPKT_Value.PKT_ASAMPLE_VALUE)) || (!(g_HdmiPacketInfo.enPKT_Value.PKT_ACR_VALUE))) { g_HdmiPollingStatus.bMuteHDMIAudio = TRUE; g_HdmiPollingStatus.u8AudioStbCnt = 0; } else if(g_HdmiPacketInfo.enPKT_Value.PKT_AUI_VALUE ) { if((g_HdmiPollingStatus.u8AudioStbCnt > HDMI_AUDIO_STABLE_CNT) || (g_HdmiPollingStatus.u8AudioForceEnableCnt > HDMI_AUDIO_FORCE_ENABLE)) { g_HdmiPollingStatus.bMuteHDMIAudio = 0; } else { g_HdmiPollingStatus.u8AudioStbCnt++; g_HdmiPollingStatus.u8AudioForceEnableCnt++; } } // Check color space if ( ( g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE ) || (g_HdmiPacketInfo.enPKT_Value.PKT_NULL_VALUE ) ) { g_HdmiPollingStatus.u8LostHDMICounter = 0; // For lossing pkg bStatus_NoAviNullPkg = FALSE; // Reset Status bNoAvi_BounceTime = FALSE; // Clear // If not receive AVI packet if ( g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE ) { //we need to monitor aspectratio... msg_hdmi(printf(" bAVI_PKT_Received? OK %bu \r\n", (U8)g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE)); } else { msg_hdmi(printf(" g_HdmiPollingStatus.bAVI_PKT_Received NO!! %bu \r\n", g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE)); if ( g_HdmiPacketInfo.enPKT_Value.PKT_NULL_VALUE ) { msg_hdmi(printf(" bNULL_PKT_Received? %bu \r\n", (U8)g_HdmiPacketInfo.enPKT_Value.PKT_NULL_VALUE)); if ( g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_UNKNOWN ) g_HdmiPollingStatus.u8ColorFormat = MS_HDMI_COLOR_DEFAULT; msg_hdmi(printf(" MS_HDMI_COLOR_RGB %bu \r\n", g_HdmiPacketInfo.enPKT_Status.PacketColorFormat)); } } if ( g_HdmiPollingStatus.u8ColorFormat == g_HdmiPacketInfo.enPKT_Status.PacketColorFormat ) { //20100224, Fix BBK DVD don't send AVI_PKT first then send, and make video/Audio be Muted issue. if(g_HdmiPollingStatus.bMuteHDMIVideo && g_HdmiPacketInfo.enPKT_Status.AVMuteStatus) bResult = TRUE; else { if(g_HdmiPollingStatus.bMuteHDMIVideo) { g_HdmiPollingStatus.bMuteHDMIVideo = 0;//clear the flag set by u8LostHDMICounter. if( (m_eAudioSource>=E_AUDIOSOURCE_HDMI) && (m_eAudioSource<=E_AUDIOSOURCE_HDMI3))//Added by jiangtao 2010-03-12 { //MW_AUD_SetSoundMute(SOUND_MUTE_TV, E_MUTE_OFF); msAPI_AUD_AdjustAudioFactor(E_ADJUST_AUDIOMUTE, E_AUDIO_BYVCHIP_MUTEOFF, E_AUDIOMUTESOURCE_ACTIVESOURCE); msg_hdmi(printf("\t Audio unMute ... \r\n")); } MsOS_DelayTask(DELAY_FOR_ENTERING_MUTE); MApi_XC_GenerateBlackVideo(DISABLE, MAIN_WINDOW); //msAPI_Scaler_SetScreenMute(E_SCREEN_MUTE_HDMI_AVMUTE, DISABLE, 0, MAIN_WINDOW); msg_hdmi(printf("\t Video unMute ... \r\n")); } bResult = FALSE; } goto exit_SetHDMI_Video; } if(g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE) { if(g_HdmiPollingStatus.u8ColorFormat != g_HdmiPacketInfo.enPKT_Status.PacketColorFormat) g_HdmiPollingStatus.bColorFMTChange = 1; else g_HdmiPollingStatus.bColorFMTChange = 0; g_HdmiPollingStatus.u8ColorFormat = g_HdmiPacketInfo.enPKT_Status.PacketColorFormat; msg_hdmi(printf(" if bAVI_PKT_Received u8ColorFormat! %bu \r\n", g_HdmiPollingStatus.u8ColorFormat )); } else { g_HdmiPacketInfo.enPKT_Status.PacketColorFormat = MS_HDMI_COLOR_DEFAULT; // #0585821 [HDMI certification] When sink's AVI InfoFrame change YCbCr to No AVI InfoFrame, there is no nomal RGB output. // No in NoAviNull status if ( g_HdmiPollingStatus.u8ColorFormat != g_HdmiPacketInfo.enPKT_Status.PacketColorFormat ) { g_HdmiPollingStatus.bColorFMTChange = 1; g_HdmiPollingStatus.u8ColorFormat = g_HdmiPacketInfo.enPKT_Status.PacketColorFormat; } else { g_HdmiPollingStatus.bColorFMTChange = 0; } } msg_hdmi(printf(" u8ColorFormat %s \r\n", (g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_RGB)? "MS_HDMI_COLOR_RGB" g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_YUV_422)? "MS_HDMI_COLOR_YUV_422" g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_YUV_444)? "MS_HDMI_COLOR_YUV_444" g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_DEFAULT)? "MS_HDMI_COLOR_DEFAULT" g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_RESERVED)? "MS_HDMI_COLOR_RESERVED" :"MS_HDMI_COLOR_UNKNOWN" )); } else { bResult = FALSE; // #0585821 [HDMI certification] When sink's AVI InfoFrame change YCbCr to No AVI InfoFrame, there is no nomal RGB output. // No in NoAviNull status if ( !bStatus_NoAviNullPkg && !bNoAvi_BounceTime) { u16TimeOut_NoAviNullPkg = MsOS_GetSystemTime() + COLOR_PKG_TIMEOUT_TIME; bNoAvi_BounceTime = TRUE; } else if ( !bStatus_NoAviNullPkg && bNoAvi_BounceTime) { if ( u16TimeOut_NoAviNullPkg < MsOS_GetSystemTime() ) // TimeOut { bNoAvi_BounceTime = FALSE; bStatus_NoAviNullPkg = TRUE; // Reset Color format g_HdmiPacketInfo.enPKT_Status.PacketColorFormat = MS_HDMI_COLOR_DEFAULT; if(g_HdmiPollingStatus.u8ColorFormat != g_HdmiPacketInfo.enPKT_Status.PacketColorFormat) { //DbgPrint_Mapi_xc_hdmi(sd_print(" g_HdmiPollingStatus.u8ColorFormat %d \n",g_HdmiPollingStatus.u8ColorFormat)); //DbgPrint_Mapi_xc_hdmi(sd_print("[FMT change] 444\n")); g_HdmiPollingStatus.bColorFMTChange = 1; g_HdmiPollingStatus.u8ColorFormat = g_HdmiPacketInfo.enPKT_Status.PacketColorFormat; } else { g_HdmiPollingStatus.bColorFMTChange = 0; } } } msg_hdmi( printf(" bAVI_PKT_Received %bu \r\n", g_HdmiPacketInfo.enPKT_Value.PKT_AVI_VALUE)); msg_hdmi( printf(" bNULL_PKT_Received %bu \r\n", g_HdmiPacketInfo.enPKT_Value.PKT_NULL_VALUE)); { //For fail case ===================> bResult=MApi_XC_HDMI_CheckSumAndBCH(enInputSourceType); //<=================== For fail case } goto exit_SetHDMI_Video; } exit_SetHDMI_Video: #if 1 //Update By WangBoJing if(g_HdmiPollingStatus.bMuteHDMIVideo) { g_HdmiPollingStatus.bMuteHDMIVideo = 0;//clear the flag set by u8LostHDMICounter. //<<SMC jayden.chen for HDMI change timing audio dudu & blackscreen 20160131 #if 0// if( (m_eAudioSource>=E_AUDIOSOURCE_HDMI) && (m_eAudioSource<=E_AUDIOSOURCE_HDMI3)) { msAPI_AUD_AdjustAudioFactor(E_ADJUST_AUDIOMUTE, E_AUDIO_BYVCHIP_MUTEOFF, E_AUDIOMUTESOURCE_ACTIVESOURCE); } #endif //>>SMC jayden.chen for HDMI change timing audio dudu & blackscreen 20160131 } #endif return bResult; }
|