📄 sesenc.cpp
字号:
/*************************************************************************This software module was originally developed by Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation Bruce Lin (blin@microsoft.com), Microsoft Corporation Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation (date: March, 1996)and edited by Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Centerand also edited by Yoshihiro Kikuchi (TOSHIBA CORPORATION) Takeshi Nagai (TOSHIBA CORPORATION) Toshiaki Watanabe (TOSHIBA CORPORATION) Noboru Yamaguchi (TOSHIBA CORPORATION) Marc Mongenet (Marc.Mongenet@epfl.ch), Swiss Federal Institute of Technology, Lausanne (EPFL)in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). This software module is an implementation of a part of one or more MPEG-4 Video tools as specified by the MPEG-4 Video. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 Video conforming products. Microsoft retains full right to use the code for his/her own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name: sesEnc.cppAbstract: Encoder for one video session.Revision History: Sept. 30, 1997: Error resilient tools added by Toshiba Nov. 27, 1997: Spatial Scalable tools added, and modified for Spatial Scalable by Takefumi Nagumo(nagumo@av.crl.sony.co.jp) SONY Dec 11, 1997: Interlaced tools added by NextLevel Systems (GI) (B.Eifrig, beifrig@nlvl.com, X.Chen, xchen@nlvl.com) Jun 17, 1998: add Complexity Estimation syntax support Marc Mongenet (Marc.Mongenet@epfl) - EPFL May 9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net*************************************************************************/#include "stdlib.h"#include "stdio.h"#include "math.h"#include "fstream.h"#include "iostream.h"#include "typeapi.h"#include "codehead.h"#include "global.hpp"#include "entropy/bitstrm.hpp"#include "entropy/entropy.hpp"#include "entropy/huffman.hpp"#include "mode.hpp"#include "sesenc.hpp"#include "tps_enhcbuf.hpp" // added by Sharp (98/2/12)#include "vopses.hpp"#include "vopseenc.hpp"#include "enhcbufenc.hpp" // added by Sharp (98/2/12)#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW #endif // __MFC_#ifdef __PC_COMPILER_ //OS specific stuff#define SUB_CMPFILE "%s\\%2.2d\\%s.cmp"#define SUB_TRCFILE "%s\\%2.2d\\%s.trc"#define SUB_YUVFILE "%s\\%2.2d\\%s.yuv"#define SUB_SEGFILE "%s\\%2.2d\\%s.seg"#define ENHN_SUB_CMPFILE "%s\\%2.2d\\%s_e.cmp"#define ENHN_SUB_TRCFILE "%s\\%2.2d\\%s_e.trc"#define ENHN_SUB_YUVFILE "%s\\%2.2d\\%s_e.yuv"#define ENHN_SUB_SEGFILE "%s\\%2.2d\\%s_e.seg"#define SUB_VDLFILE "%s\\%2.2d\\%s.spt" //for sprite i/o#define SUB_PNTFILE "%s\\%2.2d\\%s.pnt" //for sprite i/o#define ROOT_YUVFILE "%s\\%s.yuv"#define ROOT_SEGFILE "%s\\%s.seg"#define IOS_BINARY ios::binary#define MKDIR "mkdir %s\\%2.2d"#else#define SUB_CMPFILE "%s/%2.2d/%s.cmp"#define SUB_TRCFILE "%s/%2.2d/%s.trc"#define SUB_YUVFILE "%s/%2.2d/%s.yuv"#define SUB_SEGFILE "%s/%2.2d/%s.seg"#define ENHN_SUB_CMPFILE "%s/%2.2d/%s_e.cmp"#define ENHN_SUB_TRCFILE "%s/%2.2d/%s_e.trc"#define ENHN_SUB_YUVFILE "%s/%2.2d/%s_e.yuv"#define ENHN_SUB_SEGFILE "%s/%2.2d/%s_e.seg"#define SUB_VDLFILE "%s/%2.2d/%s.vdl" //for sprite i/o#define SUB_PNTFILE "%s/%2.2d/%s.pnt" //for sprite i/o#define ROOT_YUVFILE "%s/%s.yuv"#define ROOT_SEGFILE "%s/%s.seg"#define IOS_BINARY ios::binary//#define IOS_BINARY 0#define MKDIR "mkdir %s/%2.2d"#endif#define BASE_LAYER 0#define ENHN_LAYER 1#define _FOR_GSSP_Bool fileExistence (const Char* pchFile) { Bool ret = 1; FILE* pf = fopen (pchFile, "r"); if (pf == NULL) ret = 0; else fclose (pf); return ret;}Void CSessionEncoder::createReconDir (UInt idx) const{ Char pchTmp [100]; sprintf (pchTmp, SUB_YUVFILE, m_pchReconYUVDir, idx, m_pchPrefix); FILE* pf = fopen (pchTmp, "wb"); if (pf == NULL) { sprintf (pchTmp, MKDIR, m_pchReconYUVDir, idx); system (pchTmp); } else fclose (pf);}Void CSessionEncoder::createCmpDir (UInt idx) const{ Char pchTmp [100]; sprintf (pchTmp, SUB_CMPFILE, m_pchOutStrFiles, idx, m_pchPrefix); FILE* pf = fopen (pchTmp, "wb"); if (pf == NULL) { sprintf (pchTmp, MKDIR, m_pchOutStrFiles, idx); system (pchTmp); } else fclose (pf);}CSessionEncoder::~CSessionEncoder (){ delete [] m_rgvolmd [BASE_LAYER]; delete [] m_rgvolmd [ENHN_LAYER]; delete [] m_rgvopmd [BASE_LAYER]; delete [] m_rgvopmd [ENHN_LAYER]; // sprite for (Int iVO = 0; iVO < m_iNumVO; iVO++) { delete [] m_ppstSrc [iVO]; for (Int ifr = 0; ifr < m_iNumFrame; ifr++) delete [] m_pppstDst [iVO] [ifr]; delete [] m_pppstDst [iVO]; } delete [] m_ppstSrc; delete [] m_pppstDst;}CSessionEncoder::CSessionEncoder (CSessionEncoderParams *param){ m_iFirstFrame = param->iFirstFrm; m_iLastFrame = param->iLastFrm; m_iFirstVO = param->uiFirstVO; m_iLastVO = param->iLastVO; m_rgbSpatialScalability = param->rgbSpatialScalability; m_rguiRateControl = param->rguiRateControl; m_rguiBudget = param->rguiBudget; m_pchPrefix = param->pchPrefix; m_pchBmpFiles = param->pchBmpFiles; m_rgfChrType = param->rgfChrType; m_pchReconYUVDir = param->pchOutBmpFiles; m_pchOutStrFiles = param->pchOutStrFiles; m_pchSptDir = param->pchSptDir; m_pchSptPntDir = param->pchSptPntDir; m_rguiSpriteUsage = param->rguiSpriteUsage; m_rguiWarpingAccuracy = param->rguiWarpingAccuracy; m_rgNumOfPnts = param->rgNumOfPnts; m_rgiTemporalScalabilityType = param->rgiTemporalScalabilityType;#define PARAM(abc) abc = param->abc UInt PARAM(uiFrmWidth); UInt PARAM(uiFrmHeight); Bool PARAM(bNot8Bit); UInt PARAM(uiQuantPrecision); UInt PARAM(nBits); const Int* PARAM(rgiEnhancementType); const AlphaUsage* PARAM(rgfAlphaUsage); const Bool* PARAM(rgbShapeOnly); const Int* PARAM(rgiBinaryAlphaTH); const Int* PARAM(rgiBinaryAlphaRR); const Bool* PARAM(rgbNoCrChange); UInt** PARAM(rguiSearchRange); Bool** PARAM(rgbOriginalForME); Bool** PARAM(rgbAdvPredDisable); Bool ** PARAM(rgbComplexityEstimationDisable); Bool ** PARAM(rgbOpaque); Bool ** PARAM(rgbTransparent); Bool ** PARAM(rgbIntraCAE); Bool ** PARAM(rgbInterCAE); Bool ** PARAM(rgbNoUpdate); Bool ** PARAM(rgbUpsampling); Bool ** PARAM(rgbIntraBlocks); Bool ** PARAM(rgbInterBlocks); Bool ** PARAM(rgbInter4vBlocks); Bool ** PARAM(rgbNotCodedBlocks); Bool ** PARAM(rgbDCTCoefs); Bool ** PARAM(rgbDCTLines); Bool ** PARAM(rgbVLCSymbols); Bool ** PARAM(rgbVLCBits); Bool ** PARAM(rgbAPM); Bool ** PARAM(rgbNPM); Bool ** PARAM(rgbInterpolateMCQ); Bool ** PARAM(rgbForwBackMCQ); Bool ** PARAM(rgbHalfpel2); Bool ** PARAM(rgbHalfpel4); UInt ** PARAM(rguiVolControlParameters); UInt ** PARAM(rguiChromaFormat); UInt ** PARAM(rguiLowDelay); UInt ** PARAM(rguiVBVParams); UInt ** PARAM(rguiBitRate); UInt ** PARAM(rguiVbvBufferSize); UInt ** PARAM(rguiVbvBufferOccupany); Double** PARAM(rgdFrameFrequency); Bool** PARAM(rgbInterlacedCoding); Bool** PARAM(rgbTopFieldFirst); Bool** PARAM(rgbAlternateScan); Int** PARAM(rgiDirectModeRadius); Int** PARAM(rgiMVFileUsage); Char*** PARAM(pchMVFileName); Int** PARAM(rgbVPBitTh); Bool** PARAM(rgbDataPartitioning); Bool** PARAM(rgbReversibleVlc); Quantizer** PARAM(rgfQuant); Bool** PARAM(rgbLoadIntraMatrix); Int*** PARAM(rgppiIntraQuantizerMatrix); Bool** PARAM(rgbLoadInterMatrix); Int*** PARAM(rgppiInterQuantizerMatrix); Int** PARAM(rgiIntraDCSwitchingThr); Int** PARAM(rgiStepI); Int** PARAM(rgiStepP); Bool** PARAM(rgbLoadIntraMatrixAlpha); Int*** PARAM(rgppiIntraQuantizerMatrixAlpha); Bool** PARAM(rgbLoadInterMatrixAlpha); Int*** PARAM(rgppiInterQuantizerMatrixAlpha); Int** PARAM(rgiStepIAlpha); Int** PARAM(rgiStepPAlpha); Int** PARAM(rgiStepBAlpha); Int** PARAM(rgbNoAlphaQuantUpdate); Int** PARAM(rgiStepB); const Int* PARAM(rgiNumOfBbetweenPVOP); const Int* PARAM(rgiNumOfPbetweenIVOP); const Int* PARAM(rgiGOVperiod); const Bool* PARAM(rgbDeblockFilterDisable); const Bool *PARAM(rgbAllowSkippedPMBs); const Int* PARAM(rgiTemporalRate); const Int* PARAM(rgiEnhnTemporalRate); const Bool* PARAM(rgbDumpMB); const Bool* PARAM(rgbTrace); const Bool* PARAM(rgbRoundingControlDisable); const Int* PARAM(rgiInitialRoundingType); SptMode *PARAM(pSpriteMode); Int PARAM(iSpatialOption); UInt PARAM(uiFrmWidth_SS); UInt PARAM(uiFrmHeight_SS); UInt PARAM(uiHor_sampling_n); UInt PARAM(uiHor_sampling_m); UInt PARAM(uiVer_sampling_n); UInt PARAM(uiVer_sampling_m);#undef PARAM // data preparation m_iNumFrame = m_iLastFrame - m_iFirstFrame + 1; assert (m_iNumFrame > 0); m_rctOrg = CRct (0, 0, uiFrmWidth, uiFrmHeight); if( uiFrmWidth_SS !=0 && uiFrmHeight_SS!=0) m_rctOrgSpatialEnhn = CRct(0, 0, uiFrmWidth_SS, uiFrmHeight_SS); assert (uiFrmWidth <= 8192 && uiFrmHeight <= 8192); //2^13 maximum size m_iNumVO = m_iLastVO - m_iFirstVO + 1; assert (m_iNumVO > 0); m_rgvolmd [BASE_LAYER] = new VOLMode [m_iNumVO]; m_rgvolmd [ENHN_LAYER] = new VOLMode [m_iNumVO]; m_rgvopmd [BASE_LAYER] = new VOPMode [m_iNumVO]; m_rgvopmd [ENHN_LAYER] = new VOPMode [m_iNumVO]; Int iVO; for (iVO = 0; iVO < m_iNumVO; iVO++) { // set VOL and VOP mode values for (Int iLayer = BASE_LAYER; iLayer <= m_rgbSpatialScalability [iVO] * ENHN_LAYER; iLayer++) { // NBIT m_rgvolmd [iLayer][iVO].bNot8Bit = bNot8Bit; m_rgvolmd [iLayer][iVO].uiQuantPrecision = uiQuantPrecision; m_rgvolmd [iLayer][iVO].nBits = nBits; m_rgvolmd [iLayer][iVO].volType = (VOLtype) iLayer; m_rgvolmd [iLayer][iVO].fAUsage = rgfAlphaUsage [iVO]; m_rgvolmd [iLayer][iVO].bShapeOnly = rgbShapeOnly [iVO]; m_rgvolmd [iLayer][iVO].iBinaryAlphaTH = rgiBinaryAlphaTH [iVO] * 16; //magic no. from the vm m_rgvolmd [iLayer][iVO].iBinaryAlphaRR = (rgiBinaryAlphaRR [iVO]<0)?-1:(rgiBinaryAlphaRR [iVO] +1)*(rgiNumOfBbetweenPVOP [iVO] +1)*rgiTemporalRate [iVO]; // Binary shape refresh rate: Added for error resilient mode by Toshiba(1997-11-14): Modified (1998-1-16) m_rgvolmd [iLayer][iVO].bNoCrChange = rgbNoCrChange [iVO]; m_rgvolmd [iLayer][iVO].bOriginalForME = rgbOriginalForME [iLayer][iVO]; m_rgvolmd [iLayer][iVO].bAdvPredDisable = rgbAdvPredDisable [iLayer][iVO]; // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 17 Jun 1998 m_rgvolmd [iLayer][iVO].bComplexityEstimationDisable = rgbComplexityEstimationDisable [iLayer][iVO]; m_rgvolmd [iLayer][iVO].bOpaque = rgbOpaque [iLayer][iVO]; m_rgvolmd [iLayer][iVO].bTransparent = rgbTransparent [iLayer][iVO];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -