45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:苏泊尔耗的JPEG解码器的详细介绍

苏泊尔耗的JPEG解码器的详细介绍

2016-08-29 19:53:01 来源:www.45fan.com 【

苏泊尔耗的JPEG解码器的详细介绍

哈夫曼解码和位流操作部分。

JPEG的哈夫曼编码是优化过的,对于每一个N位长的编码只要它小于MAX[N]就是一个结束编码。MAX[N]可根据DHT语法中给出的码表算出。

取位的方法很普通。如果用汇编优化的话,可以考虑用以前跟踪到的某H-GAME中图片解码程序的实现方法。在这里就不多讲了。

要注意的是RSTn可能会穿插在这里面。

jpeghuff.h

********************************************** 低调滴分隔线(1) ***************************************

/**************************************************************************************************

superarhow's JPEG decoder

by superarhow(superarhow@hotmail.com).All rights reserved.

**************************************************************************************************/

#pragma once

#include "JpegDec2.h"

/* 从流中读下一个哈夫曼编码并解码出其对应的字节 */
BYTE jpeg_dec_next_huff_code(p_jpeg_dec_rec p_rec, p_jpeg_huff_table p_table);

/* 从流中读取n_bits位 */
WORD jpeg_get_next_bits(p_jpeg_dec_rec p_rec, BYTE n_bits);

********************************************** 低调滴分隔线(2) ***************************************

jpeghuff.c

********************************************** 低调滴分隔线(3) ***************************************

/**************************************************************************************************

superarhow's JPEG decoder

by superarhow(superarhow@hotmail.com).All rights reserved.

**************************************************************************************************/

#include "jpegdec2.h"

/*
* 从流中读下一个哈夫曼编码并解码出其对应的字节
* 返回解码出的字节
*/
BYTE jpeg_dec_next_huff_code(p_jpeg_dec_rec p_rec, p_jpeg_huff_table p_table)
{
WORD *p_min_code, *p_max_code;
BYTE *p_codedata, *p_startindexes;
BYTE *p_data;
BYTE left_bits, n_left_bit_count, mask;
WORD code;

p_min_code= p_table->huff_min_codes;
p_max_code= p_table->huff_max_codes;
p_codedata= p_table->start_code_indexes;
p_startindexes= p_table->start_code_indexes;

p_data = p_rec->p_data;
left_bits = p_rec->left_bits;
n_left_bit_count = p_rec->n_left_bit_count;
mask = 1 << (n_left_bit_count - 1);
code = 0;
for ( ;; ) {
if ( n_left_bit_count == 0 ) {
/* fetch the next bits from the stream */
n_left_bit_count = 8;
mask = 0x80;
left_bits = *p_data++;
while ( left_bits == 0xFF ) {
if ( *p_data == 0 ) {
p_data++;
break;
} else if ( *p_data >= 0xD0 && *p_data <= 0xD7 ) {
/* RSTn */
n_left_bit_count = 0;
jpeg_reset(p_rec);
++p_data;
break;
} else {
left_bits = *p_data++;
break;
}
}
if ( n_left_bit_count == 0 ) continue; /* still not get the next byte :( */
}
code = code << 1;
if ( left_bits & mask ) code++;
n_left_bit_count--;
left_bits &= (~mask);
if ( code <= *p_max_code && (*p_max_code >= 0x8000 || 0x8000 >= *p_min_code) ) {
/* Done! */
break;
}
p_max_code++;
p_min_code++;
p_codedata++;
p_startindexes++;
mask >>= 1;
}
p_rec->n_left_bit_count = n_left_bit_count;
p_rec->left_bits = left_bits;
p_rec->p_data = p_data;
code -= *p_min_code;
if (code + *p_startindexes >= p_table->n_code_count) _asm int 3;
return p_table->codes[code + *p_startindexes];
}

/*
* 从流中读取n_bits位
* 返回读取的位码
*/
WORD jpeg_get_next_bits(p_jpeg_dec_rec p_rec, BYTE n_bits)
{
WORD result;
BYTE *p_data;
BYTE left_bits, n_left_bit_count;

result = 0;
p_data = p_rec->p_data;
left_bits = p_rec->left_bits;
n_left_bit_count = p_rec->n_left_bit_count;

while ( n_bits > 0 ) {

if ( n_left_bit_count == 0 ) {
/* fetch the next bits from the stream */
n_left_bit_count = 8;
left_bits = *p_data++;
while ( left_bits == 0xFF ) {
if ( *p_data == 0 ) {
++p_data;
break;
} else if ( *p_data >= 0xD0 && *p_data <= 0xD7 ) {
/* RSTn */
n_left_bit_count = 0;
jpeg_reset(p_rec);
++p_data;
break;
} else {
left_bits = *p_data++;
break;
}
}
if ( n_left_bit_count == 0 ) continue; /* still not get the next byte :( */
}

if ( n_left_bit_count >= n_bits ) {
/* fetch n_bits bits */
n_left_bit_count -= n_bits;
result <<= n_bits;
result |= ( ((1 << n_bits) - 1) & (left_bits >> n_left_bit_count) );
break;
} else {
/* fetch n_left_bit_count bits */
result <<= n_left_bit_count;
result |= ( ((1 << n_left_bit_count) - 1) & left_bits );
n_bits -= n_left_bit_count;
n_left_bit_count = 0;
}
}
/* set the changed pointer and bit values */
p_rec->left_bits = left_bits;
p_rec->n_left_bit_count = n_left_bit_count;
p_rec->p_data = p_data;
return result;
}

********************************************** 低调滴分隔线(4) ***************************************

 

本文地址:http://www.45fan.com/a/question/69483.html
Tags: JPEG 解码器 哈夫曼
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部