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

📄 aviplay1.c

📁 dz3000_51.0.0.4.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************
  Copyright	(c)	2002 Sunplus Technology	Co., Ltd.
  Module Name:	aviplay.c
  Function	 :	This AVI playback function
  Environment:	Keil C51 Compiler
  Creation	 :	2002/03/18 yichang
***********************************************************************************/
#include "general.h"
#include "main.h"
#include "sdramhw.h"
#include "image.h"
#include "doslink.h"
#include "dosusr.h"
#include "dosvar.h"
#include "ui.h"
#include "quantdef.h"
//#include "avioption.h"
#include "cardfunc.h"
#include "timer.h"
#include "uiflow.h"
#include "playback.h"

#if	(SMC_OPTION	|| NANDF_OPTION)
#include "smcfunc.h"
#endif

#if	(CFC_OPTION)
#include "cffunc.h"
#endif

#if	(SDF_OPTION)
#include "sdfunc.h"
#endif

//patch3.2@ada@0401	For	Multi-Frame	Play Back
#include "initio.h"

//Joe@2003.3.4 20:12 mask begin
#include "JoeToEvb.h"
//Joe@2003.3.4 20:12 add end

//patch5.0@richie@avi window begin
UCHAR L1_SetAviDisplaySrcImgSize(USHORT	hsize, USHORT vsize, UCHAR type);
//patch5.0@richie@avi window end

//herb for TVoutput debug @03/04/18 start
xdata UCHAR SmallSizeAvi;
//herb for TVoutput debug @03/04/18 end

//version4.0@yichang@0513 use function call	to reduce code
//-----------------------------------------------------------------------------
//ULONG	ReadSramLong(ULONG addr)
//-----------------------------------------------------------------------------
ULONG ReadSramLong(ULONG addr)
{
	  ULONG	value;
	  value	= (ULONG)XBYTE[addr] | (ULONG)XBYTE[addr+1]<<8;
	  value	= value	| (ULONG)XBYTE[addr+2]<<16 | (ULONG)XBYTE[addr+3]<<24;
	  return value;
}

//version4.0@yichang@0513 use function call	to reduce code
//-----------------------------------------------------------------------------
//AVIReadOffset()
//-----------------------------------------------------------------------------
ULONG AVIReadDword(ULONG dramAddr) USING_0
{
	  ULONG	 AviDwValue;
	  UCHAR	 tmp2, tmp3;

	  L2_DRAMSetStartAddr(dramAddr,K_SDRAM_Prefetch);
	  L2_DRAMReadWord(&tmp2,&tmp3);
	  AviDwValue = (ULONG)tmp2 | (ULONG)tmp3<<8;

	  L2_DRAMSetStartAddr(dramAddr+1,K_SDRAM_Prefetch);
	  L2_DRAMReadWord(&tmp2,&tmp3);
	  AviDwValue = AviDwValue |	(ULONG)tmp2<<16	| (ULONG)tmp3<<24;

	  return AviDwValue;

}

//-----------------------------------------------------------------------------
//L1_PBVideoFrame()
//-----------------------------------------------------------------------------
//patch3.2@yichang@0401	For	320x240	AVI
UCHAR L1_PBVideoFrame(ULONG	 AVIIdxAddr, USHORT	fHandle, USHORT	frameNo, UCHAR	VLCFlip) USING_0
{
	  ULONG	tmp0;
	  USHORT tmp1;
	  ULONG	 SecAddr;
	  ULONG	 AviSize;
	  ULONG	 AviAddr;
	  ULONG	 PBVideoAddr;
	  ULONG	 SecCnt;




//patch5.0@richie@sdram	mapping	begin
	  PBVideoAddr =	K_SDRAM_AviPbVideoBufAddr +	256;
//patch5.0@richie@sdram	mapping	end
	  AviAddr =	AVIReadDword(AVIIdxAddr+(ULONG)frameNo*8+4);
	  AviSize =	AVIReadDword(AVIIdxAddr+(ULONG)frameNo*8+6);

	  AviAddr =	AviAddr+260+508;
	  SecAddr =	(ULONG)(AviAddr>>9);
	  tmp1 = AviAddr % 512;
	  tmp0 = PBVideoAddr;
	  if(tmp1 != 0)
	  {
		  tmp0 = tmp0 -	(ULONG)(tmp1/2);
		  AviSize =	AviSize	+ (ULONG)tmp1;
	  }

	  SecCnt  =	AviSize>>9;
	  if((AviSize%512)!= 0)
					SecCnt++;

	  //Prepare	the	VLC	stream data
	  M_Card_File_Read(fHandle,	K_DOS_DstDram, SecCnt*512, tmp0, (ULONG)(SecAddr<<9));

//patch5.0@richie@sdram	mapping	begin
	  //patch3.2@yichang@0401 For 320x240 AVI
	  if(VLCFlip ==	0)	//YUV420, JFIF-compatible
		  L2_DeCompress(PBVideoAddr, G_AVIWidth, G_AVIHeight, K_SDRAM_AviPbBufAddrA, 0x00, 0x05, 0x00);
	  else
		  L2_DeCompress(PBVideoAddr, G_AVIWidth, G_AVIHeight, K_SDRAM_AviPbBufAddrB, 0x00, 0x05, 0x00);



	  //patch3.2@yichang@0401 For 320x240 AVI
	  if(VLCFlip ==	0)
		  L2_TransYUV420toYUV422(K_SDRAM_AviPbBufAddrA,	G_AVIWidth,	G_AVIHeight);
	  else
		  L2_TransYUV420toYUV422(K_SDRAM_AviPbBufAddrB,	G_AVIWidth,	G_AVIHeight);
//patch5.0@richie@sdram	mapping	end

	  //patch3.2@yichang@0401 For 320x240 AVI

	  //change the display index (wait until TVvsync. low)

	  //change the display index (wait until TVvsync. low)
	 // while((XBYTE[0x20b3]&0X20)==0X20);//wendy@2004/8/31


	  return L1K_SUCCESS;

}

//patch5.0@richie@sdram	mapping	begin
//-----------------------------------------------------------------------------
//L1_PBOneVideoFrame()
//-----------------------------------------------------------------------------
//patch3.2@yichang@0401	For	320x240	AVI
UCHAR L1_PBOneVideoFrame(ULONG	AVIIdxAddr,	USHORT fHandle,	USHORT frameNo,	UCHAR  VLCFlip)	USING_0
	{
		  ULONG tmp0;
		  USHORT tmp1;
		  ULONG  SecAddr;
		  ULONG  AviSize;
		  ULONG  AviAddr;
		  ULONG  PBVideoAddr;
		  ULONG  SecCnt;
	
	
	
	
	
		  PBVideoAddr = K_SDRAM_AviPbVideoBufAddr + 256 + K_SDRAM_ImagePlaybackDisplayBufSize;

	
		  AviAddr = AVIReadDword(AVIIdxAddr+(ULONG)frameNo*8+4);
		  AviSize = AVIReadDword(AVIIdxAddr+(ULONG)frameNo*8+6);
	
		  AviAddr = AviAddr+260+508;
		  SecAddr = (ULONG)(AviAddr>>9);
		  tmp1 = AviAddr % 512;
		  tmp0 = PBVideoAddr;
		  if(tmp1 != 0)
		  {
			  tmp0 = tmp0 - (ULONG)(tmp1/2);
			  AviSize = AviSize + (ULONG)tmp1;
		  }
	
		  SecCnt  = AviSize>>9;
		  if((AviSize%512)!= 0)
						SecCnt++;
	
		  //Prepare the VLC stream data
		  M_Card_File_Read(fHandle, K_DOS_DstDram, SecCnt*512, tmp0, (ULONG)(SecAddr<<9));
	
	
		  //patch3.2@yichang@0401 For 320x240 AVI
	//herb for avi bug @03/04/16 start
		  if(VLCFlip == 0)	//YUV420, JFIF-compatible
			  L2_DeCompress(PBVideoAddr, G_AVIWidth, G_AVIHeight, K_SDRAM_ImagePlaybackGeneralBufAddr+K_SDRAM_ImagePlaybackGeneralBufSize/*K_SDRAM_AviPbBufAddrA	+ K_SDRAM_ImagePlaybackDisplayBufSize*/, 0x00, 0x05, 0x00);
		  else
			  L2_DeCompress(PBVideoAddr, G_AVIWidth, G_AVIHeight, K_SDRAM_ImagePlaybackGeneralBufAddr+K_SDRAM_ImagePlaybackGeneralBufSize/*K_SDRAM_AviPbBufAddrB	+ K_SDRAM_ImagePlaybackDisplayBufSize*/, 0x00, 0x05, 0x00);
	
	
	
		  //patch3.2@yichang@0401 For 320x240 AVI
		  if(VLCFlip == 0)
			  L2_TransYUV420toYUV422(K_SDRAM_ImagePlaybackGeneralBufAddr+K_SDRAM_ImagePlaybackGeneralBufSize/*K_SDRAM_AviPbBufAddrA + K_SDRAM_ImagePlaybackDisplayBufSize*/, G_AVIWidth, G_AVIHeight);
		  else
			  L2_TransYUV420toYUV422(K_SDRAM_ImagePlaybackGeneralBufAddr+K_SDRAM_ImagePlaybackGeneralBufSize/*K_SDRAM_AviPbBufAddrB + K_SDRAM_ImagePlaybackDisplayBufSize*/, G_AVIWidth, G_AVIHeight);
	//herb for avi bug @03/04/16 end
    //change the display index (wait until TVvsync. low)
//		  	  UI_PrintOSDString("4", 2, 2,2);//wendy@2004/8/31

//		  while((XBYTE[0x20b3]&0X20)==0X20);//wendy@2004/8/31
	
//		  	  UI_PrintOSDString("5", 2, 2,2);//wendy@2004/8/31
	
		  return L1K_SUCCESS;
	
	}

