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

📄 asfvideocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
    //PMU_EnterModule(PMU_VIDEOHIGH);
    if (gSDModeFlag == 0)
    {
        if (asf.m_width *asf.m_height <= (320*240))
        {
            gasfFunPmu = 7;
            PMU_EnterModule(PMU_VIDEOLOWLL);
        }
        else  if (asf.m_width *asf.m_height  <= (480*272))
        {
            gasfFunPmu = 6;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else if (asf.m_width *asf.m_height  <= (640 *272))
        {
            gasfFunPmu = 2;
            PMU_EnterModule(PMU_VIDEOMEDLOW);
        }
        else if (asf.m_width *asf.m_height <= (640 *480))
        {
            gasfFunPmu = 3;
            PMU_EnterModule(PMU_VIDEOMED);
        }
        else if (asf.m_width *asf.m_height  <= (720*480) &&  asf.m_width < 800)
        {
            gasfFunPmu = 4;
            PMU_EnterModule(PMU_VIDEOMEDHIGH);
        }
        else
        {
            gasfFunPmu = 5;
            PMU_EnterModule(PMU_VIDEOHIGH);
        }
    }
    else if (gSDModeFlag == 1)
    {
        PMU_EnterModule(PMU_VIDEOHIGH);
    }

    /* Flow:                                 */
    /*   a. Malloc Buffer & load RES for decoder.       */
    if (AsfVideoDecBufMalloc())
        return -1;

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

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

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

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

    /*   f. Load code and start decoder.     */
#if 0
    JtagBoot(asfVideoBufRemain);
#else
    switch (asf.m_video_stream->m_type_specific.m_video.m_encoding)
    {
        case fccWMV3:
            if (VideoDecoderLoad(asfVideoBufRemain, "WMV3"))
            {
                return -1;
            }
            break;
        case fccWMV2:
        case fccWMV1:
            if (VideoDecoderLoad(asfVideoBufRemain, "WMV12"))
            {
                return -1;
            }
            break;
        default:
            return -1;
    }
#endif

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

    asfPlayState = ASF_STATE_PLAYING;
    return 0;
}


int AsfFFD(unsigned int step)
{
    //int curTime;

    if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
        return 0;

    if (asf.m_ffd_flag || asf.m_seek_flag)
        return 0;
    if (asfPlayState == ASF_STATE_PAUSE)
    {
        AsfPlayPause();
    }

    SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
    asfPlayState = ASF_STATE_FFD;

    if (!lastSeekTime)
        lastSeekTime = AsfGetCurTime();
    if (!step)
        step = ASF_FFD_FFW_MIN_INTERVAL;

    asf.m_ffd_interval = step + (ffd_ffw_times << 7);

    ffd_ffw_times++;

    if (!asf.m_index_flag)
        asf.m_ffd_flag = TRUE;  //AsfSeek(&asf, AsfGetCurTime() + asf.m_ffd_interval);    //
    else
    {
        lastSeekTime += asf.m_ffd_interval;
        if ((lastSeekTime > asf.m_time_len) || (!AsfSeek(&asf, lastSeekTime)))
            return -1;
    }
    return 0;
}

int AsfFFW(unsigned int step)
{
    //int curTime;

    if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
        return 0;
    if (asf.m_seek_flag)
        return 0;
    if (asfPlayState == ASF_STATE_PAUSE)
    {
        AsfPlayPause();
    }

    SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
    asfPlayState = ASF_STATE_FFW;

    if (!lastSeekTime)
        lastSeekTime = AsfGetCurTime();
    if (!step)
        step = ASF_FFD_FFW_MIN_INTERVAL;

    step = (lastSeekTime >= (step + (ffd_ffw_times << 7))) ? (step + (ffd_ffw_times << 7)) : lastSeekTime;

    //curTime = AsfGetCurTime();
    lastSeekTime -= step;
    if (!AsfSeek(&asf, lastSeekTime))
        lastSeekTime += step;

    ffd_ffw_times++;

    //while(IsYuvReady(asfCurFrame))
    //    AsfTimerCallBack();
    return 0;
}

void AsfResume(void)
{
    int time = 0, seekFlag = 0, timeOut = 0;

    if ((asfPlayState != ASF_STATE_FFD) && (asfPlayState != ASF_STATE_FFW))
        return ;

    asf.m_ffd_flag = FALSE;
    lastSeekTime = 0;
    ffd_ffw_times = 0;
    /* reset seek point info */
    asf.m_next_seek_point = 0;
    asf.m_last_seek_point = 0;
    SendOperationMsg(VIDEO_OPERATION_PLAY);

    if ((!asf.m_seek_flag) && ((asfPlayState == ASF_STATE_FFW) || asf.m_index_flag))
    {
        time = asf.m_video_seg->object_start - asf.m_start_position_time;
        AsfVideoSeek(time);
        seekFlag = TRUE;
        goto resume_end;
    }

    /* get dest time */
    if (asf.m_seek_flag)
    {
        time = asf.m_seek_seg.object_start - asf.m_start_position_time;
    }
    else if (asf.m_video_seg->object_start > asf.m_start_position_time)
    {
        time = asf.m_video_seg->object_start - asf.m_start_position_time;
    }

    /* seek audio */
    AsfAudioSeek(time);

resume_end:
    /* show all frames out */
    while ((!AllBufEmpty(asffilledBlock)) || (IsYuvReady(asfCurFrame)))
    {
        AsfTimerCallBack();
        if ((timeOut++) > 0x3fff)
        {
            break;
        }
    }

    asfCurTime = timerCnt = time;

    if ((asfPlayState == ASF_STATE_FFW) && (!seekFlag))
        asfPlayState = ASF_STATE_FFW_TEMP;
    else
        asfPlayState = ASF_STATE_PLAYING;

    return;
}

int AsfVideoSeek(long msTime)
{
    if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
        return 0;

    /* reset seek point info */
    asf.m_next_seek_point = 0;
    asf.m_last_seek_point = 0;
    if (AsfSeek(&asf, msTime))
    {
        //if(asf.m_seek_seg.object_start < asf.m_video_seg->object_start){
        DisableDecoder();

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

        AsfAudioSeek(asf.m_seek_seg.object_start - asf.m_start_position_time);
        AsfSeekImmediately(&asf);

        AsfCtrlInit();

        asfCurTime = timerCnt = asf.m_seek_seg.object_start - asf.m_start_position_time;

        switch (asf.m_video_stream->m_type_specific.m_video.m_encoding)
        {
            case fccWMV3:
                VideoDecoderLoad(asfVideoBufRemain, "WMV3");
                break;
            case fccWMV2:
            case fccWMV1:
                VideoDecoderLoad(asfVideoBufRemain, "WMV12");
                break;
            default:
                break;
        }

        /* start video frames display . */
        AsfFrameDispCtrl();
        //}else{
        //    AsfAudioSeek(asf.m_seek_seg.object_start - asf.m_start_position_time);
        //}
    }
    else if ((asfPlayState == ASF_STATE_FFW) || (asfPlayState == ASF_STATE_FFD))
    {
        AsfAudioSeek(asf.m_video_seg->object_start - asf.m_start_position_time);
    }

    return 0;
}

int AsfPlayPause(void)
{
    if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
        return FALSE;

    if (asfPlayState == ASF_STATE_PAUSE)
    {

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

        asfPlayState = ASF_STATE_PLAYING;
        return FALSE;
    }
    else
    {

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

        asfPlayState = ASF_STATE_PAUSE;
        return TRUE;
    }
}

int AsfGetCurTime(void)
{
    if (((asfPlayState == ASF_STATE_FFD) || (asfPlayState == ASF_STATE_FFW)))
    {
        asfCurTime = asf.m_video_seg->object_start;
        if ((asfCurTime > asf.m_time_len) /*|| (asfCurTime < asf.m_start_position_time)*/)
            asfCurTime = asf.m_time_len;
    }

    return ((asfCurTime > asf.m_start_position_time) ? (asfCurTime - asf.m_start_position_time) : asfCurTime);
    //return 0;
}

int AsfGetYuvAddr(char **pYuv)
{
    if (lastYuvBufId < 0)
        return 0;
    *pYuv = asfYuvBuf + lastYuvBufId * YUV_BUFFER_SIZE;
    return 1;
}

int AsfGetResolution(long *pWidth, long *pHeight)
{
    *pWidth = (asf.m_width + 15) & 0xfff0;
    *pHeight = (asf.m_height + 15) & 0xfff0;
    return 0;
}

int AsfGetTotalTime(void)
{
    return (int)(asf.m_end_position_time / 10000 - asf.m_start_position_time);
    //return -1;
}

short AsfGetDecStatus(void)
{
    if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
        return 0;
    else
        return GetDecStatus();
}
/*
 *  add this to avoid loss of synchronization between audio and video.
 *  2008-6-7, by ljn
 */
//int time_skiped = 0;
static void AsfVideoHurryUp(void)
{
    unsigned int audioTime, addTime;

    /* this function is available in playing state only */
    if (asfPlayState != ASF_STATE_PLAYING)
        return;

#if 0
    /* get current time of audio */
    audioTime = AsfAudioGetCurTime();

    /* try to seek to next key frame */
    if ((!asf.m_seek_flag) && ((asf.m_video_seg->object_start - asf.m_start_position_time) < audioTime))
    {
        if (asf.m_index_flag)
            addTime = ASF_HURRY_UP_ADD_TIME + ASF_HURRY_UP_MAX_AHEAD;
        else
            addTime = ASF_HURRY_UP_ADD_TIME;
        AsfSeek(&asf, audioTime + addTime);
        if ((asf.m_seek_seg.object_start <= asf.m_video_seg->object_start)
                || ((audioTime + asf.m_start_position_time - asfCurTime + ASF_HURRY_UP_ADD_TIME
                     < asf.m_seek_seg.object_start - asf.m_video_seg->object_start)))
            asf.m_seek_flag = 0;
    }
#else
    if (!asf.m_seek_flag)
    {
        /* get point */
        if (asf.m_next_seek_point <= asf.m_video_seg->object_start)
            AsfSeekNextKeyFrm(&asf);

        if (asf.m_next_seek_point > asf.m_video_seg->object_start)
        {
            /* get current time of audio */
            audioTime = AsfAudioGetCurTime();

            /* check interval */
            if (((asf.m_next_seek_point - asf.m_video_seg->object_start)
                    <= (audioTime + asf.m_start_position_time + ASF_HURRY_UP_ADD_TIME - asfCurTime))
                    && (asf.m_last_seek_point < asfCurTime) && (audioTime))
            {
                asf.m_last_seek_point = asf.m_next_seek_point;
                asf.m_seek_flag = 1;
                //time_skiped += asf.m_next_seek_point - asf.m_video_seg->object_start;
            }
        }
    }
#endif
    hurry = FALSE;
}


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

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

⌨️ 快捷键说明

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