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

📄 movvideocontrl.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************
*	Copyright (C), 2008, Fuzhou Rockchip Co.,Ltd.
*   All Rights Reserved
*
*	File:
*              MovVideoContrl.c
*	Description:
*
*	Author:
*              guosl
*	Note:
*	           None.
*	$Log: MovVideoContrl.c,v $
*	Revision 1.2  2008/07/18 06:54:31  HZF
*	no message
*	
*	Revision 1.1  2008/07/08 07:29:21  HZF
*	增加3gp和MP4
*	
*	Revision 1.1  2008/5/16 14:43:19  guosl
*	no message
*
*
*
*
********************************************************************************************/
#include "MovVideoContrl.h"
#include "include.h"
#include "MovFile.h"
#include "DualCoreApi.h"
#include "../audio/include/audio_globals.h"

STATIC char *sMovBitStreamBuf = NULL;

STATIC char *sMovyuvBuf = NULL;

STATIC char *sMovMbMvInfoBuf = NULL;

STATIC BACKGRND *sMovVideoScreen = NULL;

STATIC DWDMALLP *sMovVideoLLPList = NULL;

STATIC char *sMovVideoBufRemain = NULL;

STATIC int sMovTimeOut;

STATIC BACKGRND *sMovVideoScreenTemp = NULL;

STATIC DWDMALLP *sMovVideoLLPListTemp = NULL;

int movLastSeekTime = 0x0;

uint32 movTimerCount = 0x0;

int gSkipFlag = FALSE;

uint32 sMovFilledBlockNum = 0x0;

uint32 movPlayState;

uint32 skipToSampleNo;

UINT16   gMovFunPmu;
extern BOOLEAN   gSDModeFlag;
extern BOOLEAN gVideoPmuFlag;

STATIC uint32 MovDispTime = 0x0; //ms

EXT SKIPSTATE gVideoBeingSkip;

EXT unsigned short *frameList;

EXT int lastYuvBufId;

EXT uint32 curFrame;

EXT uint32 displayedYuvBuffer;

EXT void OSSchedLock(void);

EXT void OSSchedUnlock(void);

EXT void LCDC_UpDate(void);

EXT uint32 MovAudioGetCurTime(void);

/********************************************************************************************
*	Func:
*		MovSetAudioPlayEnd()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-6-12	10:30
*	Log:
*
********************************************************************************************/
void MovSetAudioPlayEnd(void)
{
    isAudioPlayEnd = TRUE;
    return;
}

/********************************************************************************************
*	Func:
*		MovSetAudioPlayNoEnd()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-6-12	10:30
*	Log:
*
********************************************************************************************/
void MovSetAudioPlayNoEnd(void)
{
    isAudioPlayEnd = FALSE;
    return;
}

/********************************************************************************************
*	Func:
*		MovVideoDecBufMalloc()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/

STATIC int MovVideoDecBufMalloc(void)
{
    /* use fixed buffer. */
    sMovBitStreamBuf = gVideoBufferMix;
    sMovyuvBuf = gVideoBufferMix + (MOV_BITSREAM_BUFFER_SIZE * MOV_MAX_BITSREAM_BLOCK_NUM);
    sMovMbMvInfoBuf = sMovyuvBuf + ((MOV_YUV_BUFFER_NUM+1) * MOV_YUV_BUFFER_SIZE);
    sMovVideoScreen = (BACKGRND *)(sMovMbMvInfoBuf + (((gMovFile.width + 15) >> 4) * ((gMovFile.height + 15) >> 4) * 32));
    sMovVideoLLPList = (DWDMALLP *)((char *)sMovVideoScreen + ((MOV_YUV_BUFFER_NUM+1) * (sizeof(BACKGRND))));
    sMovVideoScreenTemp = (BACKGRND *)((char *)sMovVideoLLPList + ((MOV_YUV_BUFFER_NUM+1)*1000 * (sizeof(DWDMALLP))));
    sMovVideoLLPListTemp = (DWDMALLP *)((char *)sMovVideoScreenTemp + (MOV_YUV_BUFFER_NUM ) * (sizeof(BACKGRND)));
    sMovVideoBufRemain = (char *)((char *)sMovVideoLLPListTemp + (MOV_YUV_BUFFER_NUM * 1000) * (sizeof(DWDMALLP)));



    return 0;
}

/********************************************************************************************
*	Func:
*		MovDecodeEnd()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/
void MovDecodeEnd(void *param)
{
    int timeOutCnt = 0;

    if (movPlayState == MOV_STATE_STOP)
    {
        return;
    }

    /* Stop frame display timer. */
    Timer_PowerOffDeinit(0);
    MovGlobalVarDspInit();

    /* Close video file. */
    MovFileClose();

    if (movPlayState != MOV_STATE_INITIALIZING)
    {
        ClrRegBit32(0x1801c028, 16);
        delay_nops(300);
        SetRegBit32(0x1801c028, 16);    /* nmi interrupt. */
        delay_nops(500);
        ClrRegBit32(0x1801c028, 16);

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

            if ((timeOutCnt++) > 0x1ffff)
            {
                 break;
            }
        }
    }

    //Screen_UpdateFinish();
    movPlayState = MOV_STATE_STOP;

    if (CODEC_AC3_DEC == CurrentCodec)
        PMU_ExitModule(PMU_VIDEOLOW);
    if (gSDModeFlag == 0)
    {
        if (gMovFunPmu == 2)
            PMU_ExitModule(PMU_VIDEOMEDLOW);
        else if (gMovFunPmu == 3)
            PMU_ExitModule(PMU_VIDEOMED);
        else if (gMovFunPmu == 4)
            PMU_ExitModule(PMU_VIDEOMEDHIGH);
        else if (gMovFunPmu == 5)
            PMU_ExitModule(PMU_VIDEOHIGH);
        else if (gMovFunPmu == 6)
            PMU_ExitModule(PMU_VIDEOLOWL);
        else if (gMovFunPmu == 7)
            PMU_ExitModule(PMU_VIDEOLOWL);
        gMovFunPmu = 0;
    }
    else if (gSDModeFlag == 1)
    {
        PMU_ExitModule(PMU_VIDEOHIGH);
    }
    /* Disable Dsp */
//	PMU_ExitModule(PMU_VIDEOHIGH);
    if ((sMovyuvBuf == NULL) || (lastYuvBufId == -1))
        return;
    memcpy((sMovyuvBuf+(MOV_YUV_BUFFER_NUM) * MOV_YUV_BUFFER_SIZE),(sMovyuvBuf+(lastYuvBufId) * MOV_YUV_BUFFER_SIZE),MOV_YUV_BUFFER_SIZE);
    Screen_Change(&sMovVideoScreen[MOV_YUV_BUFFER_NUM]);
}

/********************************************************************************************
*	Func:
*		MovShareDataInit()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/

STATIC void MovShareDataInit(void)
{
    ShareMemInit((unsigned int *)sMovBitStreamBuf, (unsigned int *)sMovyuvBuf,
                 (unsigned int *)sMovMbMvInfoBuf, 1,  gMovFile.width, gMovFile.height);

    /* get start address of frame list. */
    frameList = (unsigned short *)GetFrameList();
    sMovFilledBlockNum = 0;
    lastYuvBufId = -1;

	curFrame = 0;               /* current frame ID in frame list for display. */
    displayedYuvBuffer = 0;     /* use this one to redress lcd update delay in the begining. */

    //MovDispTime = 0x0;
    movTimerCount = 0x0;
    sMovTimeOut = 0x3fffff;
}

