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

📄 avirecord.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
     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(15);
    L1_InitAVIPreview();
//		L2_SetDisplayType1(15);
    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_SetDisplayType1(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 + -