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

📄 avi_header.c

📁 凌阳SPCE3200多媒体开发板自带源程序。共安排了32个子目录
💻 C
字号:
#define HERE_NEED_AVI_HEADER_DEFINE
#include ".\Function\VideoCodec\AVI\avi_header.h"
#include ".\Function\VideoCodec\HW\mp4_DecodeEncodeAPI.h"
#include ".\System\SystemHeader.h"


//add by ww
unsigned int vop_address_array[AVI_TOTAL_FRAME];
unsigned int vop_length_array[AVI_TOTAL_FRAME];
unsigned int vop_address_index;
unsigned int avi_file_buffer_safe_flag;
unsigned int a;
unsigned int address_ptr=AVI_FILE_BUFFER_START_ADDRESS;
unsigned int avi_file_end_ptr;
volatile unsigned int MP4_Ddecode_Flag=0;

unsigned int uiABuffer;
unsigned int uiChangeBufferOK=CHANGE_OK;
unsigned int vop_address_array_b[AVI_TOTAL_FRAME];
unsigned int vop_length_array_b[AVI_TOTAL_FRAME];
unsigned int vop_address_index_b;
unsigned int avi_file_buffer_safe_flag_b;
unsigned int b;
unsigned int address_ptr_b=AVI_FILE_BUFFER_START_ADDRESS_B;
unsigned int avi_file_end_ptr_b;
unsigned int ABufferReady=0,BBufferReady=0;
//unsigned int MP4_EOF=0;
unsigned int MOVI_Sizes_Addr;
unsigned int TotalFrameNum=0;

unsigned int vop_address_array_for_file[TOTAL_FRAME_FOR_ONE_FILE];
unsigned int vop_length_array_for_file[TOTAL_FRAME_FOR_ONE_FILE];
unsigned int address_ptr_for_file;
unsigned int address_ptr_A=0,address_ptr_B=0;
unsigned int CurrentFilePtr;

#ifdef H263_CODEC
unsigned int EvWidth=H263_WIDTH,EvHigh=H263_HEIGHT;
unsigned int DvWidth=H263_WIDTH,DvHigh=H263_HEIGHT;
#else
unsigned int EvWidth=MP4_WIDTH,EvHigh=MP4_HEIGHT;
unsigned int DvWidth=MP4_WIDTH,DvHigh=MP4_HEIGHT;
#endif


#ifdef DECODER_WORK

unsigned int vop_address_array_c[AVI_TOTAL_FRAME];
unsigned int vop_length_array_c[AVI_TOTAL_FRAME];
unsigned int vop_address_index_c;
unsigned int avi_file_buffer_safe_flag_c;
unsigned int c;
unsigned int address_ptr_c=AVI_FILE_BUFFER_START_ADDRESS_C;
unsigned int avi_file_end_ptr_c;

unsigned int uiCDuffer;
unsigned int uiChangeBufferOK_CD=CHANGE_OK;
unsigned int vop_address_array_d[AVI_TOTAL_FRAME];
unsigned int vop_length_array_d[AVI_TOTAL_FRAME];
unsigned int vop_address_index_d;
unsigned int avi_file_buffer_safe_flag_d;
unsigned int d;
unsigned int address_ptr_d=AVI_FILE_BUFFER_START_ADDRESS_D;
unsigned int avi_file_end_ptr_d;
unsigned int CBufferReady=0,DBufferReady=0;

unsigned int address_ptr_temp;

unsigned int vop_address_array_for_decode_video[TOTAL_FRAME_FOR_ONE_DECODE];
unsigned int vop_length_array_for_decode_video[TOTAL_FRAME_FOR_ONE_DECODE];

unsigned int TotalDecodeFrames;
unsigned int dvFrameNum=0;
unsigned int DecodeEnd=0;

#endif


//end



unsigned int StartAVI=0;

extern unsigned int MOVI_Sizes_Addr; 



unsigned char Key_Word[KEY_WORD_NUM][5] =
{
	{"00db"},
	{"00dc"},
	{"01wb"},
	{"JUNK"},
	{"idx1"},
	{"avih"},
	{0x00,0x00,0x01,0xB5,0x00}
};


unsigned int fill_avi_header(unsigned int address_ptr,unsigned int width,unsigned int height,unsigned int *MOVI_Sizes_Addr){
	unsigned char *avi_start_address=(unsigned char *)address_ptr;
	unsigned int i,j,k;
	unsigned char c,d;
	
	for(i=0;i<AVIHEADLEN1;i++){
		avi_start_address[i]=AVIHEAD1[i];
	}
	i=address_ptr+AVIHEADLEN1;
	
	j=fill_avi_junk(i,address_ptr,12,1);
	//j=i; //add by ww for test

if(width!=320){
	fill_4byte_number(address_ptr+IMAGE_WIDTH1_OFFSET,width);
	fill_4byte_number(address_ptr+IMAGE_WIDTH2_OFFSET,width);
	fill_2byte_number(address_ptr+IMAGE_RIGHT_OFFSET,width);
}
if(height!=240){
	fill_4byte_number(address_ptr+IMAGE_HEIGHT1_OFFSET,height);
	fill_4byte_number(address_ptr+IMAGE_HEIGHT2_OFFSET,height);
	fill_2byte_number(address_ptr+IMAGE_BOTTOM_OFFSET,height);
}
	avi_start_address=(unsigned char *)j;
	*MOVI_Sizes_Addr=j;  //add by ww
	for(i=0;i<AVIHEADLEN2;i++){
		avi_start_address[i]=AVIHEAD2[i];
	}
	 if((width!=320)||(height!=240)){
	 avi_start_address=(unsigned char *)(j+MP4_HEAD_IMAGE_WIDTH_HEIGHT_OFFSET);
	 k=width>>10;
	 c=(unsigned char)(k&0x00000007);
	 c=c+0x28;
	 avi_start_address[0]=c;
	 
	 k=width>>2;
	 c=(unsigned char)(k&0x000000ff);
	 avi_start_address[1]=c;
	 
	 k=width&0x00000003;
	 c=(unsigned char)(k);
	 c=c<<6;
	 c=c+0x20;//marker bit
	 k=height>>8;
	 d=(unsigned char)(k&0x0000001f);
	 c=c|d;
	 avi_start_address[2]=c;
	 
	 k=height&0x000000ff;
	 c=(unsigned char)(k);
	 avi_start_address[3]=c;
	 }
	 
	 
	i=j+AVIHEADLEN2;
	return i;
}
//////////////////////////////////////////////////////////////////////////////////////////
unsigned int add_chunk_00db(unsigned int address_ptr,unsigned int vop_address_index){
	
	unsigned int p_flag=vop_address_index%(P_FRAME_NUMBER+1);


	if(p_flag) 	fill_FCC(address_ptr,'0','0','d','b');  //original 00dc by ww for test
		else 	fill_FCC(address_ptr,'0','0','d','b');
    
	
	return (address_ptr+8);
}
//////////////////////////////////////////////////////////////////////////////////////////
void fill_chunk_size(unsigned int start_ptr,unsigned int offset,unsigned int size){
	unsigned int a=start_ptr+offset+4;
	fill_4byte_number(a,size);
}
//////////////////////////////////////////////////////////////////////////////////////////
unsigned int fill_avi_junk(unsigned int input_ptr,unsigned int base_ptr,unsigned int offset,int fill_0_flag){
	unsigned int address_ptr;
	unsigned char *ptr;
	unsigned int size,i,j;
	static first_time=0;
	
	
	j=input_ptr&0x00000001;
	address_ptr=input_ptr+j;
	
	
	ptr=(unsigned char *)address_ptr;
	size=address_ptr-base_ptr;
	i=size%SECTOR_BYTES;//sector align
	
	j=i+offset;
	if(j==SECTOR_BYTES) return address_ptr;
	j+=8;
	if(j>=SECTOR_BYTES) size=SECTOR_BYTES+SECTOR_BYTES-j;
	else 				size=SECTOR_BYTES-j;
	
	//size=SECTOR_BYTES-i-8-offset;
	
	i=address_ptr;
	fill_FCC(i,'J','U','N','K');
	i+=4;
	
	if(first_time==0)
	{
	  fill_4byte_number(i,size-4); //by ww for test
	}
	else
	{
	  fill_4byte_number(i,size); //by ww for test	
	}
	
	if(fill_0_flag) i=0x00;  
	else            i=size;
	
	for(;i<size;i++){
		ptr[i+8]=0xFF; //original 0x00		
	}
	
	if(first_time==0)
	{
	  first_time=1;	
	  return (address_ptr+4+size);
	}
	else
	{
	  return (address_ptr+8+size); //original 8
	}
	
}
//////////////////////////////////////////////////////////////////////////////////////////
unsigned int fill_avi_idx1(unsigned int address_ptr,unsigned int *vop_address_array,unsigned int *vop_length_array,unsigned int vop_address_index){
	unsigned int i,j,k;
	unsigned int p_flag;

	k=address_ptr;
	fill_FCC(k,'i','d','x','1');
	j=vop_address_index*16;
	k+=4;
	fill_4byte_number(k,j);
	k+=4;
	for(i=0;i<vop_address_index;i++){
		p_flag=i%(P_FRAME_NUMBER+1);
		//dwckid
		//dwFlags
		if(p_flag) {
			fill_FCC(k,'0','0','d','c');
			k+=4;
			fill_4byte_number(k,0);
		}
		else {
			fill_FCC(k,'0','0','d','b');
			k+=4;
			fill_4byte_number(k,0x10);
		}
		k+=4;
		
		
/* 	//dwChukOffset
	j=vop_address_array[i];
	fill_4byte_number(k,j);
	k+=4;
	//dwChunkLength
	j=vop_length_array[i];
	fill_4byte_number(k,j);
	k+=4; */  //marked by ww
	
	//dwChukOffset
	j=vop_address_array[i]-vop_address_array[0]+4;
	fill_4byte_number(k,j);
	k+=4;
	//dwChunkLength
	j=vop_length_array[i];
	fill_4byte_number(k,j);
	k+=4;
		
	}
	return k;
}
//////////////////////////////////////////////////////////////////////////////////////////
void fill_FCC(unsigned int start_address,char a,char b,char c,char d){
	unsigned char *ptr=(unsigned char *)start_address;
	ptr[0]=a;
	ptr[1]=b;
	ptr[2]=c;
	ptr[3]=d;
	//ptr[0]=0x69_64_78_31;//idx1
	//ptr[0]=0x30_30_64_64;//00dc
	//ptr[0]=0x30_30_64_62;//00db
	//ptr[0]=0x4a_55_4e_4b;//JUNK

}
//////////////////////////////////////////////////////////////////////////////////////////
void fill_4byte_number(unsigned int start_address,unsigned int number){
	unsigned char *ptr=(unsigned char *)start_address;
	unsigned int i;
	unsigned char a;
	i=number;
	a=(unsigned char)i;
	ptr[0]=a;
	a=(unsigned char)(i>>8);
	ptr[1]=a;
	a=(unsigned char)(i>>16);
	ptr[2]=a;
	a=(unsigned char)(i>>24);
	ptr[3]=a;	
}
//////////////////////////////////////////////////////////////////////////////////////////
void fill_2byte_number(unsigned int start_address,unsigned int number){
	unsigned char *ptr=(unsigned char *)start_address;
	unsigned int i;
	unsigned char a;
	i=number;
	a=(unsigned char)i;
	ptr[0]=a;
	a=(unsigned char)(i>>8);
	ptr[1]=a;
}
//////////////////////////////////////////////////////////////////////////////////////////
unsigned int get_MP4_HEADER_LENGTH(){
	return MP4_HEADER_LENGTH;
}
//////////////////////////////////////////////////////////////////////////////////////////
extern void fill_avi_frame_num(unsigned int start_address,unsigned int framenum){
	
fill_4byte_number(start_address+TOTAL_FRAME1_OFFSET,framenum);
fill_4byte_number(start_address+TOTAL_FRAME2_OFFSET,framenum);
}
//////////////////////////////////////////////////////////////////////////////////////////
extern void fill_movi_size(unsigned int first_frame_address,unsigned int movi_size){
	
 fill_4byte_number(first_frame_address-8,movi_size);
 
}
//////////////////////////////////////////////////////////////////////////////////////////
void fill_avi_file_size(unsigned int start_address,unsigned int file_size){
	
   fill_4byte_number(start_address+4,file_size-8);
}
//////////////////////////////////////////////////////////////////////////////////////////
unsigned int avi_frame_encode(unsigned int address_ptr,unsigned int base_ptr,unsigned int *vop_address_array,unsigned int *vop_length_array,unsigned int vop_address_index,unsigned int BufferAB){
	unsigned int a;
	

	
	    if(vop_address_index==0)
	    {
	    	   
	    		if(BufferAB == A_BUFFER)
		        {
			      address_ptr_for_file += address_ptr_B - AVI_FILE_BUFFER_START_ADDRESS_B;			   
		        }
		        else
		        {
			      address_ptr_for_file += address_ptr_A - AVI_FILE_BUFFER_START_ADDRESS;	       
		        }	      	
		        
		        address_ptr_A = AVI_FILE_BUFFER_START_ADDRESS;
	    	    address_ptr_B = AVI_FILE_BUFFER_START_ADDRESS_B;  
	    	    
	    	    	    	    
	    	    if(StartAVI==0)
	    	    {
	    	    	//
	    	    }
	    	    else
	    	    {
	    	    	vop_address_array_for_file[TotalFrameNum]= address_ptr_for_file; 
	    	        address_ptr=add_chunk_00db(address_ptr,vop_address_index);	
	    	    }
	    	 	
	    }
		
		if(vop_address_index>0){
			vop_address_array[vop_address_index]=address_ptr;
			if(BufferAB == A_BUFFER)
			{
			   vop_address_array_for_file[TotalFrameNum]= address_ptr_for_file + (address_ptr - AVI_FILE_BUFFER_START_ADDRESS);
			}
			else
			{
			   vop_address_array_for_file[TotalFrameNum]= address_ptr_for_file + (address_ptr - AVI_FILE_BUFFER_START_ADDRESS_B);	
			}
			address_ptr=add_chunk_00db(address_ptr,vop_address_index);
		}
		#ifdef NO_MP4_ENABLE
		a=0x18e8;
		#else
		a=mp4_compress_frame(address_ptr,vop_address_index);
		#endif
		
		

		//add by ww
		if(StartAVI==0)
		{		
			//fill_4byte_number(MOVI_Sizes_Addr+0x10,a+44); //add sizes 44 is VOL sizes
			fill_4byte_number(MOVI_Sizes_Addr+0x10,a+44); //add sizes 44 is VOL sizes //by ww for test
		}
		else
		{		  
		    //fill_4byte_number(address_ptr-4,a); //add sizes		  
		    fill_4byte_number(address_ptr-4,a); //add sizes		//by ww for test
		}
		//end

		
		//print3("mp4 vlc size: ",0,a);
		//print3("mp4 start address: ",0,address_ptr);
	
	    if((a%2)==1)
		{
			address_ptr=address_ptr+a+1;
		}
		else
		{
			address_ptr=address_ptr+a;
		}

	
		if(StartAVI==0)
		{
		  vop_length_array[vop_address_index]=a+44;
		  vop_length_array_for_file[TotalFrameNum]=a+44; 
		}
		else
		{
		  vop_length_array[vop_address_index]=a;
		  vop_length_array_for_file[TotalFrameNum]=a;
		}
		
		vop_address_index++;
		
       //marked by ww for test 
       // address_ptr=fill_avi_junk(address_ptr,base_ptr,0,1); 
				
			 
		if(BufferAB == A_BUFFER)
		{
			   address_ptr_A = address_ptr;
		}
		else
		{
			   address_ptr_B = address_ptr;		       
		}	                         
			                         
		
		StartAVI=1;
		
		return address_ptr;
}

//add by ww
unsigned int fill_avi_idx1_to_file(int fp,unsigned int address_ptr,unsigned int *vop_address_array,unsigned int *vop_length_array,unsigned int vop_address_index){
	unsigned int i,j,k;
	unsigned int p_flag;
	 S32	status; //test

    //status = write(gl_fp, AVI_FILE_BUFFER_START_ADDRESS,a);


	k=address_ptr;
	//fill_FCC(k,'i','d','x','1');
	status = write(fp,"idx1",4);
	
	j=vop_address_index*16;
	k+=4;
	//fill_4byte_number(k,j);
//	j=REVERSE(j);
	status = write(fp,(void *) &j,4);
	
	k+=4;
	for(i=0;i<vop_address_index;i++){
		p_flag=i%(P_FRAME_NUMBER+1);
		//dwckid
		//dwFlags
		if(p_flag) {
			//fill_FCC(k,'0','0','d','c');
			status = write(fp,"00db",4);  //original 00dc by ww for test
			k+=4;
			//fill_4byte_number(k,0);
			j=0x10;  //original 0 modified by ww
			status = write(fp,(void *) &j,4);
		}
		else {
			//fill_FCC(k,'0','0','d','b');
			status = write(fp,"00db",4);  
			k+=4;
			//fill_4byte_number(k,0x10);
			j=0x10;
		//	j=REVERSE(j);
			status = write(fp,(void *) &j,4);
		}
		k+=4;
		
		
/* 	//dwChukOffset
	j=vop_address_array[i];
	fill_4byte_number(k,j);
	k+=4;
	//dwChunkLength
	j=vop_length_array[i];
	fill_4byte_number(k,j);
	k+=4; */  //marked by ww
	
	//dwChukOffset
	j=vop_address_array[i]-vop_address_array[0]+4;
	//fill_4byte_number(k,j);
//	j=REVERSE(j);
    status = write(fp,(void *) &j,4);
	
	k+=4;
	//dwChunkLength
	j=vop_length_array[i];
	//fill_4byte_number(k,j);
//	j=REVERSE(j);
    status = write(fp,(void *) &j,4);
	
	
	k+=4;
		
	}
	return k;
}
//end


//////////////////////////////////////////////////////////////////////////////////////////
#undef HERE_NEED_AVI_HEADER_DEFINE

⌨️ 快捷键说明

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