📄 mpegvideocontrol.c
字号:
/* dwdma llp list for each video screen. */
mpegVideoLLPList = (DWDMALLP *)((char *)mpegVideoScreen + ((YUV_BUFFER_NUM+1) * (sizeof(BACKGRND))));
mpegVideoScreenTemp = (BACKGRND *)((char *)mpegVideoLLPList + ((YUV_BUFFER_NUM+1) * 1000 * (sizeof(DWDMALLP))));
mpegVideoLLPListTemp = (DWDMALLP *)((char *)mpegVideoScreenTemp + (YUV_BUFFER_NUM * (sizeof(BACKGRND))));
/* buffer remain. */
mpegVideoBufRemain = (char *)((char *)mpegVideoLLPListTemp + (YUV_BUFFER_NUM * 1000 * (sizeof(DWDMALLP))));
#endif
return 0;
}
int MpegFileInit(char *path)
{
int err;
mpegPlayState = MPEG_STATE_INITIALIZING;
/* open audio stream file. */
if (MpegFileOpen(&mpeg, path))
{
mpegPlayState = MPEG_STATE_STOP;
MpegFileClose(&mpeg);
return MPEG_FILE_OPEN_ERR;
}
/* parse video file. */
if ((err = MpegFileParsing(&mpeg)))
{
if (err == MPEG_FILE_AUDIO_CODEC_ERR) /* audio codec error is allowable. */
{
return err;
}
MpegFileClose(&mpeg);
mpegPlayState = MPEG_STATE_STOP;
return err;
}
return MPEG_FILE_PARSING_OK;
}
int MpegVideoDecInit(void)
{
int i;
if (mpegPlayState != MPEG_STATE_INITIALIZING)
return -1;
// PMU_EnterModule(PMU_VIDEOHIGH);
if (gSDModeFlag == 0)
{
if (mpeg.width *mpeg.height <= (320*240))
{
gMpgFunPmu = 7;
PMU_EnterModule(PMU_VIDEOLOWLL);
}
else if (mpeg.width *mpeg.height <= (480*272))
{
gMpgFunPmu = 6;
PMU_EnterModule(PMU_VIDEOLOWL);
}
else if (mpeg.width *mpeg.height <= (640 *272))
{
gMpgFunPmu = 2;
PMU_EnterModule(PMU_VIDEOMEDLOW);
}
else if (mpeg.width *mpeg.height <= (640 *480))
{
gMpgFunPmu = 3;
PMU_EnterModule(PMU_VIDEOMED);
}
else if (mpeg.width *mpeg.height <= (720*480) && mpeg.width < 800)
{
gMpgFunPmu = 4;
PMU_EnterModule(PMU_VIDEOMEDHIGH);
}
else
{
gMpgFunPmu = 5;
PMU_EnterModule(PMU_VIDEOHIGH);
}
}
else if (gSDModeFlag == 1)
{
PMU_EnterModule(PMU_VIDEOHIGH);
}
/* Flow: */
/* a. Malloc Buffer for decoder. */
if (MpegVideoDecBufMalloc())
return -1;
/* b. Enable DSP core and peripheral. */
DspEnable(); /* do this in pmu. */
/* c. Share data initialize. */
MpegCtrlInit();
/* d. Create video screens. */
MpegCreateVideoScreen();
/* e. Fill all bit stream buffer. */
for (i = 0;i < MAX_BITSREAM_BLOCK_NUM;i++)
{
if (MpegFillBitStream() != 0)
{
return -1;
}
}
/* f. Load code and start decoder. */
#if 0
JtagBoot(mpegVideoBufRemain);
#else
if (VideoDecoderLoad(mpegVideoBufRemain, "MPEG12"))
{
return -1;
}
#endif
/* g. Start frame diaplay timer. */
MpegFrameDispCtrl();
mpegPlayState = MPEG_STATE_PLAYING;
return 0;
}
int MpegFFD(unsigned int step)
{
/* do nothing when video is stoped. */
if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
return 0;
if (!step)
step = 10000;
if (mpeg.skipFlag == MPEG_SKIP_FLAG_NONE)
mpeg.seekTime = mpeg.curTime - mpeg.startTime;
if (mpegPlayState == MPEG_STATE_PAUSE)
MpegPlayPause();
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
mpeg.skipFlag = MPEG_SKIP_FLAG_FFD;
if ((mpeg.seekTime + step) <= mpeg.duration)
mpeg.seekTime += step;
mpegPlayState = MPEG_STATE_FFD;
return 0;
}
int MpegFFW(unsigned int step)
{
/* do nothing when video is stoped. */
if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
return 0;
if (!step)
step = 10000;
if (mpeg.skipFlag == MPEG_SKIP_FLAG_NONE)
mpeg.seekTime = mpeg.curTime - mpeg.startTime;
if (mpegPlayState == MPEG_STATE_PAUSE)
MpegPlayPause();
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
mpeg.skipFlag = MPEG_SKIP_FLAG_FFW;
if (mpeg.seekTime >= step)
mpeg.seekTime -= step;
else
mpeg.seekTime = 0;
mpegPlayState = MPEG_STATE_FFW;
return 0;
}
void MpegResume(void)
{
if (((mpegPlayState != MPEG_STATE_FFD) && (mpegPlayState != MPEG_STATE_FFW)) || (!mpeg.duration))
return ;
skipFrms = -1;
while (!AllBufEmpty(mpegfilledBlock) || IsYuvReady(mpegCurFrame))
{
MpegTimerCallBack();
}
if (mpegPlayState == MPEG_STATE_FFW)
{
skipFrms = 18;
}
else
{
skipFrms = 0;
}
mpeg.skipFlag = MPEG_SKIP_FLAG_END;
timerCnt = mpeg.seekTime + 2000;
mpegPlayState = MPEG_STATE_PLAYING;
SendOperationMsg(VIDEO_OPERATION_PLAY);
}
int MpegVideoSeek(long msTime)
{
if (msTime > mpeg.duration)
return -1;
if (msTime < mpeg.curTime)
{
skipFrms = -1;
while (!AllBufEmpty(mpegfilledBlock) || IsYuvReady(mpegCurFrame))
{
MpegTimerCallBack();
}
skipFrms = 25;
}
mpeg.seekTime = msTime;
mpeg.skipFlag = MPEG_SKIP_FLAG_END;
timerCnt = mpeg.seekTime + 2000;
return 0;
}
int MpegPlayPause(void)
{
if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
return FALSE;
if (mpegPlayState == MPEG_STATE_PAUSE)
{
/* Start frame display timer. */
MpegFrameDispCtrl();
mpegPlayState = MPEG_STATE_PLAYING;
return FALSE;
}
else
{
/* Stop frame display timer. We may set DSP idle here to save power. */
Timer_PowerOffDeinit(0);
mpegPlayState = MPEG_STATE_PAUSE;
return TRUE;
}
}
int MpegGetCurTime(void)
{
int curTime;
if ((mpegPlayState == MPEG_STATE_FFD) || (mpegPlayState == MPEG_STATE_FFW)
|| (mpeg.skipFlag == MPEG_SKIP_FLAG_END))
{
return mpeg.seekTime;
}
curTime = (mpeg.curTime > mpeg.startTime) ? (mpeg.curTime - mpeg.startTime) : mpeg.curTime;
//return /*mpegCurTime; //*/
return (curTime > 1000) ? (curTime - 1000) : curTime;
}
int MpegGetYuvAddr(char **pYuv)
{
if (mpegLastYuvID < 0)
return 0;
*pYuv = mpegYuvBuf + mpegLastYuvID * YUV_BUFFER_SIZE;
return 1;
}
int MpegGetResolution(long *pWidth, long *pHeight)
{
*pWidth = (mpeg.width + 15) & 0xfff0;
*pHeight = (mpeg.height + 15) & 0xfff0;
return 0;
}
int MpegGetTotalTime(void)
{
return mpeg.duration;
}
short MpegGetDecStatus(void)
{
if ((mpegPlayState == MPEG_STATE_STOP) || (mpegPlayState == MPEG_STATE_INITIALIZING))
return 0;
else
return GetDecStatus();
}
int MpegAudioGetData(char *buffer, DWORD size)
{
if ((mpegPlayState == MPEG_STATE_STOP))
return 0;
if (MpegAudioGetDataToSDRAM(&mpeg, buffer, size) < size)
{
mpeg.auCodec = 0;
mpeg.auCurTime = 0;
return -1;
}
else
{
return size;
}
}
#ifdef TVOUT_PANEL
extern DWDMALLP gLLPList[ ][480]; // LCD刷屏接口用
extern BACKGRND gScreen[2];
extern void ReCreat(void);
void MpegTVoutChange(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);
MpegCreateVideoScreen();
}
else
{
//Screen_MCUIFUpdateFinish();
while (Screen_GetMCUIFStatus() == BUSY);
BL_SetBright(BL_DARK);
Screen_Display(OFF);
Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
MpegCreateVideoScreen();
}
ReCreat();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -