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

📄 main.c

📁 adi bf533视频编码程序
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <cdefBF533.h>

#include "ippVideoEncoderMPEG4.h"
#include "encodemain.h"
#include "global.h"
#include "enum.h"
#include "camera.h"
#include "delay.h"
#include "dsp_uart.h"
//#include "tss.h"	//for testing

#define BAUD_UART 		115200				//UART buadrate
#define REQUEST_RATE	115200					//rate control


extern void setup_sdram(void);

//extern unsigned int test_yuv_buffer(void);		//test two yuv buffer;
extern void encode_mpeg_init(void);				//initializing input video stream;

extern void rate_control(int bits_diff);		//implementing rate control;

extern int get_clk(int* pcclk, int* psclk);		//get system clock or core clock;

extern void mdma_getMB_refwin_init(void);

extern void PPI_STOP(void);
extern void ppi_dma_disable(void);
extern void uart_send(unsigned char *b, int len);
//extern void idct_int32_init(void);
   	 
int main(void)
{		
	
	int	i, j, k;
	int mycount;
//	unsigned int yuv_buffer;
	
//	unsigned int *temp1,*temp2;

	//rate control parameters;
	int bits_diff_total = 0;	
	int bits_diff = 0;
	int frames_in_10_secs = 250;
	
	//relate with the baudrate
	int div;
	int sclk;

	int tx_buffer_index = 0;					//encoded stream transfer buffer index;

#if		FILE_OUT_DEBUG

	FILE *outFile;								//for debugging
#endif


#if		LOOP_ENCODING

do{
	bits_diff_total = 0;
	bits_diff = 0;
	frames_in_10_secs = 250;
	tx_buffer_index = 0;
#endif

			
	setup_sdram();
		
	delay_init();
	
	delay(1000000);
			    	
	Reset_7180(); 
//	delay(100000);

	//configure UART baudrate;    	
	get_clk(0, &sclk); 
	div = sclk/(16*BAUD_UART);
	uart_init(div);	

#if UART_DEBUG
	{
	    char *b = "uart init ok\r\n";
		uart_send((unsigned char *)b, strlen(b));
	}
#endif
	
	//initializing mpeg4 encoder;            
//    if (mp4encInit(IMG_FORMAT_2CIF) != IPPVC_ERROR_NOERR)
//	{
//		printf("mp4encInit is failed:");
//		return -3;      
//	}

	mp4encInit(IMG_FORMAT_CIF);

#if		FILE_OUT_DEBUG

	outFile = fopen("F:\\test111.m4v", "wb");

	if (!outFile) 
	{
       	printf("Couldn't open output file '%s'\n", "F:\\test111.m4v");
        return 5;
 	} 	
#endif 
 
	EncodeVO_Header();
	EncodeVOL_Header();
	
	//global varibles initializing;	
	bypass_dist = 0;
//	lines_per_frame = 625;
	mdma_getMB_refwin_init();		//initiating restore MB, get MB, get refwin DMA.
	memset(mBuf656, 0, MBUF656_STEP*4);
	encode_mpeg_init();
			
//	idct_int32_init();
	
	//first, put stuffing data in tx buffer.
	do
	{
		while( cur_enc_buf_i == cur_dma_buf_i );

		EncodeFrame();
 	
		mycount = cBS.mPtr - cBS.mBuffer;
		for(k=0;k<mycount;k++)
		{
			tx_buffer[tx_buffer_index++]=cBS.mBuffer[k];
		}

 		cBS.mPtr = cBS.mBuffer;

		//////////////rate control codes, added by gary;///////////////
 		delay(bypass_dist*38000);
 		
    	bits_diff_total += (mycount << 3);
    	bits_diff += (mycount << 3);
	 	if((--frames_in_10_secs) == 0) {
	 	    bits_diff_total -= 10*REQUEST_RATE;
	 	    bits_diff -= 10*REQUEST_RATE;
	 	    if(bits_diff_total*bits_diff >= 0)
 		    	rate_control(bits_diff_total);
 		    	
 		    bits_diff = 0;
 		    frames_in_10_secs =10* (25+bypass_dist)/(bypass_dist+1);
 		}
 		 		
	}
#if UART_TRANSFER && (!UART_DEBUG)
	while(tx_buffer_index < 0x100000);			//1MB stuffing data;
#else
	while(tx_buffer_index < 0x100);	//64KB, test...
#endif


#if UART_TRANSFER
	// *******start UART DMA transfer****** //
	while((*pDMA7_IRQ_STATUS)&0x8 || (*pDMA7_IRQ_STATUS)&0x4);	
	UART_DMA_INI();
	uart_en();
	// ************************************ //
#endif


	while(VideoEncoderMPEG4_mFrameCount < 2500){
	    
		while(cur_enc_buf_i == cur_dma_buf_i );		

		EncodeFrame();

		mycount = cBS.mPtr - cBS.mBuffer;
		for(k=0;k<mycount;k++)
		{
			tx_buffer[tx_buffer_index++]=cBS.mBuffer[k];
			tx_buffer_index &= 0x1fffff;
		}

 		cBS.mPtr = cBS.mBuffer;
		//////////////rate control codes, added by gary;///////////////
 		delay(bypass_dist*38000);
 		
    	bits_diff_total += (mycount << 3);
    	bits_diff += (mycount << 3);
	 	if((--frames_in_10_secs) == 0) {
	 	    bits_diff_total -= 10*REQUEST_RATE;
	 	    bits_diff -= 10*REQUEST_RATE;
	 	    if(bits_diff_total*bits_diff >= 0)
 		    	rate_control(bits_diff_total);
 		    	
 		    bits_diff = 0;
 		    frames_in_10_secs =10* (25+bypass_dist)/(bypass_dist+1);
 		}
		/////////////////////////////////////////////////////////////// 		

	}

#if UART_TRANSFER
	
	// ======== dma stop ========== //
	{
	 	int tmp = (tx_buffer_index-1) >> 18;
	 	tmp ++;
	 	tmp <<= 18;
		memset(tx_buffer+tx_buffer_index, 0, tmp - tx_buffer_index);
		uart_dma_stop((tx_buffer_index-1) >> 18);
	}
#endif


	PPI_STOP();
	ppi_dma_disable();


#if FILE_OUT_DEBUG
	
	fwrite(tx_buffer, 1, tx_buffer_index, outFile);
	fclose(outFile);
#endif


#if LOOP_ENCODING

}
while(1);

#endif

#if UART_TRANSFER
	while((*pDMA7_IRQ_STATUS)&0x0008);
#endif

 	return 0;
   	 
}

⌨️ 快捷键说明

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