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

📄 appmain.c

📁 DM642平台上的H.264源码(可实时运行)
💻 C
字号:
 /*
 *  Copyright 2002 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/*
 *  ======== appMain.c ========
 */

// DSP/BIOS includes
#include <std.h>
#include <stdio.h>

//CSL
#include <csl.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include <csl_irq.h>

// RF5 library includes
#include <utl.h>

// App includes
#include "appResources.h"
#include "appThreads.h"
#include "appIO.h"
#include "h264t.h"
#include "appMain.h"
#include "thrAudioproc.h"

#define HPIC   *((volatile uint32_t*)0x01880000)


/*
 *  ======== main ========
 *
 *  Main application function.
 */

#pragma DATA_SECTION(byteBuf,  ".SHAREBYTE");
#pragma DATA_SECTION(enc_Buf,  ".EXTPROCBUFF");
#pragma DATA_SECTION(dec_Buf,  ".EXTPROCBUFF");

#pragma DATA_ALIGN(byteBuf,       MEMALIGN);
#pragma DATA_ALIGN(enc_Buf,       MEMALIGN);
#pragma DATA_ALIGN(dec_Buf,       MEMALIGN);

#pragma DATA_SECTION(dec_tag,   ".INTPROCBUFF");
#pragma DATA_SECTION(write_tag, ".INTPROCBUFF");
#pragma DATA_SECTION(read_tag,  ".INTPROCBUFF");

H264_param_t param;
H264_t *t_enc, *t_dec;
//x int32_t len;
//x int32_t size;
//int32_t tag = 0;
int32_t write_tag=0, read_tag =0;
//int32_t enc_tag[2]={0,0};
int32_t dec_tag[2]={0,0};
//char enc_Buf[2][PROCF_SIZE_IN_PIXELS];
//char dec_Buf[2][PROCF_SIZE_IN_PIXELS];
uint8_t enc_Buf[2][DATALEN];
uint8_t dec_Buf[2][DATALEN];

//int32_t is_count=0;
//int32_t time_count[5]={0,0,0,0,0};

Void HWI_Host_to_DSP();
static uint8_t byteBuf[2*DATALEN];

uint8_t *pputdata,*pgetdata,*data_tag1,*data_tag2;
//int Bit_Rate;
//extern uint8_t nframe;
//uint32_t *p_nframe;

/*********Audio**********/
unsigned short *pAudioEncBuf;//编码完成区指针
unsigned short *pAudioDecBuf;//解码空闲区指针
AUDIOBUFFER *pstrAudioEnc;
//len 0x150
int codNum;//  编码计数,数据搬移后置0

Void main() 
{

	CACHE_clean(CACHE_L2ALL, 0, 0);
	CACHE_setL2Mode(CACHE_128KCACHE);
	CACHE_enableCaching(CACHE_EMIFA_CE00);
	CACHE_enableCaching(CACHE_EMIFA_CE01);
	CACHE_setPriL2Req(CACHE_L2PRIURG);
 /* initialize I/O */
   	appIOInit();
    appThreadInit();
     /* prime I/O */
   	appIOPrime();
 
//  IRQ_reset(IRQ_EVT_EDMAINT);
    IRQ_reset(IRQ_EVT_DSPINT);
    
//	IRQ_enable(IRQ_EVT_EDMAINT);
  	IRQ_enable(IRQ_EVT_DSPINT);
  	
//	HPIC     = HPIC|0x00020002;   //清中断

	data_tag1 = byteBuf;
	data_tag2 = byteBuf+DATALEN;
	data_tag1[0]=data_tag1[1]=data_tag1[2]=data_tag1[3]=0;
	data_tag2[0]=data_tag2[1]=data_tag2[2]=data_tag2[3]=0;
    pputdata = byteBuf+4;
    pgetdata = byteBuf+DATALEN+4;    
    LIGHT  = 0x00;  //灭灯

//    printf("enc_Buf %08x,%08x\n",enc_Buf[0],enc_Buf[1]);
//    printf("dec_Buf %08x,%08x\n",dec_Buf[0],dec_Buf[1]);
	
    printf( "Application started\n" );
}

//static int g_i=0,g_j=0;

/*
Void HWI_DSP_to_Host()
{
	int32_t len_video,len_all,len_audio;
	//实际上 encbuf只要一个就可以了
	//加判断是否可以发中断 
	
	memcpy(&len_video,enc_Buf[0],4);
//v	memcpy(pputdata,enc_Buf[0],len+4);
//v	memset(pputdata+len+4,0,8);
	
	pstrAudioEnc = (AUDIOBUFFER*)pAudioEncBuf;
//x	printf("%d,%d\n",len_video,pstrAudioEnc->frameNum[0]);
	if(pstrAudioEnc->frameNum[0])
	{	//有数据
//old		memcpy(pputdata+4,pAudioEncBuf,0x150);	//audio
//olc		memcpy(pputdata+0x154,enc_Buf[0],len+4);//video
//old		pstrAudioEnc->frameNum[0] = 0;
		len_audio = 0x150;
		memcpy(pputdata+4,&len_audio,4);
		memcpy(pputdata+8,pAudioEncBuf,len_audio);	//audio
	}
	else
	{	//没有数据
		len_audio = 0;
		memcpy(pputdata+4,&len_audio,4);
//		memcpy(pputdata+4,pAudioEncBuf,len_audio);	//audio
	}
	memcpy(pputdata+8+len_audio,enc_Buf[0],len_video+4);//video
	codNum = 0;
	if(len_video<0 || len_video>=(0x10000-0x154)) len_video = 0;
	len_all = len_video + len_audio+8;
	memcpy(pputdata,&len_all,4);			//len
	//	printf("HWI_DSP_to_Host begin %d\n",len);
//x	printf("len_all=%d,len_aud=%d,len_vid=%d\n",len_all,len_audio,len_video);

	//清空缓冲区
    CACHE_wbL2(data_tag1,DATALEN,CACHE_WAIT);		
   	CACHE_clean(CACHE_L2,data_tag1,DATALEN); 
   	 
	if(len_video>0)
	{
		data_tag1[0] = data_tag1[1] = data_tag1[2] = 0;
		data_tag1[3] = 1;
	}
//printf("HWI_DSP_to_Host end\n");
}
*/
extern H264_t *t_enc, *t_dec;/*
Void HWI_Host_to_DSP()
{
	int32_t len;
	
  	LIGHT = 0x08;  //亮灯3

	memcpy(&len,data_tag1-4,4);
	
	CACHE_invL2(data_tag1-4,16,CACHE_WAIT);
   	CACHE_clean(CACHE_L2,data_tag1-4,16); 
	if(len)
	{
	    t_enc->frame_no = 0;
       	t_enc->param.bitrate = len;	
//		t_enc.frame_no = 0;
//		t_enc.param.bitrate = len;
		len = 0;
	}
	else
		return;

	HPIC = HPIC|0x00020002;          //clear int from Host
}

Void PRD_1ms()
{
	int32_t len_audio=0,len_video=0,len_all=0;

#if HAS_ENC&&HAS_DEC
//编码数据区有数据
//将其直接复制到解码数据区
	if(data_tag1[3]==1)
	{
		memcpy(&len_all,pputdata,4);
//		printf(" PRD_1ms %d  asdfasdf\n",len);
		memcpy(pgetdata,pputdata,len_all+4);
//		printf(" PRD_1ms %d  2asdfasdf\n",len);
		data_tag1[3] = 0;
		data_tag2[3] = 1;
		len_all = 1;
	}
	else
		return;
//	printf(" PRD_1ms %d\n",len);
		
#else
	memcpy(&len_all,data_tag2,4);
	
	CACHE_invL2(data_tag2,DATALEN,CACHE_WAIT);
   	CACHE_clean(CACHE_L2,data_tag2,DATALEN); 
		
#endif		
#if HAS_DEC
//	printf("PRD_1ms getdata %d\n",len);
	if(len_all==1)	
		len_all = 0;
	else	
		return;

	memcpy(&len_all,pgetdata,4); 		//len
	memcpy(&len_audio,pgetdata+4,4); 		//len
//	printf("len=%d\n",len_all);
	len_video = len_all - len_audio - 8;
//	printf("*** len_all=%d,len_aud=%d,len_vid=%d\n", len_all,len_audio,len_video);
	memcpy(pAudioDecBuf,pgetdata+8,len_audio);	//audio 
	if(len_video)
		memcpy(dec_Buf[write_tag],pgetdata+8+len_audio,len_video+4);//video

//v	memcpy(dec_Buf[write_tag],pgetdata,len+4);
//v	memset(dec_Buf[write_tag]+len+4,0,8);
//	printf("get datalen=%d ",len);
//	printf("%02x %02x %02x %02x\n",dec_Buf[write_tag][0],dec_Buf[write_tag][1],dec_Buf[write_tag][2],dec_Buf[write_tag][3]);
	
   	data_tag2[0]=data_tag2[1]=data_tag2[2]=data_tag2[3]=0;
   	
//   	CACHE_clean(CACHE_L2,data_tag2,16*1024);  
    CACHE_wbL2(data_tag2,DATALEN,CACHE_WAIT);		
   	CACHE_clean(CACHE_L2,data_tag2,DATALEN);  
   	
	dec_tag[write_tag] = 1;
//	printf("PRD_1ms dec_tag[%d]==%d\n",write_tag,dec_tag[write_tag]);
	write_tag = (write_tag+1)&1;
#endif
}
//#endif*/
Void param_control()
{
/*
	if(data_tag[1]==0)
	{
		Bit_Rate = 768000;
	}
	else Bit_Rate = data_tag[1];
*/
}

⌨️ 快捷键说明

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