📄 movvideocontrl.c
字号:
/********************************************************************************************
* 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 + -