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

📄 realfunctions.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
                    SendMsg2ZSp(&Msg);
                }
                else if ((RealSkipState == 1) && (RV_AddDecodeSpeed == 2))
                {
                    RealSkipState = 2;
                    Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
                    Msg.DAT0 = RealSkipState;
                    SendMsg2ZSp(&Msg);
                }
                else if ((RealSkipState == 2) && (RV_AddDecodeSpeed == 3))
                {
                    RealSkipState = 3;
                    Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
                    Msg.DAT0 = RealSkipState;
                    SendMsg2ZSp(&Msg);
                }
            }
            else if ((FramesInBuff > 2) && RealSkipState && (!RV_AddDecodeSpeed))
            {
                RealSkipState --;
                Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
                Msg.DAT0 = RealSkipState;
                SendMsg2ZSp(&Msg);
            }
        }
    }
}

/****************************************/
/*   解码入口初始化  */
/*   初始化空间等   */
/****************************************/

UINT16   gRealFunPmu;
extern BOOLEAN   gSDModeFlag;

extern BOOLEAN gVideoPmuFlag;
BOOLEAN RealInit(void)
{
    char  PathName[FS_MAX_PATH_LEN];
    char  buff[26];
    short i;
    unsigned long Version, iBufPos = 0;
    char  *TempMemPoint;

    //add for Exit
    for (i = 0; i < MAX_REAL_VIDEOBIT_NUM; i++)
        RealVideobitStream[i] = NULL;
    Real_CurrentSeekingTime = 0;
    RealDecTab = NULL;
    yuvBuf = NULL;
    FreshFrame = NULL;
    RealVideoScreen = NULL;
    RealVideoLLPList = NULL;
    RealFile = NULL;
    pRawFileCache = NULL;
    BackSaveForReal = NULL;
    RV_SkipFrameEn = 1;
    RKmemcpy(PathName, VideoFileInfo.Path, FS_MAX_PATH_LEN);
    RKstrcat(PathName, VideoFileInfo.Name);
    RealFile = FS_fopen(PathName, "rb");
    pRawFileCache = FS_fopen(PathName, "rb");
    if ((int)RealFile == -1 || !(int)RealFile)
        return FALSE;
    if ((int)pRawFileCache == -1 || !(int)pRawFileCache)
        return FALSE;

    // PMU_EnterModule(PMU_VIDEOHIGH);
    FileFuncInit();
    if (RVDecInit(RealFile) == 0)
        return FALSE;

    Version = Real_GetVideoVersion();
    if ((Version != RAW_RV8_MAJOR_VERSION) && (Version != RAW_RV9_MAJOR_VERSION))
        return FALSE;

    Real_PicWidth = GetRVWidth();
    Real_PicHeight = GetRVHeight();

    Real_PicWidth = (Real_PicWidth + 15) & 0xfff0;
    Real_PicHeight = (Real_PicHeight + 15) & 0xfff0;

    gVideoPmuFlag = 1;
    PMU_ExitModule(PMU_VIDEOHIGH);
    if (Real_PicWidth > 800)
        return FALSE;
    if (Real_PicHeight * Real_PicWidth > (720*576))
        return FALSE;

    if (gSDModeFlag == 0)
    {
        if (Real_PicWidth *Real_PicHeight <= (320*240))
        {
            gRealFunPmu = 7;
            PMU_EnterModule(PMU_VIDEOLOWLL);
        }
        else  if (Real_PicWidth *Real_PicHeight <= (480*272))
        {
            gRealFunPmu = 6;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else if (Real_PicWidth *Real_PicHeight <= (640 *272))
        {
            gRealFunPmu = 2;
            PMU_EnterModule(PMU_VIDEOMEDLOW);
        }
        else if (Real_PicWidth *Real_PicHeight <= (640 *480))
        {
            gRealFunPmu = 3;
            PMU_EnterModule(PMU_VIDEOMED);
        }
        else if (Real_PicWidth *Real_PicHeight <= (720*480) &&  Real_PicWidth < 800)
        {
            gRealFunPmu = 4;
            PMU_EnterModule(PMU_VIDEOMEDHIGH);
        }
        else
        {
            gRealFunPmu = 5;
            PMU_EnterModule(PMU_VIDEOHIGH);
        }
    }
    else if (gSDModeFlag == 1)
    {
        PMU_EnterModule(PMU_VIDEOHIGH);
    }

    Real_PicWidth = GetRVWidth();
    Real_PicHeight = GetRVHeight();

    yuvBuf = gVideoBufferMix;
    TempMemPoint = &gVideoBufferMix[(unsigned long)(YUV_BUFFER_NUM+1)*REAL_YUV_BUFFER_SIZE + (unsigned long)0x10000];
    for (i = 0; i < MAX_REAL_VIDEOBIT_NUM; i++)
    {
        RealVideobitStream[i] = (unsigned char*) & TempMemPoint[i*BITSREAM_BUFFER_SIZE];
    }
    FreshFrame = (OutPutFrame*) & TempMemPoint[MAX_REAL_VIDEOBIT_NUM*BITSREAM_BUFFER_SIZE];
    RealDecTab = (unsigned short*) & FreshFrame[YUV_BUFFER_NUM];
    RealVideoScreen = (BACKGRND *) & RealDecTab[0x10000];
    RealVideoLLPList = (DWDMALLP *) & RealVideoScreen[YUV_BUFFER_NUM+1];

    RealVideoScreenTemp = (BACKGRND*) & RealVideoLLPList[(YUV_BUFFER_NUM+1)*1000];
    RealVideoLLPListTemp = (DWDMALLP *) & RealVideoScreenTemp[YUV_BUFFER_NUM];
    for (i = 0; i < YUV_BUFFER_NUM;i++)
    {
        FreshFrame[i].State = 0;//Frame NULL
        FreshFrame[i].ChangScreen = 0;
        FreshFrame[i].Time = 0;
    }


    FrameInputIndex = 0;
    FrameOutputIndex = YUV_BUFFER_NUM - 1;
    PreIndex = -1;
    PrePreIndex = -1;
    PrePrePreIndex = -1;
    FramesInBuff = 0;
    RealSkipState = 0;
    RealExitState = 0;
    RealVideoSkipEnble = 0;
    ScreenChangeEnable = 0;
    Real_SendMailDisable = 0;
    RealDecoderCnt = 0;
    RealLcdWaitCnt = 0;
    showed_time = 0;
    real_timer_tick = 0;//add for test
    RealFileEnd = 0;
    Real_DecodeState = REAL_DECODE_STATE_PLAYING;
    Real_FrameTimerEn = 1;
    SyncEnable = 1;
    Real_CurrentSeekingTime = 0;

    CreateRealScreen(Real_PicWidth, Real_PicHeight);
    Scu_ModuleReset(MB_RESET, TRUE);
    Real_InitMailBox();
    BackSaveForReal = Intr_RegISR(INTC_MAILBOX, MailBoxISR);
    Scu_ModuleReset(MB_RESET, FALSE);

    return LoadDecoder(Version);
}


/****************************************/
/*  解码出口反初始化  */
/*   初始化空间等   */
/****************************************/
extern UINT8 RealIsrCloseFlag;
void RealVideoExit(void)
{
    short  i;

    Real_SendMailDisable = 1;
    Timer_PowerOffDeinit(0);
    RealIsrCloseFlag = 0;                 //  中断关闭

    if (RealAudioExist)
    {
        RockOSSendMsg(MBAUDIO, AS_GUAU_VideoAudioStop, NULL);
    }


    Intr_Disable(INTC_MAILBOX);
    Real_InitMailBox();
    Scu_ModuleReset(MB_RESET, TRUE);
    delay_nops(500);
    SetRegBit32(0x1801C000 + 0x1c, 4);   //reset zsp500
    delay_nops(500);
    while (Screen_GetMCUIFStatus() == BUSY);
    RVDeInit();
    if (0x72616370 == GetRmAudioCodec4cc())
        PMU_ExitModule(PMU_VIDEOLOW);
    if (gSDModeFlag == 0)
    {
        if (gRealFunPmu == 2)
            PMU_ExitModule(PMU_VIDEOMEDLOW);
        else if (gRealFunPmu == 3)
            PMU_ExitModule(PMU_VIDEOMED);
        else if (gRealFunPmu == 4)
            PMU_ExitModule(PMU_VIDEOMEDHIGH);
        else if (gRealFunPmu == 5)
            PMU_ExitModule(PMU_VIDEOHIGH);
        else if (gRealFunPmu == 6)
            PMU_ExitModule(PMU_VIDEOLOWL);
        else if (gRealFunPmu == 7)
            PMU_ExitModule(PMU_VIDEOLOWLL);
        gRealFunPmu = 0;
    }
    else if (gSDModeFlag == 1)
    {
        PMU_ExitModule(PMU_VIDEOHIGH);
    }


    if (RealFile)
    {
        FS_fclose(RealFile);
        RealFile = NULL;
    }

    if (pRawFileCache)
    {
        FS_fclose(pRawFileCache);
        pRawFileCache = 0;
    }
    if ((yuvBuf == NULL) || (PreIndex == -1))
        return;
    memcpy((yuvBuf+(YUV_BUFFER_NUM) * REAL_YUV_BUFFER_SIZE),(yuvBuf+(PreIndex) * REAL_YUV_BUFFER_SIZE),REAL_YUV_BUFFER_SIZE);
    Screen_Change(&RealVideoScreen[YUV_BUFFER_NUM]);
}

extern short VideoPlaying;
BOOLEAN VideoDecAudioStart(void)
{
    unsigned long Samplerate;
    int Err, i;
    int offset = 0, result;
    Codec_DACMute();
    I2sStop();
    HDMA_Stop(0);
    memset(buff, 0, sizeof(buff));

    ulEndOfRAM = (unsigned long)buff;
    VideoPlaying = 1;

    // 2.Reset the Audio I/O Buffer State
    AudioInitList();
    AudioIOBuf.gAudioOutBufIndex = 0;// AUDIO_OUT_BUF_NUM;
    AudioIOBuf.gAudioDecoderIndex = AUDIO_OUT_BUF_NUM - 1;

    // 3.Set the Audio Decode Type
    //TODO: Here is just for AVI, We should support others such as Real , WMV ...
    CurrentCodec = CODEC_RM_DEC;
    // 4.Init Audio Decoder
    if (0 == OpenTrack())
    {
        return FALSE;
    }
    if (0x72616370 == GetRmAudioCodec4cc())
        PMU_EnterModule(PMU_VIDEOLOW);
    CodecGetSampleRate(&Samplerate);
    Codec_SetSampleRate(Samplerate);
    AudioIOBuf.lOutLength = 2048;
    gAudioReq = 0;
    //AudioHWInit();
    Codec_SetMode(Codec_DACout);// huangzf 1.15
    Codec_SetVolumet(OutputVolume);
    if (GetIsRASeekable())
        CodecSeek((unsigned long)0, 0);
    //real_timer_tick = 0;
    real_timer_tick = (unsigned long)0;
    AudioInitList();
    memset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
    I2sStart(I2S_Start_Tx);
    //Codec_DACUnMute();
    Codec_DACMute();
    AudioPlayState = Audio_State_Play;
    RockOSSendMsg(MBAUDIO, AS_GUAU_Playing, (void*)NULL);
    AudioOutBufSwitch();
    //RockOSSendMsg(MBVIDEO, AS_GUVI_VideoStartAudio, (void*)0);

    return TRUE;
}

void FillRVEnd();

//Fill File Data 2 Decoder Buffer
int FillBitStreamForRealVideo(int Index)
{
    MailBoxMSG Msg;
    DECLARE_CUP_SR;
    if (RealFileEnd)
        RealFileEnd++;

    if (RealFileEnd == 4)
        RockOSSendMsg(MBVIDEO, AS_GUVI_VideoStop, NULL);

    Msg.CMD = MSG_ARM2ZSP_DATA;
    while (GetRVBufDataLen() < 4096)
    {
        if (RealFileEnd)
        {
            FillRVEnd();
        }
        else
        {
            if (RVFillBuf() == 0)
            {
                RealFileEnd = 1;
            }
        }
    }

    GetRVData(RealVideobitStream[Index], 4096);

    Msg.DAT0 = 0x0001;
    Msg.DAT1 = Index;
    Msg.DAT2 = (unsigned long)RealVideobitStream[Index];
    Msg.DAT3 = 4096;
    ENTER_CRITICAL();
    SendMsg2ZSp(&Msg);
    EXIT_CRITICAL();
    return 0;
}


//return Current Frame Time
long RealGetShowedTime()
{
    return showed_time ;
}

void SyncEnableFunc(unsigned long tm)
{
    if (RV_SeekEnd_AudioEN)
        real_timer_tick = 0;//tm - GetRASeekedTime();

    SyncTime = tm;

}
void SyncDisable()
{
    SyncTime = 0x3fffffff;
    SyncEnable = 0;
}

extern unsigned short Real_SeekEnable;
void  RealAudioErrorDeal()
{
    RealAudioExist = 0;
    Real_SeekEnable = GetIsRVSeekable();
}
#ifdef TVOUT_PANEL
extern void ReCreat(void);
extern DWDMALLP     gLLPList[ ][480];       // LCD刷屏接口用
extern UINT16 TvoutSign;
void RealTVoutChange(void)
{
    TVOUTPARA TVoutPara;
    TVoutPara.Type = TV_VEDIO;
    TVoutPara.Mode = TV_PAL50;
    TVoutPara.Size = TV_LARGE;
    TVoutPara.Switch = LCD_TVOUT;
    if (Screen_GetType() == TVOUT)
    {
        TVoutPara.Oddtion.Status = TV_Standby;
        Screen_SetTvout(TVOUT_Status, &TVoutPara, 0, 0);
#ifdef MCU_PANEL
        Screen_Configure(gLcdW, gLcdH, MCULCD, &TVoutPara);
#else
        Screen_Configure(gLcdW, gLcdH, RGBLCD, &TVoutPara);
#endif
        Screen_CreatRGB(&gScreen[0], &gLLPList[0][0], (uint32)gGuiDspLcdTransScreen0, gLcdW, gLcdH);
        Screen_CreatRGB(&gScreen[1], &gLLPList[1][0], (uint32)gGuiDspLcdTransScreen1, gLcdW, gLcdH);
        CreateRealScreen(Real_PicWidth, Real_PicHeight);

    }
    else
    {
        TvoutSign = 0;
        //Screen_MCUIFUpdateFinish();
        while (Screen_GetMCUIFStatus() == BUSY);
        TvoutSign = 0;
        BL_SetBright(BL_DARK);
        Screen_Display(OFF);
        Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
        CreateRealScreen(Real_PicWidth, Real_PicHeight);
        TvoutSign = 1;
    }
    ReCreat();
}
#endif

⌨️ 快捷键说明

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