📄 movvideocontrl.c
字号:
}
}
/* Load code and start decoder. */
switch (gMovFile.vFormat)
{
case VIDEO_CODEC_LIB_MP4V:
if (VideoDecoderLoad(sMovVideoBufRemain, "MP4V"))
{
return -1;
}
break;
case VIDEO_CODEC_LIB_H263 :
if (VideoDecoderLoad(sMovVideoBufRemain, "H263"))
{
return -1;
}
break;
default :
return -1;
}
/* Start frame diaplay timer. */
MovFrameDispCtrl(NULL);
movPlayState = MOV_STATE_PALYING;
return 0;
}
/********************************************************************************************
* Func:
* MovGetTotalTime()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
uint32 MovGetTotalTime(void)
{
return gMovFile.length;
}
/********************************************************************************************
* Func:
* MovFFD()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovFFD(unsigned int step)
{
/* do nothing when video is stoped. */
if ((movPlayState == MOV_STATE_STOP)
|| (movPlayState == MOV_STATE_INITIALIZING))
{
return 0;
}
if (gSkipFlag == FALSE)
{
movLastSeekTime = MovGetCurTime();
gSkipFlag = TRUE;
}
movLastSeekTime += MOV_FFD_FFW_INTERVAL;
if (movLastSeekTime > gMovFile.length)
{
movLastSeekTime = gMovFile.length;
}
movPlayState = MOV_STATE_FFD;
if (MovSeekVideoNextISample2Time(gMovFilePointer, &gMovFile, movLastSeekTime) != 0x0)
{
//movPlayState = MOV_STATE_PALYING;
return -1;
}
/* send ffd/ffw msg to dsp. */
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
gVideoBeingSkip = FFD_STATE;
/*while (IsYuvReady(curFrame) == 0x1)
{
MovShowVideoFrame();
}*/
return 0;
}
/********************************************************************************************
* Func:
* MovFFW()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovFFW(unsigned int step)
{
/* do nothing when video is stoped. */
if ((movPlayState == MOV_STATE_STOP)
|| (movPlayState == MOV_STATE_INITIALIZING))
{
return 0;
}
if (gSkipFlag == FALSE)
{
movLastSeekTime = MovGetCurTime();
gSkipFlag = TRUE;
}
movLastSeekTime -= MOV_FFD_FFW_INTERVAL;
if (movLastSeekTime < 0x0)
{
movLastSeekTime = 0x0;
}
movPlayState = MOV_STATE_FFW;
if (MovSeekVideoPreISample2Time(gMovFilePointer, &gMovFile, movLastSeekTime) != 0x0)
{
//movPlayState = MOV_STATE_PALYING;
return -1;
}
/* send ffd/ffw msg to dsp. */
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
gVideoBeingSkip = FFW_STATE;
/*while (IsYuvReady(curFrame) == 0x1)
{
MovShowVideoFrame();
}*/
return 0;
}
/********************************************************************************************
* Func:
* MovResume()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovResume(void *param)
{
int keyFrameNo = 0x0;
/* do nothing if current state is not ffd or ffw. */
if ((movPlayState != MOV_STATE_FFD) && (movPlayState != MOV_STATE_FFW))
{
return -1;
}
movLastSeekTime = 0x0;
gSkipFlag = FALSE;
if (movPlayState == MOV_STATE_FFD)
{
/* FFD */
keyFrameNo = MovVideoGetNextISample(gMovFilePointer, &gMovFile, gMovFile.curVideoSampleNo);
}
else
{
/* FFW */
keyFrameNo = MovVideoGetPreISample(gMovFilePointer, &gMovFile, gMovFile.curVideoSampleNo);
}
if (keyFrameNo < 0x0)
{
/* syn audio to video. */
OSSchedLock();
MovSynAudio2Video(gMovFile.curVideoSampleNo);
gBeingSkip = RESUME;
OSSchedUnlock();
movPlayState = MOV_STATE_PALYING;
return -1;
}
else
{
/* stop video frames display. */
Timer_PowerOffDeinit(0);
DisableDecoder();
MovShareDataInit();
MovGetVideoISampleinf(gMovFilePointer, &gMovFile, keyFrameNo);
/* syn audio to video. */
OSSchedLock();
MovSynAudio2Video(gMovFile.curVideoSampleNo);
gBeingSkip = RESUME;
gVideoBeingSkip = RESUME;
OSSchedUnlock();
switch (gMovFile.vFormat)
{
case VIDEO_CODEC_LIB_MP4V :
if (VideoDecoderLoad(sMovVideoBufRemain, "MP4V"))
{
return -1;
}
break;
case VIDEO_CODEC_LIB_H263 :
if (VideoDecoderLoad(sMovVideoBufRemain, "H263"))
{
return -1;
}
break;
/*case VIDEO_CODEC_LIB_H264 :
if (VideoDecoderLoad(sMovVideoBufRemain, "H264"))
{
return -1;
}
break;*/
default :
return -1;
}
/* start video frames display . */
MovFrameDispCtrl(0);
movPlayState = MOV_STATE_PALYING;
}
return 0;
}
/********************************************************************************************
* Func:
* MovPlayPause()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovPlayPause(void)
{
if ((movPlayState == MOV_STATE_STOP) || (movPlayState == MOV_STATE_INITIALIZING))
{
return FALSE;
}
if (movPlayState == MOV_STATE_PAUSE)
{
/* Start frame display timer. */
MovFrameDispCtrl(0);
movPlayState = MOV_STATE_PALYING;
return FALSE;
}
else
{
/* Stop frame display timer. We may set DSP idle here to save power. */
Timer_PowerOffDeinit(0);
movPlayState = MOV_STATE_PAUSE;
return TRUE;
}
}
/********************************************************************************************
* Func:
* MovVideoSeek()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovVideoSeek(long msTime)
{
if ((movPlayState != MOV_STATE_PALYING)
&& (movPlayState != MOV_STATE_PAUSE)
&& (movPlayState != MOV_STATE_INITIALIZING))
{
return 0;
}
/* seek video sample to time. */
if (MovSeekVideoNextISample2Time(gMovFilePointer, &gMovFile, msTime) != 0x0)
{
return -1;
}
if ((gMovFile.vFormat == VIDEO_CODEC_LIB_MP4V)
|| (gMovFile.vFormat == VIDEO_CODEC_LIB_H263))
{
MovGetVideoISampleinf(gMovFilePointer, &gMovFile, skipToSampleNo);
}
if (movPlayState != MOV_STATE_INITIALIZING)
{
/* stop video frames display. */
Timer_PowerOffDeinit(0);
DisableDecoder();
MovShareDataInit();
/* syn audio to video. */
OSSchedLock();
MovSynAudio2Video(gMovFile.curVideoSampleNo);
gBeingSkip = SEEK_TIME;
gVideoBeingSkip = SEEK_TIME;
OSSchedUnlock();
switch (gMovFile.vFormat)
{
case VIDEO_CODEC_LIB_MP4V :
if (VideoDecoderLoad(sMovVideoBufRemain, "MP4V"))
{
return -1;
}
break;
case VIDEO_CODEC_LIB_H263 :
if (VideoDecoderLoad(sMovVideoBufRemain, "H263"))
{
return -1;
}
break;
/*case VIDEO_CODEC_LIB_H264 :
if (VideoDecoderLoad(sMovVideoBufRemain, "H264"))
{
return -1;
}
break;*/
default :
return -1;
}
//movTimerCount = msTime;
/* start video frames display . */
MovFrameDispCtrl(0);
}
return 0;
}
/********************************************************************************************
* Func:
* MovGetCurTime()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
uint32 MovGetCurTime(void)
{
if ((movPlayState == MOV_STATE_FFD) || (movPlayState == MOV_STATE_FFW))
{
{
uint32 duration = 0x0;
uint32 msTime = 0x0;
duration = MovGetVideoFrameTime(gMovFilePointer, &gMovFile, gMovFile.curVideoSampleNo);
msTime = ((duration / gMovFile.videoTimeScale) * 1000) +
(((duration % gMovFile.videoTimeScale) * 1000) / gMovFile.videoTimeScale);
return msTime;
}
}
else
{
return MovDispTime;
}
}
/********************************************************************************************
* Func:
* MovGetYuvAddr()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovGetYuvAddr(char **pYuv)
{
if (lastYuvBufId < 0)
{
return 0;
}
*pYuv = sMovyuvBuf + lastYuvBufId * MOV_YUV_BUFFER_SIZE;
return 1;
}
/********************************************************************************************
* Func:
* MovGetResolution()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovGetResolution(long *pWidth, long *pHeight)
{
*pWidth = (gMovFile.width + 15) & 0xfff0;
*pHeight = (gMovFile.height + 15) & 0xfff0;
return 0;
}
/********************************************************************************************
* Func:
* MovGetDecStatus()
* Description:
*
* Param:
*
* Return:
*
*
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
short MovGetDecStatus(void)
{
if ((movPlayState == MOV_STATE_STOP) || (movPlayState == MOV_STATE_INITIALIZING))
{
return 0;
}
else
{
return GetDecStatus();
}
}
/********************************************************************************************
* Func:
* MovIsLastFrame()
* Description:
* Check if is last video frame or not?
* Param:
*
* Return:
* 0: it is not the last frame.
* 1: it is the last frame.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovIsLastFrame(void *param)
{
if ((movPlayState != MOV_STATE_PALYING) || (sMovTimeOut == 0) || (GetDecStatus() == MOV_DEC_EXIT))
{
return 1;
}
sMovTimeOut--;
return 0;
}
/********************************************************************************************
* Func:
* MovGetAudioData()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
int MovGetAudioData(char *buffer, DWORD size)
{
if (movPlayState == MOV_STATE_STOP)
{
return 0;
}
if (MovAudioGetDataToSDRAM(gMovAudioFilePointer, &gMovFile, buffer, &size) >= 0)
{
isAudioPlayEnd = FALSE;
return size;
}
else
{
isAudioPlayEnd = TRUE;
memset(buffer, 0, size);
return 0;
}
}
#ifdef TVOUT_PANEL
extern DWDMALLP gLLPList[ ][480]; // LCD刷屏接口用
extern BACKGRND gScreen[2];
extern void ReCreat(void);
void MovTVoutChange(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);
MovCreateVideoScreen();
}
else
{
//Screen_MCUIFUpdateFinish();
while (Screen_GetMCUIFStatus() == BUSY);
BL_SetBright(BL_DARK);
Screen_Display(OFF);
Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
MovCreateVideoScreen();
}
ReCreat();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -