#include "stdafx.h"
#include "jpegdec2.h"
#include "jpeghuff.h"
#include "jpegbuf.h"
#include "jpegidct.h"
#include "stdio.h"
#include "windows.h"
#define NextByte(p) (*(p->p_data++))
#define CurByte(p) (*(p->p_data))
#define PrevByte(p) (*(--p->p_data))
#define WORD_ALIGN(p) (p) = (((p) + 1) / 2) * 2
#define DWORD_ALIGN(p) (p) = (((p) + 3) / 4) * 4
void jpeg_reset(p_jpeg_dec_rec p_rec)
{
p_rec->n_left_bit_count = 0;
p_rec->n_reset_cnt = p_rec->n_reset_size;
p_rec->i_dc = 0;
p_rec->n_eob_count = 0;
}
BYTE jpeg_next_byte(p_jpeg_dec_rec p_rec)
{
BYTE b;
for ( ;; ) {
b = *p_rec->p_data++;
if (b == 0xFF) {
b = *p_rec->p_data++;
if (b == 0) return 0xFF;
if (b >= 0xD0 && b <= 0xD7) {
/* RSTn */
jpeg_reset(p_rec);
} else return b;
} else return b;
}
return 0;
}
WORD jpeg_next_word(p_jpeg_dec_rec p_rec)
{
WORD w = (p_rec->p_data[0] << 8) | (p_rec->p_data[1]);
p_rec->p_data += 2;
return w;
}
/* 初始化解码器 */
void jpeg_init_decoder(p_jpeg_dec_rec p_rec)
{
p_rec->n_width = 0;
p_rec->n_height = 0;
p_rec->n_reset_size = 0;
p_rec->left_bits = 0;
p_rec->n_left_bit_count = 0;
p_rec->n_horz_sample_coes_max = 0;
p_rec->n_vert_sample_coes_max = 0;
p_rec->n_horz_sample_coes_min = 0xff;
p_rec->n_vert_sample_coes_min = 0xff;
p_rec->p_bgr_buffer = NULL;
p_rec->p_data = NULL;
p_rec->i_dc = 0;
p_rec->i_progressive = 0;
p_rec->p_dus = NULL;
p_rec->n_eob_count = 0;
}
/* 反初始化解码器 */
void jpeg_clear_up(p_jpeg_dec_rec p_rec)
{
}
/*
* 跳过下一个块
* 返回非0表示成功
*/
int jpeg_skip_next_block(p_jpeg_dec_rec p_rec)
{
BYTE b;
WORD n;
b = NextByte(p_rec);
if (b == 0x01 /* TEM 结束标志*/ || (b >= 0xd0 && b <= 0xd9 /* RSTn OR SOI OR EOI*/))
return 1;
n = jpeg_next_word(p_rec);
p_rec->p_data += (n - 2);
return 1;
}
/*
* 处理帧开始标记
* 返回非0表示成功
*/
int jpeg_decode_SOF0(p_jpeg_dec_rec p_rec)
{
BYTE b, index, n;
/* skip tag */
NextByte(p_rec);
jpeg_next_word(p_rec);
/* 采样精度 */
p_rec->n_bits_per_sample = NextByte(p_rec);
/* 图像高度(为0表示通过DNL标记指定) */
p_rec->n_height = jpeg_next_word(p_rec);
/* 图像宽度 */
p_rec->n_width = jpeg_next_word(p_rec);
/* 每行字节数 */
p_rec->n_bytes_per_line = ((DWORD)p_rec->n_width) * 3;
DWORD_ALIGN(p_rec->n_bytes_per_line);
/* 分量数 */
p_rec->n_components = NextByte(p_rec);
if (p_rec->n_components <= 0 || p_rec->n_components > 4)
return 0; /* 不支持的分量数 */
for ( n = 0; n < p_rec->n_components; ++n )
{
/* 分量ID */
p_rec->i_component_ids[n] = jpeg_next_byte(p_rec);
/*
* Note!!!!
* Our index here doesn't mean component ids, its only an index
* We also reference our huffman-table & quanlity-table by index not by component id.
*/
index = n;
if ( index >= p_rec->n_components )
return 0; /* 出现了错误的分量ID */
b = jpeg_next_byte(p_rec);
/* 分量采样率 */
p_rec->n_vert_sample_coes[index] = b & 0xf;
p_rec->n_horz_sample_coes[index] = b >> 4;
/* 计算分量采样率最大值 */
if (p_rec->n_vert_sample_coes[index] > p_rec->n_vert_sample_coes_max)
p_rec->n_vert_sample_coes_max = p_rec->n_vert_sample_coes[index];
if (p_rec->n_horz_sample_coes[index] > p_rec->n_horz_sample_coes_max)
p_rec->n_horz_sample_coes_max = p_rec->n_horz_sample_coes[index];
if (p_rec->n_vert_sample_coes[index] < p_rec->n_vert_sample_coes_min)
p_rec->n_vert_sample_coes_min = p_rec->n_vert_sample_coes[index];
if (p_rec->n_horz_sample_coes[index] < p_rec->n_horz_sample_coes_min)
p_rec->n_horz_sample_coes_min = p_rec->n_horz_sample_coes[index];
b = jpeg_next_byte(p_rec);
if (b >= 4)
return 0; /* 出现了错误的量化表ID */
p_rec->n_quality_table_indexes[index] = b;
}
return 1;
}
/*
* 处理定义重启动段标志
* 返回非0表示成功
*/
int jpeg_decode_DRI(p_jpeg_dec_rec p_rec)
{
NextByte(p_rec);
jpeg_next_word(p_rec);
p_rec->n_reset_size = jpeg_next_word(p_rec);
p_rec->n_reset_cnt = p_rec->n_reset_size;
return 1;
}
/*
* 处理定义量化表标志
*/
int jpeg_decode_DQT(p_jpeg_dec_rec p_rec)
{
WORD size;
BYTE b, index, coe;
WORD i;
NextByte(p_rec);
size = jpeg_next_word(p_rec) - 2;
while ( size > 0 )
{
b = jpeg_next_byte(p_rec);
index = b & 0xf;
if ( index >= 4 )
return 0; /* 出现了非法的量化表ID */
coe = b >> 4;
if ( coe != 0 )
coe = 1;
/* 量化表精度,0:8位 非0:16位 */
p_rec->quality_tables[index].precision = coe;
if ( coe == 0 )
{
/* 8位量化表 */
for ( i = 0; i != 64; ++i )
{
p_rec->quality_tables[index].values[i] = jpeg_next_byte(p_rec);
}
p_rec->quality_tables[index].process_in_idct = 0;
jpeg_idct_prepare_qualitytable(&p_rec->quality_tables[index]);
size -= (64 + 1);
}
else
{
/* 16位量化表 */
for ( i = 0; i != 64; ++i )
{
p_rec->quality_tables[index].values[i] = jpeg_next_word(p_rec);
}
p_rec->quality_tables[index].process_in_idct = 0;
jpeg_idct_prepare_qualitytable(&p_rec->quality_tables[index]);
size -= (64 * 2 + 1);
}
}
return 1;
}
/*
* 生成解码用哈夫曼表
*/
void jpeg_make_huff_table(p_jpeg_huff_table p_table)
{
WORD mask;
WORD i, j, k;
p_table->huff_min_codes[0] = 0;
for ( i = 0, mask = 0, j = 0, k = 0; i < p_table->n_code_count; )
{
if ( j >= p_table->n_counts[k] )
{
if ( j == 0 )
{
/* 无k位Huffman码,则置huff_max_codes[k]为0、huff_min_codes[k]为0xffff以示区别 */
p_table->huff_min_codes[k] = 0xffff;
p_table->huff_max_codes[k] = 0;
}
else
{
j = 0;
}
mask <<= 1;
++k;
if ( k < 16 )
p_table->huff_min_codes[k] = mask;
}
else
{
p_table->huff_max_codes[k] = mask;
++mask;
++j;
++i;
}
} /* end of for(...) */
}
/*
* 处理定义哈夫曼表标志
*/
int jpeg_decode_DHT(p_jpeg_dec_rec p_rec)
{
BYTE b, index, type;
WORD size, total, i;
NextByte(p_rec);
size = jpeg_next_word(p_rec) - 2;
while ( size > 0 )
{
b = jpeg_next_byte(p_rec);
index = b & 0xf;
if (index >= 4)
return 0; /* 出现了非法的哈夫曼表ID */
type = b >> 4;
if (type > 1)
return 0; /* 非法的哈夫曼表类型 */
total = 0;
for ( i = 0; i < 16; ++i )
{
b = jpeg_next_byte(p_rec);
p_rec->huff_tables[type][index].n_counts[i] = b;
p_rec->huff_tables[type][index].start_code_indexes[i] = (BYTE)total;
total += b;
}
p_rec->huff_tables[type][index].n_code_count = total;
memcpy(p_rec->huff_tables[type][index].codes, p_rec->p_data, total);
jpeg_make_huff_table( &(p_rec->huff_tables[type][index]) );
p_rec->p_data += total;
if ( p_rec->p_data >= p_rec->p_data_limit )
return 0; /* 数据不够 */
size -= (total + 16 + 1);
}
return 1;
}
/*
* 查找EOI标记。找到返回非0
*/
int jpeg_scan_for_eoi( p_jpeg_dec_rec p_rec )
{
BYTE *p = p_rec->p_data;
for ( ;; ) {
if ( p + 1 >= p_rec->p_data_limit ) break;
if ( *p == 0xff ) {
if ( p[1] == 0xD9 ) break;
else {
if ( p[1] >= 0xD0 && p[1] <= 0xD7 ) {
/* RSTn */
p += 2;
} else if ( p[1] == 0 ) {
return 0;
} else {
jpeg_decode_next_block(p_rec);
}
}
} else {
return 0;
}
}
return 1;
}
/*
* 解码帧(非渐近方式)
* 返回非0表示成功
*/
int jpeg_decode_scanlines(p_jpeg_dec_rec p_rec)
{
static BYTE _un_zig_zag[64] = {
0, 1, 8, 16, 9, 2, 3,10,
17,24,32,25,18,11, 4, 5,
12,19,26,33,40,48,41,34,
27,20,13, 6, 7,14,21,28,
35,42,49,56,57,50,43,36,
29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,
53,60,61,54,47,55,62,63
};
/* 工作矩阵(Data Unit) */
SHORT du[64];
/* 指向当前量化表数值 */
DWORD *pw_quality_values;
/* 各组件DC分量值 */
SHORT dc[5] = { 0, 0, 0, 0, 0 };
/* 各组件缓冲区,需释放 */
BYTE* p_com_bufs[5] = { NULL, NULL, NULL, NULL, NULL };
/* 每段每组件扫描完后地址偏移量,需释放 */