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

📄 fiplay.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
								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 + -