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

📄 aviplay1.c

📁 dz3000_51.0.0.4.rar
💻 C
📖 第 1 页 / 共 3 页
字号:

  //#if	( PLAYAUDIO_OPTION == 1	)
  ULONG	 AudBufIdx;
  ULONG	 AudBufCnt;
  //ULONG  AudBufCnt1;
  //#endif

  ULONG	 PAVIIdx;
  UCHAR	 VLCFlip;
  UCHAR	 StreamNum;
  UCHAR	 PlayAudio_Flag;
  UCHAR	 FeedData;
  USHORT lastVidCluster, lastAudCluster;
  USHORT lastVidFileIdx, lastAudFileIdx;
  USHORT lastVidIdx, lastAudIdx;
  USHORT NextVidIdx, NextAudIdx;
  ULONG	 VidFrameTime;
  ULONG	 playVidTime, playAudTime;
  UCHAR	 VidDone, AudDone;
  ULONG	 dwRate, dwScale;
  float	 frameRate;
  ULONG	 msPerFrame;
  UCHAR	 FeedAudio;
  UCHAR	 DropVidFlag;
  UCHAR	 tmp2, tmp3;
  UCHAR	 MediaType;
  UCHAR	 firstVidblock,firstAudblock;
  ULONG	 TimeExceed;
  ULONG	 AudioAddr;

  //version4.0@ada@0513	for	DCF
  UCHAR	 FileType;
  //patch4.4@yichang@for valid signal begin
  UCHAR	showBG_flag;

  showBG_flag =	0;
  //patch4.4@yichang@for valid signal end

  TimeExceed = 0;
  sts =	FALSE;
  PlayAudio_Flag = 0;
//patch5.0@richie@sdram	mapping	begin
  AudioAddr	= K_SDRAM_AviPbAudioBufAddr;
  PBAudioChunkAddr = K_SDRAM_AviPbAudioChunkBufAddr;
  AVIIdxRamAddr	= K_SDRAM_AviPbIdx1BufAddr;
////patch5.0@richie@sdram mapping end

  // patch3.2@yichang@0401 prebuild	smc	banking	table into sdram
  Card_Specific( 1,	0xff );

  USR_SetAviName(name, (USHORT)ID);

  //ada@0401 For Multi-Frame Play Back
  //version4.0@ada@0513	for	DCF

  //patch4.5@ada@Record	DCF	file name begin
  startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr +	(((ULONG)ID	- 1)) *	10,&FileType);
  //startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr	+ (((ULONG)ID -	1))	* 8,&FileType);
  //patch4.5@ada@Record	DCF	file name end

  //startCluster = USR_ReadDramFdbParameter(K_SDRAM_AVI_FdbParameterBufAddr	+ (((ULONG)ID -	1))	* 3);


  //ada@0401
  fHandle =	File_Open(name,	K_DOS_ReadFile,	startCluster);

  if (!fHandle)
  {
	 DbgPrint("Cannot open AVI file\n");
	 return	L1K_ERROR_GENERAL;
  }

  avifileSize =	G_DOS_FileSize;

   sts = M_Card_File_Read(fHandle, K_DOS_DstDram, 512, PBAudioChunkAddr, 0);
   if(!sts)
   {

	 DbgPrint("Cannot read AVI header\n");
	 return	L1K_ERROR_GENERAL;
   }

//Davis:patch5.0.0.3_2005/Jun/30	L2_SetGPIOBit(40,1);   //AUDIO_CTRL//

	L2_SetSRAMDMA(0x0C00);
	L2_SetDRAMDMA(PBAudioChunkAddr);
	L2_DoDMA(0,1,512,0,0);

	StreamNum =	(UCHAR)XBYTE[0x1C38] | (UCHAR)XBYTE[0x1C39]<<8 | (UCHAR)XBYTE[0x1C3A]<<16 |	(UCHAR)XBYTE[0x1C3B]<<24;
	//DbgPrint("StreamNum=%bx\n",StreamNum);

	//patch3.2@yichang@0401	For	320x240	AVI
	G_AVIWidth = (UCHAR)XBYTE[0x1C40] |	(UCHAR)XBYTE[0x1C41]<<8	| (UCHAR)XBYTE[0x1C42]<<16 | (UCHAR)XBYTE[0x1C43]<<24;
	G_AVIHeight	= (UCHAR)XBYTE[0x1C44] | (UCHAR)XBYTE[0x1C45]<<8 | (UCHAR)XBYTE[0x1C46]<<16	| (UCHAR)XBYTE[0x1C47]<<24;
	//DbgPrint("G_AVIWidth=%d,G_AVIHeight=%d\n",G_AVIWidth,G_AVIHeight);

//Joe@2003.2.25 17:24 mask begin
/*
	dwRate = (ULONG)XBYTE[0x1C4C] |	(ULONG)XBYTE[0x1C4D]<<8;
	dwRate = dwRate	| (ULONG)XBYTE[0x1C4E]<<16 | (ULONG)XBYTE[0x1C4F]<<24;

	dwScale	= (ULONG)XBYTE[0x1C48] | (ULONG)XBYTE[0x1C49]<<8;
	dwScale	= dwScale |	(ULONG)XBYTE[0x1C4A]<<16 | (ULONG)XBYTE[0x1C4B]<<24;
*/
//Joe@2003.2.25 17:24 mask end

//Joe@2003.2.25 17:24 add begin
	dwRate = (ULONG)XBYTE[0x1C84] |	(ULONG)XBYTE[0x1C85]<<8;
	dwRate = dwRate	| (ULONG)XBYTE[0x1C86]<<16 | (ULONG)XBYTE[0x1C87]<<24;

	dwScale	= (ULONG)XBYTE[0x1C80] | (ULONG)XBYTE[0x1C81]<<8;
	dwScale	= dwScale |	(ULONG)XBYTE[0x1C82]<<16 | (ULONG)XBYTE[0x1C83]<<24;
//Joe@2003.2.25 17:24 add end

	frameRate =	(float)dwRate/(float)dwScale;

	//msPerFrame = (ULONG)((float)1000 / frameRate);
	//version4.0@yichang@0513 to increase the accuracy of the value	(time need / per frame)
	msPerFrame = (ULONG)((float)256000 / frameRate);  //yichang@0416


	//DbgPrint("dwRate=%ld,	dwScale=%ld\n",	dwRate,	dwScale);
	//DbgPrint("frameRate=%f\n",frameRate);
	//DbgPrint("msPerFrame=%ld\n",msPerFrame);


	AVIIdxAddr = (ULONG)XBYTE[0x1DF8] | (ULONG)XBYTE[0x1DF9]<<8 | (ULONG)XBYTE[0x1DFA]<<16 | (ULONG)XBYTE[0x1DFB]<<24;
	AVIIdxAddr = AVIIdxAddr	+ 508;

	L1_ReadAVIIdx(AVIIdxRamAddr,AVIIdxAddr,fHandle,&ChunkCnt, 0);
/*//wendy@2004/9/9
	//patch4.4@yichang@0624	to avoid memory	overflow begin
	if(ChunkCnt == 0)
	{
		//Joe@2003.3.19 10:27 modify begin
		/*
		UI_PrintOSDString("Memory Full", 0, 2,	UI_MENU_HIGHLIGHT_COLOR);
		UI_PrintOSDString("			", 0, 2, UI_MENU_HIGHLIGHT_COLOR);
		*/
