📄 avirecord.c
字号:
UCHAR FOSD_V_num, FOSD_H_num;
UCHAR tmp;//Davis@05.3.3 add for debug
UI_GetFOSDSize(&FOSD_H_num, &FOSD_V_num);
//Joe@2003.3.12 18:44 add end
//patch5.0@richie@sdram mapping begin
AudioAddr = K_SDRAM_AviCapAudioBufAddr;
fragmentAddr = K_SDRAM_AviCapFragBufAddr;
AVIHeadAddr = K_SDRAM_AviCapHeaderBufAddr;
AVIIdxAddr = K_SDRAM_AviCaptureIdx1Addr;
AvlcAddr = K_SDRAM_AviCapVLCBufAddrA;
BvlcAddr = K_SDRAM_AviCapVLCBufAddrB;
//patch5.0@richie@sdram mapping end
RecordVidCnt = 50000;
AudDMACnt = 0;
totalChuck = 0;
MoviOfset = 4;
VidChunkCnt = 0;
AudChunkCnt = 0;
USR_SetAviName(name, G_USR_FileIndex);
L2_WriteQTable(K_QWriteTable,K_Q50, NULL);
L2_ReadQTable(2,&G_Image_QTableIndex,QTable);
L2_TurnOnOffDisplay (0); //hx@030408...add for ov2610 red lcd when record avi
L2_StopAud();
//L2_SetDisplayType1(9);
L1_InitAVIPreview();
L2_SetDisplayType(21);
L1_InitVideoClip();
XBYTE[0x1C00] = 0x00;
XBYTE[0x1C41] = 0x01;
// patch4.2@andrew@0520
// for initial video AE/AWB
VIDEO=1;
//printf("AE_START=%bx\n",AE_START);
// patch5.0@andrew@3a_avi
#if AAA_OPTION
L2_InitAEAW( 0 );
#endif
if(G_MANUAL_WB_Flag)
{
L1_AE(0);
L1_AWB();
L1_AE(0);
L1_AWB();
L1_AE(0);
L1_AWB();
L2_WaitVD(0,2);
#if DEBUG_COLOR
CMPGrGb(tmp);
if(tmp)
SetGrEqGb();//add for debug
#endif
}
for(i=0;i<64;i++)
XBYTE[0x1C01+i] = QTable[i];
for(i=64;i<128;i++)
XBYTE[0x1C02+i] = QTable[i];
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(AvlcAddr+16);
L2_DoDMA(1,0,130,0,0);
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(BvlcAddr+16);
L2_DoDMA(1,0,130,0,0);
L2_DRAMSetStartAddr( AVIIdxAddr, K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(0x69,0x64);
L2_DRAMWriteWord(0x78,0x31);
AVIIdxAddr += 4;
AVLCAddr = AvlcAddr + 130;
BVLCAddr = BvlcAddr + 130;
L2_SetImageType(5); //set image type to YUV420 Comp
L2_SetAVLCAddr(AVLCAddr);
L2_SetBVLCAddr(BVLCAddr);
G_DRAMint = 0;
freeCluster = DOS_GetDiskSpace();
sts = FALSE;
usedCluster = 1 + ((ULONG)600L*1024L)/(ULONG)G_DOS_ClusterSize;//500L*1024L
if (freeCluster > usedCluster)
{
freeCluster -= usedCluster;
usedCluster = (500L*1024L)/G_DOS_ClusterSize;
if (usedCluster <= freeCluster)
sts = TRUE;
}
if ( sts == FALSE )
{
//M_DOS_SetError(K_DOS_DiskFullErr);
L2_TurnOnOffDisplay (1); //hx@030408...add for ov2610 red lcd when record avi
//Joe@2003.3.3 19:48 add begin
UI_ShowMemoryFull();
//Joe@2003.3.3 19:48 add end
//Joe@2003.2.21 13:58 modify for fix fdb bug begin
//return FALSE;
return L1K_ERROR_GENERAL;
//Joe@2003.2.21 13:58 modify for fix fdb bug end
}
Card_Specific( 1, 0xff );
//patch3.2@yichang@0410 for searching free cluster quickly
// request max free clusters as possible
// wyeo@0523, patch 4.2, when audio with avi, if not use K_DOS_NewFile_LinearFAT
// video and audio may not sync when cluster have many gap.
rwMode = K_DOS_NewFile;
#if ( K_DOS_HaveLinearFAT )
#if ((AVIAUDIO_OPTION == 1) && (K_Link_AllFreeCluster == 1))
rwMode = K_DOS_NewFile_LinearFAT;
#endif
fHandle = File_Open(0,rwMode,100);
#else
fHandle = File_Open(0,K_DOS_NewFile,100);
#endif
//~
// wyeo@0523, patch 4.2
//fHandle = File_Open(0,K_DOS_NewFile,100);
if ( fHandle == 0 )
{
L2_TurnOnOffDisplay (1); //hx@030408...add for ov2610 red lcd when record avi
//Joe@2003.2.21 13:58 modify for fix fdb bug begin
//return FALSE;
return L1K_ERROR_GENERAL;
//Joe@2003.2.21 13:58 modify for fix fdb bug end
}
//version4.0@ada@0513 for DCF
/*
else
{
G_USR_FileIndex ++;
G_USR_FileCount++;
}
*/
SecAddr = 1; // 512 byte is reserved for AVI header
//DbgPrint("G_DOS_ClusterSize=%d,G_DOS_SectorSize=%d\n",G_DOS_ClusterSize , G_DOS_SectorSize);
//DbgPrint("FreeCluster=%x\n",freeCluster);
L2_WaitVD(0,4);
L2_SetCamMode(0);
L2_SetCamMode(3); //set to vidclip mode, start to clip the video data
G_CamMode = 3;
#if (AVIAUDIO_OPTION == 1)
L2_RecordAud(AudioAddr, 0x03, 0x62);
L2_SetDRAMAudDMACnt(0); // disable DRAMAuddMACnt
#endif
SecNu = 0;
G_ABVLCIntFlag = 0;
G_AVLCSize = 0;
G_BVLCSize = 0;
// XBYTE[0x2739] = 0;
//patch4.3@yichang@0612 for non-audio AVI
//patch4.4@yichang@OSD, begin
//#if (AVIAUDIO_OPTION == 0)
L2_ConfigGTimer(5); //up count and timebase 1 ms
L2_WriteGTimer(0);
L2_StartGTimer();
//#endif
//patch4.4@yichang@OSD, end
//patch4.4@yichang@OSD, begin
UI_PrintOSDString(" ", FOSD_H_num/2-5, FOSD_V_num/2, 0x00);
//patch4.4@yichang@OSD, end
// L1_3A(1);//wendy@2004/10/20
L2_SetDisplayType(G_DisplayType);
for(i=0; i<RecordVidCnt; i=i+1)
{
/*if(i == 0)
{ L2_WaitVD(0,2);
//wait for the VLC buffer is filled
while(G_DRAMint==0)
{
}
}*/
while(G_DRAMint==0)
{
}
if(i == 0)
L2_TurnOnOffDisplay (1); //hx@030408...add for ov2610 red lcd when record avi
G_DRAMint=0;
totalChuck++;
//patch4.4@yichang@OSD, begin
L2_ReadGTimer(&tmp0);
UI_UpdateFOSDTime(0,0,UI_MENU_DEHIGHLIGHT_COLOR,tmp0);
//patch4.4@yichang@OSD, end
//Check if snap2 button pressed
UI_Keypad_Scan(); //yichang@0424 to stop playing
//Davis:patch2.01
if((G_KeyState == K_UI_BUTTON_SNAP2))//wendy@2004/9/7
{
//Joe@2003.3.4 20:04 add begin
UI_Buzzer();
//Joe@2003.3.4 20:05 add end
break;
}
//patch4.2@yichang@0522
if(totalChuck > K_MAX_AVI_CHUNCKS)
break;
if(G_ABVLCIntFlag == 1)
Compsize = G_AVLCSize;
else
Compsize = G_BVLCSize;
tmp1 = Compsize%4;
if(tmp1 != 0)
Compsize = Compsize + 4 - (ULONG)tmp1;
tmp0 = Compsize+252;
#if (AVIAUDIO_OPTION == 1)
usedSize = SecAddr * 512 + Compsize + (totalChuck << 4) + 512 * 3 + G_DOS_ClusterSize;
#else
usedSize = SecAddr * 512 + Compsize + (totalChuck << 4) + 512 + G_DOS_ClusterSize;
#endif
usedCluster = usedSize / G_DOS_ClusterSize;
if(usedCluster > freeCluster)
{
//DbgPrint("usedCluster=%d\n",usedCluster);
//Joe@2003.3.3 19:49 add begin
UI_ShowMemoryFull();
//Joe@2003.3.3 19:49 add end
break;
}
if((i%2)==0)
{
L2_DRAMSetStartAddr( AvlcAddr+2, K_SDRAM_NoPrefetch );
L2_DRAMWriteWord((UCHAR)tmp0,(UCHAR)(tmp0>>8));
L2_DRAMWriteWord((UCHAR)(tmp0>>16),(UCHAR)(tmp0>>24));
}
else
{
L2_DRAMSetStartAddr( BvlcAddr+2, K_SDRAM_NoPrefetch );
L2_DRAMWriteWord((UCHAR)tmp0,(UCHAR)(tmp0>>8));
L2_DRAMWriteWord((UCHAR)(tmp0>>16),(UCHAR)(tmp0>>24));
}
if((i%2)==0)
DramDMAaddr = AvlcAddr;
else
DramDMAaddr = BvlcAddr;
L2_SetDRAMDMA(DramDMAaddr);
if(SecNu != 0)
{
UsedDramAddr = fragmentAddr * 2 + SecNu;
SecNu = 512-SecNu;
L2_DoDRAMDMA(DramDMAaddr*2, UsedDramAddr, SecNu);
M_Card_File_Write(fHandle, K_File_SrcDataDram2Card, 512, fragmentAddr, 0);
if((i%2)==0)
DramDMAaddr = AvlcAddr + SecNu/2;
else
DramDMAaddr = BvlcAddr + SecNu/2;
SecAddr++;
L2_SetDRAMDMA(DramDMAaddr);
}
Compsize = Compsize + 260 - (ULONG)SecNu;
SecCnt = Compsize >> 9;
if(i == 0) //Copy the first frame and reserve a page for AVI header
M_Card_File_Write(fHandle, K_File_SrcDataDram2Card, SecCnt*512, DramDMAaddr, 1);
else
M_Card_File_Write(fHandle, K_File_SrcDataDram2Card, SecCnt*512, DramDMAaddr, 0);
DramDMAaddr = DramDMAaddr + (SecCnt*512)/2;
L2_SetDRAMDMA(DramDMAaddr);
SecAddr += SecCnt;
WriteVidIndex2Dram(MoviOfset, tmp0 , AVIIdxAddr);
AVIIdxAddr += 8;
MoviOfset = MoviOfset + 8 + tmp0;
VidChunkCnt++;
SecNu = Compsize % 512;
if(SecNu != 0)
L2_DoDRAMDMA(DramDMAaddr*2, fragmentAddr*2, SecNu);
// patch5.0@andrew@3a_avi
#if AAA_OPTION
// patch4.2@andrew@0523
// for AE/AWB
if(VidChunkCnt%(4)==1)
L1_AE(0);
if(VidChunkCnt%(8)==1)
{
L1_AWB();
#if DEBUG_COLOR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -