?? modified_decode_ebcot1.c
字號:
/******************************************************************************
功能描述:
Implements block_decode
以下部分是對EBCOT的解碼。三個通道。四種編碼形式
功能描述:編碼過程中,每個系數(shù)總處于三種狀態(tài)之一:無效態(tài),有效態(tài),上下文有效態(tài)
******************************************************************************/
/*****************************************************************************/
// 程序: 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;//顯著性狀態(tài)變量
// e;//延遲顯著性狀態(tài)變量 表示系數(shù)是否是第一次被量值改進(jìn),也叫細(xì)化信息位
// v;//樣本比特值
// pi;//編碼狀態(tài)變量 表示位平面上的比特值是否已經(jīng)被編碼,也叫訪問信息位
初始化所有狀態(tài)變量為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;
}
/******************************************************************************
//小波系數(shù)的預(yù)處理,完成三個功能:碼塊生成過程,數(shù)據(jù)格式轉(zhuǎn)換過程,碼塊最大值查
找過程
//求單個碼塊的最大值和把符號位提取出來給符號變量X;符號變換,補碼形式變成源碼形式
*******************************************************************************/
//開始解碼數(shù)據(jù)
k=0;
rewind(context);
printf("\n");
while(!feof(context))
{
k++;//位平面,執(zhí)行一次完成一個位平面的解碼
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
{//開始重要性掃描通道,處理當(dāng)前不顯著,但具有顯著鄰域的樣本
if(state_data_q[4*i][j]==0 && Cx>0)
{//當(dāng)前系數(shù)不是重要性系數(shù)
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;
//開始幅值細(xì)化通過,位平面的幅度細(xì)化掃描通道
if(state_data_q[4*i+m][j]==1 && state_data_pi[4*i+m][j]==0)
{//該系數(shù)是重要的,
//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);
}
//重要性傳播和幅值細(xì)化通過,開始清除通過
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;//重要性標(biāo)志置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;//標(biāo)志此位被訪問過。
//第二位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+1][j] = D;
// state_data_pi[4*i+m+1][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置1
}
//第三位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+2][j] = D;
// state_data_pi[4*i+m+2][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置1
}
//第四位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置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;//重要性標(biāo)志置1
//第三位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+2][j] = D;
// state_data_pi[4*i+m+2][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置1
}
//第四位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置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;//重要性標(biāo)志置1
//第四位開始編碼
fscanf(context,"%d %d ",&Cx,&D);
state_data_v[4*i+3][j] = D;
// state_data_pi[4*i+m+3][j] = 1;//標(biāo)志此位被訪問過。
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;//重要性標(biāo)志置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;//重要性標(biāo)志置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)
{//當(dāng)前系數(shù)不是重要性系數(shù)
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -