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

📄 avilib.c

📁 dz3000_51.0.0.4.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
	
     return size;
}

void File_AviSetIndex(ULONG size, BYTE bAudio, BYTE bSecond) USING_0
{
        ULONG siz;

        //ckid = "00db"
        G_ucStorData[0] = '0';
        G_ucStorData[1] = '0';
        G_ucStorData[2] = 'd';
        G_ucStorData[3] = 'b';
        
        G_ucStorData[4] = 0x10;
        G_ucStorData[5] = 0x00;
        G_ucStorData[6] = 0x00;
        G_ucStorData[7] = 0x00;

        //dwChunkOffset
        siz = G_File_AviTotalSize - 0x16;               //image header
        if ( bSecond )
        	siz += K_Card_PageSize; 		//image header
        G_ucStorData[8] = siz;
        G_ucStorData[9] = siz >> 8;
        G_ucStorData[10] = siz >> 16;
        G_ucStorData[11] = siz >> 24;

        //dwChunkLength
        //"00db" + ImageSize + (padding) + "JUNK" + JunkSize = PageSize
        siz = size + (0x16 - 0x08);                     
        if ( bSecond )
        	siz -= K_Card_PageSize;
        G_ucStorData[12] = siz;
        G_ucStorData[13] = siz >> 8;
        G_ucStorData[14] = siz >> 16;
        G_ucStorData[15] = siz >> 24;

        //set image buffer start address
        G_DOS_SDRAM_NextIntRetAddr = G_File_SDRAM_AviIdx1BufAddr + ((8 + G_File_AviVideoChunkCount * 16) >> 1);

        //disable timer0 interrupt
        if ( bAudio )
        	ET0 = 0;

//ada@1209
        SDRAM_Sram2Dram(G_ucStorData, G_DOS_SDRAM_NextIntRetAddr, 16);

        //increase interrupt return address by 8
        G_DOS_SDRAM_NextIntRetAddr += 8;

        if ( bAudio )
        	ET0 = 1;

        G_File_AviIdx1Count++;
}

