⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avirecord.c

📁 dz3000_51.0.0.4.rar
💻 C
📖 第 1 页 / 共 3 页
字号:

//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 + -