📄 fiplay.c
字号:
break;
}
else
{
chunkType = K_File_Avi_LIST_Chunk;
fOffset += chunkSize;
}
}
else
err = 4;
}
} while ( fOffset < G_DOS_FileSize && err == 0 );
}
else
err = 3;
}
else
err = 2;
if (err == 0)
{
if (bVideo)
{
chunkType = K_File_Avi_idx1_Chunk;
fOffset = vidsValue[ K_File_Avi_idx1Offset_Value ];
bufOffset = File_FindPattern(fHandle, (UCHAR *)&chunkType, 4, &fOffset, &totalIdx1, 0);
totalIdx1 >>= 4;
if (bufOffset && totalIdx1)
{
G_TimeStamp = vidsValue[ K_File_Avi_TimpStamp_Value ];
skipExtraByte = 0;
addOffset = 0;
actImageSize = 0;
if ( vidsValue[ K_File_Avi_vidsHandler_Value ] == K_File_Avi_SP54_Handler )
skipExtraByte = 14;
else if ( vidsValue[ K_File_Avi_vidsHandler_Value ] == K_File_Avi_mjpg_Handler )
addOffset = vidsValue[ K_File_Avi_moviOffset_Value ];
idx1Counter = 0;
while (sts && idx1Counter < totalIdx1 )
{
chunkType = File_ReadValue(fHandle, &fOffset, FALSE, 4);
chunkSize = File_ReadValue(fHandle, &fOffset, TRUE, 4);
imageOffset = File_ReadValue(fHandle, &fOffset, TRUE, 4)+8+addOffset;
imageSize = File_ReadValue(fHandle, &fOffset, TRUE, 4);
if (imageSize != 0)
{
imageSize -= skipExtraByte;
actImageSize = imageSize;
if ( chunkType == K_File_Avi_00db_Chunk || chunkType == K_File_Avi_00dc_Chunk )
{
if (skipExtraByte)
{
// there are extra structure put before actual image data
valueOffset = imageOffset;
actImageSize = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
if (actImageSize == 0)
actImageSize = imageSize;
}
L2_DRAMSetStartAddr((vidRamAddr>>1), K_SDRAM_NoPrefetch);
sts = File_ReadDataToDram(fHandle, imageSize, vidRamAddr, imageOffset+skipExtraByte);
if (sts)
{
L2_DRAMSetStartAddr((vidRamAddr>>1), K_SDRAM_NoPrefetch);//ada@1209
File_PlayAviStream(vidRamAddr>>1, actImageSize,
vidsValue[ K_File_Avi_Width_Value ],
vidsValue[ K_File_Avi_Height_Value ],
K_File_DataType_YUV411, 0, audRamAddr, audioSize );
}
}
#if ( AUDIO_OPTION )
else if (chunkType == K_File_Avi_01wb_Chunk && audRamSize)
{
L2_DRAMSetStartAddr((audRamAddr>>1), K_SDRAM_NoPrefetch);
sts = File_ReadDataToDram(fHandle, imageSize, audRamAddr, imageOffset);
audioSize += imageSize;
}
#endif
}
idx1Counter++;
}
}
}
}
File_Close(fHandle, name, K_DOS_ReadFile, 0);
}
else
err = 1;
if (err)
return FALSE;
else
return TRUE;
}
BYTE File_IsAviFile(UCHAR *buf, ULONG *pSize) USING_0
{
if ( buf[0] == 'R' &&
buf[1] == 'I' &&
buf[2] == 'F' &&
buf[3] == 'F' &&
buf[8] == 'A' &&
buf[9] == 'V' &&
buf[10] == 'I' )
{
if ( pSize != 0 )
{
*pSize = buf[4];
*pSize |= ((ULONG)buf[5]) << 8;
*pSize |= ((ULONG)buf[6]) << 16;
*pSize |= ((ULONG)buf[7]) << 24;
}
return TRUE;
}
else
{
if ( pSize != 0 )
*pSize = 0;
return FALSE;
}
}
#endif
#if ( AUDIO_OPTION )
BYTE File_ParseWave(UCHAR *name, USHORT startCluster, ULONG *pAudsValue, USHORT arraySize) USING_0
{
USHORT wTemp = arraySize;
USHORT err = 0;
WORD bufOffset;
ULONG fOffset;
ULONG chunkType;
ULONG chunkSize;
USHORT fHandle;
UCHAR sts;
pAudsValue[ K_File_Wave_audioSize_Value ] = 0;
pAudsValue[ K_File_Wave_audioFOffset_Value ] = 0;
fHandle = File_Open(name, K_DOS_ReadFile, startCluster);
if (fHandle)
{
// HIS101c-0004
sts = M_Card_File_Read(fHandle, K_DOS_DstSram, K_Card_PageSize, 0, 0);
if (sts)
{
if ( File_IsWaveFile(G_ucStorData, &chunkSize) )
{
chunkType = K_File_Wave_fmt_Chunk;
fOffset = 12;
bufOffset = File_FindPattern(fHandle, (UCHAR *)&chunkType, 4, &fOffset, &chunkSize, 0);
if (bufOffset)
{
// wFormatTag, Compression code
pAudsValue[ K_File_Wave_wFormatTag_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 2);
// nChannels, Number of channels
pAudsValue[ K_File_Wave_nChannels_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 2);
// nSamplesPerSec, Samples per second
pAudsValue[ K_File_Wave_nSamplesPerSec_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 4);
// nAvgBytesPerSec, Average number of bytes per second
pAudsValue[ K_File_Wave_nAvgBytesPerSec_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 4);
// wBlockAlign 2 byte, Block alignment
pAudsValue[ K_File_Wave_blockAlign_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 2);
// wBitsPerSample, Significant bits per sample
pAudsValue[ K_File_Wave_wBitsPerSample_Value ] = File_ReadValue(fHandle, &fOffset, TRUE, 2);
chunkType = K_File_Wave_data_Chunk;
bufOffset = File_FindPattern(fHandle, (UCHAR *)&chunkType, 4, &fOffset, &chunkSize, 0);
if (bufOffset)
{
pAudsValue[ K_File_Wave_audioSize_Value ] = chunkSize;
pAudsValue[ K_File_Wave_audioFOffset_Value ] = fOffset;
}
else
err = 5;
}
else
err = 4;
}
else
err = 3;
}
else
err = 2;
File_Close(fHandle, name, K_DOS_ReadFile, 0);
}
else
err = 1;
if (err)
return FALSE;
else
return TRUE;
}
BYTE File_IsWaveFile(UCHAR *buf, ULONG *pSize) USING_0
{
if ( buf[0] == 'R' &&
buf[1] == 'I' &&
buf[2] == 'F' &&
buf[3] == 'F' &&
buf[8] == 'W' &&
buf[9] == 'A' &&
buf[10] == 'V' &&
buf[11] == 'E' )
{
if ( pSize != 0 )
{
*pSize = buf[4];
*pSize |= ((ULONG)buf[5]) << 8;
*pSize |= ((ULONG)buf[6]) << 16;
*pSize |= ((ULONG)buf[7]) << 24;
}
return TRUE;
}
else
{
if ( pSize != 0 )
*pSize = 0;
return FALSE;
}
}
BYTE File_PlayWave(UCHAR *name, USHORT startCluster, ULONG ramAddr, ULONG ramSize) USING_0
{
ULONG audsValue[K_File_Wave_End_Value];
BYTE sts = FALSE;
ULONG readSize;
if ( readSize = File_ReadWaveToDram(name, startCluster, ramAddr, ramSize, &audsValue[0] ) )
sts = File_PlayWaveStream(ramAddr, readSize, &audsValue[0]);
return sts;
}
ULONG File_ReadWaveToDram(UCHAR *name, USHORT startCluster, ULONG ramAddr, ULONG ramSize, ULONG *pAudsValue) USING_0
{
ULONG ulTemp = ramSize;
WORD fHandle;
ULONG readSize = 0;
if ( File_ParseWave(name, startCluster, pAudsValue, K_File_Wave_End_Value) )
{
if ( fHandle = File_Open(name, K_DOS_ReadFile, startCluster) )
{
readSize = pAudsValue[K_File_Wave_audioSize_Value];
if ( pAudsValue[K_File_Wave_audioSize_Value] > G_DOS_FileSize )
readSize = pAudsValue[K_File_Wave_audioSize_Value];
if ( !File_ReadDataToDram(fHandle, readSize, ramAddr << 1, pAudsValue[K_File_Wave_audioFOffset_Value] ) )
readSize = 0;
}
File_Close(fHandle, name, K_DOS_ReadFile, 0);
}
return readSize;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -