搜索
 找回密码
 立即注册

简单一步 , 微信登陆

【Mstar】【MSD3463】【切HMDI Timing闪黑屏】

作者:jayden | 时间:2016-8-31 14:38:08 | 阅读:6451| 只看该作者
【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;
}

收藏
收藏0
分享
分享
点赞
点赞0
反对
反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
手机版