📄 main.c
字号:
/*!
************************************************************************
*
*
* The library contain AVC H.264 baseline codec,which can process video
* less than 12 minutes.
*
* (C) Copyright 2007 by Tonald DL
* All rights reserved
*
* Date: 2007-08-11
* Version: 070811A
* Contact Personal: Tonald DL
* Email: dhcodec@hotmail.com
*
************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include ".\Project\S264_DSPcfg.h"
#include "..\common\S264_SYNTAX.h"
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (S264PCICleanUp, "S264CODE_REF");
void S264PCICleanUp(void)
{
uint *pAddr;
S264_PCI_SYNTAX* pS264_PCI_SYNTAX=(S264_PCI_SYNTAX*)S264_PCI_SYNTAX_ADDR_BASE;
int i;
pAddr=(uint*)S264_PCI_SYNTAX_ADDR_BASE;
for(i=0;i<S264_PCI_SYNTAX_WORD_LEN;i++)
pAddr[i]=0;
pAddr=(uint*)S264_PCI_DATA_ADDR_BASE;
for(i=0;i<S264_PCI_DATA_WORD_LEN;i++)
pAddr[i]=0;
pS264_PCI_SYNTAX->TokenOwner=S264_PCI_OWNER_PC;
return;
}
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (WaitToken_S264, "S264CODE_REF");
int WaitToken_S264(void)
{
S264_PCI_SYNTAX* pS264_PCI_SYNTAX=(S264_PCI_SYNTAX*)S264_PCI_SYNTAX_ADDR_BASE;
int i;
i=0;
do{
i++;
}while(pS264_PCI_SYNTAX->TokenOwner!=S264_PCI_OWNER_DM6437);
return pS264_PCI_SYNTAX->OpCode;
}
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (PassToken_S264, "S264CODE_REF");
void PassToken_S264(int _Opcode)
{
S264_PCI_SYNTAX* pS264_PCI_SYNTAX=(S264_PCI_SYNTAX*)S264_PCI_SYNTAX_ADDR_BASE;
pS264_PCI_SYNTAX->OpCode=_Opcode;
pS264_PCI_SYNTAX->TokenOwner=S264_PCI_OWNER_PC;
return;
}
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (ReadCMD_S264, "S264CODE_REF");
int ReadCMD_S264(void *pAddr)
{
S264_PCI_SYNTAX* pS264_PCI_SYNTAX;
void *pS264_PCI_DATA_ADDR_BASE;
pS264_PCI_SYNTAX=(S264_PCI_SYNTAX*)S264_PCI_SYNTAX_ADDR_BASE;
pS264_PCI_DATA_ADDR_BASE=(void*)S264_PCI_DATA_ADDR_BASE;
memcpy(pAddr,pS264_PCI_DATA_ADDR_BASE,(pS264_PCI_SYNTAX->BufWordLen<<2));
return pS264_PCI_SYNTAX->BufWordLen;
}
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (WriteCMD_S264, "S264CODE_REF");
void WriteCMD_S264(void *pAddr,int _WordLen)
{
S264_PCI_SYNTAX* pS264_PCI_SYNTAX=(S264_PCI_SYNTAX*)S264_PCI_SYNTAX_ADDR_BASE;
void *pS264_PCI_DATA_ADDR_BASE=(void*)S264_PCI_DATA_ADDR_BASE;
pS264_PCI_SYNTAX->BufWordLen=_WordLen;
memcpy(pS264_PCI_DATA_ADDR_BASE,pAddr,(_WordLen<<2));
return;
}
/*!
************************************************************************
*
*
*
************************************************************************
*/
#pragma CODE_SECTION (main, "S264CODE_REF");
void main( void )
{
ENCFRAME_PROP ENCINPUT;
uint *pAddr_int;
int OperationCode,wordlen,wordlenout;
uint TimeA_H,TimeA_L,TimeB_H,TimeB_L,ENCMIPS;
unsigned char *psrc=(unsigned char*)0x83000000;
unsigned char *pbits=(unsigned char*)0x83800000;
int i;
//Stardard Encoder Parameter settings.
//
// ENCINPUT.VideoQuality=780;
// ENCINPUT.IntraPeriod=90;
// ENCINPUT.ImageWidth=352;
// ENCINPUT.ImageHeight=288;
// ENCINPUT.FrameType=NEW_SEQ;
//
S264PCICleanUp();
while(1)
{
OperationCode=WaitToken_S264();
switch(OperationCode)
{
case S264_PCI_OP_ENC_PARA:
ReadCMD_S264(&ENCINPUT);
PassToken_S264(S264_PCI_OP_ENC_ACK);
break;
case S264_PCI_OP_ENC_YUV420_IN_START:
PassToken_S264(S264_PCI_OP_ENC_ACK);
pAddr_int=(uint*)psrc;
do{
OperationCode=WaitToken_S264();
wordlen=ReadCMD_S264(pAddr_int);
pAddr_int+=wordlen;
PassToken_S264(S264_PCI_OP_ENC_ACK);
}while(OperationCode!=S264_PCI_OP_ENC_YUV420_IN_END);
TIMER_READ(&TimeA_L,&TimeA_H);
DHENC_FRAME(psrc,pbits,&ENCINPUT);
TIMER_READ(&TimeB_L,&TimeB_H);
ENCMIPS=((TimeB_H<<16)+(TimeB_L>>16))-((TimeA_H<<16)+(TimeA_L>>16));
break;
case S264_PCI_OP_ENC_YUV420_OUT_START:
pAddr_int=(uint*)psrc;
wordlen=((ENCINPUT.ImageHeight*ENCINPUT.ImageWidth*3)>>3);
do{
if(wordlen>S264_PCI_DATA_WORD_LEN)
wordlenout=S264_PCI_DATA_WORD_LEN;
else
wordlenout=wordlen;
WaitToken_S264();
WriteCMD_S264(pAddr_int,wordlenout);
pAddr_int+=wordlenout;
wordlen-=wordlenout;
PassToken_S264(S264_PCI_OP_ENC_ACK);
}while(wordlen>0);
WaitToken_S264();
WriteCMD_S264(NULL,0);
PassToken_S264(S264_PCI_OP_ENC_YUV420_OUT_END);
WaitToken_S264();
PassToken_S264(S264_PCI_OP_ENC_ACK);
break;
case S264_PCI_OP_ENC_BITS_OUT_START:
pAddr_int=(uint*)&ENCINPUT.CodeLength;
wordlen=1;
WaitToken_S264();
WriteCMD_S264(pAddr_int,wordlen);
PassToken_S264(S264_PCI_OP_ENC_ACK);
pAddr_int=(uint*)pbits;
wordlen=(ENCINPUT.CodeLength>>2)+2;
do{
if(wordlen>S264_PCI_DATA_WORD_LEN)
wordlenout=S264_PCI_DATA_WORD_LEN;
else
wordlenout=wordlen;
WaitToken_S264();
WriteCMD_S264(pAddr_int,wordlenout);
pAddr_int+=wordlenout;
wordlen-=wordlenout;
PassToken_S264(S264_PCI_OP_ENC_ACK);
}while(wordlen>0);
WaitToken_S264();
WriteCMD_S264(NULL,0);
PassToken_S264(S264_PCI_OP_ENC_BITS_OUT_END);
WaitToken_S264();
PassToken_S264(S264_PCI_OP_ENC_ACK);
break;
case S264_PCI_OP_ENC_MIPS_OUT:
WaitToken_S264();
pAddr_int=&ENCMIPS;
wordlen=1;
WriteCMD_S264(pAddr_int,wordlen);
PassToken_S264(S264_PCI_OP_ENC_ACK);
break;
case S264_PCI_OP_ENC_CLEANUP:
S264PCICleanUp();
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -