📄 avilib.c
字号:
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 + -