⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtc_shape_shapebasedecode.cpp

📁 完整的RTP RTSP代码库
💻 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 + -