📄 avirecord.c
字号:
//L2_CtrlScreen(2);
L2_SetFrontImgOffsetm(imgOffX, imgOffY);
L2_SetFrontImgSizem(imgWidth, imgHeight);
//patch4.5@richie@view range (remove '+ 16' of second parameter)
//this one don't need to mark +16
//patch5.0@richie@avi size begin
L2_SetCDSPScale(imgWidth, G_usVideoClip_Width + 16);
//L2_SetCDSPScale(imgWidth, K_VIDEOCLIP_Width);
if(jpegHeight%G_usVideoClip_Height)
{
L2_SetAFBSize(G_usVideoClip_Width,jpegHeight-1);
L2_SetBFBSize(G_usVideoClip_Width,jpegHeight-1);
L2_SetRFBSize(G_usVideoClip_Width,jpegHeight-1);
}
else
{
L2_SetAFBSize(G_usVideoClip_Width,jpegHeight);
L2_SetBFBSize(G_usVideoClip_Width,jpegHeight);
L2_SetRFBSize(G_usVideoClip_Width,jpegHeight);
}
L2_SetJPEGVscale(jpegHeight, G_usVideoClip_Height);
//patch4.1@yichang@0515 for correcting display ratio
L2_SetDisplaySrcImgSize(G_usVideoClip_Width, jpegHeight/*imgHeight - 13*/, G_DisplayType);
//patch5.0@richie@avi size end
//printf("G_usVideoClip_Width = %d,jpegHeight = %d\n",G_usVideoClip_Width,jpegHeight);
L1_InitSPCA533(1);
//patch4.4@yichang@for valid signal begin
//please set delay time by yourself
for(i=0;i<100;i++)
DELAY_1ms();
//Joe@2003.2.21 14:48 mask begin
/*
while(((XBYTE[0x2DA0] & 0x04) == 0x04))
{
L2_CtrlScreen(1);
}
//patch4.4@yichang@for valid signal end
*/
//Joe@2003.2.21 14:48 add end
//Joe@2003.2.21 12:58 unmask begin
//L2_TurnOnOffDisplay(1);
//Joe@2003.2.21 12:58 unmask end
}
//patch4.3@richie@zo v end
//version4.0@yichang@0513 use function call to reduce code
//-----------------------------------------------------------------------------
//void FillDramLong(ULONG address, ULONG value)
//-----------------------------------------------------------------------------
void FillDramLong(ULONG address, ULONG value) USING_0
{
L2_DRAMSetStartAddr(address, K_SDRAM_NoPrefetch );
L2_DRAMWriteWord((UCHAR)value,(UCHAR)(value>>8));
L2_DRAMWriteWord((UCHAR)(value>>16),(UCHAR)(value>>24));
}
//-----------------------------------------------------------------------------
//L1_VideoClip
//-----------------------------------------------------------------------------
//patch4.2@andrew@0523 video ae/awb
//patch3.2@ada@0401 For Multi-Frame Play Back
extern unsigned char G_MANUAL_WB_Flag;
UCHAR L1_VideoClip() USING_0
{
USHORT i;
UCHAR QTable[128];
ULONG Compsize;
ULONG AVIIdxAddr;
ULONG SecAddr;
ULONG SecCnt;
ULONG AVLCAddr;
ULONG BVLCAddr;
USHORT SecNu;
ULONG DRAMAudBufCnt;
ULONG MoviOfset;
ULONG VidChunkCnt;
ULONG AudChunkCnt;
ULONG AviSize;
ULONG MoviSize;
ULONG tmp0;
UCHAR tmp1;
BYTE sts;
USHORT freeCluster;
USHORT usedCluster;
USHORT fHandle;
ULONG DramDMAaddr;
ULONG fragmentAddr;
BYTE name[12];
ULONG UsedDramAddr;
//version4.0@yichang@0513 change data type
ULONG totalChuck;
float TframeRate;
UCHAR AudDMACnt;
ULONG RecordVidCnt;
ULONG usedSize;
ULONG dwScale,dwRate;
BYTE rwMode;
ULONG AvlcAddr, BvlcAddr ;
ULONG AudioAddr, AVIHeadAddr;
//Joe@2003.3.12 18:44 add begin
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();
L1_InitAVIPreview();
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
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)||(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;
}
//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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -