📄 avi_header.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 + -