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

📄 flvvideocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
        if (err == FLV_FILE_AUDIO_CODEC_ERR)     /* audio codec error is allowable. */
        {
            return err;
        }
        FlvFileClose(&flv);
        flvPlayState = FLV_STATE_STOP;
        return err;
    }

    return FLV_FILE_PARSING_OK;
}

int FlvVideoDecInit(void)
{
    int i;
    long flv_width, flv_height;

    if (flvPlayState != FLV_STATE_INITIALIZING)
        return -1;

    gVideoPmuFlag = 1;
    PMU_ExitModule(PMU_VIDEOHIGH);
    FlvGetResolution(&flv_width, &flv_height);
    if (gSDModeFlag == 0)
    {
        if (flv_width *flv_height <= (320*240))
        {
            gFlvFunPmu = 7;
            PMU_EnterModule(PMU_VIDEOLOWLL);
        }
        else  if (flv_width *flv_height <= (480*272))
        {
            gFlvFunPmu = 6;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else if (flv_width *flv_height  <= (640 *272))
        {
            gFlvFunPmu = 2;
            PMU_EnterModule(PMU_VIDEOMEDLOW);
        }
        else if (flv_width *flv_height  <= (640 *480))
        {
            gFlvFunPmu = 3;
            PMU_EnterModule(PMU_VIDEOMED);
        }
        else if (flv_width *flv_height  <= (720*480) && flv_width < 800)
        {
            gFlvFunPmu = 4;
            PMU_EnterModule(PMU_VIDEOMEDHIGH);
        }
        else
        {
            gFlvFunPmu = 5;
            PMU_EnterModule(PMU_VIDEOHIGH);
        }
    }
    else if (gSDModeFlag == 1)
    {
        PMU_EnterModule(PMU_VIDEOHIGH);
    }

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

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

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

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

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

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

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

    flvPlayState = FLV_STATE_PLAYING;
    return 0;
}


int FlvFFD(unsigned int step)
{
    /* do nothing when video is stoped. */
    if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
        return 0;
#if 0
    if (!step)
        step = 3000;
    if (FlvSeek(&flv, flv.curVideo.time + step))
        return -1;
#else
    if (flvPlayState == FLV_STATE_PAUSE)
        FlvPlayPause();
    if (!flv.skipFlag)
    {
        SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
        flvDispInterval = 1;
        flv.skipFlag = FLV_SKIP_FLAG_FFD;
        flvPlayState = FLV_STATE_FFD;
    }
#endif
    return 0;
}

int FlvFFW(unsigned int step)
{
    /* do nothing when video is stoped. */
    if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
        return 0;
#if 0
    if (!step)
        step = 5000;
    if (flv.curVideo.time <= step)
        return -1;
    FlvSeek(&flv, flv.curVideo.time + step);
#else
    if (flvPlayState == FLV_STATE_PAUSE)
        FlvPlayPause();
    if (!flv.skipFlag)
    {
        SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
        flvDispInterval = 1;
        flv.skipFlag = FLV_SKIP_FLAG_FFW;
        flvPlayState = FLV_STATE_FFW;
    }
#endif
    return 0;
}

void FlvResume(void)
{
    if ((flvPlayState != FLV_STATE_FFD) && (flvPlayState != FLV_STATE_FFW))
        return ;

    flv.skipFlag = FLV_SKIP_FLAG_NONE;
    flv.lastSkipPos = 0;
    SendOperationMsg(VIDEO_OPERATION_PLAY);

    if (flvPlayState == FLV_STATE_FFW)
    {
#if 0
        flvPlayState = FLV_STATE_PLAYING;
        FlvVideoGetPreKeyFrm(&flv, 0);
        //FlvVideoSeek(flv.curVideo.time);

        ClrRegBit32(0x1801c028, 16);
        delay_nops(300);
        SetRegBit32(0x1801c028, 16);    /* decoder exit interrupt. */
        delay_nops(500);
        ClrRegBit32(0x1801c028, 16);

        OSSchedLock();
        FlvSynAudio2Video(&flv);
        OSSchedUnlock();

        /* stop video frames display. */
        Timer_PowerOffDeinit(0);

        /* wating for decoder exit. */
        while ((GetDecStatus()) != FLV_DEC_EXIT)
            delay_nops(300);

        DisableDecoder();
        FlvCtrlInit();

        /* update displayed frame number */
        flvDispFrameNum = flv.videoFrmNum - 1;

        VideoDecoderLoad(flvVideoBufRemain, "FLV");            /* restart decoder. */
        flvTimerIsrTimes = flvDispInterval;

        /* start video frames display . */
        FlvFrameDispCtrl();
#else
        flv.skipFlag = FLV_SKIP_FLAG_END;

        while ((!AllBufEmpty(flvfilledBlock)) || (IsYuvReady(flvCurFrame)))
        {
            FlvTimerCallBack();
        }

#endif
    }
    else
    {
        flv.skipFlag = FLV_SKIP_FLAG_END;


        while ((!AllBufEmpty(flvfilledBlock)) || (IsYuvReady(flvCurFrame)))
        {
            FlvTimerCallBack();
        }

        //flvDispFrameNum = flv.keyFrm[flv.keyFrmNum].frmID - 1;
    }

    flvDispInterval = TIMER_ISR_NUM_PER_FRAME;
    flvTimerIsrTimes = flvDispInterval;
    flvPlayState = FLV_STATE_PLAYING;
}

int FlvVideoSeek(long msTime)
{
    if ((flvPlayState != FLV_STATE_PLAYING) && (flvPlayState != FLV_STATE_PAUSE) && (flvPlayState != FLV_STATE_INITIALIZING))
        return 0;

    if (msTime > flv.length)
        return 0;

    /* seek video to time. */
    if (FlvSeek(&flv, msTime))
        return -1;

    if (flvPlayState != FLV_STATE_INITIALIZING)
    {

        /* stop video frames display. */
        Timer_PowerOffDeinit(0);

        DisableDecoder();
        FlvCtrlInit();

        /* update displayed frame number */
        flvDispFrameNum = flv.videoFrmNum - 1;

        VideoDecoderLoad(flvVideoBufRemain, "FLV");            /* restart decoder. */
        flvTimerIsrTimes = flvDispInterval;

        /* start video frames display . */
        FlvFrameDispCtrl();
    }

    return 0;
    //return FlvSeek(&flv, msTime);
}

int FlvPlayPause(void)
{
    if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
        return FALSE;

    if (flvPlayState == FLV_STATE_PAUSE)
    {

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

        flvPlayState = FLV_STATE_PLAYING;
        return FALSE;
    }
    else
    {

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

        flvPlayState = FLV_STATE_PAUSE;
        return TRUE;
    }
}

int FlvGetCurTime(void)
{
#if 0
    if ((flv.curAudio.time) && (flvPlayState == FLV_STATE_PLAYING))
        return flv.curAudio.time;
    else
        return flv.curVideo.time;
#else
    return flvDispTime;
#endif
}
int FlvGetYuvAddr(char **pYuv)
{
    if (flvLastYuvID < 0)
        return 0;
    *pYuv = flvYuvBuf + flvLastYuvID * YUV_BUFFER_SIZE;
    return 1;
}

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

int FlvGetTotalTime(void)
{
    return flv.length;
}

short FlvGetDecStatus(void)
{
    if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
        return 0;
    else
        return GetDecStatus();
}

int FlvAudioGetData(char *buffer, DWORD size)
{
    if ((flvPlayState == FLV_STATE_STOP))
        return 0;
    if (FlvAudioGetDataToSDRAM(&flv, buffer, &size) < 0)
    {
        flv.audioFlag = 0;
        return -1;
    }
    else
    {
        return size;
    }
}
#ifdef TVOUT_PANEL
extern DWDMALLP     gLLPList[ ][480];       // LCD刷屏接口用
extern BACKGRND                    gScreen[2];
extern void ReCreat(void);
void FLVTVoutChange(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);
        FlvCreateVideoScreen();

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

⌨️ 快捷键说明

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