/********************************************************************************************
*	Func:
*		MovCreateVideoScreen()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/
EXT SCALEMODE ScreenMode;
EXT INT16  ScreenModeSetSign ;
STATIC void MovCreateVideoScreen(void)
{
    int i;
    int width = gMovFile.width;
    int height = gMovFile.height;

    for (i = 0; i < MOV_YUV_BUFFER_NUM; i++)
    {
        Screen_CreatVideo(&sMovVideoScreen[i], &sMovVideoLLPList[i*1000], (unsigned long)((unsigned long)(sMovyuvBuf)+(unsigned long)(MOV_YUV_BUFFER_SIZE)*(unsigned long)(i)), width,
        height, FullScreen);
        Screen_CreatVideo(&sMovVideoScreenTemp[i], &sMovVideoLLPListTemp[i*1000], (unsigned long)((unsigned long)(sMovyuvBuf)+(unsigned long)(MOV_YUV_BUFFER_SIZE)*(unsigned long)(i)), width,
        height, LineArity);
    }
    Screen_CreatVideo(&sMovVideoScreen[MOV_YUV_BUFFER_NUM], &sMovVideoLLPList[MOV_YUV_BUFFER_NUM*1000], (unsigned long)((unsigned long)(sMovyuvBuf)+(unsigned long)(MOV_YUV_BUFFER_SIZE)*(unsigned long)(MOV_YUV_BUFFER_NUM)), width,
    height, FullScreen);
}

/********************************************************************************************
*	Func:
*		MovFillBitStreamForDecoder()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/

int MovFillBitStreamForDecoder(void *param)
{
	DWORD size = MOV_BITSREAM_BUFFER_SIZE;
    //unsigned int tempVideoChunkNum

    if (movPlayState == MOV_STATE_STOP)
    {
        return 0;
    }

    /* use only one bit stream buffer when ffd/ffw. */
    if ((((movPlayState == MOV_STATE_FFD) || (movPlayState == MOV_STATE_FFW))
        && (!AllBufEmpty(sMovFilledBlockNum))))
    {
        return 0;
    }

	if ((!AllBufFull(sMovFilledBlockNum)))
    {
        sMovFilledBlockNum ++;

		if (MovVideoGetDataToSDRAM(gMovFilePointer, &gMovFile,
                                  (char *)(sMovBitStreamBuf+((sMovFilledBlockNum-1)&0xf) * MOV_BITSREAM_BUFFER_SIZE), &size) != 0x0)
        {

            /* use this to prevent decoder from exiting when ffd/ffw. */
            if ((movPlayState == MOV_STATE_FFD) || (movPlayState == MOV_STATE_FFW))
            {
                sMovFilledBlockNum--;
                LCDC_UpDate();
                return 0;
            }

            /* send last block to decoder */
			SendBlock(sMovFilledBlockNum);
			SendLastBlockInfo(size);
	        return -1;
		}

        /* send filled block number to decoder */
		SendBlock(sMovFilledBlockNum);
	}

    return 0;
}

/********************************************************************************************
*	Func:
*		MovShowVideoFrame()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/
STATIC void MovShowVideoFrame(void)
{
    uint32 frmTime;

    if ((movPlayState == MOV_STATE_STOP)
       || (movPlayState == MOV_STATE_INITIALIZING))
    {
        return ;
    }

    movTimerCount += MOV_TIMER_TICK;

    /**************************************************
      Check if the current YUV buffer is ready.
    ***************************************************/
    if (IsYuvReady(curFrame) == 0x1)
    {
        frmTime = GetFrameTime(curFrame);

        if (movPlayState == MOV_STATE_PALYING)
        {
            if (isAudioPlayEnd == FALSE)
            {
                if (frmTime > (MovAudioGetCurTime() + 0x100))
                {
                    return;
                }
            }
            else
            {
                if (frmTime > movTimerCount)
                {
                    return;
                }
            }
        }

        /* Change screen and update lcd. */

        if (ScreenMode == FullScreen)
            Screen_Change(&sMovVideoScreen[frameList[curFrame]]);
        else if (ScreenMode == LineArity)
            Screen_Change(&sMovVideoScreenTemp[frameList[curFrame]]);
#ifdef MCU_PANEL
        while (Lcdctrl_GetStatus() == 1);
        LCDC_UpDate();
#endif

        MovDispTime = frmTime;

        /* Redress lcd update delay in the begining. */
        if (displayedYuvBuffer < 2)
        {
            displayedYuvBuffer++;
        }
        else
        {
		    SendYuvFinish(curFrame);
        }

		/* save last buffer id for video cap. */
		lastYuvBufId = frameList[curFrame];

        /* Change to next. */
        ++curFrame;
        curFrame = curFrame % MOV_YUV_BUFFER_NUM;

	}

    return;
}

