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

📄 huffman.c

📁 经过优化的嵌入式系统开源JPEG编解码库;
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	unsigned char len;

	len = convertACMagnitudeYLength[magnitude];
/*	if (!len) {
#ifndef __MICROBLAZE
	printf("WAARDE STAAT NIET IN TABEL!!!!!!!!!!!!!!!!!!!!\n");
#endif
		} */
	*lenght = len;
	*out = convertACMagnitudeYOut[magnitude];
	
}

char Extend (char additional, unsigned char magnitude)
{
        int vt= 1 << (magnitude-1);
        if ( additional < vt ) return (additional + (-1 << magnitude) + 1);
        else return additional;
}

void ReverseExtend (char value, unsigned char *magnitude, unsigned char *bits)
{
 //	printf("reverseextend value= %d\n",*magnitude);
	if (value >=0)
	{
		*bits=value;
	}
	else
	{
		value=-value;
		*bits=~value;
	}
	*magnitude=0;
	while (value !=0)
	{
		value>>=1;
		++*magnitude;
	}
 //	printf("reverseextend magnitude= %d bits= %d",magnitude,bits);
	return;
}

void WriteRawBits16(unsigned char amount_bits, unsigned int bits)     //*remaining needs bo be more than 8 bits because 8 bits could be added and ther ecould already be up ot 7 bits in *remaining
// this function collects bits to send
// if there less than 16 bits collected, nothing is send and these bits are stored in *remaining. In *amount_remaining there is stated how much bits are stored in *remaining
// if more than 16 bits are collected, 16 bits are send and the remaining bits are stored again
{
        unsigned short int send;
        unsigned int mask;
        unsigned char send2;
        int count;
        mask=0x00;                                                              //init mask
        vlc_remaining=(vlc_remaining<<amount_bits);                                   //shift to make place for the new bits
        for (count=amount_bits; count>0; count--) mask=(mask<<1)|0x01;          //create mask for adding bit
        vlc_remaining=vlc_remaining | (bits&mask);                                    //add bits
        vlc_amount_remaining=vlc_amount_remaining + amount_bits;                      //change *amount_remaining to the correct new value
        if (vlc_amount_remaining >= 16)                                            //are there more than 16 bits in buffer, send 16 bits
        {
/* #ifndef __MICROBLAZE        
if (vlc_amount_remaining >= 32 ) printf("ERROR, more bits to send %d",vlc_amount_remaining);
#endif */
                send=vlc_remaining>>(vlc_amount_remaining-16);                        //this value can be send/stored (in art this can be dony by selecting bits)
                send2=(send & 0xFF00) >>8;
		  vlc_output_byte(send2);
                if (send2==0xFF)
                {
                        send2=0x00;
			  vlc_output_byte(send2);
                }
                send2=send & 0xFF;
		  vlc_output_byte(send2);
                if (send2==0xFF)
                {
                        send2=0x00;
		  	   vlc_output_byte(send2);
                }
                vlc_amount_remaining=vlc_amount_remaining-16;                         //descrease by 16 because these are send
        }
        return;
}

void HuffmanEncodeFinishSend()
// There are still some bits left to send at the end of the 8x8 matrix (or maybe the file),
// the remaining bits are filled up with ones and send
// possible fault: -must it be filled up with ones?
{
        unsigned short int send;
        unsigned int mask;
        int  count;
        mask=0x00;                                                              //init mask
        if (vlc_amount_remaining >= 8)                                             //2 bytes to send, send first byte
        {
                send=vlc_remaining>>(vlc_amount_remaining-8);                         //shift so that first byte is ready to send
		  vlc_output_byte(send&0xff);
                if (send==0xFF)                                                 //is this still needed????
                {
                        send=0x00;
			   vlc_output_byte(send&0xff);
                }
                vlc_amount_remaining=vlc_amount_remaining -8;                         // lower the value to the amount of bits that still needs to be send
        }
        if (vlc_amount_remaining >= 0)                                             //there is a last byte to send
        {
                send=vlc_remaining<<(8-vlc_amount_remaining);                         //shift the last bits to send to the front of the byte
                mask=0x00;                                                      //init mask
                for (count=(8-vlc_amount_remaining); count>0; count--) mask=(mask<<1)|0x01; //create mask to fill byte up with ones
                send=send | mask;                                               //add the ones to the byte
                vlc_output_byte(send&0xff);
                vlc_amount_remaining=0x00;                                         //is this needed?
        }
        return;
}

void HuffmanEncodeUsingDCTable(unsigned char magnitude)
// Translate magnitude into needed data (from table) and send it
{
        unsigned char send;
        unsigned short int huffmancode, huffmanlengt;
        ConvertDCMagnitudeY(magnitude, &huffmancode, &huffmanlengt);
        WriteRawBits16(huffmanlengt,huffmancode);
   	//printf("Write DC magnitude= %2x \n",magnitude);
        //WriteRawBits16(0x08,magnitude,remaining,amount_remaining, file);
        return;
}

void HuffmanEncodeUsingACTable(unsigned char mag)
// Translate magnitude into needed data (from table) and send it
{
        unsigned char send;
        unsigned short int huffmancode, huffmanlengt;
        ConvertACMagnitudeY(mag, &huffmancode, &huffmanlengt);
        WriteRawBits16(huffmanlengt,huffmancode);
        return;
}

char EncodeDataUnit(char dataunit[64], unsigned int color)
{
	char difference;
        unsigned char magnitude,zerorun,ii,ert;
        unsigned int bits;
	unsigned char bit_char;
	 char last_dc_value;
                                         //init
  //    PrintMatrix(dataunit) ;
  	last_dc_value = dcvalue[color];
	difference = dataunit[0] - last_dc_value;
	last_dc_value=dataunit[0];
	ReverseExtend(difference, &magnitude,&bit_char);
	bits = bit_char;
	HuffmanEncodeUsingDCTable(magnitude);
        WriteRawBits16(magnitude,bits);
	zerorun=0;
	ii=1;
  	while ( ii < 64 )
	{
		if (dataunit[ii] != 0 )
		{
			while ( zerorun >= 16 )
			{
				HuffmanEncodeUsingACTable(0xF0);
                                zerorun=zerorun-16;
                            //    printf("16 zeros:  %d\n",zerorun);
			}
			ReverseExtend(dataunit[ii],&magnitude,&bit_char);
			bits=bit_char;
                        ert= ((int)zerorun *16);                                     //ERROR !!!!!!!!!!!
                        ert=ert + magnitude;
			HuffmanEncodeUsingACTable(ert);
			WriteRawBits16(magnitude,bits);
                        zerorun=0;
		}
		else zerorun=zerorun+1;
                ii++;
	}
	if ( zerorun != 0 )
        {
                HuffmanEncodeUsingACTable(0x00);
        }
 	dcvalue[color] = last_dc_value;
        return 0;
}

⌨️ 快捷键说明

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