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

📄 modified_decode_ebcot1.c

📁 这是我刚刚完成的关于JPEG2000的C语言实现的部分程序。小波变换是采用97变换
💻 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 + -