/********************************************************************************************
*	Func:
*		MovFrameDispCtrl()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/

STATIC void MovFrameDispCtrl(void *param)
{
    StartHWVideoTimer(10000, MovShowVideoFrame);
}



/********************************************************************************************
*	Func:
*		MovVideoFileInit()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/

int MovVideoFileInit(void *PathName)
{
    int err;

    movPlayState = MOV_STATE_INITIALIZING;
    MovGlobalVarInit();

    if (MovFileInit((const char *)PathName))
    {
        movPlayState = MOV_STATE_STOP;
        MovFileClose();
        return MOV_FILE_OPEN_ERR;
    }

    if ((err = MovFileParsing(gMovFilePointer)) != MOV_FILE_PARSING_OK)
    {
        movPlayState = MOV_STATE_STOP;
        return err;
    }

    if ((gMovFile.audioFlag == FALSE)
       || (gMovFile.aFormat == AUDIO_CODEC_LIB_NULL))
    {
        return MOV_FILE_AUDIO_CODEC_ERR;
    }
    if ((gMovFile.videoFlag == FALSE)
    || (gMovFile.vFormat == VIDEO_CODEC_LIB_NULL))
    {
        return MOV_FILE_VIDEO_UNSUPPORTED;
    }
    return MOV_FILE_PARSING_OK;
}

/********************************************************************************************
*	Func:
*		MovVideoDecInit()
*	Description:
*
*	Param:
*
*	Return:
*
*
*	Author:
*		guosl
*	Date:
*		2008-5-16	10:30
*	Log:
*
********************************************************************************************/
int MovVideoDecInit(void *param)
{
    int i;
    long mov_width, mov_height, stride;

    if (movPlayState != MOV_STATE_INITIALIZING)
    {
        return -1;
    }

    gVideoPmuFlag = 1;
    PMU_ExitModule(PMU_VIDEOHIGH);
    MovGetResolution(&mov_width, &mov_height);
    stride = mov_width * mov_height;
    if (gSDModeFlag == 0)
    {
        if (stride <= (320*240))
        {
            gMovFunPmu = 7;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else  if (stride  <= (480*272))
        {
            gMovFunPmu = 6;
            PMU_EnterModule(PMU_VIDEOLOWL);
        }
        else if (stride  <= (640 *272))
        {
            gMovFunPmu = 2;
            PMU_EnterModule(PMU_VIDEOMEDLOW);
        }
        else if (stride  <= (640 *480))
        {
            gMovFunPmu = 3;
            PMU_EnterModule(PMU_VIDEOMED);
        }
        else if ((stride  <= (720*480)) && (mov_width < 800))
        {
            gMovFunPmu = 4;
            PMU_EnterModule(PMU_VIDEOMEDHIGH);
        }
        else
        {
            gMovFunPmu = 5;
            PMU_EnterModule(PMU_VIDEOHIGH);
        }
    }
    else if (gSDModeFlag == 1)
    {
        PMU_EnterModule(PMU_VIDEOHIGH);
    }


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

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

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

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

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

⌨️ 快捷键说明

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