/*		UI_ShowMemoryFull();

	 	return	L1K_ERROR_GENERAL;
	}
*///wendy@2004/9/9
	//patch4.4@yichang@0624	to avoid memory	overflow end

	tmp1 = AVIIdxAddr%512;
	AVIIdxRamAddr =	AVIIdxRamAddr +	tmp1/2;	//skip the non idx garbage

	M_Card_File_Read(fHandle, K_DOS_DstDram, 512, PBAudioChunkAddr,	512);
	L2_SetSRAMDMA(0x0C00);
	L2_SetDRAMDMA(PBAudioChunkAddr);
	L2_DoDMA(0,1,512,0,0);

	for(i=0;i<64;i++)	QTable[i] =	XBYTE[0x1C21+i];
	for(i=64;i<128;i++)	QTable[i] =	XBYTE[0x1C22+i];
	 L2_WriteQTable(0x01,0xf1,QTable);		  // fill Q-table in zigzag	scan


	XBYTE[0X20E1]=0x0b;
	XBYTE[0X2DE1]=0X03;

	AVIIdxAddr = AVIIdxRamAddr + 4;

	PAVIIdx	= AVIIdxAddr;
	//VLCFlip	= 0;	//AVI_DEBUG	dlchiou	- 02-12-11 10:52

	//DbgPrint("Start to Play Video\n");

	lastVidCluster = G_DOS_FileCurrCluster;
	lastVidFileIdx = G_DOS_FileClusterIndex;
	lastAudCluster = G_DOS_FileCurrCluster;
	lastAudFileIdx = G_DOS_FileClusterIndex;


	FeedData = 0;
	FeedAudio =	0;
	lastVidIdx = 0;
	lastAudIdx = 0;

	NextVidIdx = 1;
	NextAudIdx = 1;

	playVidTime	= 0;
	playAudTime	= 0;
	VidDone	= 0;
	AudDone	= 0;
	DropVidFlag	= 0;


	PAVIIdx	= AVIIdxAddr;
	//VLCFlip =	0;	//dlchiou -	2002-12-11 10:56
	VLCFlip	= 1;	//AVI_DEBUG	dlchiou	- //2002-12-11 10:56
	firstVidblock =	0;
	firstAudblock =	0;

	//yichang@0626 test
	/*
	L2_ConfigGPIOBit(40, 1);
	L2_SetGPIOBit(40, 1);
	*/
	////printf("chunck count=%ld\n",ChunkCnt);

	G_playObject.mediaType = K_PLAYBACK_TYPE_AVI;

	L2_DRAMSetStartAddr(AVIIdxAddr,	K_SDRAM_Prefetch);
	L2_DRAMReadWord(&tmp2,&tmp3);

	if(tmp2==0x30 && tmp3==0x30) //00dc
	{
		  MediaType	= 0;

		  if(StreamNum == 1) //video only
		  {
			   G_playObject.mediaType =	K_PLAYBACK_TYPE_VIDONLY;

		  }

		   #if(	PLAYAUDIO_OPTION ==	0 )
		   G_playObject.mediaType =	K_PLAYBACK_TYPE_VIDONLY;
		   #endif

	}

	if(tmp2==0x30 && tmp3==0x31) //01wb: audio only
	{
		  MediaType	= 1;
		  VidDone =	1;
		  msPerFrame = 1000;
		  G_playObject.mediaType = K_PLAYBACK_TYPE_WAV;
	}



	// only	avi	with audio require to build	LinearFAT
	#if	(K_DOS_HaveLinearFAT)

	#if( ( PLAYAUDIO_OPTION	== 1 ) && (K_Link_AllFreeCluster ==	1))
	if (G_playObject.mediaType == K_PLAYBACK_TYPE_AVI)
	{
	 G_DOS_UseLinearFAT	= 1;
	DOS_File_Build_LinearFAT(G_DOS_FileStartCluster);
	}
	#endif
	#endif



	//Camera mode set up
	L2_SetCamMode(0);		   //Idle
	L2_SetCamMode(5);		   //Playback

	//patch4.4@yichang@for valid signal	begin
	/*		//AVI_DEBUG		//dlchiou -	2002-12-11 10:58
	while(((XBYTE[0x2DA0] &	0x04) == 0x04))
	{

		L2_CtrlScreen(2);
	}
	*/

	showBG_flag	= 1;
	//patch4.4@yichang@for valid signal	end

/*	//AVI_DEBUG	//dlchiou -	2002-12-11 10:59
	L2_SetDisplayMode(0,0x10); //Disable Frame-rate-conversion

	//L2_SetJPEGVscale(G_AVIHeight,	G_AVIHeight);//yichang@0503

	//patch3.2@yichang@0401	For	320x240	AVI
//patch5.0@richie@avi window begin
	//L2_SetDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
	L1_SetAviDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
//patch5.0@richie@avi window end
	//patch3.2@yichang@0401	For	320x240	AVI
	L2_SetAFBSize(G_AVIWidth, G_AVIHeight);
	L2_SetBFBSize(G_AVIWidth, G_AVIHeight);
*/
//	L2_TurnOnOffDisplay(1);
//herb for TVoutput debug @03/04/18 start
	if((G_AVIWidth==192)&&(G_AVIHeight==144))
	SmallSizeAvi = 1;
	else
	SmallSizeAvi = 0;
//herb for TVoutput debug @03/04/18 end

	while( (!VidDone) || (!AudDone)	)
	{

	  if(PlayAudio_Flag)
	  {
	  	     UI_PowerOnOffDetect(0);//wendy@2004/9/9

		  UI_Keypad_Scan();	//yichang@0424 to stop playing
		  if((G_KeyState	== K_UI_BUTTON_SELECT)||(G_KeyState == K_UI_BUTTON_PCCAM_SWITCH)||(G_KeyState == K_UI_BUTTON_PREVIEW_SWITCH)||(G_KeyState == K_UI_BUTTON_PLAY_SWITCH)||(G_KeyState == K_UI_BUTTON_AUDIO_SWITCH))//wendy@2004/9/7
		  {
			//Joe@2003.3.4 20:04 add begin
			UI_Buzzer();
			//Joe@2003.3.4 20:05 add end
			break;
		  }


		  L2_ReadGTimer(&VidFrameTime);
		  //patch4.4@yichang@0624 for OSD begin
		  if(showBG_flag ==	0)
				UI_UpdateFOSDTime(0,0,UI_MENU_DEHIGHLIGHT_COLOR,VidFrameTime);
		  //patch4.4@yichang@0624 for OSD end
		  //yichang@0416
		  //version4.0@yichang@0513	to increase	the	accuracy of	the	value (time	need / per frame)
		  VidFrameTime = (VidFrameTime << 8);
		  if( ((VidFrameTime - playVidTime)	>= msPerFrame )	&& (!VidDone) )
		  {
			   //yichang@0416
			   TimeExceed += (VidFrameTime - playVidTime - msPerFrame);
			   playVidTime = playVidTime + msPerFrame;
			   DropVidFlag = 0;
			   if(TimeExceed >=	msPerFrame)
			   {
					DropVidFlag	= 1;
					TimeExceed = 0;
			   }

			   //~//yichang@0416

			   NextVidIdx =	SearchAVIIndex(AVIIdxAddr, lastVidIdx, ChunkCnt, 0);
			   lastVidIdx =	NextVidIdx;

			   if(MediaType	== 0) //first frame	:00dc
					lastVidIdx = NextVidIdx	= 0;

			   //record	audio file pointer before video

			   if(PlayAudio_Flag)
			   {

					if(firstVidblock)
					{
						 G_DOS_FileCurrCluster = lastVidCluster;
						 G_DOS_FileClusterIndex	= lastVidFileIdx;
						 firstVidblock = 0;
					}
			   }


			   if(NextVidIdx ||	(MediaType == 0)) //for	play 0th chunck	of 00dc
			   {
					  if(DropVidFlag ==	0)
					  {

						 L1_PBVideoFrame(AVIIdxAddr,fHandle,NextVidIdx,VLCFlip);

						 //patch5.0@richie@sdram mapping begin
						 if(VLCFlip==0)
							  L2_SetBFBAddr(K_SDRAM_AviPbBufAddrA);
						 else
							  L2_SetBFBAddr(K_SDRAM_AviPbBufAddrB);
			 //patch5.0@richie@sdram mapping end
//test start
					//hx@2003.4.15  	// if((NextVidIdx==0)||(NextVidIdx==1))
						// L2_TurnOnOffDisplay(1);
//test end
						 VLCFlip = 1 - VLCFlip;

						if(MediaType==0)	//DEBUG BY dlchiou - 2002-12-11 11:09
						{
							L2_SetDisplayMode(0,0x10); //Disable Frame-rate-conversion
							//L2_SetDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
							L1_SetAviDisplaySrcImgSize(G_AVIWidth, G_AVIHeight,G_DisplayType);
							L2_SetAFBSize(G_AVIWidth, G_AVIHeight);
							L2_SetBFBSize(G_AVIWidth, G_AVIHeight);
						}

						 //when	read video chunck, record file position
						 lastVidCluster	= G_DOS_FileCurrCluster;
				 lastVidFileIdx	= G_DOS_FileClusterIndex;

						 //patch4.4@yichang@for	valid signal begin
						 if(showBG_flag)
						 {
								for(i=0;i<10;i++)
										DELAY_1ms();

								while(((XBYTE[0x2DA0] &	0x04) == 0x04))
								{
										L2_CtrlScreen(1);
								}

								showBG_flag	= 0;
						 }
						 //patch4.4@yichang@for	valid signal end

					  }


					if(MediaType ==	0)
						 MediaType = 2;		//for play 0th chunck of 00dc
			   }
			   else
			   {
					VidDone	= 1;

			   }



		  }//video chuck process



		  if(!AudDone)
		  {
			   L2_ReadGTimer(&VidFrameTime);

			   if((VidFrameTime-playAudTime) >=	100)
			   {

					L2_SetDRAMAudDMACnt(1);
					L2_ReadDRAMAudBufCnt(&AudBufCnt);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -