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

📄 fiplay.c

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