Beispiel #1
0
//写入帧头
void jmkr_write_frame_head(jpeg_compress_info *cinfo)
{
  	int i;
  	u16 Lf,X,Y;
  	u8  P,Nf,C,H,V,Tq;
	jutl_write_byte(0xFF,cinfo->output);
	jutl_write_byte(SOF0,cinfo->output);
	Nf=cinfo->num_comp;
	P=cinfo->precision;
	X=cinfo->image_width;
	Y=cinfo->image_height;
	Lf=8+3*Nf;
	jutl_write_byte(Lf>>8,cinfo->output);
	jutl_write_byte(Lf&0xFF,cinfo->output);
	jutl_write_byte(P,cinfo->output);
	jutl_write_byte(Y>>8,cinfo->output);
	jutl_write_byte(Y&0xFF,cinfo->output);
	jutl_write_byte(X>>8,cinfo->output);
	jutl_write_byte(X&0xFF,cinfo->output);
	jutl_write_byte(Nf,cinfo->output);
	for(i=0;i<Nf;i++)
	{
		C=cinfo->comp[i].comp_id;
		H=cinfo->comp[i].h_factor;
		V=cinfo->comp[i].v_factor;
		Tq=cinfo->comp[i].quant_tbl_no;
		jutl_write_byte(C,cinfo->output);
		jutl_write_byte(((H<<4)|V),cinfo->output);
		jutl_write_byte(Tq,cinfo->output);
	}
}
Beispiel #2
0
void jhuff_write_bits (jpeg_compress_info *cinfo, UINT32 data, int len) 
{
  #ifdef DEBUG
    printf("(b:%d;%d/%d)", bits_in_buffer, data, len);
  #endif
  UINT32 tdata;
  
  while (len>0) {
    tdata = (data<<(32-len));
    buffer.all |= ((tdata >> bits_in_buffer));
    bits_in_buffer += len;
    /* output buffer */
    if (bits_in_buffer >= 32) { 
      int i;
      /* must be BIG ENDIAN */
      for (i=3; i>=0; i--) {
        jutl_write_byte(buffer.c[i], cinfo->output);
        if (buffer.c[i]==0xFF)
          jutl_write_byte(0x00, cinfo->output);
      }
      buffer.all = 0;
      len = bits_in_buffer - 32;
      bits_in_buffer=0;
    }else{
      len=0;
    }
  }
  #ifdef DEBUG
    printf("..buffer..%08X\n", buffer.all);  
  #endif
}
Beispiel #3
0
//写入扫描开始标志
void jmkr_write_scan_head(jpeg_compress_info *cinfo) 
{
  	int i;
  	u16 Ls;
  	u8 Ns,Ss,Se,Ah,Al,Cs,Td,Ta;
	jutl_write_byte(0xFF,cinfo->output);
	jutl_write_byte(SOS,cinfo->output);
	Ns=cinfo->num_comp;
	Ls=6+2*Ns;
	Ss=0;//定值!不改变
	Se=63;
	Ah=Al=0;
	jutl_write_byte(Ls>>8,cinfo->output);
	jutl_write_byte(Ls&0xFF,cinfo->output);
	jutl_write_byte(Ns,cinfo->output);
	for(i=0;i<Ns;i++)
	{
		Cs=cinfo->comp[i].comp_id;
		Td=cinfo->comp[i].dc_tbl_no;
		Ta=cinfo->comp[i].ac_tbl_no;
		jutl_write_byte(Cs,cinfo->output);
		jutl_write_byte((Td<<4|Ta),cinfo->output);
	}
	jutl_write_byte(Ss,cinfo->output);
	jutl_write_byte(Se,cinfo->output);
	jutl_write_byte(((Ah<<4)|Al),cinfo->output);
}
Beispiel #4
0
//清除/释放缓冲区
void jhuff_flush_buffer(jpeg_compress_info *cinfo) 
{
  	int i=3;  
  	while(bits_in_buffer>8)
	{
		jutl_write_byte(buffer.c[i],cinfo->output);
		if(buffer.c[i]==0xFF)jutl_write_byte(0x00,cinfo->output);		
		i--;
		bits_in_buffer-=8;
	}
	if(bits_in_buffer>0)
	{
		buffer.c[i]|=((u8)(0xFF)>>bits_in_buffer);
		jutl_write_byte(buffer.c[i],cinfo->output);
		if(buffer.c[i]==0xFF)jutl_write_byte(0x00,cinfo->output);		
	}
Beispiel #5
0
void  jhuff_flush_buffer(jpeg_compress_info *cinfo) 
{
  int i;
  i = 3;
  #ifdef DEBUG
    printf(" <FB:%08X,%d ", buffer.all, bits_in_buffer);
  #endif
  
  while (bits_in_buffer > 8) {
    jutl_write_byte(buffer.c[i], cinfo->output);
    if (buffer.c[i]==0xFF)
      jutl_write_byte(0x00, cinfo->output);
    i--;
    bits_in_buffer -= 8;
  }
  if(bits_in_buffer > 0) {
    buffer.c[i] |= ((unsigned char)(0xFF) >> bits_in_buffer);
    jutl_write_byte(buffer.c[i], cinfo->output);
    if (buffer.c[i]==0xFF) 
      jutl_write_byte(0x00, cinfo->output);
  }
Beispiel #6
0
//写入量化表
void jmkr_write_quant_table(jpeg_compress_info *cinfo)
{
  	int i, j;
  	for (i=0;i<NUM_QUANT_TBLS;i++) 
  	{
	    if (!cinfo->quant_table[i])continue;	      
	    jutl_write_byte(0xFF,cinfo->output);
	    jutl_write_byte(DQT,cinfo->output);
	    jutl_write_byte(0x00,cinfo->output);
	    jutl_write_byte(0x43,cinfo->output);//长度:固定为43h
	    jutl_write_byte(i&0xFF,cinfo->output);//ouput Pq & Tq
	    for (j=0;j<DCTSIZE2;j++) 
	    {
	      	u8 Q=cinfo->quant_table[i]->quantval[j];
	      	jutl_write_byte(Q,cinfo->output);
	    }
  	}
}
Beispiel #7
0
//写文件结束标志
void jmkr_write_end(jpeg_compress_info *cinfo) 
{
  	jutl_write_byte(0xFF,cinfo->output);
	cinfo->state =JC_FINISH;//状态为完成
  	jutl_write_byte(EOI,cinfo->output);	
}
Beispiel #8
0
//写入哈夫曼表
void jmkr_write_huff_table(jpeg_compress_info *cinfo)
{
  	int i,j,num_val;
  	u16 Lh;
	for(i=0;i<NUM_HUFF_TBLS;i++)//输出直流HUFFMAN码
	{
		num_val=0;
		if(!cinfo->dc_huff_table[i])continue;
		jutl_write_byte(0xFF,cinfo->output);
		jutl_write_byte(DHT,cinfo->output);
		for(j=1;j<=16;j++)num_val+=cinfo->dc_huff_table[i]->bits[j];
		Lh=3+16+num_val;//长度,固定为43h
		jutl_write_byte(Lh>>8,cinfo->output);
		jutl_write_byte(Lh&0xFF,cinfo->output);
		jutl_write_byte(i,cinfo->output);//输出ID
		for(j=1;j<=16;j++)jutl_write_byte(cinfo->dc_huff_table[i]->bits[j],cinfo->output);//输出bits
		for(j=0;j<num_val;j++)jutl_write_byte(cinfo->dc_huff_table[i]->huffval[j],cinfo->output);
	}
	for(i=0;i<NUM_HUFF_TBLS;i++)//输出交流HUFFMAN码
	{
		num_val=0;
		if(!cinfo->ac_huff_table[i])continue;
		jutl_write_byte(0xFF,cinfo->output);
		jutl_write_byte(DHT,cinfo->output);
		for(j=1;j<=16;j++)num_val+=cinfo->ac_huff_table[i]->bits[j];
		Lh=3+16+num_val;//长度,固定为43h
		jutl_write_byte(Lh>>8,cinfo->output);
		jutl_write_byte(Lh&0xFF,cinfo->output);
		jutl_write_byte((0x10|i),cinfo->output);//输出ID
		for(j=1;j<=16;j++)jutl_write_byte(cinfo->ac_huff_table[i]->bits[j],cinfo->output);//输出bits
		for(j=0;j<num_val;j++)jutl_write_byte(cinfo->ac_huff_table[i]->huffval[j],cinfo->output);
	}
}
Beispiel #9
0
//写入APP0应用数据段
void jmkr_write_jfif(jpeg_compress_info *cinfo)
{
  	int i;
  	for (i=0;i<18;i++)jutl_write_byte(jfcode[i], cinfo->output);
}
Beispiel #10
0
//写入文件开始标志 
void jmkr_write_image_start(jpeg_compress_info *cinfo)
{
  	jutl_write_byte(0xFF,cinfo->output);
  	jutl_write_byte(SOI,cinfo->output);
}