📄 modified_decode_ebcot1.c
字号:
/******************************************************************************
功能描述:
Implements block_decode
以下部分是对EBCOT的解码。三个通道。四种编码形式
功能描述:编码过程中,每个系数总处于三种状态之一:无效态,有效态,上下文有效态
******************************************************************************/
/*****************************************************************************/
// 程序: ebcot 解码
// 版本: V0.0
// 作者: 胡运平
// 最后修改时间 : 30, 6, 2005
/****************************************************************************/
#include <stdio.h>
#include<math.h>
#include<assert.h>
#include"fdwt.h"
#include"block_encode.h"
/******************************************************************************
//输入为文件形式的(CX,D)输出为block code的
*******************************************************************************/
void block_decode(int block_bufferout[BLOCKLENGTH][BLOCKWIDTH])
{
int i,j,k=0,m;
unsigned char Cx,D,D1,D2;
FILE *context;
if ((context = fopen("context.raw","ab+")) == NULL)
{
printf("cannot open file\n");
return;
}
/*******************************************************************************
// x;//符号变量
// q;//显著性状态变量
// e;//延迟显著性状态变量 表示系数是否是第一次被量值改进,也叫细化信息位
// v;//样本比特值
// pi;//编码状态变量 表示位平面上的比特值是否已经被编码,也叫访问信息位
初始化所有状态变量为0
********************************************************************************/
for(i=0;i<BLOCKLENGTH;i++)
for(j=0;j<BLOCKWIDTH;j++)
{
state_data_x[i][j] = 0;
state_data_q[i][j] = 0;
state_data_e[i][j] = 0;
state_data_v[i][j] = 0;
state_data_pi[i][j] = 0;
}
/******************************************************************************
//小波系数的预处理,完成三个功能:码块生成过程,数据格式转换过程,码块最大值查
找过程
//求单个码块的最大值和把符号位提取出来给符号变量X;符号变换,补码形式变成源码形式
*******************************************************************************/
//开始解码数据
k=0;
rewind(context);
printf("\n");
while(!feof(context))
{
k++;//位平面,执行一次完成一个位平面的解码
for(i=0;i<BLOCKLENGTH;i++)
for(j=0;j<BLOCKWIDTH;j++)
{
block_bufferout[i][j] |= (state_data_v[i][j] & 1)<<(k-2);
// printf("%d ",block_bufferout[i][j]);
printf("%d ",state_data_v[i][j]);
// printf("%d ",state_data_x[i][j]);
// printf("%d ",state_data_q[i][j]);
}
if(k==3) break;
for(i=0;i<BLOCKLENGTH;i++)
for(j=0;j<BLOCKWIDTH;j++)
{
state_data_v[i][j] = 0;
}
for(i=0;i<BLOCKLENGTH/4;i++)
{
for(j=0;j<BLOCKWIDTH;j++)
{
if(k==1)
goto Decode_RLC;
else
{//开始重要性扫描通道,处理当前不显著,但具有显著邻域的样本
if(state_data_q[4*i][j]==0 && Cx>0)
{//当前系数不是重要性系数
for(m=0;m<4;m++)
{
//fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+m][j] = D;
if(D)
{
state_data_q[4*i+m][j] = 1;
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+m][j]=D;
}
state_data_pi[4*i+m][j] = 1;
}
}
else
state_data_pi[4*i+m][j] = 0;
//开始幅值细化通过,位平面的幅度细化扫描通道
if(state_data_q[4*i+m][j]==1 && state_data_pi[4*i+m][j]==0)
{//该系数是重要的,
//fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+m][j] = D;
state_data_e[4*i+m][j] = 1;
}
fscanf(context,"%d %d ",&Cx,&D);
}
//重要性传播和幅值细化通过,开始清除通过
Decode_RLC:if(Cx==17)
{
if(D==0)
{
for(m=0;m<4;m++)
{
state_data_v[4*i+m][j]=0;
}
}
else //D = 1
{
fscanf(context,"%d %d ",&Cx,&D1);
fscanf(context,"%d %d ",&Cx,&D2);
if(D1==0 && D2 == 0)
{//是1开始的码流,编码剩下三个码流
// Encode sign bit
state_data_v[4*i][j] = 1;
state_data_q[4*i][j] = 1;//重要性标志置1
//编码符号位
fscanf(context,"%d %d ",&Cx,&D);
if(Cx>=9 && Cx<=13)
{
state_data_x[4*i][j] = D;
}
// state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
//第二位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+1][j] = D;
// state_data_pi[4*i+m+1][j] = 1;//标志此位被访问过。
if(D==1)
{
//此时将符号位元编码,
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+1][j] = D;
state_data_q[4*i+1][j] = 1;//重要性标志置1
}
//第三位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+2][j] = D;
// state_data_pi[4*i+m+2][j] = 1;//标志此位被访问过。
if(D==1)
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+2][j] = D;
state_data_q[4*i+2][j] = 1;//重要性标志置1
}
//第四位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//标志此位被访问过。
if(D==1)
{//此时将符号位元编码,
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+3][j] = D;
state_data_q[4*i+3][j] = 1;//重要性标志置1
}
}
if(D1==0 && D2 == 1)
{
state_data_v[4*i][j] = 0;
state_data_v[4*i+1][j] = 1;
//第二位符号编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+1][j] = D;
state_data_q[4*i+1][j] = 1;//重要性标志置1
//第三位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+2][j] = D;
// state_data_pi[4*i+m+2][j] = 1;//标志此位被访问过。
if(D==1)
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+2][j] = D;
state_data_q[4*i+2][j] = 1;//重要性标志置1
}
//第四位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//标志此位被访问过。
if(D==1)
{//此时将符号位元编码,
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+3][j] = D;
state_data_q[4*i+3][j] = 1;//重要性标志置1
}
}
if(D1==1 && D2 == 0)
{
state_data_v[4*i][j] = 0;
state_data_v[4*i+1][j] = 0;
state_data_v[4*i+2][j] = 1;
//此时将第三位符号位元编码,
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+2][j] = D;
state_data_q[4*i+2][j] = 1;//重要性标志置1
//第四位开始编码
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//标志此位被访问过。
if(D==1)
{//此时将符号位元编码,
// Encode sign bit
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+3][j] = D;
state_data_q[4*i+3][j] = 1;//重要性标志置1
}
}
if(D1==1 && D2 == 1)
{
state_data_v[4*i][j] = 0;
state_data_v[4*i+1][j] = 0;
state_data_v[4*i+2][j] = 0;
state_data_v[4*i+3][j] = 1;
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+3][j] = D;
state_data_q[4*i+3][j] = 1;//重要性标志置1
}
}//d=1
}//cx=17
if(Cx == 0)
{
for(m=0;m<4;m++)
{
// fscanf(context,"%d %d ",&Cx,&D);
if(state_data_q[4*i+m][j]==0 && Cx == 0)
{//当前系数不是重要性系数
state_data_v[4*i+m][j] = D;
if(D)
{
state_data_q[4*i+m][j] = 1;
fscanf(context,"%d %d ",&Cx,&D);
state_data_x[4*i+m][j] = D;
}
}
}
}
}//else
}//for
}//for
}//while
//到次为止完成三个通道的编码。
fclose(context);
}
void decode_allsubband()
{
unsigned char Cx,D;
FILE *context;
if ((context = fopen("context.raw","rb+")) == NULL)
{
printf("cannot open file\n");
return;
}
printf("\nThe block_code ebcot outdata is:");
while(!feof(context))
{
fscanf(context,"%d %d ",&Cx,&D);
printf("%d %d ",Cx,D);
}
fclose(context);
block_decode(block_bufferout);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -