📄 vtc_shape_shapebasedecode.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 *//****************************************************************************/#include <stdio.h>#include "dataStruct.hpp"//#include "ShapeBaseCodec.h"//#include "ShapeBaseCommon.h"//#include "BinArCodec.h"#include "shape_def.hpp"//#include "ShapeUtil.h"//#include "bitpack.h" /* new */#define Error -1//extern Int ObjectWidth, ObjectHeight;Int CVTCDecoder::ShapeBaseDeCoding(UChar *OutShape, Int object_width, Int object_height, Int change_CR_disable){ /* Int alphaTH = alphaTH; */ Int cols = object_width; Int rows = object_height; Int blkn = 16; Int blkx = (cols+15)/16; Int blky = (rows+15)/16; SBI ShapeInf, *infor; UChar **BAB = malloc_2d_Char ( blkn, blkn ); UChar **BABdown = malloc_2d_Char ( blkn, blkn ); UChar **BAB_ext = malloc_2d_Char ( blkn+4, blkn+4 ); UChar **ip, **shape; Int i, j, k, l; Int smode; Int bsize; Int CR; ObjectWidth = object_width; ObjectHeight = object_height; shape = (UChar **)malloc(sizeof(UChar *)*object_height); if(shape == NULL) { fprintf(stderr,"Memory allocation failed\n"); return Error; } for(i=0;i<object_height;i++) shape[i] = OutShape + i*object_width; infor = &ShapeInf; infor -> shape_mode = malloc_2d_Int(blky, blkx); infor -> CR = malloc_2d_Int(blky, blkx); infor -> ST = malloc_2d_Int(blky, blkx); infor -> change_CR_disable = change_CR_disable; /* infor -> alphaTH = alphaTH; */ infor -> block_size = blkn; infor -> block_num_hor = blkx; infor -> block_num_ver = blky; for ( j=0; j<blky; j++ ) { for ( i=0; i<blkx; i++ ) { if ( ShapeBaseHeaderDecode ( i, j, blkx, infor ) == Error ) { fprintf(stderr,"\n CAE arithmetic decoding Error !\n"); return Error; } smode = infor -> shape_mode[j][i]; if ( smode == ALL0 || smode == ALL255 ) { for ( l=0; l<blkn; l++ ) { for ( k=0; k<blkn; k++ ) { if(j*blkn+l < ObjectHeight && i*blkn+k < ObjectWidth) shape[j*blkn+l][i*blkn+k] = (Char)( smode == ALL0 ? 0 : 1 ); } } } else { CR = infor -> CR[j][i]; bsize = blkn / CR; for ( l=0; l<bsize; l++ ) { for ( k=0; k<bsize; k++ ) { BABdown [l][k] = (Char)0; } } /* Add surrounding pixels for CAE. */ AddBorderToBAB ( i, j, blkn, CR, blkx, BABdown, BAB_ext, shape, 2 ); if ( ShapeBaseContentDecode ( i, j, bsize, BAB_ext, infor ) == Error ) { fprintf ( stderr, "\n CAE arithmetic decoding Error !\n" ); return Error; } /* make reconstructed 16x16 shape by BAB */ for ( l=0; l<bsize; l++ ) { for ( k=0; k<bsize; k++ ) { BABdown [l][k] = BAB_ext [l+2][k+2]; } } if ( CR != 1 ) { /* Reconstruct shape from BAB */ UpSampling_Still ( i, j, blkn, CR, blkx, BABdown, BAB, shape ); } else { ip = BAB; BAB = BABdown; BABdown = ip; ip = (UChar **)NULL; } /* store result BAB. */ for ( l=0; l<blkn; l++ ) { for ( k=0; k<blkn; k++ ) { if(j*blkn+l < ObjectHeight && i*blkn+k < ObjectWidth) shape[j*blkn+l][i*blkn+k] = ( BAB[l][k] == 0 ? 0 : 1 ); } } } } } free_2d_Char ( BAB, blkn ); free_2d_Char ( BABdown, blkn ); free_2d_Char ( BAB_ext, blkn+4 ); free_2d_Int (infor->shape_mode, blky); free_2d_Int (infor->CR, blky); free_2d_Int (infor->ST, blky); /* ByteAlignmentDec(); */ free(shape); return ( 0 );}Int CVTCDecoder::ShapeBaseContentDecode(Int i,Int j,Int bsize,UChar **BAB,SBI *infor){ Int k, l; Int dir = infor -> ST[j][i]; Int context; Int ctx_max = 1023; ArDecoder decoder; StartArDecoder_Still( &decoder);/* if ( dir == HOR ) { */ if ( dir == 0 ) { for ( l=0; l<bsize; l++ ) { for ( k=0; k<bsize; k++ ) { context = ( BAB [l+2+(+0)][k+2+(-1)] << 0 ) + ( BAB [l+2+(+0)][k+2+(-2)] << 1 ) + ( BAB [l+2+(-1)][k+2+(+2)] << 2 ) + ( BAB [l+2+(-1)][k+2+(+1)] << 3 ) + ( BAB [l+2+(-1)][k+2+(+0)] << 4 ) + ( BAB [l+2+(-1)][k+2+(-1)] << 5 ) + ( BAB [l+2+(-1)][k+2+(-2)] << 6 ) + ( BAB [l+2+(-2)][k+2+(+1)] << 7 ) + ( BAB [l+2+(-2)][k+2+(+0)] << 8 ) + ( BAB [l+2+(-2)][k+2+(-1)] << 9 ); if ( context > ctx_max ) { fprintf ( stderr, "\n Shape context Error !\n" ); return Error; } BAB [l+2][k+2] = ArDecodeSymbol_Still( &decoder, intra_prob[context] ); } BAB [l+2][bsize+2] = BAB [l+2][bsize+3] = BAB [l+2][bsize+1]; } } else { for ( k=0; k<bsize; k++ ) { for ( l=0; l<bsize; l++ ) { context = ( BAB [l+2+(-1)][k+2+(+0)] << 0 ) + ( BAB [l+2+(-2)][k+2+(+0)] << 1 ) + ( BAB [l+2+(+2)][k+2+(-1)] << 2 ) + ( BAB [l+2+(+1)][k+2+(-1)] << 3 ) + ( BAB [l+2+(+0)][k+2+(-1)] << 4 ) + ( BAB [l+2+(-1)][k+2+(-1)] << 5 ) + ( BAB [l+2+(-2)][k+2+(-1)] << 6 ) + ( BAB [l+2+(+1)][k+2+(-2)] << 7 ) + ( BAB [l+2+(+0)][k+2+(-2)] << 8 ) + ( BAB [l+2+(-1)][k+2+(-2)] << 9 ); if ( context > ctx_max ) { fprintf ( stderr, "\n Shape context Error !\n" ); return Error; } BAB [l+2][k+2] = ArDecodeSymbol_Still( &decoder, intra_prob[context] ); } BAB [bsize+2][k+2] = BAB [bsize+3][k+2] = BAB [bsize+1][k+2]; } } StopArDecoder_Still ( &decoder); return ( 0 );}Int CVTCDecoder::ShapeBaseHeaderDecode(Int i,Int j,Int blkx,SBI *infor){ Int dis_CR = infor -> change_CR_disable; Int UL= ( (i == 0 || j == 0) ? 0 : infor -> shape_mode[j-1][i-1] ); Int UR= ( (i == blkx-1 || j == 0) ? 0 : infor -> shape_mode[j-1][i+1] ); Int U = ( (j == 0) ? 0 : infor -> shape_mode[j-1][i] ); Int L = ( (i == 0) ? 0 : infor -> shape_mode[j][i-1] ); Int index = ( 27 * UL + 9 * U + 3 * UR + L ); Int mode = 0; Int CR = 1; UInt code = 0; Int bits; do { bits = LMMR_first_shape_code_I [index][mode]; code = LookBitsFromStream ( bits); } while ( code != CMMR_first_shape_code_I [index][mode] && (++mode) <= 2 ); if ( code == CMMR_first_shape_code_I [index][mode] ) { BitstreamFlushBits_Still( bits); if ( mode == BORDER ) { if ( dis_CR == 0 ) { do { bits = LCR [CR]; code = LookBitsFromStream ( bits ); } while ( code != CCR[CR] && (CR=(CR<<1)) <= 4 ); if ( code == CCR [CR] ) { BitstreamFlushBits_Still( bits); } else { fprintf(stderr,"\n Decode shape information CR Error at [%d, %d] \n", i, j ); return Error; } } bits = LST; code = GetBitsFromStream ( bits); } infor -> shape_mode[j][i] = mode; infor -> CR [j][i] = CR; infor -> ST [j][i] = (Int)code; } else { fprintf ( stderr, "\n Decode shape mode Error at [%d, %d] \n", i, j ); return Error; } return ( 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -