📄 fiplay.c
字号:
//}
if ((ImagePara.Width % 16) != 0x00)
{
TempWidth = (((ImagePara.Width + 16) >> 4) << 4);
}
//patch4.5.2@ada@Fix the bug to play non-uniform size image end
else
{
TempWidth = ImagePara.Width;
}
if ((ImagePara.Height % 8) != 0x00)
{
TempHeight = (((ImagePara.Height + 8) >> 3) << 3);
}
else
{
TempHeight = ImagePara.Height;
}
//patch5.0@richie@sdram mapping begin
L2_DeCompress(ImagePara.Addr, TempWidth, TempHeight, K_SDRAM_ImagePlaybackBufAddr , 0x00, 0x04, DRI_MCU_Num);
//patch4.2@yichang@0520 for improving display speed
if ((TempWidth != G_DSPHsize) || (TempHeight != G_DSPVsize))
{
//herb for Playback bug @03/04/21 start
if(((G_DisplayType < 8)&&(reset_display == 1)&&(avi_play==0))||(SmallSizeAvi==1))
//L2_TurnOnOffDisplay(0);
L2_CtrlScreen(3);
//herb for Playback bug @03/04/21 end
L1_ScaleImage(K_SDRAM_ImagePlaybackBufAddr, TempWidth, TempHeight, K_SDRAM_ImagePlaybackDisplayBufAddr, G_DSPHsize, G_DSPVsize, K_SDRAM_ImagePlaybackGeneralBufAddr);
}
//patch5.0@richie@sdram mapping end
}
}
else//Other YUV format
{
//printf("Other YUV format not support\n");
sts = FALSE;
}
}
}
else//Parsing header error or image size not in range
{
//printf("Parsing header error or image size not in range\n");
sts = FALSE;
}
}
//patch4.5@ada@modify for pictures whose width is not the times of 8 and 16 end
}//Read file error
}
else//Open file error
{
sts = FALSE;
}
SETMODE_ChangeCameraMode(K_MODE_IDLE);
//version4.0@ada@0513 for DPOF
if (sts)
{
FileIndex = ((USHORT)(name[4] - '0')) * 1000 + ((USHORT)(name[5] - '0')) * 100 + ((USHORT)(name[6] - '0')) * 10 + (USHORT)(name[7] - '0');
//printf("File index for DPOF = %d\n",FileIndex);
L2_DRAMSetStartAddr((K_SDRAM_DPOF3_BufAddr + (((ULONG)FileIndex) - 1) * 3 + 1),K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
//Write back the first marking byte
L2_DRAMSetStartAddr((K_SDRAM_DPOF3_BufAddr + (((ULONG)FileIndex) - 1) * 3 + 1),K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(tmp1,Jpeg_Exif_Format);
}
return sts;
}
//-----------------------------------------------------------------------------
//File_IFD_Type
//-----------------------------------------------------------------------------
/*USHORT File_IFD_Type(USHORT value) USING_1
{
switch 1: //BYTE
return 1;
switch 2: //ASCII
return 1;
switch 3: //SHORT
return 2;
switch 4: //LONG
return 4;
switch 5: //RATIONAL
return 8;
switch 7: //UNDEFINED
return 1;
switch 9: //SLONG
return 4;
switch 10: //SRATIONAL
return 8;
}*/
#if ( K_File_HaveVideo )
BYTE File_PlayAvi(UCHAR *name, USHORT startCluster, ULONG vidRamAddr, ULONG vidRamSize, ULONG audRamAddr, ULONG audRamSize) USING_0
{
ULONG ulTemp0 = vidRamSize;
ULONG ulTemp1 = audRamSize;
WORD err = 0;
WORD bufOffset;
ULONG valueOffset;
ULONG fOffset;
ULONG chunkType;
WORD chunkSequence;
ULONG chunkSize;
ULONG chunkData;
WORD k;
ULONG vidsValue[K_File_Avi_vidssEnd_Value];
WORD valueCounter;
ULONG *pValue1;
ULONG *pValue2;
USHORT fHandle;
UCHAR sts;
BYTE bVideo = FALSE;
ULONG imageSize;
ULONG imageOffset;
ULONG totalIdx1;
ULONG idx1Counter;
ULONG actImageSize;
ULONG skipExtraByte;
ULONG addOffset;
UCHAR newQTable = FALSE;
ULONG audioSize = 0;
#if ( AUDIO_OPTION )
ULONG audsValue[K_File_Avi_audsEnd_Value];
BYTE bAudio = FALSE;
#endif
vidRamAddr <<= 1;
audRamAddr <<= 1;
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)
{
fOffset = 0;
if ( File_IsAviFile(G_ucStorData,&chunkSize) )
{
bufOffset = 0;
chunkType = K_File_Avi_avih_Chunk;
chunkSequence = 0;
pValue1 = &chunkSize;
pValue2 = 0;
vidsValue[ K_File_Avi_vidsHandler_Value ] = 0xFFFFFFFF;
do
{
bufOffset = File_FindPattern(fHandle, (UCHAR *)&chunkType, 4, &fOffset, pValue1, pValue2);
if (bufOffset > K_Card_PageSize)
{
// error happen
err = 2;
break;
}
if (bufOffset)
{
if (chunkType == K_File_Avi_avih_Chunk && chunkSequence == 0)
{
vidsValue[ K_File_Avi_TotalFrames_Value ] = K_File_Avi_TotalFrames_Offset;
vidsValue[ K_File_Avi_Width_Value ] = K_File_Avi_Width_Offset;
vidsValue[ K_File_Avi_Height_Value ] = K_File_Avi_Height_Offset;
valueCounter = K_File_Avi_TotalFrames_Value;
for ( k = 0; k < 3; k++ )
{
valueOffset = fOffset + vidsValue[valueCounter];
vidsValue[valueCounter++] = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
}
fOffset += chunkSize;
chunkType = K_File_Avi_LIST_Chunk;
chunkSequence++;
pValue2 = &chunkData;
}
else if (chunkSequence > 0)
{
if (chunkType == K_File_Avi_LIST_Chunk && chunkData == K_File_Avi_strl_Chunk)
{
chunkType = K_File_Avi_strh_Chunk;
}
else if (chunkType == K_File_Avi_strh_Chunk)
{
if (chunkData == K_File_Avi_vids_Chunk)
{
// should be SP54 handler
valueOffset = fOffset + 4;
vidsValue[ K_File_Avi_vidsHandler_Value ] = File_ReadValue(fHandle, &valueOffset, FALSE, 4);
// time stamp
valueOffset = fOffset + K_File_Avi_TimpStamp_Offset;
vidsValue[ K_File_Avi_TimpStamp_Value ] = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
valueOffset = fOffset + chunkSize;
chunkType = File_ReadValue(fHandle, &valueOffset, FALSE, 4);
if (chunkType != K_File_Avi_strd_Chunk)
{
valueOffset += File_ReadValue(fHandle, &valueOffset, TRUE, 4);
chunkType = File_ReadValue(fHandle, &valueOffset, FALSE, 4);
}
if (chunkType == K_File_Avi_strd_Chunk)
{
chunkSize = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
fOffset = valueOffset;
// optinal data for different codec
if ( vidsValue[ K_File_Avi_vidsHandler_Value ] == K_File_Avi_SP54_Handler )
{
// get q table
newQTable = TRUE;
}
else if ( vidsValue[ K_File_Avi_vidsHandler_Value ] == K_File_Avi_mjpg_Handler )
{
}
}
}
#if ( AUDIO_OPTION )
else if (chunkData == K_File_Avi_auds_Chunk)
{
// auds fccHandler
valueOffset = fOffset + 4;
audsValue[ K_File_Avi_audsHandler_Value ] = File_ReadValue(fHandle, &valueOffset, FALSE, 4);
audsValue[ K_File_Avi_SampleScale_Value] = K_File_Avi_SampleScale_Offset;
audsValue[ K_File_Avi_SampleRate_Value] = K_File_Avi_SampleRate_Offset;
audsValue[ K_File_Avi_SampleSize_Value] = K_File_Avi_SampleSize_Offset;
valueCounter = K_File_Avi_SampleScale_Value;
for ( k = 0; k < 3; k++ )
{
valueOffset = fOffset + audsValue[ valueCounter];
audsValue[ valueCounter++] = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
}
fOffset += chunkSize;
// strf
chunkType = K_File_Avi_strf_Chunk;
bufOffset = File_FindPattern(fHandle, (UCHAR *)&chunkType, 4, &fOffset, &chunkSize, 0);
if (bufOffset)
{
// wFormatTag
valueOffset = fOffset;
audsValue[ K_File_Avi_wFormatTag_Value] = File_ReadValue(fHandle, &valueOffset, TRUE, 2);
// nChannels
audsValue[ K_File_Avi_nChannels_Value] = File_ReadValue(fHandle, &valueOffset, TRUE, 2);
// nSamplesPerSec
audsValue[ K_File_Avi_nSamplesPerSec_Value] = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
// nAvgBytesPerSec
audsValue[ K_File_Avi_nAvgBytesPerSec_Value] = File_ReadValue(fHandle, &valueOffset, TRUE, 4);
// wBitsPerSample
valueOffset += 2;
audsValue[ K_File_Avi_wBitsPerSample_Value] = File_ReadValue(fHandle, &valueOffset, TRUE, 2);
bAudio = TRUE;
}
else
err = 5;
}
#endif
chunkType = K_File_Avi_LIST_Chunk;
fOffset += chunkSize;
}
else if (chunkData == K_File_Avi_movi_Chunk)
{
// movi offset
vidsValue[ K_File_Avi_moviOffset_Value ] = fOffset;
// idx1 offset
vidsValue[ K_File_Avi_idx1Offset_Value ] = chunkSize + vidsValue[ K_File_Avi_moviOffset_Value ];
bVideo = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -