📄 aviplay1.c
字号:
/********************************************************************************
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 + -