📄 ztscan_dec.cpp
字号:
/* $Id: ztscan_dec.cpp,v 1.3 2001/04/30 20:51:45 dmackie Exp $ */
/****************************************************************************/
/* MPEG4 Visual Texture Coding (VTC) Mode Software */
/* */
/* This software was jointly developed by the following participants: */
/* */
/* Single-quant, multi-quant and flow control */
/* are provided by Sarnoff Corporation */
/* Iraj Sodagar (iraj@sarnoff.com) */
/* Hung-Ju Lee (hjlee@sarnoff.com) */
/* Paul Hatrack (hatrack@sarnoff.com) */
/* Shipeng Li (shipeng@sarnoff.com) */
/* Bing-Bing Chai (bchai@sarnoff.com) */
/* B.S. Srinivas (bsrinivas@sarnoff.com) */
/* */
/* Bi-level is provided by Texas Instruments */
/* Jie Liang (liang@ti.com) */
/* */
/* Shape Coding is provided by OKI Electric Industry Co., Ltd. */
/* Zhixiong Wu (sgo@hlabs.oki.co.jp) */
/* Yoshihiro Ueda (yueda@hlabs.oki.co.jp) */
/* Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp) */
/* */
/* OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream */
/* exchange and bug fixing. */
/* */
/* */
/* In the course of development of the MPEG-4 standard, this software */
/* module is an implementation of a part of one or more MPEG-4 tools as */
/* specified by the MPEG-4 standard. */
/* */
/* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use */
/* of the MPEG-4 standard free license to use this software module or */
/* modifications thereof for hardware or software products claiming */
/* conformance to the MPEG-4 standard. */
/* */
/* Those intending to use this software module in hardware or software */
/* products are advised that use may infringe existing patents. The */
/* original developers of this software module and their companies, the */
/* subsequent editors and their companies, and ISO/IEC have no liability */
/* and ISO/IEC have no liability for use of this software module or */
/* modification thereof in an implementation. */
/* */
/* Permission is granted to MPEG members to use, copy, modify, */
/* and distribute the software modules ( or portions thereof ) */
/* for standardization activity within ISO/IEC JTC1/SC29/WG11. */
/* */
/* Copyright 1995, 1996, 1997, 1998 ISO/IEC */
/****************************************************************************/
/************************************************************/
/* Sarnoff Very Low Bit Rate Still Image Coder */
/* Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
/************************************************************/
/************************************************************/
/* Filename: ztscan_dec.c */
/* Author: Bing-Bing CHai */
/* Date: Dec. 17, 1997 */
/* */
/* Descriptions: */
/* This file contains the routines that performs */
/* zero tree scanning and entropy decoding. */
/* */
/************************************************************/
#include <stdio.h>
#include <stdlib.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include <ctype.h>
#include <string.h>
#include <math.h>
#include "basic.hpp"
#include "Utils.hpp"
#include "startcode.hpp"
#include "dataStruct.hpp"
#include "states.hpp"
#include "globals.hpp"
#include "errorHandler.hpp"
#include "ac.hpp"
#include "bitpack.hpp"
//#include "context.hpp"
#include "ztscan_common.hpp"
#include "ztscanUtil.hpp"
static ac_decoder acd;
/******************************************************************/
/**************************** DC ********************************/
/******************************************************************/
/*******************************************************/
/************** Inverse DC Prediction ****************/
/*******************************************************/
/********************************************************
Function Name
-------------
static DATA iDC_pred_pix(Int i, Int j)
Arguments
---------
Int i, Int j: Index of wavelet coefficient (row, col)
Description
-----------
Inverse DPCM prediction for a DC coefficient, refer
to syntax for algorithm.
Functions Called
----------------
None.
Return Value
------------
inverse prediction for coeffinfo[i][j].quantized_value
********************************************************/
Short CVTCDecoder::iDC_pred_pix(Int i, Int j)
{
/* modified by Z. Wu @ OKI */
Int pred_i, pred_j, pred_d;
if ( i==0 || coeffinfo[i-1][j].mask == 0 )
pred_i = 0;
else
pred_i = coeffinfo[i-1][j].quantized_value;
if ( j==0 || coeffinfo[i][j-1].mask == 0 )
pred_j = 0;
else
pred_j = coeffinfo[i][j-1].quantized_value;
if ( i==0 || j== 0 || coeffinfo[i-1][j-1].mask == 0 )
pred_d = 0;
else
pred_d = coeffinfo[i-1][j-1].quantized_value;
if ( abs(pred_d-pred_j) < abs(pred_d-pred_i))
return(pred_i);
else
return(pred_j);
}
/*****************************************************
Function Name
-------------
Void iDC_predict()
Arguments
---------
None
Description
-----------
control program for inverse DC prediction
Functions Called
----------------
iDC_pred_pix(i,j).
Return Value
------------
none
******************************************************/
Void CVTCDecoder::iDC_predict(Int color)
{
Int i,j,dc_h,dc_w,offset_dc;
dc_h=mzte_codec.m_iDCHeight;
dc_w=mzte_codec.m_iDCWidth;
coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
offset_dc=mzte_codec.m_iOffsetDC;
for(i=0;i<dc_h;i++)
for(j=0;j<dc_w;j++)
if (coeffinfo[i][j].mask != 0)
coeffinfo[i][j].quantized_value += offset_dc;
for(i=0;i<dc_h;i++)
for(j=0;j<dc_w;j++)
if (coeffinfo[i][j].mask != 0)
coeffinfo[i][j].quantized_value+=iDC_pred_pix(i,j);
}
/********************************************************
Function Name
-------------
Void wavelet_dc_decode(Int c)
Arguments
---------
Int c - color component.
Description
-----------
Control program for decode DC information for one
color component.
Functions Called
----------------
None.
iDC_predict()
get_param()
cacll_decode()
Return Value
------------
None.
********************************************************/
Void CVTCDecoder::wavelet_dc_decode(Int c)
{
noteDetail("Decoding DC (wavelet_dc_decode)....");
color=c;
mzte_codec.m_iMean[color] = get_X_bits(8);
/* mzte_codec.m_iQDC[color] = get_X_bits(8); */
mzte_codec.m_iQDC[color] = get_param(7);
mzte_codec.m_iOffsetDC=-get_param(7);
mzte_codec.m_iMaxDC=get_param(7);
/* mzte_codec.m_iMaxDC=get_param(7)-mzte_codec.m_iOffsetDC; */ /* hjlee */
callc_decode();
iDC_predict(color);
noteDetail("Completed decoding DC.");
}
/********************************************************
Function Name
-------------
static Void cacll_decode()
Arguments
---------
None.
Description
-----------
Decode DC information for one color component.
Functions Called
----------------
mzte_ac_decoder_init()
mzte_ac_model_init()
mzte_ac_decode_symbol()
mzte_ac_model_done()
mzte_ac_decoder_done()
Return Value
------------
None.
********************************************************/
Void CVTCDecoder::callc_decode()
{
Int dc_h, dc_w,i,j;
Int numBP, bp; // 1127
dc_w=mzte_codec.m_iDCWidth;
dc_h=mzte_codec.m_iDCHeight;
/* init arithmetic model */
/* ac_decoder_open(acd,NULL); */
mzte_ac_decoder_init(&acd);
// 1127
numBP = ceilLog2(mzte_codec.m_iMaxDC + 1);
if ((acm_bpdc=(ac_model *)calloc(numBP,sizeof(ac_model)))==NULL)
errorHandler("Can't allocate memory for prob model.");
for (i=0; i<numBP; i++) {
acm_bpdc[i].Max_frequency = Bitplane_Max_frequency;
mzte_ac_model_init(&(acm_bpdc[i]),2,NULL,ADAPT,1);
}
coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
for (bp=numBP-1; bp>=0; bp--) {
for(i=0;i<dc_h;i++)
for(j=0;j<dc_w;j++){
if(coeffinfo[i][j].mask == 1)
coeffinfo[i][j].quantized_value +=
(mzte_ac_decode_symbol(&acd,&(acm_bpdc[bp])) << bp);
else
coeffinfo[i][j].quantized_value=-mzte_codec.m_iOffsetDC;
}
}
for (i=0; i<numBP; i++)
mzte_ac_model_done(&(acm_bpdc[i]));
free(acm_bpdc);
#if 0 // 1127
if ((acm_vz=(ac_model *)calloc(1,sizeof(ac_model)))==NULL)
errorHandler("Can't allocate memory for prob model.");
acm_vz->Max_frequency = DEFAULT_MAX_FREQ;
mzte_ac_model_init(acm_vz,mzte_codec.m_iMaxDC+1,NULL,ADAPT,1);
coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
for(i=0;i<dc_h;i++)
for(j=0;j<dc_w;j++){
if( coeffinfo[i][j].mask == 1)
coeffinfo[i][j].quantized_value=
mzte_ac_decode_symbol(&acd,acm_vz);
else
coeffinfo[i][j].quantized_value=-mzte_codec.m_iOffsetDC;
}
/* close arithmetic coder */
mzte_ac_model_done(acm_vz);
free(acm_vz);
#endif // 1127
mzte_ac_decoder_done(&acd);
}
/*********************************************************************/
/***************************** AC **********************************/
/************************* Single quant ****************************/
/*********************************************************************/
Int CVTCDecoder::bitplane_decode(Int l,Int max_bplane)
{
register Int i,val=0,k=0;
for(i=max_bplane-1;i>=0;i--,k++)
val+=mzte_ac_decode_symbol(&acd,&acm_bpmag[l][k])<<i;
return val;
}
/*******************************************************
The following single quant routines are for band by
band scan order.
*******************************************************/
/********************************************************
Function Name
-------------
Void wavelet_higher_bands_decode_SQ_band(Int col)
Arguments
---------
None.
Description
-----------
Control program for decoding AC information for one
color component. Single quant mode.
Functions Called
----------------
cachb_encode_SQ_band()
ac_encoder_init()
mzte_ac_model_init()
mzte_ac_model_done()
ac_encoder_done()
Return Value
------------
None.
********************************************************/
Void CVTCDecoder::wavelet_higher_bands_decode_SQ_band(Int col)
{
SNR_IMAGE *snr_image;
noteDetail("Encoding AC (wavelet_higher_bands_encode_SQ)....");
color=col;
snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
/* init arithmetic coder */
mzte_ac_decoder_init(&acd);
probModelInitSQ(color); // hjlee 0901
cachb_decode_SQ_band(snr_image);
probModelFreeSQ(color); // hjlee 0901
mzte_ac_decoder_done(&acd);
noteDetail("Completed encoding AC.");
}
/********************************************************
Function Name
-------------
static Void cachb_decode_SQ_band(SNR_IMAGE *snr_img)
Arguments
---------
None.
Description
-----------
Decode AC information for single quant mode, tree-depth scan.
Functions Called
----------------
codeBlocks();
decode_pixel_SQ_band()
Return Value
------------
None.
********************************************************/
Void CVTCDecoder::cachb_decode_SQ_band(SNR_IMAGE *snr_image)
{
Int h,w,ac_h,ac_w,ac_h2,ac_w2;
Int n; /* layer index - for codeBlocks function */
Int k; /* block jump for the layer */
/* ac_h, ac_w init */
ac_h2=mzte_codec.m_SPlayer[color].height;;
ac_w2=mzte_codec.m_SPlayer[color].width;
ac_h=ac_h2>>1;
ac_w=ac_w2>>1;
height=mzte_codec.m_Image[color].height;
width=mzte_codec.m_Image[color].width;
/* Get layer index - for codeBlocks function */
n = -1;
for (w=mzte_codec.m_iDCWidth; w < ac_w2; w<<=1)
n++;
setProbModelsSQ(color); // hjlee 0901
coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
/* scan each coefficients in the spatial layer */
k = 1<<n;
for(h=0;h<ac_h;h+=k)
for(w=ac_w;w<ac_w2;w+=k)
{
/* LH */
decodeSQBlocks(h,w,n);
/* HL */
h += ac_h;
w -= ac_w;
decodeSQBlocks(h,w,n);
/* HH */
w += ac_w;
decodeSQBlocks(h,w,n);
/* Set h back to where it started. w is already there */
h -= ac_h;
}
}
#if 0
/********************************************************
Function Name
-------------
static Void decode_pixel_SQ_band(Int h,Int w)
Arguments
---------
Int h,Int w - position of a pixel in height and width
Description
-----------
Decoding the type and/or value of a coefficient, a
recursive function.
Functions Called
----------------
mag_sign_decode_SQ()
mzte_ac_decode_symbol()
Return Value
------------
None.
********************************************************/
Void CVTCDecoder::decode_pixel_SQ_band(Int h,Int w)
{
UChar zt_type;
Int l;
if(coeffinfo[h][w].type == ZTR_D)
return;
l=xy2wvtDecompLev(w,h);
/* decode leave coefficients, value only */
if(IS_STATE_LEAF(coeffinfo[h][w].state)){ /* zero value. no sign */
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1)
{
#endif
/* Map leaf code word to type 0->ZTR, 1->VZTR */
coeffinfo[h][w].type =
mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LINIT]) ? VZTR : ZTR;
if (coeffinfo[h][w].type==VZTR)
mag_sign_decode_SQ(h,w);
else
coeffinfo[h][w].quantized_value = 0;
#ifdef _SHAPE_
}
else
coeffinfo[h][w].quantized_value = 0;
#endif
return;
}
/* decode zero tree symbols */
#ifdef _SHAPE_
if(coeffinfo[h][w].mask==1)
#endif
coeffinfo[h][w].type=zt_type=
mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_INIT]);
#ifdef _SHAPE_
else
coeffinfo[h][w].type=zt_type = IZ;
#endif
/* code magnitude and sign */
switch(zt_type){
case IZ :
break;
case VZTR:
mag_sign_decode_SQ(h,w);
case ZTR:
mark_ZTR_D(h,w); /* necessary for checking purpose bandwise scan */
return;
case VAL:
mag_sign_decode_SQ(h,w);
break;
default:
errorHandler("Invalid zerotree symbol in single quant decode");
}
}
#endif /* 0 */
/*******************************************************
The following single quant routines are for tree
depth scan order.
*******************************************************/
/********************************************************
Function Name
-------------
Void wavelet_higher_bands_decode_SQ_tree()
Arguments
---------
None.
Description
-----------
Control program for decoding AC information for single quant mode.
All colors decoded.
Functions Called
----------------
cachb_decode_SQ_tree()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -