📄 vtcenc.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>
#include <assert.h>
// begin: added by Sharp (99/2/16)
#include <iostream.h>
#include <sys/stat.h>
// end: added by Sharp (99/2/16)
#define DEFINE_GLOBALS
#include "basic.hpp"
#include "dataStruct.hpp"
#include "startcode.hpp"
#include "bitpack.hpp"
#include "msg.hpp"
#include "globals.hpp"
#include "states.hpp" // hjlee 0901
CVTCEncoder::CVTCEncoder()
{
m_cImagePath = new Char[80];
m_cSegImagePath = new Char[80];
m_cOutBitsFile = new Char[80];
mzte_codec.m_cBitFile = new Char[80];
}
CVTCEncoder::~CVTCEncoder()
{
delete m_cImagePath;
delete m_cSegImagePath;
delete m_cOutBitsFile;
delete mzte_codec.m_cBitFile;
}
//CVTCEncoder::CVTCEncoder(
Void CVTCEncoder::init(
UInt uiVerID, // added by Sharp (99/11/18)
Char* cImagePath,
UInt uiAlphaChannel,
Char* cSegImagePath,
UInt uiAlphaTh,
UInt uiChangeCRDisable,
// FPDAM begin: deleted by Sharp
// UInt uiShapeScalable, //added by SL@Sarnoff (03/02/99)
// FPDAM end: deleted by Sharp
UInt uiSTOConstAlpha, //added by SL@Sarnoff (03/03/99)
UInt uiSTOConstAlphaValue, //added by SL@Sarnoff (03/02/99)
Char* cOutBitsFile,
UInt uiColors,
UInt uiFrmWidth,
UInt uiFrmHeight,
// begin: added by Sharp (99/2/16)
UInt uiTilingDisable,
UInt uiTilingJump,
UInt uiTileWidth,
UInt uiTileHeight,
// end: added by Sharp (99/2/16)
UInt uiWvtType,
UInt uiWvtDownload, // hjlee 0901
UInt uiWvtDecmpLev,
UInt uiWvtUniform, // hjlee 0901
Int* iWvtFilters, // hjlee 0901
UInt uiQuantType,
UInt uiScanDirection,
Bool bStartCodeEnable,
UInt uiTargetSpatialLev,
UInt uiTargetSNRLev,
UInt uiTargetShapeLev, //added by SL@Sarnoff (03/02/99)
UInt uiFullSizeOut, //added by SL@Sarnoff (03/02/99)
// begin: added by Sharp (99/2/16)
UInt uiTargetTileFrom,
UInt uiTargetTileTo,
// end: added by Sharp (99/2/16)
UInt uiQdcY,
UInt uiQdcUV,
UInt uiSpatialLev ,
UInt defaultSpatialScale, // hjlee 0901
Int lastWvtDecompInSpaLayer[MAXDECOMPLEV], // hjlee 0901
SNR_PARAM* Qinfo[],
//Added by Sarnoff for error resilience, 3/5/99
Int uiErrResiDisable, //bbc, 2/19/99
Int uiPacketThresh,
Int uiSegmentThresh
//End: Added by Sarnoff for error resilience, 3/5/99
)
{
// input/output
mzte_codec.m_visual_object_verid = uiVerID; // added by Sharp(99/11/18)
strcpy(m_cImagePath,cImagePath);
strcpy(m_cSegImagePath,cSegImagePath);
strcpy(m_cOutBitsFile,cOutBitsFile);
strcpy(mzte_codec.m_cBitFile,cOutBitsFile);
mzte_codec.m_iAlphaChannel = (int)uiAlphaChannel;
mzte_codec.m_iAlphaTh = (int)uiAlphaTh;
mzte_codec.m_iChangeCRDisable = (int)uiChangeCRDisable;
//begin: added by SL@Sarnoff (03/02/99)
// FPDAM begin: modified by Sharp
mzte_codec.m_iShapeScalable = 1; // (int)uiShapeScalable;
// FPDAM end: modified by Sharp
STO_const_alpha=mzte_codec.m_iSTOConstAlpha = (int)uiSTOConstAlpha;
STO_const_alpha_value=mzte_codec.m_iSTOConstAlphaValue = (int)uiSTOConstAlphaValue;
//end: added by SL@Sarnoff (03/02/99)
mzte_codec.m_iBitDepth = 8;
mzte_codec.m_iColorFormat = 0;
mzte_codec.m_iColors = (int)uiColors;
mzte_codec.m_iWidth = (int)uiFrmWidth;
mzte_codec.m_iHeight = (int)uiFrmHeight;
mzte_codec.m_iWvtType = (int)uiWvtType;
mzte_codec.m_iWvtDecmpLev = (int)uiWvtDecmpLev;
mzte_codec.m_iQuantType = (int)uiQuantType;
mzte_codec.m_iScanDirection = (int)uiScanDirection;
mzte_codec.m_bStartCodeEnable = bStartCodeEnable;
mzte_codec.m_iSpatialLev = (int)uiSpatialLev;
mzte_codec.m_iTargetSpatialLev = (int)uiTargetSpatialLev;
mzte_codec.m_iTargetSNRLev = (int)uiTargetSNRLev;
// begin: added by SL@Sarnoff (03/02/99)
mzte_codec.m_iTargetShapeLev = (int) uiTargetShapeLev;
mzte_codec.m_iFullSizeOut = (int)uiFullSizeOut;
// end: added by SL@Sarnoff (03/02/99)
// begin: added by Sharp (99/2/16)
mzte_codec.m_tiling_disable = (int)uiTilingDisable;
mzte_codec.m_tiling_jump_table_enable = (int)uiTilingJump;
mzte_codec.m_tile_width = (int)uiTileWidth;
mzte_codec.m_tile_height = (int)uiTileHeight;
mzte_codec.m_target_tile_id_from = (int)uiTargetTileFrom;
mzte_codec.m_target_tile_id_to = (int)uiTargetTileTo;
// end: added by Sharp (99/2/16)
mzte_codec.m_iWvtDownload = (int)uiWvtDownload; // hjlee 0901
mzte_codec.m_iWvtUniform = (int)uiWvtUniform;// hjlee 0901
mzte_codec.m_WvtFilters = (int *)iWvtFilters; // hjlee 0901
mzte_codec.m_defaultSpatialScale = (int)defaultSpatialScale; // hjlee 0901
if (uiQuantType == 2) {
if (uiSpatialLev != uiWvtDecmpLev) {
/* read in usedefault */
mzte_codec.m_defaultSpatialScale=(int)defaultSpatialScale;
if (defaultSpatialScale==0) {
int spa_lev;
/* read in spatial layer info */
for (spa_lev=0; spa_lev<(int)uiSpatialLev-1; ++spa_lev)
mzte_codec.m_lastWvtDecompInSpaLayer[spa_lev][0]
= lastWvtDecompInSpaLayer[spa_lev];
}
}
}
for (int i=0; i<(int)uiColors; i++)
mzte_codec.m_Qinfo[i] = Qinfo[i];
mzte_codec.m_iQDC[0] = (int)uiQdcY;
mzte_codec.m_iQDC[1] = mzte_codec.m_iQDC[2] = (int)uiQdcUV;
/* mzte_codec.m_iDCWidth = GetDCWidth();
mzte_codec.m_iDCHeight = GetDCHeight(); */ //deleted by SL 030499
mzte_codec.m_iSingleBitFile = 1;
// mzte_codec.m_cBitFile = NULL;
mzte_codec.m_cBitFileAC = NULL;
// check parameter
if (mzte_codec.m_iQuantType==1 && mzte_codec.m_iScanDirection==0)
mzte_codec.m_bStartCodeEnable = 0;
//Added by Sarnoff for error resilience, 3/5/99
//disable startcode in error resilience case
if((mzte_codec.m_usErrResiDisable=(UShort)uiErrResiDisable)==0)
mzte_codec.m_bStartCodeEnable=0;
mzte_codec.m_usPacketThresh=(UShort)uiPacketThresh;
mzte_codec.m_usSegmentThresh=(UShort)uiSegmentThresh;
//End: Added by Sarnoff for error resilience, 3/5/99
}
/*******************************************************/
/* Flush buffer and close file. Only and must be used */
/* by encoder to close bitstream file */
/*******************************************************/
Void CVTCEncoder::flush_buffer_file()
{
flush_bits();
flush_bytes();
}
Void CVTCEncoder::close_buffer_file(FILE *fp)
{
flush_buffer_file();
fclose(fp);
}
Void CVTCEncoder::texture_packet_header_Enc(FILTER **wvtfilter) // hjlee 0901
{
Int texture_object_id=0;
Int texture_object_layer_shape=mzte_codec.m_iAlphaChannel;
Int wavelet_stuffing = 0x0f;
// Int wavelet_upload;
// Int wavelet_uniform; // hjlee 0901
long tile_table_position=0;
if(!mzte_codec.m_usErrResiDisable){
flush_bits(); // added by Sharp(99/3/29)
texture_object_id=1<<15; // error resilience
prev_TU_first = prev_TU_last = prev_TU_err = -1;
flush_bytes(); // to get alignment in buffer
emit_bits((UShort)1,2); // 1st bit dummy, 2nd bit HEC=1
packet_size=0;
}
//End: Added by Sarnoff for error resilience, 3/5/99
header_Enc_Common( wvtfilter ,1);
//Added by Sarnoff for error resilience, 3/5/99
if(!mzte_codec.m_usErrResiDisable) {
emit_bits((UShort)mzte_codec.m_usSegmentThresh,16);
emit_bits((UShort)MARKER_BIT, 1); // added for FDAM1 by Samsung AIT on 2000/02/03
}
//End: Added by Sarnoff for error resilience, 3/5/99
}
Void CVTCEncoder::header_Enc_V1(FILTER **wvtfilter) // hjlee 0901
{
Int texture_object_id=0;
Int texture_object_layer_shape=mzte_codec.m_iAlphaChannel;
Int wavelet_stuffing = 0x0f;
// Int wavelet_upload;
Int wavelet_uniform; // hjlee 0901
Int i; // hjlee 0901
/*------- Write header info to bitstream file -------*/
emit_bits((UShort)(STILL_TEXTURE_OBJECT_START_CODE>>16), 16);
emit_bits((UShort)STILL_TEXTURE_OBJECT_START_CODE, 16);
emit_bits((UShort)texture_object_id, 16);
emit_bits((UShort)MARKER_BIT, 1);
emit_bits((UShort)(mzte_codec.m_iWvtType==0?0:1), 1); // hjlee 0901
emit_bits((UShort)mzte_codec.m_iWvtDownload, 1); // hjlee 0901
emit_bits((UShort)mzte_codec.m_iWvtDecmpLev, 4); // hjlee 0901
emit_bits((UShort)mzte_codec.m_iScanDirection,1);
emit_bits((UShort)mzte_codec.m_bStartCodeEnable, 1);
emit_bits((UShort)texture_object_layer_shape, 2);
emit_bits((UShort)mzte_codec.m_iQuantType, 2);
/* hjlee 0901 */
if (mzte_codec.m_iQuantType==2) {
Int i;
emit_bits((UShort)mzte_codec.m_iSpatialLev, 4);
/* 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)
{
emit_bits((UShort)mzte_codec.m_defaultSpatialScale, 1);
if (mzte_codec.m_defaultSpatialScale==0)
{
/* For the 1st spatial_scalability_levels-1 layers the luma componant
of lastWvtDecompInSpaLayer should have been filled in from the
parameter file. */
for (i=0; i<mzte_codec.m_iSpatialLev-1; ++i)
emit_bits((UShort)mzte_codec.m_lastWvtDecompInSpaLayer[i][0], 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;
}
if (mzte_codec.m_iWvtDownload == 1) {
// hjlee 0901
wavelet_uniform = (mzte_codec.m_iWvtUniform!=0)?1:0;
emit_bits((UShort)wavelet_uniform, 1);
if(wavelet_uniform) {
upload_wavelet_filters(wvtfilter[0]);
}
else {
for(i=0;i<mzte_codec.m_iWvtDecmpLev;i++)
upload_wavelet_filters(wvtfilter[i]);
}
}
emit_bits((UShort)wavelet_stuffing, 3);
if (texture_object_layer_shape == 0x00) {
emit_bits((UShort)mzte_codec.m_iRealWidth, 15);
emit_bits((UShort)MARKER_BIT, 1);
emit_bits((UShort)mzte_codec.m_iRealHeight, 15);
emit_bits((UShort)MARKER_BIT, 1);
}
else { /* Arbitrary shape info, SL */
emit_bits((UShort)mzte_codec.m_iOriginX, 15); /*horizontal_ref */
emit_bits((UShort)MARKER_BIT, 1); /* marker_bit */
emit_bits((UShort)mzte_codec.m_iOriginY, 15); /*vertical_ref */
emit_bits((UShort)MARKER_BIT, 1); /* marker_bit */
emit_bits((UShort)mzte_codec.m_iWidth, 15); /* object_width */
emit_bits((UShort)MARKER_BIT, 1); /* marker_bit */
emit_bits((UShort)mzte_codec.m_iHeight, 15); /* object_height */
emit_bits((UShort)MARKER_BIT, 1); /* marker_bit */
noteProgress("Merge Shape Bitstream ....");
// MergeShapeBitstream();
}
}
// begin: modified by Sharp (99/2/16)
//Void CVTCEncoder::header_Enc(FILTER *wvtfilter) // hjlee 0901
long CVTCEncoder::header_Enc(FILTER **wvtfilter) // hjlee 0901
{
Int texture_object_id=0;
Int texture_object_layer_shape=mzte_codec.m_iAlphaChannel;
Int wavelet_stuffing = 0x0f;
// Int wavelet_upload;
// Int wavelet_uniform; // hjlee 0901
Int i; // hjlee 0901
long tile_table_position=0;
/*------- Write header info to bitstream file -------*/
emit_bits((UShort)(STILL_TEXTURE_OBJECT_START_CODE>>16), 16);
emit_bits((UShort)STILL_TEXTURE_OBJECT_START_CODE, 16);
emit_bits((UShort)mzte_codec.m_tiling_disable, 1); // added by Sharp (99/2/16)
//Added by Sarnoff for error resilience, 3/5/99
emit_bits(mzte_codec.m_usErrResiDisable,1); /* bbc, 2/18/99 */
// flush_bits(); // deleted by Sharp (99/3/29)
// This part is moved to texture_packet_header_Enc, by Sharp (99/4/7)
#if 0
if(!mzte_codec.m_usErrResiDisable){
flush_bits(); // added by Sharp(99/3/29)
texture_object_id=1<<15; // error resilience
prev_TU_first = prev_TU_last = prev_TU_err = -1;
flush_bytes(); // to get alignment in buffer
emit_bits((UShort)1,2); // 1st bit dummy, 2nd bit HEC=1
packet_size=0;
}
//End: Added by Sarnoff for error resilience, 3/5/99
#endif
// if ( mzte_codec.m_usErrResiDisable == 1) // added by Sharp (99/3/29) // @@@@@@
header_Enc_Common( wvtfilter );
if ( mzte_codec.m_tiling_disable == 0 ){
emit_bits((UShort)mzte_codec.m_tile_width, 15); // modified by Sharp (99/11/16)
emit_bits((UShort)1, 1);
emit_bits((UShort)mzte_codec.m_tile_height, 15); // modified by Sharp (99/11/16)
emit_bits((UShort)1, 1);
emit_bits((UShort)mzte_codec.m_iNumOfTile, 16);
emit_bits((UShort)1, 1);
/* mzte_codec.m_tiling_jump_table_enable = 1;*/
emit_bits((UShort)mzte_codec.m_tiling_jump_table_enable, 1);
mzte_codec.m_extension_type = 0;
used_bits = current_put_bits() % 8;
/* printf("used_bits = %d\n", used_bits);*/
flush_bytes();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -