📄 flvvideocontrol.c
字号:
{
if (err == FLV_FILE_AUDIO_CODEC_ERR) /* audio codec error is allowable. */
{
return err;
}
FlvFileClose(&flv);
flvPlayState = FLV_STATE_STOP;
return err;
}
return FLV_FILE_PARSING_OK;
}
int FlvVideoDecInit(void)
{
int i;
long flv_width, flv_height;
if (flvPlayState != FLV_STATE_INITIALIZING)
return -1;
gVideoPmuFlag = 1;
PMU_ExitModule(PMU_VIDEOHIGH);
FlvGetResolution(&flv_width, &flv_height);
if (gSDModeFlag == 0)
{
if (flv_width *flv_height <= (320*240))
{
gFlvFunPmu = 7;
PMU_EnterModule(PMU_VIDEOLOWLL);
}
else if (flv_width *flv_height <= (480*272))
{
gFlvFunPmu = 6;
PMU_EnterModule(PMU_VIDEOLOWL);
}
else if (flv_width *flv_height <= (640 *272))
{
gFlvFunPmu = 2;
PMU_EnterModule(PMU_VIDEOMEDLOW);
}
else if (flv_width *flv_height <= (640 *480))
{
gFlvFunPmu = 3;
PMU_EnterModule(PMU_VIDEOMED);
}
else if (flv_width *flv_height <= (720*480) && flv_width < 800)
{
gFlvFunPmu = 4;
PMU_EnterModule(PMU_VIDEOMEDHIGH);
}
else
{
gFlvFunPmu = 5;
PMU_EnterModule(PMU_VIDEOHIGH);
}
}
else if (gSDModeFlag == 1)
{
PMU_EnterModule(PMU_VIDEOHIGH);
}
/* Flow: */
/* a. Malloc Buffer for decoder. */
if (FlvVideoDecBufMalloc())
return -1;
/* b. Enable DSP core and peripheral. */
DspEnable(); /* do this in pmu. */
/* c. Share data initialize. */
FlvCtrlInit();
/* d. Create video screens. */
FlvCreateVideoScreen();
/* e. Fill all bit stream buffer. */
for (i = 0;i < MAX_BITSREAM_BLOCK_NUM;i++)
{
if (FlvFillBitStream() != 0)
{
return -1;
}
}
/* f. Load code and start decoder. */
#if 0
JtagBoot(flvVideoBufRemain);
#else
if (VideoDecoderLoad(flvVideoBufRemain, "FLV"))
{
return -1;
}
#endif
/* g. Start frame diaplay timer. */
FlvFrameDispCtrl();
flvPlayState = FLV_STATE_PLAYING;
return 0;
}
int FlvFFD(unsigned int step)
{
/* do nothing when video is stoped. */
if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
return 0;
#if 0
if (!step)
step = 3000;
if (FlvSeek(&flv, flv.curVideo.time + step))
return -1;
#else
if (flvPlayState == FLV_STATE_PAUSE)
FlvPlayPause();
if (!flv.skipFlag)
{
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
flvDispInterval = 1;
flv.skipFlag = FLV_SKIP_FLAG_FFD;
flvPlayState = FLV_STATE_FFD;
}
#endif
return 0;
}
int FlvFFW(unsigned int step)
{
/* do nothing when video is stoped. */
if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
return 0;
#if 0
if (!step)
step = 5000;
if (flv.curVideo.time <= step)
return -1;
FlvSeek(&flv, flv.curVideo.time + step);
#else
if (flvPlayState == FLV_STATE_PAUSE)
FlvPlayPause();
if (!flv.skipFlag)
{
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
flvDispInterval = 1;
flv.skipFlag = FLV_SKIP_FLAG_FFW;
flvPlayState = FLV_STATE_FFW;
}
#endif
return 0;
}
void FlvResume(void)
{
if ((flvPlayState != FLV_STATE_FFD) && (flvPlayState != FLV_STATE_FFW))
return ;
flv.skipFlag = FLV_SKIP_FLAG_NONE;
flv.lastSkipPos = 0;
SendOperationMsg(VIDEO_OPERATION_PLAY);
if (flvPlayState == FLV_STATE_FFW)
{
#if 0
flvPlayState = FLV_STATE_PLAYING;
FlvVideoGetPreKeyFrm(&flv, 0);
//FlvVideoSeek(flv.curVideo.time);
ClrRegBit32(0x1801c028, 16);
delay_nops(300);
SetRegBit32(0x1801c028, 16); /* decoder exit interrupt. */
delay_nops(500);
ClrRegBit32(0x1801c028, 16);
OSSchedLock();
FlvSynAudio2Video(&flv);
OSSchedUnlock();
/* stop video frames display. */
Timer_PowerOffDeinit(0);
/* wating for decoder exit. */
while ((GetDecStatus()) != FLV_DEC_EXIT)
delay_nops(300);
DisableDecoder();
FlvCtrlInit();
/* update displayed frame number */
flvDispFrameNum = flv.videoFrmNum - 1;
VideoDecoderLoad(flvVideoBufRemain, "FLV"); /* restart decoder. */
flvTimerIsrTimes = flvDispInterval;
/* start video frames display . */
FlvFrameDispCtrl();
#else
flv.skipFlag = FLV_SKIP_FLAG_END;
while ((!AllBufEmpty(flvfilledBlock)) || (IsYuvReady(flvCurFrame)))
{
FlvTimerCallBack();
}
#endif
}
else
{
flv.skipFlag = FLV_SKIP_FLAG_END;
while ((!AllBufEmpty(flvfilledBlock)) || (IsYuvReady(flvCurFrame)))
{
FlvTimerCallBack();
}
//flvDispFrameNum = flv.keyFrm[flv.keyFrmNum].frmID - 1;
}
flvDispInterval = TIMER_ISR_NUM_PER_FRAME;
flvTimerIsrTimes = flvDispInterval;
flvPlayState = FLV_STATE_PLAYING;
}
int FlvVideoSeek(long msTime)
{
if ((flvPlayState != FLV_STATE_PLAYING) && (flvPlayState != FLV_STATE_PAUSE) && (flvPlayState != FLV_STATE_INITIALIZING))
return 0;
if (msTime > flv.length)
return 0;
/* seek video to time. */
if (FlvSeek(&flv, msTime))
return -1;
if (flvPlayState != FLV_STATE_INITIALIZING)
{
/* stop video frames display. */
Timer_PowerOffDeinit(0);
DisableDecoder();
FlvCtrlInit();
/* update displayed frame number */
flvDispFrameNum = flv.videoFrmNum - 1;
VideoDecoderLoad(flvVideoBufRemain, "FLV"); /* restart decoder. */
flvTimerIsrTimes = flvDispInterval;
/* start video frames display . */
FlvFrameDispCtrl();
}
return 0;
//return FlvSeek(&flv, msTime);
}
int FlvPlayPause(void)
{
if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
return FALSE;
if (flvPlayState == FLV_STATE_PAUSE)
{
/* Start frame display timer. */
FlvFrameDispCtrl();
flvPlayState = FLV_STATE_PLAYING;
return FALSE;
}
else
{
/* Stop frame display timer. We may set DSP idle here to save power. */
Timer_PowerOffDeinit(0);
flvPlayState = FLV_STATE_PAUSE;
return TRUE;
}
}
int FlvGetCurTime(void)
{
#if 0
if ((flv.curAudio.time) && (flvPlayState == FLV_STATE_PLAYING))
return flv.curAudio.time;
else
return flv.curVideo.time;
#else
return flvDispTime;
#endif
}
int FlvGetYuvAddr(char **pYuv)
{
if (flvLastYuvID < 0)
return 0;
*pYuv = flvYuvBuf + flvLastYuvID * YUV_BUFFER_SIZE;
return 1;
}
int FlvGetResolution(long *pWidth, long *pHeight)
{
*pWidth = (flv.width + 15) & 0xfff0;
*pHeight = (flv.height + 15) & 0xfff0;
return 0;
}
int FlvGetTotalTime(void)
{
return flv.length;
}
short FlvGetDecStatus(void)
{
if ((flvPlayState == FLV_STATE_STOP) || (flvPlayState == FLV_STATE_INITIALIZING))
return 0;
else
return GetDecStatus();
}
int FlvAudioGetData(char *buffer, DWORD size)
{
if ((flvPlayState == FLV_STATE_STOP))
return 0;
if (FlvAudioGetDataToSDRAM(&flv, buffer, &size) < 0)
{
flv.audioFlag = 0;
return -1;
}
else
{
return size;
}
}
#ifdef TVOUT_PANEL
extern DWDMALLP gLLPList[ ][480]; // LCD刷屏接口用
extern BACKGRND gScreen[2];
extern void ReCreat(void);
void FLVTVoutChange(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);
FlvCreateVideoScreen();
}
else
{
//Screen_MCUIFUpdateFinish();
while (Screen_GetMCUIFStatus() == BUSY);
BL_SetBright(BL_DARK);
Screen_Display(OFF);
Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
FlvCreateVideoScreen();
}
ReCreat();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -