📄 asfvideocontrol.c
字号:
//PMU_EnterModule(PMU_VIDEOHIGH);
if (gSDModeFlag == 0)
{
if (asf.m_width *asf.m_height <= (320*240))
{
gasfFunPmu = 7;
PMU_EnterModule(PMU_VIDEOLOWLL);
}
else if (asf.m_width *asf.m_height <= (480*272))
{
gasfFunPmu = 6;
PMU_EnterModule(PMU_VIDEOLOWL);
}
else if (asf.m_width *asf.m_height <= (640 *272))
{
gasfFunPmu = 2;
PMU_EnterModule(PMU_VIDEOMEDLOW);
}
else if (asf.m_width *asf.m_height <= (640 *480))
{
gasfFunPmu = 3;
PMU_EnterModule(PMU_VIDEOMED);
}
else if (asf.m_width *asf.m_height <= (720*480) && asf.m_width < 800)
{
gasfFunPmu = 4;
PMU_EnterModule(PMU_VIDEOMEDHIGH);
}
else
{
gasfFunPmu = 5;
PMU_EnterModule(PMU_VIDEOHIGH);
}
}
else if (gSDModeFlag == 1)
{
PMU_EnterModule(PMU_VIDEOHIGH);
}
/* Flow: */
/* a. Malloc Buffer & load RES for decoder. */
if (AsfVideoDecBufMalloc())
return -1;
/* b. Enable DSP core and peripheral. */
DspEnable(); /* do this in pmu. */
/* c. Share data initialize. */
AsfCtrlInit();
/* d. Create video screens. */
AsfCreateVideoScreen();
/* e. Fill all bit stream buffer. */
for (i = 0;i < MAX_BITSREAM_BLOCK_NUM;i++)
{
if (AsfFillBitStream() != 0)
{
return -1;
}
}
/* f. Load code and start decoder. */
#if 0
JtagBoot(asfVideoBufRemain);
#else
switch (asf.m_video_stream->m_type_specific.m_video.m_encoding)
{
case fccWMV3:
if (VideoDecoderLoad(asfVideoBufRemain, "WMV3"))
{
return -1;
}
break;
case fccWMV2:
case fccWMV1:
if (VideoDecoderLoad(asfVideoBufRemain, "WMV12"))
{
return -1;
}
break;
default:
return -1;
}
#endif
/* g. Start frame diaplay timer. */
AsfFrameDispCtrl();
asfPlayState = ASF_STATE_PLAYING;
return 0;
}
int AsfFFD(unsigned int step)
{
//int curTime;
if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
return 0;
if (asf.m_ffd_flag || asf.m_seek_flag)
return 0;
if (asfPlayState == ASF_STATE_PAUSE)
{
AsfPlayPause();
}
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
asfPlayState = ASF_STATE_FFD;
if (!lastSeekTime)
lastSeekTime = AsfGetCurTime();
if (!step)
step = ASF_FFD_FFW_MIN_INTERVAL;
asf.m_ffd_interval = step + (ffd_ffw_times << 7);
ffd_ffw_times++;
if (!asf.m_index_flag)
asf.m_ffd_flag = TRUE; //AsfSeek(&asf, AsfGetCurTime() + asf.m_ffd_interval); //
else
{
lastSeekTime += asf.m_ffd_interval;
if ((lastSeekTime > asf.m_time_len) || (!AsfSeek(&asf, lastSeekTime)))
return -1;
}
return 0;
}
int AsfFFW(unsigned int step)
{
//int curTime;
if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
return 0;
if (asf.m_seek_flag)
return 0;
if (asfPlayState == ASF_STATE_PAUSE)
{
AsfPlayPause();
}
SendOperationMsg(VIDEO_OPERATION_FFD_FFW);
asfPlayState = ASF_STATE_FFW;
if (!lastSeekTime)
lastSeekTime = AsfGetCurTime();
if (!step)
step = ASF_FFD_FFW_MIN_INTERVAL;
step = (lastSeekTime >= (step + (ffd_ffw_times << 7))) ? (step + (ffd_ffw_times << 7)) : lastSeekTime;
//curTime = AsfGetCurTime();
lastSeekTime -= step;
if (!AsfSeek(&asf, lastSeekTime))
lastSeekTime += step;
ffd_ffw_times++;
//while(IsYuvReady(asfCurFrame))
// AsfTimerCallBack();
return 0;
}
void AsfResume(void)
{
int time = 0, seekFlag = 0, timeOut = 0;
if ((asfPlayState != ASF_STATE_FFD) && (asfPlayState != ASF_STATE_FFW))
return ;
asf.m_ffd_flag = FALSE;
lastSeekTime = 0;
ffd_ffw_times = 0;
/* reset seek point info */
asf.m_next_seek_point = 0;
asf.m_last_seek_point = 0;
SendOperationMsg(VIDEO_OPERATION_PLAY);
if ((!asf.m_seek_flag) && ((asfPlayState == ASF_STATE_FFW) || asf.m_index_flag))
{
time = asf.m_video_seg->object_start - asf.m_start_position_time;
AsfVideoSeek(time);
seekFlag = TRUE;
goto resume_end;
}
/* get dest time */
if (asf.m_seek_flag)
{
time = asf.m_seek_seg.object_start - asf.m_start_position_time;
}
else if (asf.m_video_seg->object_start > asf.m_start_position_time)
{
time = asf.m_video_seg->object_start - asf.m_start_position_time;
}
/* seek audio */
AsfAudioSeek(time);
resume_end:
/* show all frames out */
while ((!AllBufEmpty(asffilledBlock)) || (IsYuvReady(asfCurFrame)))
{
AsfTimerCallBack();
if ((timeOut++) > 0x3fff)
{
break;
}
}
asfCurTime = timerCnt = time;
if ((asfPlayState == ASF_STATE_FFW) && (!seekFlag))
asfPlayState = ASF_STATE_FFW_TEMP;
else
asfPlayState = ASF_STATE_PLAYING;
return;
}
int AsfVideoSeek(long msTime)
{
if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
return 0;
/* reset seek point info */
asf.m_next_seek_point = 0;
asf.m_last_seek_point = 0;
if (AsfSeek(&asf, msTime))
{
//if(asf.m_seek_seg.object_start < asf.m_video_seg->object_start){
DisableDecoder();
/* stop video frames display. */
Timer_PowerOffDeinit(0);
AsfAudioSeek(asf.m_seek_seg.object_start - asf.m_start_position_time);
AsfSeekImmediately(&asf);
AsfCtrlInit();
asfCurTime = timerCnt = asf.m_seek_seg.object_start - asf.m_start_position_time;
switch (asf.m_video_stream->m_type_specific.m_video.m_encoding)
{
case fccWMV3:
VideoDecoderLoad(asfVideoBufRemain, "WMV3");
break;
case fccWMV2:
case fccWMV1:
VideoDecoderLoad(asfVideoBufRemain, "WMV12");
break;
default:
break;
}
/* start video frames display . */
AsfFrameDispCtrl();
//}else{
// AsfAudioSeek(asf.m_seek_seg.object_start - asf.m_start_position_time);
//}
}
else if ((asfPlayState == ASF_STATE_FFW) || (asfPlayState == ASF_STATE_FFD))
{
AsfAudioSeek(asf.m_video_seg->object_start - asf.m_start_position_time);
}
return 0;
}
int AsfPlayPause(void)
{
if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
return FALSE;
if (asfPlayState == ASF_STATE_PAUSE)
{
/* Start frame display timer. */
AsfFrameDispCtrl();
asfPlayState = ASF_STATE_PLAYING;
return FALSE;
}
else
{
/* Stop frame display timer. We may set DSP idle here to save power. */
Timer_PowerOffDeinit(0);
asfPlayState = ASF_STATE_PAUSE;
return TRUE;
}
}
int AsfGetCurTime(void)
{
if (((asfPlayState == ASF_STATE_FFD) || (asfPlayState == ASF_STATE_FFW)))
{
asfCurTime = asf.m_video_seg->object_start;
if ((asfCurTime > asf.m_time_len) /*|| (asfCurTime < asf.m_start_position_time)*/)
asfCurTime = asf.m_time_len;
}
return ((asfCurTime > asf.m_start_position_time) ? (asfCurTime - asf.m_start_position_time) : asfCurTime);
//return 0;
}
int AsfGetYuvAddr(char **pYuv)
{
if (lastYuvBufId < 0)
return 0;
*pYuv = asfYuvBuf + lastYuvBufId * YUV_BUFFER_SIZE;
return 1;
}
int AsfGetResolution(long *pWidth, long *pHeight)
{
*pWidth = (asf.m_width + 15) & 0xfff0;
*pHeight = (asf.m_height + 15) & 0xfff0;
return 0;
}
int AsfGetTotalTime(void)
{
return (int)(asf.m_end_position_time / 10000 - asf.m_start_position_time);
//return -1;
}
short AsfGetDecStatus(void)
{
if ((asfPlayState == ASF_STATE_STOP) || (asfPlayState == ASF_STATE_INITIALIZING))
return 0;
else
return GetDecStatus();
}
/*
* add this to avoid loss of synchronization between audio and video.
* 2008-6-7, by ljn
*/
//int time_skiped = 0;
static void AsfVideoHurryUp(void)
{
unsigned int audioTime, addTime;
/* this function is available in playing state only */
if (asfPlayState != ASF_STATE_PLAYING)
return;
#if 0
/* get current time of audio */
audioTime = AsfAudioGetCurTime();
/* try to seek to next key frame */
if ((!asf.m_seek_flag) && ((asf.m_video_seg->object_start - asf.m_start_position_time) < audioTime))
{
if (asf.m_index_flag)
addTime = ASF_HURRY_UP_ADD_TIME + ASF_HURRY_UP_MAX_AHEAD;
else
addTime = ASF_HURRY_UP_ADD_TIME;
AsfSeek(&asf, audioTime + addTime);
if ((asf.m_seek_seg.object_start <= asf.m_video_seg->object_start)
|| ((audioTime + asf.m_start_position_time - asfCurTime + ASF_HURRY_UP_ADD_TIME
< asf.m_seek_seg.object_start - asf.m_video_seg->object_start)))
asf.m_seek_flag = 0;
}
#else
if (!asf.m_seek_flag)
{
/* get point */
if (asf.m_next_seek_point <= asf.m_video_seg->object_start)
AsfSeekNextKeyFrm(&asf);
if (asf.m_next_seek_point > asf.m_video_seg->object_start)
{
/* get current time of audio */
audioTime = AsfAudioGetCurTime();
/* check interval */
if (((asf.m_next_seek_point - asf.m_video_seg->object_start)
<= (audioTime + asf.m_start_position_time + ASF_HURRY_UP_ADD_TIME - asfCurTime))
&& (asf.m_last_seek_point < asfCurTime) && (audioTime))
{
asf.m_last_seek_point = asf.m_next_seek_point;
asf.m_seek_flag = 1;
//time_skiped += asf.m_next_seek_point - asf.m_video_seg->object_start;
}
}
}
#endif
hurry = FALSE;
}
#ifdef TVOUT_PANEL
extern DWDMALLP gLLPList[ ][480]; // LCD刷屏接口用
extern BACKGRND gScreen[2];
extern void ReCreat(void);
void AsfTVoutChange(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);
AsfCreateVideoScreen();
}
else
{
//Screen_MCUIFUpdateFinish();
while (Screen_GetMCUIFStatus() == BUSY);
BL_SetBright(BL_DARK);
Screen_Display(OFF);
Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
AsfCreateVideoScreen();
}
ReCreat();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -