【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; }    
 |