//patch5.0@richie@sdram	mapping	end

//-----------------------------------------------------------------------------
//L1_PBAudioChunck()
//-----------------------------------------------------------------------------
UCHAR L1_PBAudioChunck(ULONG  AVIIdxAddr,ULONG audioBufferAddr,	USHORT fHandle,	USHORT AudioIdx) USING_0
{

	 ULONG	SecAddr;
	 ULONG	SecCnt;
	 ULONG	AviSize;
	 ULONG	AviAddr;
	 ULONG	pbAudioChunkAddr;
	 USHORT	tmp1;
//patch5.0@richie@sdram	mapping	begin
	 pbAudioChunkAddr =	 K_SDRAM_AviPbAudioChunkBufAddr;
//patch5.0@richie@sdram	mapping	end
	 AviAddr = AVIReadDword(AVIIdxAddr+(ULONG)AudioIdx*8+4);
	 AviSize = AVIReadDword(AVIIdxAddr+(ULONG)AudioIdx*8+6);

	 AviAddr = AviAddr+8+508;
	 SecAddr = (ULONG)(AviAddr>>9);
	 tmp1 =	AviAddr%512;

	 if(tmp1 !=	0)
	 {
		AviSize	= AviSize +	(ULONG)tmp1;
	 }

	 SecCnt	 = AviSize>>9;
	 if((AviSize%512)!=	0)
		  SecCnt++;

	 M_Card_File_Read(fHandle, K_DOS_DstDram, SecCnt*512, pbAudioChunkAddr,	(ULONG)(SecAddr<<9));
	 L2_SetSRAMDMA(0x0C00);
	 L2_SetDRAMDMA(pbAudioChunkAddr+tmp1/2);
	 L2_DoDMA(0,1,SecCnt*512,0,0);

	 L2_SetSRAMDMA(0x0C00);
	 L2_SetDRAMDMA(audioBufferAddr);
	 L2_SetDRAMAudDMACnt(1);

	 L2_DoDMA(1,0,512,0,0);
	 L2_SetDRAMAudDMACnt(0);

	 return	L1K_SUCCESS;
}


//-----------------------------------------------------------------------------
//L1_ReadAVIIdx()
//-----------------------------------------------------------------------------
UCHAR L1_ReadAVIIdx(ULONG  AVIIdxRamAddr, ULONG	AVIIdxAddr,	USHORT fHandle,PULONG ChunkCnt,	UCHAR onlyFirst) USING_0
{

	ULONG  tmp0;
	USHORT tmp1;
	UCHAR  tmp2;
	UCHAR  tmp3;
	ULONG  backAddr;
	ULONG  FilePos;
	ULONG  SecAddr;
	ULONG  Remainder;
	ULONG  SecCnt;
	//patch4.5@cytsai@AVI idx1 error begin
	ULONG readSize;
	//patch4.5@cytsai@AVI idx1 error end
	//backAddr = K_SDRAM_CaptureFragmentBufAddr;
	//yichang@0515
//patch5.0@richie@sdram	mapping	begin
	if (onlyFirst)
	{
		backAddr = K_SDRAM_AviPbAudioChunkBufAddr +	K_SDRAM_ImagePlaybackDisplayBufSize;
	}
	else
	{
		backAddr = K_SDRAM_AviPbAudioChunkBufAddr;
	}
//patch5.0@richie@sdram	mapping	end

	SecAddr	= (ULONG)(AVIIdxAddr>>9);
	tmp1 = AVIIdxAddr%512;


	FilePos	= SecAddr *	512;

	//patch4.5@cytsai@AVI idx1 error begin
	if ((G_DOS_FileSizeKeep	- FilePos) < 1024)
		readSize = 512;
	else
		readSize = 1024;
		//patch4.4.1@yichang@fix a bug of AVI playback begin
		//M_Card_File_Read(fHandle,	K_DOS_DstDram, 512,	backAddr, FilePos);
		//M_Card_File_Read(fHandle,	K_DOS_DstDram, 1024, backAddr, FilePos);
	M_Card_File_Read(fHandle, K_DOS_DstDram, readSize, backAddr, FilePos);
		//patch4.4.1@yichang@fix a bug of AVI playback end
	//patch4.5@cytsai@AVI idx1 error end

	L2_DRAMSetStartAddr(backAddr + tmp1/2 +	2,K_SDRAM_Prefetch);
	L2_DRAMReadWord(&tmp2,&tmp3); //read chunck	size
	tmp0 = (ULONG)tmp2 | (ULONG)tmp3<<8;

	L2_DRAMSetStartAddr(backAddr + tmp1/2 +	3,K_SDRAM_Prefetch);
	L2_DRAMReadWord(&tmp2,&tmp3); //read chunck	size
	tmp0 = tmp0	| (ULONG)tmp2<<16 |	(ULONG)tmp3<<24;

	*ChunkCnt =	tmp0 >>	4;
	tmp0 = tmp0	+ 8;

	//patch4.4@yichang@0624	to avoid memory	full, begin
	if((*ChunkCnt) > K_MAX_AVI_CHUNCKS)
	{
			*ChunkCnt =	0;
			return L1K_ERROR_GENERAL;
	}

	//patch4.4@yichang@0624	to avoid memory	full, end
	Remainder =	512-tmp1;
	tmp0 = tmp0	- Remainder;
	SecCnt = tmp0/512;

	//Joe@2003.2.26 13:24 mask begin
	SecCnt++;
	//Joe@2003.2.26 13:24 mask end

	if((tmp0%512) != 0)
			   SecCnt++;

	//patch4.5@cytsai@AVI idx1 error begin
		//patch4.4@yichang@read	2K data	for	AVI	preview	begin
		if(onlyFirst)
	{
		if ((G_DOS_FileSizeKeep	- FilePos) < 1024)
			SecCnt = 1;
		else
			SecCnt = 2;
			}
	//patch4.4@yichang@read	2K data	for	AVI	preview	end
	//patch4.5@cytsai@AVI idx1 error end
	M_Card_File_Read(fHandle, K_DOS_DstDram, SecCnt*512, AVIIdxRamAddr,	FilePos);


	return L1K_SUCCESS;

}


//-----------------------------------------------------------------------------
//SearchAVIIndex
//-----------------------------------------------------------------------------
USHORT SearchAVIIndex(ULONG	 AVIIdxRamAddr,	USHORT defaultIdx, USHORT maxIdx, UCHAR	type) USING_0
{
  USHORT i;
  UCHAR	tmp2, tmp3;
  //version4.0@yichang@0513	replace	"i <= maxIdx" to "i	< maxIdx"
  for(i	= (defaultIdx+1) ; i < maxIdx; i++)
  {

	 L2_DRAMSetStartAddr(AVIIdxRamAddr+(ULONG)i*8, K_SDRAM_Prefetch);
	 L2_DRAMReadWord(&tmp2,&tmp3);

	 if(type ==	0)
	 {
		  if(tmp2==0x30	&& tmp3==0x30) //00dc
			   return i;
	 }
	 else
	 {
		  if(tmp2==0x30	&& tmp3==0x31) //01wb
			   return i;
	 }
  }

  return 0;
}




//-----------------------------------------------------------------------------
//L1_PBVideoEx
//-----------------------------------------------------------------------------
//patch3.2@yichang@0401	AVI	playback on	demo kit (re-write)
//patch3.2@ada@0401	For	Multi-Frame	Play Back

UCHAR L1_PBVideoEx(USHORT ID) USING_0
{
  USHORT i;
  ULONG	 AVIIdxAddr;
  ULONG	 ChunkCnt;
  UCHAR	 QTable[128];
  USHORT tmp1;
  //ada@0401
  USHORT startCluster;
  ULONG	 PBAudioChunkAddr;
  ULONG	 AVIIdxRamAddr;
  BYTE	 name[12];
  UCHAR	 sts ;
  USHORT fHandle;
  ULONG	 avifileSize;

⌨️ 快捷键说明

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