//-------------------------------------
//File_AviWriteHeader
//-------------------------------------
BYTE File_AviWriteHeader(BYTE bAudio) USING_0
{
        BYTE sts = TRUE;
        ULONG ulData;
	USHORT width;
	USHORT height;
        PUCHAR pIndex;
        PCHUNK pChunk;
        PMAIN_AVI_HEADER pMainAviHeader;
        PAVI_STREAM_HEADER pAviStreamHeader;
        PBITMAPINFOHEADER pBitmapInfoHeader;
#if ( AUDIO_OPTION == 1 )
        PWAVEFORMAT pWaveFormat;
#endif

        //initialization
#if ( AUDIO_OPTION == 0 )
        bAudio = 0;
#endif
        
	width = File_GetActImageLength( G_Image_SensorWidth, G_Image_HSubSample, G_Image_SrcDataType ) >> G_Image_HSubSample;
	height = File_GetActImageLength( G_Image_SensorHeight, G_Image_VSubSample, G_Image_SrcDataType ) >> G_Image_VSubSample;

        //-----------------------------
        //set data to write
        //-----------------------------
        //initialize index pointer
        pIndex = G_ucStorData;
       
        //ID = "RIFF", DATA = "AVI "
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_RiffId;
        pChunk->chunkSize = M_ByteSwapOfDword(G_File_AviTotalSize - 8);
        pChunk->chunkData = K_AviData;
        pIndex += K_CHUNK_SIZE;
             
        //ID = "LIST", DATA = "hdrl"
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_ListId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_MAIN_HEADER_SIZE);
        pChunk->chunkData = K_HdrlData;
        pIndex += K_CHUNK_SIZE;
              
        //ID = "avih", DATA = MainAVIHeader
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_AvihId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_MAIN_AVI_HEADER_SIZE);
        pMainAviHeader = (PMAIN_AVI_HEADER) &pChunk->chunkData;
        pMainAviHeader->dwMicroSecPerFrame = M_ByteSwapOfDword(K_AVIH_dwMicroSecPerFrame);
        pMainAviHeader->dwMaxBytesPerSec = M_ByteSwapOfDword(K_AVIH_dwMaxBytesPerSec);
        pMainAviHeader->dwReserved1 = 0;
        pMainAviHeader->dwFlags = M_ByteSwapOfDword(K_AVIH_dwFlags);
        pMainAviHeader->dwTotalFrames = M_ByteSwapOfDword(G_File_AviVideoChunkCount);
        pMainAviHeader->dwInitialFrames = M_ByteSwapOfDword(K_AVIH_dwInitialFrames);
        pMainAviHeader->dwStreams = M_ByteSwapOfDword(K_AVIH_dwStreams);
        pMainAviHeader->dwSuggestedBufferSize = M_ByteSwapOfDword(K_AVIH_dwSuggestedBufferSize);
        pMainAviHeader->dwWidth = M_ByteSwapOfDword(K_AVIH_dwWidth);
        pMainAviHeader->dwHeight = M_ByteSwapOfDword(K_AVIH_dwHeight);
        pMainAviHeader->dwScale = M_ByteSwapOfDword(K_AVIH_dwScale);
        pMainAviHeader->dwRate = M_ByteSwapOfDword(K_AVIH_dwRate);
        pMainAviHeader->dwStart = M_ByteSwapOfDword(K_AVIH_dwStart);
        pMainAviHeader->dwLength = M_ByteSwapOfDword(K_AVIH_dwLength);
        pIndex += K_CHUNK_SIZE - 0x04 + K_MAIN_AVI_HEADER_SIZE;

        //ID = "LIST", DATA = "strl"
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_ListId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_VIDEO_STREAM_HEADER_SIZE);
        pChunk->chunkData = K_StrlData;
        pIndex += K_CHUNK_SIZE;
              
        //ID = "strh", DATA = AVIStreamHeader
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_StrhId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_AVI_STREAM_HEADER_SIZE);
        pAviStreamHeader = (PAVI_STREAM_HEADER) &pChunk->chunkData;
        pAviStreamHeader->fccType = K_VidsId;
        pAviStreamHeader->fccHandler = K_MjpgId;
        pAviStreamHeader->dwFlags = M_ByteSwapOfDword(K_VSTRH_dwFlags);
        pAviStreamHeader->dwReserved1 = 0;
        pAviStreamHeader->dwInitialFrames = M_ByteSwapOfDword(K_VSTRH_dwInitialFrames);
        pAviStreamHeader->dwScale = M_ByteSwapOfDword(K_VSTRH_dwScale);
        pAviStreamHeader->dwRate = M_ByteSwapOfDword(K_VSTRH_dwRate);
        pAviStreamHeader->dwStart = M_ByteSwapOfDword(K_VSTRH_dwStart);
        pAviStreamHeader->dwLength = M_ByteSwapOfDword(G_File_AviVideoChunkCount);
        pAviStreamHeader->dwSuggestedBufferSize = M_ByteSwapOfDword(K_VSTRH_dwSuggestedBufferSize);
        pAviStreamHeader->dwQuality = M_ByteSwapOfDword(K_VSTRH_dwQuality);
        pAviStreamHeader->dwSampleSize = M_ByteSwapOfDword(K_VSTRH_dwSampleSize);
        pAviStreamHeader->dwReserved2 = 0;
        pAviStreamHeader->dwReserved3 = 0;
        pIndex += K_CHUNK_SIZE - 0x04 + K_AVI_STREAM_HEADER_SIZE;

        //ID = "strf", DATA = BITMAPINFOHEADER
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_StrfId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_BITMAPINFOHEADER_SIZE);
        pBitmapInfoHeader = (PBITMAPINFOHEADER) &pChunk->chunkData;
        pBitmapInfoHeader->biSize = M_ByteSwapOfDword(K_BITMAPINFOHEADER_SIZE);
        pBitmapInfoHeader->biWidth = M_ByteSwapOfDword(K_VSTRF_biWidth);
        pBitmapInfoHeader->biHeight = M_ByteSwapOfDword(K_VSTRF_biHeight);
        pBitmapInfoHeader->biPlanes = M_ByteSwapOfWord(K_VSTRF_biPlanes);
        pBitmapInfoHeader->biBitCount = M_ByteSwapOfWord(K_VSTRF_biBitCount);
        pBitmapInfoHeader->biCompression = K_MjpgId;
        pBitmapInfoHeader->biSizeImage = M_ByteSwapOfDword(K_VSTRF_biSizeImage);
        pBitmapInfoHeader->biXPelsPerMeter = M_ByteSwapOfDword(K_VSTRF_biXPelsPerMeter);
        pBitmapInfoHeader->biYPelsPerMeter = M_ByteSwapOfDword(K_VSTRF_biYPelsPerMeter);
        pBitmapInfoHeader->biClrUsed = M_ByteSwapOfDword(K_VSTRF_biClrUsed);
        pBitmapInfoHeader->biClrImportant = M_ByteSwapOfDword(K_VSTRF_biClrImportant);
        pIndex += K_CHUNK_SIZE - 0x04 + K_BITMAPINFOHEADER_SIZE;

#if (AUDIO_OPTION == 1)
        if (bAudio)
        {
                //ID = "LIST", DATA = "strl"
                pChunk = (PCHUNK) pIndex;
                pChunk->chunkId = K_ListId;
                pChunk->chunkSize = M_ByteSwapOfDword(K_AUDIO_STREAM_HEADER_SIZE);
                pChunk->chunkData = K_StrlData;
                pIndex += K_CHUNK_SIZE;
              
                //ID = "strh", DATA = AVIStreamHeader
                pChunk = (PCHUNK) pIndex;
                pChunk->chunkId = K_StrhId;
                pChunk->chunkSize = M_ByteSwapOfDword(K_AVI_STREAM_HEADER_SIZE);
                pAviStreamHeader = (PAVI_STREAM_HEADER) &pChunk->chunkData;
                pAviStreamHeader->fccType = K_AudsId;
                pAviStreamHeader->fccHandler = 0;
                pAviStreamHeader->dwFlags = M_ByteSwapOfDword(K_VSTRH_dwFlags);
                pAviStreamHeader->dwReserved1 = 0;
                pAviStreamHeader->dwInitialFrames = M_ByteSwapOfDword(K_ASTRH_dwInitialFrames);
                pAviStreamHeader->dwScale = M_ByteSwapOfDword(K_ASTRH_dwScale);
                pAviStreamHeader->dwRate = M_ByteSwapOfDword(K_ASTRH_dwRate);
                pAviStreamHeader->dwStart = M_ByteSwapOfDword(K_ASTRH_dwStart);
                pAviStreamHeader->dwLength = 0;
                pAviStreamHeader->dwSuggestedBufferSize = M_ByteSwapOfDword(K_ASTRH_dwSuggestedBufferSize);
                pAviStreamHeader->dwQuality = M_ByteSwapOfDword(K_ASTRH_dwQuality);
                pAviStreamHeader->dwSampleSize = M_ByteSwapOfDword(K_ASTRH_dwSampleSize);
                pAviStreamHeader->dwReserved2 = 0;
                pAviStreamHeader->dwReserved3 = 0;
                pIndex += K_CHUNK_SIZE - 0x04 + K_AVI_STREAM_HEADER_SIZE;

                //ID = "strf", DATA = WAVEFORMAT
                pChunk = (PCHUNK) pIndex;
                pChunk->chunkId = K_StrfId;
                pChunk->chunkSize = M_ByteSwapOfDword(K_WAVEFORMAT_SIZE);
                pWaveFormat = (PWAVEFORMAT) &pChunk->chunkData;
                pWaveFormat->wFormatTag = M_ByteSwapOfWord(K_ASTRF_wFormatTag);
                pWaveFormat->nChannels = M_ByteSwapOfWord(K_ASTRF_nChannels);
                pWaveFormat->nSamplesPerSec = M_ByteSwapOfDword(K_ASTRF_nSamplesPerSec);
                pWaveFormat->nAvgBytesPerSec = M_ByteSwapOfDword(K_ASTRF_nAvgBytesPerSec);
                pWaveFormat->nBlockAlign = M_ByteSwapOfWord(K_ASTRF_nBlockAlign);
                pWaveFormat->wBitsPerSample = M_ByteSwapOfWord(K_ASTRF_wBitsPerSample);
                pIndex += K_CHUNK_SIZE - 0x04 + K_WAVEFORMAT_SIZE;
        }
#endif

        //ID = "JUNK", DATA = Don'tCare
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_JunkId;
        pChunk->chunkSize = M_ByteSwapOfDword(K_HEADER_JUNK_SIZE);
        pIndex += K_CHUNK_SIZE - 0x04 + K_HEADER_JUNK_SIZE;

        //ID = "LIST", DATA = "movi"
        pChunk = (PCHUNK) pIndex;
        pChunk->chunkId = K_ListId;
        ulData = 0x08 +
                (G_File_AviVideoChunkCount + G_File_AviAudioChunkCount) * 0x10;
        pChunk->chunkSize = M_ByteSwapOfDword(G_File_AviTotalSize - 0x01fc - ulData);
        pChunk->chunkData = K_MoviData;
        pIndex += K_CHUNK_SIZE;

        //write header page
        M_Card_LPSram2Card(G_File_HdrLogAddr, G_File_HdrPhyAddr, G_File_HdrLogBlock);

        return sts;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -