⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvmvd.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
        MVD_DEBUGERROR( printf( "Ctrl: MVD_I_GET_PICTURE_SIZE fail!!\r\n" ) );
        return;
    }
    pinfo->u16HorSize = COMBWORD(mvdcmd.Arg1, mvdcmd.Arg0);
    pinfo->u16VerSize = COMBWORD(mvdcmd.Arg3, mvdcmd.Arg2);


    mvdcmd.Arg0 = 0;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_ASPECT_FRAMERATE, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: MVD_I_ASPECT_FRAMERATE fail!!\r\n" ) );
        return;
    }

    pinfo->u8AspectRatio = mvdcmd.Arg0 >> 4;
    pinfo->u16FrameRate = (U16)(mvdcmd.Arg0 & 0x0F);
}

/********************************************************************************/
/// Get MVD first frame decode status
/// @return -first frame decoded ready or not
/********************************************************************************/
U8 MDrv_Mvd_GetFirstFrame ( void )
{
    MVD_CMD_ARG mvdcmd;
    mvdcmd.Arg0 = FIRST_FRAME;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: FIRST_FRAME fail!!\r\n" ) );
        return 0xFF;
    }
    return mvdcmd.Arg2;
}



/********************************************************************************/
/// Get video progressive or interlace
/// @return -video progressive or interlace
/********************************************************************************/
U8 MDrv_Mvd_GetProgInt ( void )
{
    MVD_CMD_ARG mvdcmd;
    mvdcmd.Arg0 = PROG_SEQ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: PROG_SEQ fail!!\r\n" ) );
        return 0xFF;
    }
    return mvdcmd.Arg2;
}


#ifdef MHEG_RDY

//#if ( KEEP_UNUSED_FUNC == 1 )

/********************************************************************************/
/// Reset for I-frame decoding
/// @return -none
/********************************************************************************/

void MDrv_Mvd_ResetIFrameDecode ( void )
    {
    XBYTE[MVD_COMMAND] = MVD_STOP;   // issue stop command to clear previous command
    MDrv_Mvd_MVDReset();
}

/********************************************************************************/
/// Decode I-frame
/// @param -u32FrameBufAddr \b IN : start address of frame buffer
/// @param -u32StreamBufAddr \b IN : start address of stream buffer
/// @return -return decode I-frame success or not
/********************************************************************************/

BOOLEAN MDrv_Mvd_DecodeIFrame ( U32 u32FrameBufAddr, U32 u32StreamBufAddr )
{
    U32 u32deley_ms;
    MVD_CMD_ARG mvdcmd;

    // set frame buffer address
    #if VIDEO_FIRMWARE_CODE >= VIDEO_FIRMWARE_CODE_HD
        ASSERT((u32FrameBufAddr%2048)==0);
        u32FrameBufAddr >>= ( 3 + 8 );
    #else
        ASSERT((u32FrameBufAddr%512)==0);
	    u32FrameBufAddr >>= ( 3 + 6 );
    #endif
    mvdcmd.Arg0 = L_WORD(u32FrameBufAddr);
    mvdcmd.Arg1 = H_WORD(u32FrameBufAddr);
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_MHEG_SET_FRAMEBUF, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Command: 0x%bx fail!!\r\n", MVD_I_MHEG_SET_FRAMEBUF ) );
        return FALSE;
    }

    // set stream buffer address & start decode
    ASSERT((u32StreamBufAddr%8)==0);
    u32StreamBufAddr >>= 3;
    mvdcmd.Arg0 = L_WORD(u32StreamBufAddr);
    mvdcmd.Arg1 = H_WORD(u32StreamBufAddr);
    mvdcmd.Arg2 = L_DWORD(u32StreamBufAddr);
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_MHEG_DECODE_IFRAME, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Command: 0x%bx fail!!\r\n", MVD_I_MHEG_DECODE_IFRAME ) );
        return FALSE;
    }

    // wait decode complete
    u32deley_ms = MDrv_Timer_GetTime0();
    do
    {
        mvdcmd.Arg0 = MHEG_RDY;
        mvdcmd.Arg1 = 0;
        mvdcmd.Arg2 = 0;
        mvdcmd.Arg3 = 0;

        if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
        {
            MVD_DEBUGERROR( printf( "Command: MHEG_RDY fail!!\r\n" ) );
            return FALSE;
        }

        if (MDrv_Timer_TimeDifferenceFromCurrent(u32deley_ms) > 2500) {
            MVD_DEBUGERROR( printf( "MDrv_Mvd_DecodeIFrame time out\n" ) );
            return FALSE;
        }
    }
    while(mvdcmd.Arg2 != 1);

    return TRUE;
}
#endif

//#endif

//#if ( KEEP_UNUSED_FUNC == 1 )
/********************************************************************************/
/// Set mvd play mode
/// @return -none
/********************************************************************************/
void MDrv_Mvd_SetPlayMode(U8 bFileMode, U8 bDisablePESParsing)
{
    u8MvdPlayMode = (U8)((bFileMode?1:0)<<2) | (U8)((bDisablePESParsing?1:0)<<3);
}

/********************************************************************************/
/// Set bitstream buffer overflow threshold
/// @return -none
/********************************************************************************/
void MDrv_Mvd_SetOverflowTH (U32 u32Threshold)
{
    MVD_CMD_ARG mvdcmd;
    ASSERT((u32Threshold%8)==0);
    u32Threshold >>= 3;
    mvdcmd.Arg0 = L_WORD(u32Threshold);
    mvdcmd.Arg1 = H_WORD(u32Threshold);
    mvdcmd.Arg2 = L_DWORD(u32Threshold);
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_SET_BS_OVERFLOWTH, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Command: 0x%bx fail!!\r\n", MVD_I_SET_BS_OVERFLOWTH ) );
        return;
    }
}

/********************************************************************************/
/// Set bitstream buffer underflow threshold
/// @return -none
/********************************************************************************/
void MDrv_Mvd_SetUnderflowTH (U32 u32Threshold)
{
    MVD_CMD_ARG mvdcmd;
    ASSERT((u32Threshold%8)==0);
    u32Threshold >>= 3;
    mvdcmd.Arg0 = L_WORD(u32Threshold);
    mvdcmd.Arg1 = H_WORD(u32Threshold);
    mvdcmd.Arg2 = L_DWORD(u32Threshold);
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_SET_BS_UNDERFLOWTH, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Command: 0x%bx fail!!\r\n", MVD_I_SET_BS_UNDERFLOWTH ) );
        return;
    }
}

U8 MDrv_Mvd_GetActiveFormat()
{
#ifdef ACTIVE_FORMAT
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = ACTIVE_FORMAT ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", ACTIVE_FORMAT  ) );
        return 0xff;
    }
    return mvdcmd.Arg2;
#else
    return 0xff;
#endif
}

//#endif //#if ( KEEP_UNUSED_FUNC == 1 )

/********************************************************************************/
/// Get sync status to know whether sync is complete or not
/// @return - 0        : sync complete
////        - otherwise: sync not complete
/********************************************************************************/
U8 MDrv_Mvd_GetSyncStatus ()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = SYN_INI_DONE ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", SYN_INI_DONE  ) );
        return 0xff;
    }
    MVD_DEBUGINFO(printf("SYN_INI_DONE=%bx\n", mvdcmd.Arg2));
    return mvdcmd.Arg2;
    }

U8 MDrv_Mvd_GetDispRdy()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = FIRST_PIC ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", FIRST_PIC  ) );
        return 0xff;
    }
    return mvdcmd.Arg2;
    }

void MDrv_Mvd_SetVOPDone()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = VOP_INI_DONE ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 1;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( 0x41, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", VOP_INI_DONE  ) );
        return;
    }
}

U8 MDrv_Mvd_I_PIC_Found()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = I_PIC_FOUND ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", I_PIC_FOUND  ) );
        return 0xff;
    }
    return mvdcmd.Arg2;
}

//#if ( ENABLE_DTV_FREEZE_WEAK_SIGNAL == ENABLE )
U16 MDrv_Mvd_GetDecodeErrCnt()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = VLD_ERR_CNT ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( MVD_I_COMMAND_CTRL, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", VLD_ERR_CNT  ) );
        return 0xffff;
    }
    return COMBWORD(mvdcmd.Arg3, mvdcmd.Arg2);
}

void MDrv_Mvd_ResetDecodeErrCnt()
{
    MVD_CMD_ARG mvdcmd;

    mvdcmd.Arg0 = VLD_ERR_CNT ;
    mvdcmd.Arg1 = 0;
    mvdcmd.Arg2 = 0;
    mvdcmd.Arg3 = 0;

    if (MDrv_Mvd_MVDCommand( 0x41, &mvdcmd ) == FALSE)
    {
        MVD_DEBUGERROR( printf( "Ctrl: 0x%bx fail!!\r\n", VLD_ERR_CNT  ) );
    }
}
//#endif

//#if BUILD_SYSDEBUG
/********************************************************************************/
/// MVD test function (debug use only )
/// @param -OneShot \b IN : one shot decode flag
/********************************************************************************/
void MDrv_Mvd_Polling ( U8 OneShot )
{
#ifdef SHOW_SYN
    U32 u32Diff,
    u32Pts1 = 0,
    u32Pts2,
    u32Stc1 = 0,
    u32Stc2,
    u32Time1 = 0,
    u32Time2;

    while ( 1 )
    {
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SHOW_SYN timeout0\n" ) );
        }

        XBYTE[MVD_ARG0] = SHOW_SYN;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_ARG2] = 0x01;
        XBYTE[MVD_ARG3] = 0x00;
        XBYTE[MVD_COMMAND] = 0x41;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SHOW_SYN timeout1\n" ) );
        }

        while ( 1 )
        {
            XBYTE[MVD_ARG0] = SHOW_SYN;
            XBYTE[MVD_ARG1] = 0x00;
            XBYTE[MVD_COMMAND] = 0x40;
            if ( MVD_TimeOut() )
            {
                MVD_DEBUGERROR( printf( "SHOW_SYN timeout2\n" ) );
            }
            if ( ( XBYTE[MVD_ARG2] == 0 ) && ( XBYTE[MVD_ARG3] == 0 ) )
            {
                break;
            }
            if ( kbhit() )
            {
                if ( getchar() == 'q' )
                {
                    return;
                }
            }
            MDrv_Timer_Delayms( 1 );
        }

        //diff ==============================
        XBYTE[MVD_ARG0] = SYN_DIFF1;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SYN_DIFF1 timeout\n" ) );
        }
        u32Diff = XBYTE[MVD_ARG3];
        u32Diff = u32Diff << 8;
        u32Diff |= XBYTE[MVD_ARG2];
        u32Diff = u32Diff << 8;

        XBYTE[MVD_ARG0] = SYN_DIFF0;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SYN_DIFF0 timeout\n" ) );
        }
        u32Diff |= XBYTE[MVD_ARG3];
        u32Diff = u32Diff << 8;
        u32Diff |= XBYTE[MVD_ARG2];

        MVD_DEBUGINFO( printf( "diff= 0x%08lx | ", u32Diff ) );

        //pts ==================================
        XBYTE[MVD_ARG0] = PTS1_1;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "PTS1_1 timeout\n" ) );
        }
        u32Pts2 = XBYTE[MVD_ARG3];
        u32Pts2 = u32Pts2 << 8;
        u32Pts2 |= XBYTE[MVD_ARG2];
        u32Pts2 = u32Pts2 << 8;

        XBYTE[MVD_ARG0] = PTS1_0;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "PTS1_0 timeout\n" ) );
        }
        u32Pts2 |= XBYTE[MVD_ARG3];
        u32Pts2 = u32Pts2 << 8;
        u32Pts2 |= XBYTE[MVD_ARG2];

        MVD_DEBUGINFO( printf( "pts= 0x%08lx ; diff= 0x%08lx | ",
                u32Pts2,
                u32Pts2 - u32Pts1 ) );
        u32Pts1 = u32Pts2;

        //stc ====================================
        XBYTE[MVD_ARG0] = SYN_STC1;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SYN_STC1 timeout \r\n" ) );
        }
        u32Stc2 = XBYTE[MVD_ARG3];
        u32Stc2 = u32Stc2 << 8;
        u32Stc2 |= XBYTE[MVD_ARG2];
        u32Stc2 = u32Stc2 << 8;

        XBYTE[MVD_ARG0] = SYN_STC0;
        XBYTE[MVD_ARG1] = 0x00;
        XBYTE[MVD_COMMAND] = 0x40;
        if ( MVD_TimeOut() )
        {
            MVD_DEBUGERROR( printf( "SYN_STC0 timeout\n" ) );
        }
        u32Stc2 |= XBYTE[MVD_ARG3];
        u32Stc2 = u32Stc2 << 8;
        u32Stc2 |= XBYTE[MVD_ARG2];

        MVD_DEBUGINFO( printf( "stc= 0x%08lx ; diff= 0x%08lx | ",u32Stc2,u32Stc2 - u32Stc1 ) );
        u32Stc1 = u32Stc2;

        //timer =============================
        u32Time2 = MDrv_Timer_GetTime0();
        MVD_DEBUGINFO( printf( "time= 0x%08lx ; diff= 0x%08lx | \r\n",u32Time2,u32Time2 - u32Time1 ) );
        u32Time1 = u32Time2;

        if ( OneShot )
        {
            break;
        }

        if ( kbhit() )
        {
            if ( getchar() == 'q' )
            {
                return;
            }
        }
    }
#else
    OneShot = OneShot;
#endif //SHOW_SYN
}
//#endif /* BUILD_SYSDEBUG */

/***************************************************************************************/

#undef DRV_MVD_C

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -