📄 block_encode.c.bak
字号:
/******************************************************************************
功能描述:
Implements block_encode
以下部分是对EBCOT的编码。三个通道。四种编码形式
功能描述:编码过程中,每个系数总处于三种状态之一:无效态,有效态,上下文有效态
******************************************************************************/
/*****************************************************************************/
// 程序: ebcot 编码
// 版本: V0.0
// 作者: 胡运平
// 最后修改时间 : 30, 6, 2005
/****************************************************************************/
#include <stdio.h>
#include<math.h>
#include<assert.h>
#include"fdwt.h"
#include"block_encode.h"
/******************************************************************************
//函数功能:
//输入:1 3 7 15 31 63 127 255
//输出 1 2 3 4 5 6 7 8
*******************************************************************************/
int log2i(int val)
{
int i;
for(i=0;val>0;val>>=1,i++);
return i;
}
/******************************************************************************
//输入为block code 的小波量化系数,输出为文件形式的(CX,D)
*******************************************************************************/
void block_encode(int block_bufferin[BLOCKLENGTH][BLOCKWIDTH])
{
int i,j,k,m;
int max;
unsigned char c[BLOCKLENGTH][BLOCKWIDTH];//显著性状态。
unsigned int f[BLOCKLENGTH][BLOCKWIDTH] = {0};
// unsigned char kign;
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;符号变换,补码形式变成源码形式
*******************************************************************************/
max = abs(block_bufferin[0][0]);
for(i=0;i<BLOCKLENGTH;i++)
for(j=0;j<BLOCKWIDTH;j++)
{
state_data_x[i][j] = (block_bufferin[i][j]>>16 & 1);
block_bufferin[i][j] = abs(block_bufferin[i][j]);
if(block_bufferin[i][j]>max)
max = block_bufferin[i][j];
}
//环境状态字初始化,32位,每一个总共表示有4个系数的所有状态变量。
for(i=0;i<BLOCKLENGTH;i++)
for(j=0;j<BLOCKWIDTH;j++)
{
c[i][j] = 0;
}
/******************************************************************************
//预处理完毕可以进行下面的核心编码操作,以四个系数作为一个stripe编码,
//最高位平面开始编码,最高位平面只进行cleanup通道编码
******************************************************************************/
for(j=0;j<BLOCKWIDTH;j++)
{
for(i=0;i<BLOCKLENGTH/4;i++)
{
state_data_v[4*i][j] = (block_bufferin[4*i][j]>>(log2i(max)-1) && 1);
state_data_v[4*i+1][j] = (block_bufferin[4*i+1][j]>>(log2i(max)-1) && 1);
state_data_v[4*i+2][j] = (block_bufferin[4*i+2][j]>>(log2i(max)-1) && 1);
state_data_v[4*i+3][j] = (block_bufferin[4*i+3][j]>>(log2i(max)-1) && 1);
}
}
for(j=0;j<BLOCKWIDTH;j++)
{
for(i=0;i<BLOCKLENGTH/4;i++)
{
if(!(state_data_v[4*i][j] | state_data_v[4*i+1][j] |
state_data_v[4*i+2][j] | state_data_v[4*i+3][j]))
{
fprintf(context,"%d %d ",17,0);
break;
}
for(k = 0;k<4;k++)
{
if(state_data_v[4*i+k][j])
{
fprintf(context,"%d %d ",17,1);
if(k == 0)
{
fprintf(context,"%d %d ",18,0);
fprintf(context,"%d %d ",18,0);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
fprintf(context,"%d %d ",9,state_data_x[4*i+k][j]);
state_data_q[4*i+k][j] = 1;//重要性标志置1
// state_data_pi[4*i+k][j] = 1;//标志此位被访问过。
//第二位开始编码
fprintf(context,"%d %d ",0,state_data_v[4*i+k+1][j]);
if(state_data_v[4*i+k+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+1][j]);
state_data_q[4*i+k+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+1][j] = 1;//标志此位被访问过。
}
//第三位开始编码
printf("%d %d ",0,state_data_v[4*i+k+2][j]);
if(state_data_v[4*i+k+2][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+2][j]);
state_data_q[4*i+k+2][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+2][j] = 1;//标志此位被访问过。
}
//第四位开始编码
printf("%d %d ",0,state_data_v[4*i+k+3][j]);
if(state_data_v[4*i+k+3][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+3][j]);
state_data_q[4*i+k+3][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+3][j] = 1;//标志此位被访问过。
}
break;
}
if(k == 1)
{
printf("%d %d ",18,0);
printf("%d %d ",18,1);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k][j]);
state_data_q[4*i+k][j] = 1;//重要性标志置1
// state_data_pi[4*i+k][j] = 1;//标志此位被访问过。
//第三位开始编码
printf("%d %d ",0,state_data_v[4*i+k+1][j]);
if(state_data_v[4*i+k+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+1][j]);
state_data_q[4*i+k+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+1][j] = 1;//标志此位被访问过。
}
//第四位开始编码
printf("%d %d ",0,state_data_v[4*i+k+2][j]);
if(state_data_v[4*i+k+2][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+2][j]);
state_data_q[4*i+k+2][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+2][j] = 1;//标志此位被访问过。
}
break;
}
if(k == 2)
{
printf("%d %d ",18,1);
printf("%d %d ",18,0);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k][j]);
state_data_q[4*i+k][j] = 1;//重要性标志置1
// state_data_pi[4*i+k][j] = 1;//标志此位被访问过。
printf("%d %d ",0,state_data_v[4*i+k+1][j]);
if(state_data_v[4*i+k+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k+1][j]);
state_data_q[4*i+k+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+k+1][j] = 1;//标志此位被访问过。
}
break;
}
if(k == 3)
{
printf("%d %d ",18,1);
printf("%d %d ",18,1);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+k][j]);
state_data_q[4*i+k][j] = 1;//重要性标志置1
// state_data_pi[4*i+k][j] = 1;//标志此位被访问过。
break;
}
}
}
}
}
/******************************************************************************
//最高位平面处理完毕。从次高位平面起开始位平面编码,
//依次经过三个编码通道。
//环境状态字给初值,8位,显示重要性状态值。状态变量如下所示:
// x;//符号变量
// q;//显著性状态变量
// e;//延迟显著性状态变量 表示系数是否是第一次被量值改进,也叫细化信息位
// v;//样本比特值
// pi;//编码状态变量 表示位平面上的比特值是否已经被编码,也叫访问信息位
/初始化所有状态变量为0
********************************************************************************/
printf("\n最高位平面处理完毕\n");
for(k=log2i(max)-2;k>-1;k--)
{//位平面层数,从次高位平面到最低位平面0编码
for(i=0;i<BLOCKLENGTH;i++)
{
for(j=0;j<BLOCKWIDTH;j++)
{
c[i][j] = state_data_q[i][j];
state_data_v[i][j] = ((block_bufferin[i][j]>>k) & 1);
// printf("%d ",c[i][j]);
// printf("%d ",state_data[i][j].v);
// printf("%d ",state_data_x[i][j]);
// printf("%d ",block_bufferin[i][j]);
}
}
init_environment(f,c,state_data_x);
//位平面的重要性扫描通道
for(j=0;j<BLOCKWIDTH;j++)
{
for(m=0;m<BLOCKLENGTH/4;m++)
{
for(i=0;i<4;i++)
{
if((!c[4*m+i][j]) && init_significant(f[4*m+i][j],0)>0)
{
printf("%d %d ",init_significant(f[4*m+i][j],0),state_data_v[4*m+i][j]);
if(state_data_v[4*m+i][j])
{
state_data_q[4*m+i][j] = 1;
// unsigned char init_sign(unsigned int f, unsigned char v,int i,int j)
printf("%d %d ",init_sign(f[4*m+i][j],state_data_x[4*m+i][j]),state_data_x[4*m+i][j]);
}
state_data_pi[4*m+i][j] = 1;
}
}
}
}
//完成第一次位平面扫描通道,开始幅值细化通道扫描
for(j=0;j<BLOCKWIDTH;j++)
{
for(m=0;m<BLOCKLENGTH/4;m++)
{
for(i=0;i<4;i++)
{
if(c[4*m+i][j] && (!state_data_pi[4*m+i][j]))
{
printf("%d %d ",init_magnitude(f[4*m+i][j],state_data_e[4*m+i][j]),state_data_v[4*m+i][j]);
state_data_e[4*m+i][j] = 1;
}
}
}
}
//完成幅值细化扫描通道,若还有数据没有扫描,则进入清除通道扫描
init_environment(f,c,state_data_x);
for(j=0;j<BLOCKWIDTH;j++)
{
for(m=0;m<BLOCKLENGTH/4;m++)
{
for(i=0;i<4;i++)
{
if(!c[4*m+i][j] && (!state_data_pi[4*m+i][j]))
{
if(state_data_v[4*m+i][j])
{
printf("%d %d ",init_significant(f[4*m+i][j],0),state_data_v[4*m+i][j]);
if(state_data_v[4*m+i][j])
{
state_data_q[4*m+i][j] = 1;
// unsigned char init_sign(unsigned int f, unsigned char v,int i,int j)
printf("%d %d ",init_sign(f[4*m+i][j],state_data_x[4*m+i][j]),state_data_x[4*m+i][j]);
}
state_data_pi[4*m+i][j] = 1;
}
else
{
}
}
}
}
}
/*for(j=0;j<BLOCKWIDTH;j++)
{
for(i=0;i<BLOCKLENGTH/4;i++)
{
if(!c[4*i][j] && (!state_data_pi[4*i][j]) &&
!c[4*i+1][j] && (!state_data_pi[4*i+1][j]) &&
!c[4*i+2][j] && (!state_data_pi[4*i+2][j]) &&
!c[4*i+3][j] && (!state_data_pi[4*i+3][j]))
{
if(!(state_data_v[4*i][j] | state_data_v[4*i+1][j] |
state_data_v[4*i+2][j] | state_data_v[4*i+3][j]))
{
printf("%d %d ",17,0);
break;
}
}
for(m = 0;m<4;k++)
{
if(!c[4*i+m][j] && (!state_data_pi[4*i+m][j]))
{
if(state_data_v[4*i+m][j])
{
printf("%d %d ",17,1);
if(m == 0)
{
printf("%d %d ",18,0);
printf("%d %d ",18,0);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m][j]);
state_data_q[4*i+m][j] = 1;//重要性标志置1
// state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
//第二位开始编码
printf("%d %d ",0,state_data_v[4*i+m+1][j]);
if(state_data_v[4*i+m+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+1][j]);
state_data_q[4*i+m+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+1][j] = 1;//标志此位被访问过。
}
//第三位开始编码
printf("%d %d ",0,state_data_v[4*i+m+2][j]);
if(state_data_v[4*i+m+2][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+2][j]);
state_data_q[4*i+m+2][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+2][j] = 1;//标志此位被访问过。
}
//第四位开始编码
printf("%d %d ",0,state_data_v[4*i+m+3][j]);
if(state_data_v[4*i+m+3][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+3][j]);
state_data_q[4*i+m+3][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+3][j] = 1;//标志此位被访问过。
}
break;
}
if(m == 1)
{
printf("%d %d ",18,0);
printf("%d %d ",18,1);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m][j]);
state_data_q[4*i+m][j] = 1;//重要性标志置1
// state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
//第三位开始编码
printf("%d %d ",0,state_data_v[4*i+m+1][j]);
if(state_data_v[4*i+m+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+1][j]);
state_data_q[4*i+m+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+1][j] = 1;//标志此位被访问过。
}
//第四位开始编码
printf("%d %d ",0,state_data_v[4*i+m+2][j]);
if(state_data_v[4*i+m+2][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+2][j]);
state_data_q[4*i+m+2][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+2][j] = 1;//标志此位被访问过。
}
break;
}
if(m == 2)
{
printf("%d %d ",18,1);
printf("%d %d ",18,0);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m][j]);
state_data_q[4*i+m][j] = 1;//重要性标志置1
// state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
printf("%d %d ",0,state_data_v[4*i+m+1][j]);
if(state_data_v[4*i+m+1][j])
{
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m+1][j]);
state_data_q[4*i+m+1][j] = 1;//重要性标志置1
// state_data_pi[4*i+m+1][j] = 1;//标志此位被访问过。
}
break;
}
if(m == 3)
{
printf("%d %d ",18,1);
printf("%d %d ",18,1);
//此时将符号位元编码,有5种可能的情况(9-13)sign coding
// Encode sign bit
printf("%d %d ",9,state_data_x[4*i+m][j]);
state_data_q[4*i+m][j] = 1;//重要性标志置1
// state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
break;
}
}
}
}
}
}
*/
//到次为止完成三个通道的编码。
}
fclose(context);
}
void encode_allsubband(int block_bufferin[BLOCKLENGTH][BLOCKWIDTH],
float interleave[LENGTH+8][WIDTH+8])
{
int i,j,m=0,n=0;
int image_size = LENGTH*WIDTH;
int block_size = BLOCKLENGTH*BLOCKWIDTH;
int blocksample[4][4] =
{
{1,6,-5,0},
{4,1,7,-4},
{0,5,-2,-5},
{-3,4,-3,1}
};
// long int c[16][8];
//for(k=8;)
// for(m=0;m<2;m++)
// for(n=0;n<2;n++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -