📄 aviplay1.c
字号:
//#if ( PLAYAUDIO_OPTION == 1 )
ULONG AudBufIdx;
ULONG AudBufCnt;
//ULONG AudBufCnt1;
//#endif
ULONG PAVIIdx;
UCHAR VLCFlip;
UCHAR StreamNum;
UCHAR PlayAudio_Flag;
UCHAR FeedData;
USHORT lastVidCluster, lastAudCluster;
USHORT lastVidFileIdx, lastAudFileIdx;
USHORT lastVidIdx, lastAudIdx;
USHORT NextVidIdx, NextAudIdx;
ULONG VidFrameTime;
ULONG playVidTime, playAudTime;
UCHAR VidDone, AudDone;
ULONG dwRate, dwScale;
float frameRate;
ULONG msPerFrame;
UCHAR FeedAudio;
UCHAR DropVidFlag;
UCHAR tmp2, tmp3;
UCHAR MediaType;
UCHAR firstVidblock,firstAudblock;
ULONG TimeExceed;
ULONG AudioAddr;
//version4.0@ada@0513 for DCF
UCHAR FileType;
//patch4.4@yichang@for valid signal begin
UCHAR showBG_flag;
showBG_flag = 0;
//patch4.4@yichang@for valid signal end
TimeExceed = 0;
sts = FALSE;
PlayAudio_Flag = 0;
//patch5.0@richie@sdram mapping begin
AudioAddr = K_SDRAM_AviPbAudioBufAddr;
PBAudioChunkAddr = K_SDRAM_AviPbAudioChunkBufAddr;
AVIIdxRamAddr = K_SDRAM_AviPbIdx1BufAddr;
////patch5.0@richie@sdram mapping end
// patch3.2@yichang@0401 prebuild smc banking table into sdram
Card_Specific( 1, 0xff );
USR_SetAviName(name, (USHORT)ID);
//ada@0401 For Multi-Frame Play Back
//version4.0@ada@0513 for DCF
//patch4.5@ada@Record DCF file name begin
startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr + (((ULONG)ID - 1)) * 10,&FileType);
//startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr + (((ULONG)ID - 1)) * 8,&FileType);
//patch4.5@ada@Record DCF file name end
//startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr + (((ULONG)ID - 1)) * 3);
//ada@0401
fHandle = File_Open(name, K_DOS_ReadFile, startCluster);
if (!fHandle)
{
DbgPrint("Cannot open AVI file\n");
return L1K_ERROR_GENERAL;
}
avifileSize = G_DOS_FileSize;
sts = M_Card_File_Read(fHandle, K_DOS_DstDram, 512, PBAudioChunkAddr, 0);
if(!sts)
{
DbgPrint("Cannot read AVI header\n");
return L1K_ERROR_GENERAL;
}
//Davis:patch5.0.0.3_2005/Jun/30 L2_SetGPIOBit(40,1); //AUDIO_CTRL//
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(PBAudioChunkAddr);
L2_DoDMA(0,1,512,0,0);
StreamNum = (UCHAR)XBYTE[0x1C38] | (UCHAR)XBYTE[0x1C39]<<8 | (UCHAR)XBYTE[0x1C3A]<<16 | (UCHAR)XBYTE[0x1C3B]<<24;
//DbgPrint("StreamNum=%bx\n",StreamNum);
//patch3.2@yichang@0401 For 320x240 AVI
G_AVIWidth = (UCHAR)XBYTE[0x1C40] | (UCHAR)XBYTE[0x1C41]<<8 | (UCHAR)XBYTE[0x1C42]<<16 | (UCHAR)XBYTE[0x1C43]<<24;
G_AVIHeight = (UCHAR)XBYTE[0x1C44] | (UCHAR)XBYTE[0x1C45]<<8 | (UCHAR)XBYTE[0x1C46]<<16 | (UCHAR)XBYTE[0x1C47]<<24;
//DbgPrint("G_AVIWidth=%d,G_AVIHeight=%d\n",G_AVIWidth,G_AVIHeight);
//Joe@2003.2.25 17:24 mask begin
/*
dwRate = (ULONG)XBYTE[0x1C4C] | (ULONG)XBYTE[0x1C4D]<<8;
dwRate = dwRate | (ULONG)XBYTE[0x1C4E]<<16 | (ULONG)XBYTE[0x1C4F]<<24;
dwScale = (ULONG)XBYTE[0x1C48] | (ULONG)XBYTE[0x1C49]<<8;
dwScale = dwScale | (ULONG)XBYTE[0x1C4A]<<16 | (ULONG)XBYTE[0x1C4B]<<24;
*/
//Joe@2003.2.25 17:24 mask end
//Joe@2003.2.25 17:24 add begin
dwRate = (ULONG)XBYTE[0x1C84] | (ULONG)XBYTE[0x1C85]<<8;
dwRate = dwRate | (ULONG)XBYTE[0x1C86]<<16 | (ULONG)XBYTE[0x1C87]<<24;
dwScale = (ULONG)XBYTE[0x1C80] | (ULONG)XBYTE[0x1C81]<<8;
dwScale = dwScale | (ULONG)XBYTE[0x1C82]<<16 | (ULONG)XBYTE[0x1C83]<<24;
//Joe@2003.2.25 17:24 add end
frameRate = (float)dwRate/(float)dwScale;
//msPerFrame = (ULONG)((float)1000 / frameRate);
//version4.0@yichang@0513 to increase the accuracy of the value (time need / per frame)
msPerFrame = (ULONG)((float)256000 / frameRate); //yichang@0416
//DbgPrint("dwRate=%ld, dwScale=%ld\n", dwRate, dwScale);
//DbgPrint("frameRate=%f\n",frameRate);
//DbgPrint("msPerFrame=%ld\n",msPerFrame);
AVIIdxAddr = (ULONG)XBYTE[0x1DF8] | (ULONG)XBYTE[0x1DF9]<<8 | (ULONG)XBYTE[0x1DFA]<<16 | (ULONG)XBYTE[0x1DFB]<<24;
AVIIdxAddr = AVIIdxAddr + 508;
L1_ReadAVIIdx(AVIIdxRamAddr,AVIIdxAddr,fHandle,&ChunkCnt, 0);
/*//wendy@2004/9/9
//patch4.4@yichang@0624 to avoid memory overflow begin
if(ChunkCnt == 0)
{
//Joe@2003.3.19 10:27 modify begin
/*
UI_PrintOSDString("Memory Full", 0, 2, UI_MENU_HIGHLIGHT_COLOR);
UI_PrintOSDString(" ", 0, 2, UI_MENU_HIGHLIGHT_COLOR);
*/
/* UI_ShowMemoryFull();
return L1K_ERROR_GENERAL;
}
*///wendy@2004/9/9
//patch4.4@yichang@0624 to avoid memory overflow end
tmp1 = AVIIdxAddr%512;
AVIIdxRamAddr = AVIIdxRamAddr + tmp1/2; //skip the non idx garbage
M_Card_File_Read(fHandle, K_DOS_DstDram, 512, PBAudioChunkAddr, 512);
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(PBAudioChunkAddr);
L2_DoDMA(0,1,512,0,0);
for(i=0;i<64;i++) QTable[i] = XBYTE[0x1C21+i];
for(i=64;i<128;i++) QTable[i] = XBYTE[0x1C22+i];
L2_WriteQTable(0x01,0xf1,QTable); // fill Q-table in zigzag scan
XBYTE[0X20E1]=0x0b;
XBYTE[0X2DE1]=0X03;
AVIIdxAddr = AVIIdxRamAddr + 4;
PAVIIdx = AVIIdxAddr;
//VLCFlip = 0; //AVI_DEBUG dlchiou - 02-12-11 10:52
//DbgPrint("Start to Play Video\n");
lastVidCluster = G_DOS_FileCurrCluster;
lastVidFileIdx = G_DOS_FileClusterIndex;
lastAudCluster = G_DOS_FileCurrCluster;
lastAudFileIdx = G_DOS_FileClusterIndex;
FeedData = 0;
FeedAudio = 0;
lastVidIdx = 0;
lastAudIdx = 0;
NextVidIdx = 1;
NextAudIdx = 1;
playVidTime = 0;
playAudTime = 0;
VidDone = 0;
AudDone = 0;
DropVidFlag = 0;
PAVIIdx = AVIIdxAddr;
//VLCFlip = 0; //dlchiou - 2002-12-11 10:56
VLCFlip = 1; //AVI_DEBUG dlchiou - //2002-12-11 10:56
firstVidblock = 0;
firstAudblock = 0;
//yichang@0626 test
/*
L2_ConfigGPIOBit(40, 1);
L2_SetGPIOBit(40, 1);
*/
////printf("chunck count=%ld\n",ChunkCnt);
G_playObject.mediaType = K_PLAYBACK_TYPE_AVI;
L2_DRAMSetStartAddr(AVIIdxAddr, K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp2,&tmp3);
if(tmp2==0x30 && tmp3==0x30) //00dc
{
MediaType = 0;
if(StreamNum == 1) //video only
{
G_playObject.mediaType = K_PLAYBACK_TYPE_VIDONLY;
}
#if( PLAYAUDIO_OPTION == 0 )
G_playObject.mediaType = K_PLAYBACK_TYPE_VIDONLY;
#endif
}
if(tmp2==0x30 && tmp3==0x31) //01wb: audio only
{
MediaType = 1;
VidDone = 1;
msPerFrame = 1000;
G_playObject.mediaType = K_PLAYBACK_TYPE_WAV;
}
// only avi with audio require to build LinearFAT
#if (K_DOS_HaveLinearFAT)
#if( ( PLAYAUDIO_OPTION == 1 ) && (K_Link_AllFreeCluster == 1))
if (G_playObject.mediaType == K_PLAYBACK_TYPE_AVI)
{
G_DOS_UseLinearFAT = 1;
DOS_File_Build_LinearFAT(G_DOS_FileStartCluster);
}
#endif
#endif
//Camera mode set up
L2_SetCamMode(0); //Idle
L2_SetCamMode(5); //Playback
//patch4.4@yichang@for valid signal begin
/* //AVI_DEBUG //dlchiou - 2002-12-11 10:58
while(((XBYTE[0x2DA0] & 0x04) == 0x04))
{
L2_CtrlScreen(2);
}
*/
showBG_flag = 1;
//patch4.4@yichang@for valid signal end
/* //AVI_DEBUG //dlchiou - 2002-12-11 10:59
L2_SetDisplayMode(0,0x10); //Disable Frame-rate-conversion
//L2_SetJPEGVscale(G_AVIHeight, G_AVIHeight);//yichang@0503
//patch3.2@yichang@0401 For 320x240 AVI
//patch5.0@richie@avi window begin
//L2_SetDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
L1_SetAviDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
//patch5.0@richie@avi window end
//patch3.2@yichang@0401 For 320x240 AVI
L2_SetAFBSize(G_AVIWidth, G_AVIHeight);
L2_SetBFBSize(G_AVIWidth, G_AVIHeight);
*/
// L2_TurnOnOffDisplay(1);
//herb for TVoutput debug @03/04/18 start
if((G_AVIWidth==192)&&(G_AVIHeight==144))
SmallSizeAvi = 1;
else
SmallSizeAvi = 0;
//herb for TVoutput debug @03/04/18 end
while( (!VidDone) || (!AudDone) )
{
if(PlayAudio_Flag)
{
UI_PowerOnOffDetect(0);//wendy@2004/9/9
UI_Keypad_Scan(); //yichang@0424 to stop playing
if((G_KeyState == K_UI_BUTTON_SELECT)||(G_KeyState == K_UI_BUTTON_PCCAM_SWITCH)||(G_KeyState == K_UI_BUTTON_PREVIEW_SWITCH)||(G_KeyState == K_UI_BUTTON_PLAY_SWITCH)||(G_KeyState == K_UI_BUTTON_AUDIO_SWITCH))//wendy@2004/9/7
{
//Joe@2003.3.4 20:04 add begin
UI_Buzzer();
//Joe@2003.3.4 20:05 add end
break;
}
L2_ReadGTimer(&VidFrameTime);
//patch4.4@yichang@0624 for OSD begin
if(showBG_flag == 0)
UI_UpdateFOSDTime(0,0,UI_MENU_DEHIGHLIGHT_COLOR,VidFrameTime);
//patch4.4@yichang@0624 for OSD end
//yichang@0416
//version4.0@yichang@0513 to increase the accuracy of the value (time need / per frame)
VidFrameTime = (VidFrameTime << 8);
if( ((VidFrameTime - playVidTime) >= msPerFrame ) && (!VidDone) )
{
//yichang@0416
TimeExceed += (VidFrameTime - playVidTime - msPerFrame);
playVidTime = playVidTime + msPerFrame;
DropVidFlag = 0;
if(TimeExceed >= msPerFrame)
{
DropVidFlag = 1;
TimeExceed = 0;
}
//~//yichang@0416
NextVidIdx = SearchAVIIndex(AVIIdxAddr, lastVidIdx, ChunkCnt, 0);
lastVidIdx = NextVidIdx;
if(MediaType == 0) //first frame :00dc
lastVidIdx = NextVidIdx = 0;
//record audio file pointer before video
if(PlayAudio_Flag)
{
if(firstVidblock)
{
G_DOS_FileCurrCluster = lastVidCluster;
G_DOS_FileClusterIndex = lastVidFileIdx;
firstVidblock = 0;
}
}
if(NextVidIdx || (MediaType == 0)) //for play 0th chunck of 00dc
{
if(DropVidFlag == 0)
{
L1_PBVideoFrame(AVIIdxAddr,fHandle,NextVidIdx,VLCFlip);
//patch5.0@richie@sdram mapping begin
if(VLCFlip==0)
L2_SetBFBAddr(K_SDRAM_AviPbBufAddrA);
else
L2_SetBFBAddr(K_SDRAM_AviPbBufAddrB);
//patch5.0@richie@sdram mapping end
//test start
//hx@2003.4.15 // if((NextVidIdx==0)||(NextVidIdx==1))
// L2_TurnOnOffDisplay(1);
//test end
VLCFlip = 1 - VLCFlip;
if(MediaType==0) //DEBUG BY dlchiou - 2002-12-11 11:09
{
L2_SetDisplayMode(0,0x10); //Disable Frame-rate-conversion
//L2_SetDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
L1_SetAviDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
L2_SetAFBSize(G_AVIWidth, G_AVIHeight);
L2_SetBFBSize(G_AVIWidth, G_AVIHeight);
}
//when read video chunck, record file position
lastVidCluster = G_DOS_FileCurrCluster;
lastVidFileIdx = G_DOS_FileClusterIndex;
//patch4.4@yichang@for valid signal begin
if(showBG_flag)
{
for(i=0;i<10;i++)
DELAY_1ms();
while(((XBYTE[0x2DA0] & 0x04) == 0x04))
{
L2_CtrlScreen(1);
}
showBG_flag = 0;
}
//patch4.4@yichang@for valid signal end
}
if(MediaType == 0)
MediaType = 2; //for play 0th chunck of 00dc
}
else
{
VidDone = 1;
}
}//video chuck process
if(!AudDone)
{
L2_ReadGTimer(&VidFrameTime);
if((VidFrameTime-playAudTime) >= 100)
{
L2_SetDRAMAudDMACnt(1);
L2_ReadDRAMAudBufCnt(&AudBufCnt);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -