📄 vtcdec.cpp
字号:
/****************************************************************************/
/* 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 */
/************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#ifdef _VTC_DECODER_
#define DEFINE_GLOBALS
#endif
#include "basic.hpp"
#include "dataStruct.hpp"
#include "startcode.hpp"
#include "bitpack.hpp"
#include "msg.hpp"
#include "globals.hpp"
extern FILTER DefaultSynthesisFilterInt;
extern FILTER DefaultSynthesisFilterDbl;
CVTCDecoder::CVTCDecoder()
{
m_cInBitsFile = new Char [80];
m_cRecImageFile = new Char [80];
}
CVTCDecoder::~CVTCDecoder()
{
delete m_cInBitsFile;
delete m_cRecImageFile;
}
void CVTCCommon::getSpatialLayerDims()
{
Int i, shift;
/* Calc widths and heights for all spatial layers */
for (i=0; i<mzte_codec.m_iSpatialLev; ++i)
{
shift=mzte_codec.m_iWvtDecmpLev-mzte_codec.m_lastWvtDecompInSpaLayer[i][0]-1;
mzte_codec.m_spaLayerWidth[i][0]=mzte_codec.m_iWidth>>shift;
mzte_codec.m_spaLayerHeight[i][0]=mzte_codec.m_iHeight>>shift;
if (mzte_codec.m_lastWvtDecompInSpaLayer[i][1]<0)
{
mzte_codec.m_spaLayerWidth[i][1]=mzte_codec.m_iDCWidth;
mzte_codec.m_spaLayerHeight[i][1]=mzte_codec.m_iDCHeight;
}
else
{
shift=mzte_codec.m_iWvtDecmpLev-mzte_codec.m_lastWvtDecompInSpaLayer[i][1]-1;
mzte_codec.m_spaLayerWidth[i][1]=mzte_codec.m_iWidth>>shift;
mzte_codec.m_spaLayerHeight[i][1]=mzte_codec.m_iHeight>>shift;
}
if (mzte_codec.m_lastWvtDecompInSpaLayer[i][2]<0)
{
mzte_codec.m_spaLayerWidth[i][2]=mzte_codec.m_iDCWidth;
mzte_codec.m_spaLayerHeight[i][2]=mzte_codec.m_iDCHeight;
}
else
{
shift=mzte_codec.m_iWvtDecmpLev-mzte_codec.m_lastWvtDecompInSpaLayer[i][2]-1;
mzte_codec.m_spaLayerWidth[i][2]=mzte_codec.m_iWidth>>shift;
mzte_codec.m_spaLayerHeight[i][2]=mzte_codec.m_iHeight>>shift;
}
}
}
void CVTCCommon::setSpatialLayerDimsSQ(Int band)
{
/* added for compatability for new MQ spatial layer flexability - ph 7/16 */
Int i;
if (band) /* BAND - wvtDecompLev spatial layers */
{
for (i=0; i<mzte_codec.m_iWvtDecmpLev; ++i)
{
mzte_codec.m_lastWvtDecompInSpaLayer[i][0] = i;
mzte_codec.m_lastWvtDecompInSpaLayer[i][1]
=mzte_codec.m_lastWvtDecompInSpaLayer[i][2] = i-1;
}
mzte_codec.m_iSpatialLev=mzte_codec.m_iWvtDecmpLev;
}
else /* TREE - 1 spatial layer */
{
mzte_codec.m_lastWvtDecompInSpaLayer[0][0] = mzte_codec.m_iWvtDecmpLev-1;
mzte_codec.m_lastWvtDecompInSpaLayer[0][1]
=mzte_codec.m_lastWvtDecompInSpaLayer[0][2] = mzte_codec.m_iWvtDecmpLev-2;
mzte_codec.m_iSpatialLev=1;
}
getSpatialLayerDims();
}
/* Number of bitplanes required to x different values
(i.e. all values in {0,1, ...,x-1} */
Int CVTCCommon::ceilLog2(Int x)
{
Int i;
for (i=0; x > (1<<i); ++i)
;
return i;
}
// begin: added by Sharp (99/4/7)
Void CVTCDecoder::texture_packet_header_Dec(FILTER ***wvtfilter, PICTURE **Image, Int *header_size)
{
Int wavelet_uniform=1; // hjlee 0901
align_byte();
if(!mzte_codec.m_usErrResiDisable){
prev_TU_first = prev_TU_last = prev_TU_err = -1;
TU_first = TU_last = TU_max = TU_max_dc = 0;
get_err_resilience_header();
if (TU_first != 0)
errorHandler("Reading incorrect TU_first in the first packet.\n");
if (get_X_bits(1) != 1)
errorHandler("Reading incorrect HEC in the first packet.\n");
if (mzte_codec.m_iScanDirection==1) /* BB */
;
else
set_prev_good_TD_segment(-1,0,0);
}
header_Dec_Common(wvtfilter, Image, header_size, 1);
if(!mzte_codec.m_usErrResiDisable){
mzte_codec.m_usSegmentThresh=get_X_bits(16);
get_X_bits(1); // added for FDAM1 by Samsung AIT on 2000/02/03
}
}
// end: added by Sharp (99/4/7)
// hjlee 0901
Void CVTCDecoder::header_Dec_V1(FILTER ***wvtfilter, PICTURE **Image)
{
Int texture_object_id;
Int marker_bit;
Int wavelet_download;
Int texture_object_layer_shape;
Int wavelet_stuffing;
Int still_texture_object_start_code;
Int i; // hjlee 0901
FILTER **filters; // hjlee 0901
Int wavelet_uniform=1; // hjlee 0901
Int wavelet_type; // hjlee 0901
still_texture_object_start_code = get_X_bits(32);
if (still_texture_object_start_code != STILL_TEXTURE_OBJECT_START_CODE)
errorHandler("Wrong texture_object_layer_start_code.");
texture_object_id = get_X_bits(16);
marker_bit = get_X_bits(1);
// hjlee 0901
// wvtfilter->DWT_Type = get_X_bits(1);
// wavelet_download = get_X_bits(1);
mzte_codec.m_iWvtType = wavelet_type = get_X_bits(1); // hjlee 0901
wavelet_download= mzte_codec.m_iWvtDownload = get_X_bits(1); // hjlee 0901
mzte_codec.m_iWvtDecmpLev = get_X_bits(4); // hjlee 0901
mzte_codec.m_iScanDirection=get_X_bits(1);
mzte_codec.m_bStartCodeEnable = get_X_bits(1);
// mzte_codec.m_iWvtDecmpLev = get_X_bits(8); // hjlee 0901
texture_object_layer_shape = get_X_bits(2);
mzte_codec.m_iQuantType = get_X_bits(2);
if (mzte_codec.m_iQuantType==2) /* MQ */
{
Int i;
mzte_codec.m_iSpatialLev = get_X_bits(4);
/* Get/Calc number decomp layers for all spatial layers */
if (mzte_codec.m_iSpatialLev == 1)
{
mzte_codec.m_lastWvtDecompInSpaLayer[0][0]=mzte_codec.m_iWvtDecmpLev-1;
}
else if (mzte_codec.m_iSpatialLev != mzte_codec.m_iWvtDecmpLev)
{
mzte_codec.m_defaultSpatialScale = get_X_bits(1);
if (mzte_codec.m_defaultSpatialScale==0)
{
/* Fill in the luma componant of lastWvtDecompInSpaLayer. */
for (i=0; i<mzte_codec.m_iSpatialLev-1; ++i)
mzte_codec.m_lastWvtDecompInSpaLayer[i][0]=get_X_bits(4);
mzte_codec.m_lastWvtDecompInSpaLayer\
[mzte_codec.m_iSpatialLev-1][0]
=mzte_codec.m_iWvtDecmpLev-1;
}
else
{
Int sp0;
sp0=mzte_codec.m_iWvtDecmpLev-mzte_codec.m_iSpatialLev;
mzte_codec.m_lastWvtDecompInSpaLayer[0][0]=sp0;
for (i=1; i<mzte_codec.m_iSpatialLev; ++i)
mzte_codec.m_lastWvtDecompInSpaLayer[i][0]=sp0+i;
}
}
else
{
for (i=0; i<mzte_codec.m_iSpatialLev; ++i)
mzte_codec.m_lastWvtDecompInSpaLayer[i][0]=i;
}
/* Calculate for chroma (one less than luma) */
for (i=0; i<mzte_codec.m_iSpatialLev; ++i)
mzte_codec.m_lastWvtDecompInSpaLayer[i][1]
=mzte_codec.m_lastWvtDecompInSpaLayer[i][2]
=mzte_codec.m_lastWvtDecompInSpaLayer[i][0]-1;
}
// hjlee 0901
filters = (FILTER **)malloc(sizeof(FILTER *)*mzte_codec.m_iWvtDecmpLev);
if(filters==NULL)
errorHandler("Memory allocation error\n");
if (wavelet_download == 1) {
mzte_codec.m_iWvtUniform=wavelet_uniform = get_X_bits(1);
if(wavelet_uniform) {
download_wavelet_filters(&(filters[0]), wavelet_type);
}
else {
for(i=0;i< mzte_codec.m_iWvtDecmpLev; i++) {
download_wavelet_filters(&(filters[mzte_codec.m_iWvtDecmpLev-1-i]), wavelet_type);
}
}
}
else if(wavelet_type==0){
mzte_codec.m_iWvtType = 0;
filters[0]=&DefaultSynthesisFilterInt;
}
else{
mzte_codec.m_iWvtType = 1;
filters[0]=&DefaultSynthesisFilterDbl;
}
if(wavelet_uniform) {
for(i=1;i< mzte_codec.m_iWvtDecmpLev; i++) {
filters[i] = filters[0];
}
}
*wvtfilter = filters;
wavelet_stuffing = get_X_bits(3);
if (texture_object_layer_shape==0) {
mzte_codec.m_iAlphaChannel = 0;
mzte_codec.m_iWidth = get_X_bits(15);
marker_bit = get_X_bits(1);
mzte_codec.m_iHeight = get_X_bits(15);
marker_bit = get_X_bits(1);
}
else { /* Arbitrary shape header */
mzte_codec.m_iAlphaChannel = 1;
mzte_codec.m_iOriginX = get_X_bits(15);
marker_bit = get_X_bits(1);
mzte_codec.m_iOriginY = get_X_bits(15);
marker_bit = get_X_bits(1);
mzte_codec.m_iWidth = get_X_bits(15);
marker_bit = get_X_bits(1);
mzte_codec.m_iHeight = get_X_bits(15);
marker_bit = get_X_bits(1);
mzte_codec.m_iRealWidth = mzte_codec.m_iWidth;
mzte_codec.m_iRealHeight = mzte_codec.m_iHeight;
}
/* decode the shape info from bitstream */
if(mzte_codec.m_iAlphaChannel)
noteProgress("Decoding Shape Information...");
*Image = (PICTURE *)malloc(sizeof(PICTURE)*3);
get_virtual_mask_V1(*Image, mzte_codec.m_iWvtDecmpLev,
mzte_codec.m_iWidth, mzte_codec.m_iHeight,
mzte_codec.m_iAlphaChannel, mzte_codec.m_iColors,
filters);
}
// begin: modified by Sharp (99/2/16)
// hjlee 0901
Void CVTCDecoder::header_Dec(FILTER ***wvtfilter, PICTURE **Image, Int *header_size)
{
//Int texture_object_id;
Int marker_bit;
//Int wavelet_download;
//Int texture_object_layer_shape;
//Int wavelet_stuffing;
Int still_texture_object_start_code;
//Int i; // hjlee 0901
//FILTER **filters; // hjlee 0901
Int wavelet_uniform=1; // hjlee 0901
//Int wavelet_type; // hjlee 0901
Int h_size = 0;
still_texture_object_start_code = get_X_bits(32);
if (still_texture_object_start_code != STILL_TEXTURE_OBJECT_START_CODE)
errorHandler("Wrong texture_object_layer_start_code.");
h_size += 32;
mzte_codec.m_tiling_disable = get_X_bits(1);
h_size += 1;
// This part is moved to texture_packet_header_Dec()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -