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

📄 mpegvideocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* dwdma llp list for each video screen. */
    mpegVideoLLPList = (DWDMALLP *)((char *)mpegVideoScreen + ((YUV_BUFFER_NUM+1) * (sizeof(BACKGRND))));

    mpegVideoScreenTemp = (BACKGRND *)((char *)mpegVideoLLPList + ((YUV_BUFFER_NUM+1) * 1000 * (sizeof(DWDMALLP))));
    mpegVideoLLPListTemp = (DWDMALLP *)((char *)mpegVideoScreenTemp + (YUV_BUFFER_NUM * (sizeof(BACKGRND))));
    /* buffer remain. */
    mpegVideoBufRemain = (char *)((char *)mpegVideoLLPListTemp + (YUV_BUFFER_NUM * 1000 * (sizeof(DWDMALLP))));

#endif
    return 0;
}

int MpegFileInit(char *path)
{
    int err;

    mpegPlayState = MPEG_STATE_INITIALIZING;

    /* open audio stream file. */
    if (MpegFileOpen(&mpeg, path))
    {
        mpegPlayState = MPEG_STATE_STOP;
        MpegFileClose(&mpeg);
        return MPEG_FILE_OPEN_ERR;
    }
    /* parse video file. */
    if ((err = MpegFileParsing(&mpeg)))
    {
        if (err == MPEG_FILE_AUDIO_CODEC_ERR)     /* audio codec error is allowable. */
        {
            return err;
        }
        MpegFileClose(&mpeg);
        mpegPlayState = MPEG_STATE_STOP;
        return err;
    }

    return MPEG_FILE_PARSING_OK;
}

int MpegVideoDecInit(void)
{
    int i;

    if (mpegPlayState != MPEG_STATE_INITIALIZING)
        return -1;

// PMU_EnterModule(PMU_VIDEOHIGH);
    if (gSDModeFlag == 0)
    {
        if (mpeg.width *mpeg.height <= (320*240))
        {
            gMpgFunPmu = 7;
            PMU_EnterModule(PMU_VIDEOLOWLL);
        }
        else  if (mpeg.width *mpeg.height  <= (480*272))
        {
            gMpgFunPmu = 6;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else if (mpeg.width *mpeg.height  <= (640 *272))
        {
            gMpgFunPmu = 2;
            PMU_EnterModule(PMU_VIDEOMEDLOW);
        }
        else if (mpeg.width *mpeg.height  <= (640 *480))
        {
            gMpgFunPmu = 3;
            PMU_EnterModule(PMU_VIDEOMED);
        }
        else if (mpeg.width *mpeg.height  <= (720*480) &&  mpeg.width < 800)
        {
            gMpgFunPmu = 4;
            PMU_EnterModule(PMU_VIDEOMEDHIGH);
        }
        else
        {
            gMpgFunPmu = 5;
            PMU_EnterModule(PMU_VIDEOHIGH);
        }
    }
    else if (gSDModeFlag == 1)
    {
        PMU_EnterModule(PMU_VIDEOHIGH);
    }


    /* Flow:                                 */
    /*   a. Malloc Buffer for decoder.       */
    if (MpegVideoDecBufMalloc())
        return -1;

    /*   b. Enable DSP core and peripheral.  */
    DspEnable();  /* do this in pmu. */

    /*   c. Share data initialize.           */
    MpegCtrlInit();

    /*   d. Create video screens.            */
    MpegCreateVideoScreen();

    /*   e. Fill all bit stream buffer.      */
    for (i = 0;i < MAX_BITSREAM_BLOCK_NUM;i++)
    {
        if (MpegFillBitStream() != 0)
        {
            return -1;
        }
    }

    /*   f. Load code and start decoder.     */
#if 0
    JtagBoot(mpegVideoBufRemain);
#else
    if (VideoDecoderLoad(mpegVideoBufRemain, "MPEG12"))
    {
        return -1;
    }
#endif

    /*   g. Start frame diaplay timer.       */
    MpegFrameDispCtrl();

    mpegPlayState = MPEG_STATE_PLAYING;
    return 0;
}

int MpegFFD(unsigned int step)
{
    /* do nothing when video is stoped. */
    if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
        return 0;

    if (!step)
        step = 10000;
    if (mpeg.skipFlag == MPEG_SKIP_FLAG_NONE)
        mpeg.seekTime = mpeg.curTime - mpeg.startTime;

    if (mpegPlayState == MPEG_STATE_PAUSE)
        MpegPlayPause();

    SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
    mpeg.skipFlag = MPEG_SKIP_FLAG_FFD;
    if ((mpeg.seekTime + step) <= mpeg.duration)
        mpeg.seekTime += step;

    mpegPlayState = MPEG_STATE_FFD;
    return 0;
}

int MpegFFW(unsigned int step)
{
    /* do nothing when video is stoped. */
    if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
        return 0;

    if (!step)
        step = 10000;
    if (mpeg.skipFlag == MPEG_SKIP_FLAG_NONE)
        mpeg.seekTime = mpeg.curTime - mpeg.startTime;

    if (mpegPlayState == MPEG_STATE_PAUSE)
        MpegPlayPause();

    SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
    mpeg.skipFlag = MPEG_SKIP_FLAG_FFW;
    if (mpeg.seekTime >= step)
        mpeg.seekTime -= step;
    else
        mpeg.seekTime = 0;

    mpegPlayState = MPEG_STATE_FFW;
    return 0;
}

void MpegResume(void)
{
    if (((mpegPlayState != MPEG_STATE_FFD) && (mpegPlayState != MPEG_STATE_FFW)) || (!mpeg.duration))
        return ;

    skipFrms = -1;
    while (!AllBufEmpty(mpegfilledBlock) || IsYuvReady(mpegCurFrame))
    {
        MpegTimerCallBack();
    }

    if (mpegPlayState == MPEG_STATE_FFW)
    {
        skipFrms = 18;
    }
    else
    {
        skipFrms = 0;
    }

    mpeg.skipFlag = MPEG_SKIP_FLAG_END;
    timerCnt = mpeg.seekTime + 2000;
    mpegPlayState = MPEG_STATE_PLAYING;
    SendOperationMsg(VIDEO_OPERATION_PLAY);
}

int MpegVideoSeek(long msTime)
{
    if (msTime > mpeg.duration)
        return -1;

    if (msTime < mpeg.curTime)
    {
        skipFrms = -1;
        while (!AllBufEmpty(mpegfilledBlock) || IsYuvReady(mpegCurFrame))
        {
            MpegTimerCallBack();
        }
        skipFrms = 25;
    }

    mpeg.seekTime = msTime;
    mpeg.skipFlag = MPEG_SKIP_FLAG_END;
    timerCnt = mpeg.seekTime + 2000;
    return 0;
}

int MpegPlayPause(void)
{
    if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
        return FALSE;

    if (mpegPlayState == MPEG_STATE_PAUSE)
    {

        /* Start frame display timer. */
        MpegFrameDispCtrl();

        mpegPlayState = MPEG_STATE_PLAYING;
        return FALSE;
    }
    else
    {

        /* Stop frame display timer. We may set DSP idle here to save power. */
        Timer_PowerOffDeinit(0);

        mpegPlayState = MPEG_STATE_PAUSE;
        return TRUE;
    }
}

int MpegGetCurTime(void)
{
    int curTime;

    if ((mpegPlayState == MPEG_STATE_FFD) || (mpegPlayState == MPEG_STATE_FFW)
            || (mpeg.skipFlag == MPEG_SKIP_FLAG_END))
    {
        return mpeg.seekTime;
    }

    curTime = (mpeg.curTime > mpeg.startTime) ? (mpeg.curTime - mpeg.startTime) : mpeg.curTime;
    //return /*mpegCurTime; //*/
    return (curTime > 1000) ? (curTime - 1000) : curTime;
}

int MpegGetYuvAddr(char **pYuv)
{
    if (mpegLastYuvID < 0)
        return 0;
    *pYuv = mpegYuvBuf + mpegLastYuvID * YUV_BUFFER_SIZE;
    return 1;
}

int MpegGetResolution(long *pWidth, long *pHeight)
{
    *pWidth = (mpeg.width + 15) & 0xfff0;
    *pHeight = (mpeg.height + 15) & 0xfff0;
    return 0;
}

int MpegGetTotalTime(void)
{
    return mpeg.duration;
}

short MpegGetDecStatus(void)
{
    if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
        return 0;
    else
        return GetDecStatus();
}

int MpegAudioGetData(char *buffer, DWORD size)
{
    if ((mpegPlayState == MPEG_STATE_STOP))
        return 0;
    if (MpegAudioGetDataToSDRAM(&mpeg, buffer, size) < size)
    {
        mpeg.auCodec = 0;
        mpeg.auCurTime = 0;
        return -1;
    }
    else
    {
        return size;
    }
}


#ifdef TVOUT_PANEL
extern DWDMALLP     gLLPList[ ][480];       // LCD刷屏接口用
extern BACKGRND                    gScreen[2];
extern void ReCreat(void);
void MpegTVoutChange(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);
        MpegCreateVideoScreen();

    }
    else
    {
        //Screen_MCUIFUpdateFinish();
        while (Screen_GetMCUIFStatus() == BUSY);
        BL_SetBright(BL_DARK);
        Screen_Display(OFF);
        Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
        MpegCreateVideoScreen();
    }
    ReCreat();
}
#endif

⌨️ 快捷键说明

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