📄 jpg_header.c
字号:
if(index == 0)
{
cw[index] = 0;
if(pcount[0] == 1)
l_codeword = 1;
else
l_codeword=0;
}
else if(index <= last_valid)
{
if(0 == cs[index])
{
l_codeword= 0;
}
l_codeword = l_codeword << 1;
cw[index] = l_codeword;
l_codeword = l_codeword + pcount[index];
}
else
{
cw[index] = 0xffff;
}
}
}
/////////////////////////////////////////////////////////////////////////
void fill_huffman_reg(unsigned char *jpg_ptr)
{
unsigned int length,counter,i,index;
unsigned char word;
unsigned char *pointer;
unsigned char *temp_pointer;
unsigned int cw[16];
unsigned char cs[16];
unsigned char cv[256];
length=get_jpg_segment_length(jpg_ptr);
if(length == 0x1A2)
{
counter=3;
pointer=jpg_ptr+3;
for(index=0;index<4;index++)
{
for(i=0;i<16;i++)
{
cw[i]=0;
cs[i]=0;
}
for(i=0;i<256;i++)
{
cv[i]=0;
}
Get_Huffman_cs_cw(cs,cw,pointer);
word =*(pointer-1); // Get Huffman table type
temp_pointer = pointer + 16; // Shift to the starting point of DiffDC_length or <R,V_length>
set_Huff_sram_mode(8); // Set TSramMode =CPU R/W TSRAM Regs and JPEG Decoding
set_jpg_huffman_cw_reg(word,cw);
if(word==0x00)
{
length = 0x1c;
set_jpg_huffman_dcs_reg(0,cs);
for(i=0; i<16; i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_dcv_reg(0,cv);
}//YDC
else if(word==0x01)
{
length = 0x1c;
set_jpg_huffman_dcs_reg(1,cs);
for(i=0; i<16; i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_dcv_reg(1,cv);
}//CDC
else if(word==0x10)
{
length = 0xb2;
set_jpg_huffman_acs_reg(0,cs);
for(i=0; i<(0x40*3); i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_acv_sram(0,cv);
}//YAC
else if(word==0x11)
{
length = 0xb2;
set_jpg_huffman_acs_reg(1,cs);
for(i=0; i<(0x40*3); i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_acv_sram(1,cv);
}//CAC
pointer=pointer+(length+1);
counter=counter+(length+1);
}
}
else
{
counter=3;
pointer=jpg_ptr+3;
for(i=0;i<16;i++)
{
cw[i]=0;
cs[i]=0;
}
for(i=0;i<256;i++)
{
cv[i]=0;
}
Get_Huffman_cs_cw(cs,cw,pointer);
word =*(pointer-1); // Get Huffman table type
temp_pointer = pointer + 16; // Shift to the starting point of DiffDC_length or <R,V_length>
set_Huff_sram_mode(8); // Set TSramMode =CPU R/W TSRAM Regs and JPEG Decoding
set_jpg_huffman_cw_reg(word,cw);
if(word==0x00)
{
set_jpg_huffman_dcs_reg(0,cs);
for(i=0; i<16; i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_dcv_reg(0,cv);
}//YDC
else if(word==0x01)
{
set_jpg_huffman_dcs_reg(1,cs);
for(i=0; i<16; i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_dcv_reg(1,cv);
}//CDC
else if(word==0x10)
{
set_jpg_huffman_acs_reg(0,cs);
for(i=0; i<(0x40*3); i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_acv_sram(0,cv);
}//YAC
else if(word==0x11)
{
set_jpg_huffman_acs_reg(1,cs);
for(i=0; i<(0x40*3); i++)
{
word =*temp_pointer;
cv[i] = word;
temp_pointer++;
}
set_jpg_huffman_acv_sram(1,cv);
}//CAC
pointer=pointer+(length-3);
counter=counter+(length-3);
}
}
////////////////////////////////////////////////////////////////////////////////////////
void set_jpg_huffman_cw_reg(unsigned char htype,unsigned int *cw)
{
unsigned int i,temp1;
unsigned int *pointer;
if(htype==0x00)
pointer=(unsigned int *)P_MPEG4_HUFFMAN_START;
else if(htype==0x01)
pointer=(unsigned int *)P_MPEG4_CHROMDCCODE_START;
else if(htype==0x10)
pointer=(unsigned int *)P_MPEG4_LUMACHUFFMANTABLE_START;
else if(htype==0x11)
pointer=(unsigned int *)P_MPEG4_CHROMACHUFFMANTABLE_START;
for(i=0;i<8;i++)
{
*pointer=cw[i];
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
if(htype==0x00)
{print2("ydcw : ",0,cw[i]);}
else if(htype==0x01)
{print2("cdcw : ",0,cw[i]);}
else if(htype==0x10)
{print2("yacw : ",0,cw[i]);}
else if(htype==0x11)
{print2("cacw : ",0,cw[i]);}
#endif
}
for(i=8;i<16;i++)
{
*pointer=cw[i];
pointer++;
temp1=cw[i]>>8;
*pointer=temp1;
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
if(htype==0x00){print2("ydcw : ",0,cw[i]);}
else if(htype==0x01){print2("cdcw : ",0,cw[i]);}
else if(htype==0x10){print2("yacw : ",0,cw[i]);}
else if(htype==0x11){print2("cacw : ",0,cw[i]);}
#endif
}
#ifdef PRINT_JPG_HEADER_INFO
print1("---------------------------\n");
#endif
}
/////////////////////////////////////////////////////////////////////
void set_jpg_huffman_acs_reg(int chrominance,unsigned char *cs)
{
unsigned int i;//,j;
//unsigned int data[2];
unsigned int *pointer;
if(chrominance==0)
{
pointer=(unsigned int *)P_MPEG4_LUMACHUFFMANOFFSET_SA;
}
else
{
pointer=(unsigned int *)P_MPEG4_CHROMACHUFFMANOFFSET_SA;
}
for(i=0;i<16;i++)
{
//j=i*2;
//data[1]=(unsigned int)cs[j+1];
//data[0]=(unsigned int)cs[j];
//data[1]=data[1]<<8;
//*pointer=data[0]+data[1];
*pointer=(unsigned int)cs[i];
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
if(chrominance==0)
{print2("yacs : ",0,cs[i]);}
else {print2("cacs : ",0,cs[i]);}
#endif
}
#ifdef PRINT_JPG_HEADER_INFO
print1("---------------------------\n");
#endif
}
/////////////////////////////////////////////////////////////////////
void set_jpg_huffman_dcs_reg(int chrominance,unsigned char *cs){
unsigned int i,j;
unsigned int data[2];
unsigned int *pointer;
if(chrominance==0)
{pointer=(unsigned int *)P_MPEG4_LUMOFFSET_SA;}
else
{pointer=(unsigned int *)P_MPEG4_CHROMOFFSET_SA;}
for(i=0;i<8;i++)
{
j=i*2;
data[1]=(unsigned int)cs[j+1];
data[0]=(unsigned int)cs[j];
data[1]=data[1]&0x0000000f;
data[1]=data[1]<<4;
data[0]=data[0]&0x0000000f;
*pointer=data[0]+data[1];
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
if(chrominance==0)
{
print2("ydcs low byte: ",0,data[0]);
print2("ydcs high byte: ",0,data[1]);
}
else
{
print2("cdcs low byte: ",0,data[0]);
print2("cdcs high byte: ",0,data[1]);
}
#endif
}
#ifdef PRINT_JPG_HEADER_INFO
print1("---------------------------\n");
#endif
}
/////////////////////////////////////////////////////////////////////
void set_jpg_huffman_dcv_reg(int chrominance ,unsigned char *cv)
{
unsigned int *pointer;
unsigned int i,j;
unsigned int data[2];
unsigned int *port;
port = 0x88220940;
if(chrominance==0)
{pointer=(unsigned int *)P_MPEG4_LUMHUFFMANTABLE_START ;}
else
{pointer=(unsigned int *)port;} ////////////////////////////
for(i=0;i<8;i++)
{
j=i*2;
data[1]=(unsigned int)(cv[j+1]&0x000f);
data[0]=(unsigned int)(cv[j]&0x000f);
data[1]=data[1]<<4;
*pointer=data[0]+data[1];
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
if(chrominance==0)
{
print2("ydcv low byte: ",0,data[0]);
print2("ydcv high byte: ",0,data[1]);
}
else
{ print2("cdcv low byte: ",0,data[0]);
print2("cdcv high byte: ",0,data[1]);
}
#endif
}
#ifdef PRINT_JPG_HEADER_INFO
print1("---------------------------\n");
#endif
}
/////////////////////////////////////////////////////////////////////
void set_jpg_huffman_acv_sram(int chrominance,unsigned char *cv)
{
unsigned int Huffman_SRAM_Page;
unsigned int *pointer;
unsigned int j,i,k;
if(chrominance==0)
{Huffman_SRAM_Page=0;}
else
{Huffman_SRAM_Page=4;}
for(j=0;j<4;j++)
{
set_Huff_sram_mode(Huffman_SRAM_Page);
#ifdef PRINT_JPG_HEADER_INFO
print2("Huffman SRAM Page = ",0,Huffman_SRAM_Page);
#endif
pointer=(unsigned int *)P_MPEG4_LUMDCCODE_START;
k=j*64;
for(i=0;i<64;i++)
{
*pointer=(unsigned int)cv[k];
pointer++;
#ifdef PRINT_JPG_HEADER_INFO
print2("YACV/CACV = ",0,cv[k]);
#endif
k++;
}
Huffman_SRAM_Page++;
#ifdef PRINT_JPG_HEADER_INFO
print1("---------------------------\n");
#endif
}
set_Huff_sram_mode(8);
}
/////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -