SuperIC社区_
标题: 【Mstar】【MSD3463】【切HMDI Timing闪黑屏】 [打印本页]
作者: jayden 时间: 2016-8-31 14:38
标题: 【Mstar】【MSD3463】【切HMDI Timing闪黑屏】
【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;
}
欢迎光临 SuperIC社区_ (/) |
Powered by Discuz! X3.3 |