📄 realfunctions.c
字号:
SendMsg2ZSp(&Msg);
}
else if ((RealSkipState == 1) && (RV_AddDecodeSpeed == 2))
{
RealSkipState = 2;
Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
Msg.DAT0 = RealSkipState;
SendMsg2ZSp(&Msg);
}
else if ((RealSkipState == 2) && (RV_AddDecodeSpeed == 3))
{
RealSkipState = 3;
Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
Msg.DAT0 = RealSkipState;
SendMsg2ZSp(&Msg);
}
}
else if ((FramesInBuff > 2) && RealSkipState && (!RV_AddDecodeSpeed))
{
RealSkipState --;
Msg.CMD = MSG_ARM2ZSP_SKIPSTART;
Msg.DAT0 = RealSkipState;
SendMsg2ZSp(&Msg);
}
}
}
}
/****************************************/
/* 解码入口初始化 */
/* 初始化空间等 */
/****************************************/
UINT16 gRealFunPmu;
extern BOOLEAN gSDModeFlag;
extern BOOLEAN gVideoPmuFlag;
BOOLEAN RealInit(void)
{
char PathName[FS_MAX_PATH_LEN];
char buff[26];
short i;
unsigned long Version, iBufPos = 0;
char *TempMemPoint;
//add for Exit
for (i = 0; i < MAX_REAL_VIDEOBIT_NUM; i++)
RealVideobitStream[i] = NULL;
Real_CurrentSeekingTime = 0;
RealDecTab = NULL;
yuvBuf = NULL;
FreshFrame = NULL;
RealVideoScreen = NULL;
RealVideoLLPList = NULL;
RealFile = NULL;
pRawFileCache = NULL;
BackSaveForReal = NULL;
RV_SkipFrameEn = 1;
RKmemcpy(PathName, VideoFileInfo.Path, FS_MAX_PATH_LEN);
RKstrcat(PathName, VideoFileInfo.Name);
RealFile = FS_fopen(PathName, "rb");
pRawFileCache = FS_fopen(PathName, "rb");
if ((int)RealFile == -1 || !(int)RealFile)
return FALSE;
if ((int)pRawFileCache == -1 || !(int)pRawFileCache)
return FALSE;
// PMU_EnterModule(PMU_VIDEOHIGH);
FileFuncInit();
if (RVDecInit(RealFile) == 0)
return FALSE;
Version = Real_GetVideoVersion();
if ((Version != RAW_RV8_MAJOR_VERSION) && (Version != RAW_RV9_MAJOR_VERSION))
return FALSE;
Real_PicWidth = GetRVWidth();
Real_PicHeight = GetRVHeight();
Real_PicWidth = (Real_PicWidth + 15) & 0xfff0;
Real_PicHeight = (Real_PicHeight + 15) & 0xfff0;
gVideoPmuFlag = 1;
PMU_ExitModule(PMU_VIDEOHIGH);
if (Real_PicWidth > 800)
return FALSE;
if (Real_PicHeight * Real_PicWidth > (720*576))
return FALSE;
if (gSDModeFlag == 0)
{
if (Real_PicWidth *Real_PicHeight <= (320*240))
{
gRealFunPmu = 7;
PMU_EnterModule(PMU_VIDEOLOWLL);
}
else if (Real_PicWidth *Real_PicHeight <= (480*272))
{
gRealFunPmu = 6;
PMU_EnterModule(PMU_VIDEOLOWL);
}
else if (Real_PicWidth *Real_PicHeight <= (640 *272))
{
gRealFunPmu = 2;
PMU_EnterModule(PMU_VIDEOMEDLOW);
}
else if (Real_PicWidth *Real_PicHeight <= (640 *480))
{
gRealFunPmu = 3;
PMU_EnterModule(PMU_VIDEOMED);
}
else if (Real_PicWidth *Real_PicHeight <= (720*480) && Real_PicWidth < 800)
{
gRealFunPmu = 4;
PMU_EnterModule(PMU_VIDEOMEDHIGH);
}
else
{
gRealFunPmu = 5;
PMU_EnterModule(PMU_VIDEOHIGH);
}
}
else if (gSDModeFlag == 1)
{
PMU_EnterModule(PMU_VIDEOHIGH);
}
Real_PicWidth = GetRVWidth();
Real_PicHeight = GetRVHeight();
yuvBuf = gVideoBufferMix;
TempMemPoint = &gVideoBufferMix[(unsigned long)(YUV_BUFFER_NUM+1)*REAL_YUV_BUFFER_SIZE + (unsigned long)0x10000];
for (i = 0; i < MAX_REAL_VIDEOBIT_NUM; i++)
{
RealVideobitStream[i] = (unsigned char*) & TempMemPoint[i*BITSREAM_BUFFER_SIZE];
}
FreshFrame = (OutPutFrame*) & TempMemPoint[MAX_REAL_VIDEOBIT_NUM*BITSREAM_BUFFER_SIZE];
RealDecTab = (unsigned short*) & FreshFrame[YUV_BUFFER_NUM];
RealVideoScreen = (BACKGRND *) & RealDecTab[0x10000];
RealVideoLLPList = (DWDMALLP *) & RealVideoScreen[YUV_BUFFER_NUM+1];
RealVideoScreenTemp = (BACKGRND*) & RealVideoLLPList[(YUV_BUFFER_NUM+1)*1000];
RealVideoLLPListTemp = (DWDMALLP *) & RealVideoScreenTemp[YUV_BUFFER_NUM];
for (i = 0; i < YUV_BUFFER_NUM;i++)
{
FreshFrame[i].State = 0;//Frame NULL
FreshFrame[i].ChangScreen = 0;
FreshFrame[i].Time = 0;
}
FrameInputIndex = 0;
FrameOutputIndex = YUV_BUFFER_NUM - 1;
PreIndex = -1;
PrePreIndex = -1;
PrePrePreIndex = -1;
FramesInBuff = 0;
RealSkipState = 0;
RealExitState = 0;
RealVideoSkipEnble = 0;
ScreenChangeEnable = 0;
Real_SendMailDisable = 0;
RealDecoderCnt = 0;
RealLcdWaitCnt = 0;
showed_time = 0;
real_timer_tick = 0;//add for test
RealFileEnd = 0;
Real_DecodeState = REAL_DECODE_STATE_PLAYING;
Real_FrameTimerEn = 1;
SyncEnable = 1;
Real_CurrentSeekingTime = 0;
CreateRealScreen(Real_PicWidth, Real_PicHeight);
Scu_ModuleReset(MB_RESET, TRUE);
Real_InitMailBox();
BackSaveForReal = Intr_RegISR(INTC_MAILBOX, MailBoxISR);
Scu_ModuleReset(MB_RESET, FALSE);
return LoadDecoder(Version);
}
/****************************************/
/* 解码出口反初始化 */
/* 初始化空间等 */
/****************************************/
extern UINT8 RealIsrCloseFlag;
void RealVideoExit(void)
{
short i;
Real_SendMailDisable = 1;
Timer_PowerOffDeinit(0);
RealIsrCloseFlag = 0; // 中断关闭
if (RealAudioExist)
{
RockOSSendMsg(MBAUDIO, AS_GUAU_VideoAudioStop, NULL);
}
Intr_Disable(INTC_MAILBOX);
Real_InitMailBox();
Scu_ModuleReset(MB_RESET, TRUE);
delay_nops(500);
SetRegBit32(0x1801C000 + 0x1c, 4); //reset zsp500
delay_nops(500);
while (Screen_GetMCUIFStatus() == BUSY);
RVDeInit();
if (0x72616370 == GetRmAudioCodec4cc())
PMU_ExitModule(PMU_VIDEOLOW);
if (gSDModeFlag == 0)
{
if (gRealFunPmu == 2)
PMU_ExitModule(PMU_VIDEOMEDLOW);
else if (gRealFunPmu == 3)
PMU_ExitModule(PMU_VIDEOMED);
else if (gRealFunPmu == 4)
PMU_ExitModule(PMU_VIDEOMEDHIGH);
else if (gRealFunPmu == 5)
PMU_ExitModule(PMU_VIDEOHIGH);
else if (gRealFunPmu == 6)
PMU_ExitModule(PMU_VIDEOLOWL);
else if (gRealFunPmu == 7)
PMU_ExitModule(PMU_VIDEOLOWLL);
gRealFunPmu = 0;
}
else if (gSDModeFlag == 1)
{
PMU_ExitModule(PMU_VIDEOHIGH);
}
if (RealFile)
{
FS_fclose(RealFile);
RealFile = NULL;
}
if (pRawFileCache)
{
FS_fclose(pRawFileCache);
pRawFileCache = 0;
}
if ((yuvBuf == NULL) || (PreIndex == -1))
return;
memcpy((yuvBuf+(YUV_BUFFER_NUM) * REAL_YUV_BUFFER_SIZE),(yuvBuf+(PreIndex) * REAL_YUV_BUFFER_SIZE),REAL_YUV_BUFFER_SIZE);
Screen_Change(&RealVideoScreen[YUV_BUFFER_NUM]);
}
extern short VideoPlaying;
BOOLEAN VideoDecAudioStart(void)
{
unsigned long Samplerate;
int Err, i;
int offset = 0, result;
Codec_DACMute();
I2sStop();
HDMA_Stop(0);
memset(buff, 0, sizeof(buff));
ulEndOfRAM = (unsigned long)buff;
VideoPlaying = 1;
// 2.Reset the Audio I/O Buffer State
AudioInitList();
AudioIOBuf.gAudioOutBufIndex = 0;// AUDIO_OUT_BUF_NUM;
AudioIOBuf.gAudioDecoderIndex = AUDIO_OUT_BUF_NUM - 1;
// 3.Set the Audio Decode Type
//TODO: Here is just for AVI, We should support others such as Real , WMV ...
CurrentCodec = CODEC_RM_DEC;
// 4.Init Audio Decoder
if (0 == OpenTrack())
{
return FALSE;
}
if (0x72616370 == GetRmAudioCodec4cc())
PMU_EnterModule(PMU_VIDEOLOW);
CodecGetSampleRate(&Samplerate);
Codec_SetSampleRate(Samplerate);
AudioIOBuf.lOutLength = 2048;
gAudioReq = 0;
//AudioHWInit();
Codec_SetMode(Codec_DACout);// huangzf 1.15
Codec_SetVolumet(OutputVolume);
if (GetIsRASeekable())
CodecSeek((unsigned long)0, 0);
//real_timer_tick = 0;
real_timer_tick = (unsigned long)0;
AudioInitList();
memset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
I2sStart(I2S_Start_Tx);
//Codec_DACUnMute();
Codec_DACMute();
AudioPlayState = Audio_State_Play;
RockOSSendMsg(MBAUDIO, AS_GUAU_Playing, (void*)NULL);
AudioOutBufSwitch();
//RockOSSendMsg(MBVIDEO, AS_GUVI_VideoStartAudio, (void*)0);
return TRUE;
}
void FillRVEnd();
//Fill File Data 2 Decoder Buffer
int FillBitStreamForRealVideo(int Index)
{
MailBoxMSG Msg;
DECLARE_CUP_SR;
if (RealFileEnd)
RealFileEnd++;
if (RealFileEnd == 4)
RockOSSendMsg(MBVIDEO, AS_GUVI_VideoStop, NULL);
Msg.CMD = MSG_ARM2ZSP_DATA;
while (GetRVBufDataLen() < 4096)
{
if (RealFileEnd)
{
FillRVEnd();
}
else
{
if (RVFillBuf() == 0)
{
RealFileEnd = 1;
}
}
}
GetRVData(RealVideobitStream[Index], 4096);
Msg.DAT0 = 0x0001;
Msg.DAT1 = Index;
Msg.DAT2 = (unsigned long)RealVideobitStream[Index];
Msg.DAT3 = 4096;
ENTER_CRITICAL();
SendMsg2ZSp(&Msg);
EXIT_CRITICAL();
return 0;
}
//return Current Frame Time
long RealGetShowedTime()
{
return showed_time ;
}
void SyncEnableFunc(unsigned long tm)
{
if (RV_SeekEnd_AudioEN)
real_timer_tick = 0;//tm - GetRASeekedTime();
SyncTime = tm;
}
void SyncDisable()
{
SyncTime = 0x3fffffff;
SyncEnable = 0;
}
extern unsigned short Real_SeekEnable;
void RealAudioErrorDeal()
{
RealAudioExist = 0;
Real_SeekEnable = GetIsRVSeekable();
}
#ifdef TVOUT_PANEL
extern void ReCreat(void);
extern DWDMALLP gLLPList[ ][480]; // LCD刷屏接口用
extern UINT16 TvoutSign;
void RealTVoutChange(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);
CreateRealScreen(Real_PicWidth, Real_PicHeight);
}
else
{
TvoutSign = 0;
//Screen_MCUIFUpdateFinish();
while (Screen_GetMCUIFStatus() == BUSY);
TvoutSign = 0;
BL_SetBright(BL_DARK);
Screen_Display(OFF);
Screen_Configure(TVOUT_VIDEO_W, TVOUT_VIDEO_H, TVOUT, &TVoutPara);
CreateRealScreen(Real_PicWidth, Real_PicHeight);
TvoutSign = 1;
}
ReCreat();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -