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

📄 main.c

📁 This site include optimized H.264 baseline codec, SF IP Box Binary. PC version and TI DM6437 version
💻 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 + -