sesenc.hpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  4. Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
  5. Bruce Lin (blin@microsoft.com), Microsoft Corporation
  6. Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
  7. (date: March, 1996)
  8. and edited by
  9.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  10. and also edited by
  11. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  12. Takeshi Nagai (TOSHIBA CORPORATION)
  13. Toshiaki Watanabe (TOSHIBA CORPORATION)
  14. Noboru Yamaguchi (TOSHIBA CORPORATION)
  15. Marc Mongenet (Marc.Mongenet@epfl.ch), Swiss Federal Institute of Technology, Lausanne (EPFL)
  16. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  17. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  18. as specified by the MPEG-4 Video. 
  19. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  20. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  21. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  22. The original developer of this software module and his/her company, 
  23. the subsequent editors and their companies, 
  24. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  25. Copyright is not released for non MPEG-4 Video conforming products. 
  26. Microsoft retains full right to use the code for his/her own purpose, 
  27. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  28. This copyright notice must be included in all copies or derivative works. 
  29. Copyright (c) 1996, 1997.
  30. Module Name:
  31. sesEnc.hpp
  32. Abstract:
  33. Encoder for one image session.
  34. Revision History:
  35. Sept. 30, 1997: Error resilient tools added by Toshiba
  36. Nov.  27, 1997: Spatial Scalable tools added by SONY
  37. Dec.  11, 1997: Interlaced tools added by NextLevel Systems
  38. Jun.  17, 1998: Complexity Estimation syntax support added by EPFL
  39. May    9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net
  40. *************************************************************************/
  41. #ifndef __SESENC_HPP_ 
  42. #define __SESENC_HPP_
  43. class COutBitStream;
  44. class CEntropyEncoder;
  45. class CEntropyEncoderSet;
  46. class CVideoObjectEncoder;
  47. typedef struct whothehellwriteafunctionwiththismanyparms {
  48.   UInt uiFrmWidth; // frame width
  49.   UInt uiFrmHeight; // frame height
  50.   Int iFirstFrm; // first frame number
  51.   Int iLastFrm; // last frame number
  52.   Bool bNot8Bit; // NBIT
  53.   UInt uiQuantPrecision; // NBIT
  54.   UInt nBits; // NBIT
  55.   Int uiFirstVO; // first VOP index
  56.   Int iLastVO; // last VOP index
  57.   const Bool* rgbSpatialScalability; // spatial scalability indicator
  58.   const Int* rgiTemporalScalabilityType; // temporal scalability formation case // added by Sharp (98/02/09)
  59.   const Int* rgiEnhancementType;  // enhancement_type for scalability // added by Sharp (98/02/09)
  60.   UInt** rguiRateControl; // rate control type
  61.   UInt** rguiBudget; // for rate control
  62.   // for shape coding
  63.   const AlphaUsage* rgfAlphaUsage;// alpha usage for each VOP.  0: binary; 1: 8-bit
  64.   const Bool* rgbShapeOnly; // shape only mode
  65.   const Int* rgiBinaryAlphaTH;
  66.   const Int* rgiBinaryAlphaRR; // refresh rate: Added for error resilient mode by Toshiba(1997-11-14)
  67.   const Bool* rgbNoCrChange;
  68.   // motion estimation part for each VOP
  69.   UInt** rguiSearchRange; // motion search range
  70.   Bool** rgbOriginalForME; // flag indicating whether use the original previous VOP for ME
  71.   Bool** rgbAdvPredDisable; // no advanced MC (currenly = obmc; later = obmc + 8x8)
  72.   // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 17 Jun 1998
  73.   Bool ** rgbComplexityEstimationDisable;
  74.   Bool ** rgbOpaque;
  75.   Bool ** rgbTransparent;
  76.   Bool ** rgbIntraCAE;
  77.   Bool ** rgbInterCAE;
  78.   Bool ** rgbNoUpdate;
  79.   Bool ** rgbUpsampling;
  80.   Bool ** rgbIntraBlocks;
  81.   Bool ** rgbInterBlocks;
  82.   Bool ** rgbInter4vBlocks;
  83.   Bool ** rgbNotCodedBlocks;
  84.   Bool ** rgbDCTCoefs;
  85.   Bool ** rgbDCTLines;
  86.   Bool ** rgbVLCSymbols;
  87.   Bool ** rgbVLCBits;
  88.   Bool ** rgbAPM;
  89.   Bool ** rgbNPM;
  90.   Bool ** rgbInterpolateMCQ;
  91.   Bool ** rgbForwBackMCQ;
  92.   Bool ** rgbHalfpel2;
  93.   Bool ** rgbHalfpel4;
  94.   // END: Complexity Estimation syntax support
  95.   // START: VOL Control Parameters
  96.   UInt ** rguiVolControlParameters;
  97.   UInt ** rguiChromaFormat;
  98.   UInt ** rguiLowDelay;
  99.   UInt ** rguiVBVParams;
  100.   UInt ** rguiBitRate;
  101.   UInt ** rguiVbvBufferSize;
  102.   UInt ** rguiVbvBufferOccupany;
  103.   // END: VOL Control Parameters
  104.   Double** rgdFrameFrequency; // Frame Frequency
  105.   Bool** rgbInterlacedCoding; // interlace coding flag
  106.   Bool** rgbTopFieldFirst; // top field first flag
  107.   Bool** rgbAlternateScan;    // alternate scan flag
  108.   Int** rgiDirectModeRadius; // direct mode search radius
  109.   Int** rgiMVFileUsage; // 0- not used; 1: read from motion file; 2- write to motion file
  110.   Char*** pchMVFileName; // Motion vector filenames
  111.   // major syntax mode
  112.   Int** rgbVPBitTh; // Bit threshold for video packet spacing control
  113.   Bool** rgbDataPartitioning; // data partitioning
  114.   Bool** rgbReversibleVlc; // reversible VLC
  115.   // for texture coding
  116.   Quantizer** rgfQuant; // quantizer selection; either H.263 or MPEG
  117.   Bool** rgbLoadIntraMatrix; // load user-defined intra Q-Matrix
  118.   Int*** rgppiIntraQuantizerMatrix; // Intra Q-Matrix
  119.   Bool** rgbLoadInterMatrix; // load user-defined inter Q-Matrix
  120.   Int*** rgppiInterQuantizerMatrix; // Inter Q-Matrix
  121.   Int** rgiIntraDCSwitchingThr; //threshold to code dc as ac when pred. is on
  122.   Int** rgiStepI; // I-VOP quantization stepsize
  123.   Int** rgiStepP; // P-VOP quantization stepsize
  124.   Bool** rgbLoadIntraMatrixAlpha;
  125.   Int*** rgppiIntraQuantizerMatrixAlpha;
  126.   Bool** rgbLoadInterMatrixAlpha;
  127.   Int*** rgppiInterQuantizerMatrixAlpha;
  128.   Int** rgiStepIAlpha; // I-VOP quantization stepsize for Alpha
  129.   Int** rgiStepPAlpha; // P-VOP quantization stepsize for Alpha
  130.   Int** rgiStepBAlpha; // B-VOP quantization stepsize for Alpha
  131.   Int** rgbNoAlphaQuantUpdate; // discouple gray quant update with tex. quant
  132.   Int** rgiStepB; // code for quantization stepsize for B-VOP
  133.   const Int* rgiNumOfBbetweenPVOP; // no of B-VOPs between P-VOPs
  134.   const Int* rgiNumOfPbetweenIVOP; // no of P-VOPs between I-VOPs
  135.   //added to encode GOV header by SONY 980212
  136.   const Int* rgiGOVperiod;
  137.   const Bool* rgbDeblockFilterDisable; //deblocking filter disable
  138.   const Bool *rgbAllowSkippedPMBs;
  139.   // file information
  140.   const Char* pchPrefix; // prefix name of the movie
  141.   const Char* pchBmpFiles; // bmp file directory location
  142.   const ChromType* rgfChrType; // input chrominance type. 0 - 4:4:4; 1 - 4:2:2; 0 - 4:2:0
  143.   const Char* pchOutBmpFiles; // quantized frame file directory
  144.   const Char* pchOutStrFiles; // output bitstream file
  145.   const Int* rgiTemporalRate; // temporal subsampling rate
  146.   const Int* rgiEnhnTemporalRate; // temporal subsampling rate for enhancement layer // added by Sharp (98/02/09)
  147.   // statistics dumping options
  148.   const Bool* rgbDumpMB;
  149.   const Bool* rgbTrace;
  150.   // rounding control
  151.   const Bool* rgbRoundingControlDisable; 
  152.   const Int* rgiInitialRoundingType; 
  153.   // for sprite info
  154.   const UInt* rguiSpriteUsage; // sprite usage
  155.   const UInt* rguiWarpingAccuracy; // warping accuracy
  156.   const Int* rgNumOfPnts; // number of points for sprite; 0 for stationary and -1 for no sprite
  157.   const Char* pchSptDir; // sprite directory
  158.   const Char* pchSptPntDir; // sprite point file
  159.   SptMode *pSpriteMode; // sprite reconstruction mode
  160.   Int iSpatialOption;
  161.   UInt uiFrmWidth_SS;
  162.   UInt uiFrmHeight_SS;
  163.   UInt uiHor_sampling_n;
  164.   UInt uiHor_sampling_m;
  165.   UInt uiVer_sampling_n;
  166.   UInt uiVer_sampling_m;
  167. } CSessionEncoderParams;
  168. Class CSessionEncoder
  169. {
  170. friend class CEnhcBufferEncoder;
  171. public:
  172. // Constructors
  173. ~CSessionEncoder ();
  174. CSessionEncoder (CSessionEncoderParams *ptr);
  175. // Attributes
  176. UInt compressedSize () const {return m_uCmpSize;} // in bits
  177. // Operations
  178. Void encode ();
  179. ///////////////// implementation /////////////////
  180. protected:
  181. CRct m_rctOrg;
  182. CRct m_rctOrgSpatialEnhn;
  183. Int m_iFirstFrame; // first frame number
  184. Int m_iLastFrame; // last frame number
  185. Int m_iNumFrame; // number of frames
  186. Int m_iFirstVO; // first VO index
  187. Int m_iLastVO; // last VO index
  188. Int m_iNumVO; //  number of VO's
  189. const Bool* m_rgbSpatialScalability; //spatial scalability on/off
  190. UInt** m_rguiRateControl; // rate control type
  191. UInt** m_rguiBudget; // for rate control
  192. own VOLMode* m_rgvolmd [2]; // VOL modes
  193. own VOPMode* m_rgvopmd [2]; // VOP modes
  194. // file information
  195. const Char* m_pchPrefix; // prefix name of the movie
  196. const Char* m_pchBmpFiles; // bmp file directory location
  197. const ChromType* m_rgfChrType; // input chrominance type. 0 - 4:4:4, 1 - 4:2:2, 0 - 4:2:0
  198. const Char* m_pchReconYUVDir; // quantized frame file directory
  199. const Char* m_pchOutStrFiles; // output bitstream file
  200. UInt m_uCmpSize; // in bits
  201. Bool m_bTexturePerVOP; // Bool for whether there are texture data for each VOP
  202. Bool m_bAlphaPerVOP; // Bool for whether there are alpha data for each VOP
  203. // for sprite info
  204. const Char* m_pchSptDir; // sprite directory
  205. const Char* m_pchSptPntDir; // sprite point file
  206. const UInt* m_rguiSpriteUsage; // sprite usage
  207. const UInt* m_rguiWarpingAccuracy; // warping accuracy
  208. const Int* m_rgNumOfPnts; // number of points for each VOP
  209. own CSiteD** m_ppstSrc; // source sites, [numVOP] [numPnt]
  210. own CSiteD*** m_pppstDst; // destination sites, [numVOP] [numFrm] [numPnt]
  211. // low latency stuff
  212. SptMode m_SptMode;  // sprite reconstruction mode : 0 -- basic sprite , 1 -- Object piece only, 2 -- Update piece only, 3 -- intermingled
  213. CRct m_rctFrame; // to save the frame rectangle
  214. Int** m_rgiMVFileUsage; // MV file usage [iLayer][iObj]
  215. Char*** m_pchMVFileName; // MV file names [iLayer][iObj]
  216. // temporal scalability
  217. const Int* m_rgiTemporalScalabilityType; // added by Sharp (98/2/12)
  218. Bool m_bPrevObjectExists;
  219. Void getInputFiles (FILE*& pfYuvSrc, FILE*& pfAlpSrc, FILE*& pfYuvSrcSpatialEnhn, FILE* rgpfReconYUV [], FILE* rgpfReconSeg [], 
  220. ofstream* rgpostrm [], ofstream* rgpostrmTrace [],
  221. PixelC& pxlcObjColor, Int iobj, const VOLMode& volmd, const VOLMode& volmd_enhn);
  222. Void initVOEncoder (CVideoObjectEncoder** rgpvoenc, Int iobj, ofstream* rgpostrmTrace []);
  223. Bool loadDataSpriteCheck(UInt iVOrelative,UInt iFrame, FILE* pfYuvSrc, FILE* pfSegSrc,
  224. PixelC pxlcObjColor, CVOPU8YUVBA* pvopcDst, const VOLMode& volmd);
  225. Bool loadData (UInt iFrame, FILE* pfYuvSrc, FILE* pfSegSrc, PixelC pxlcObjColor, 
  226. CVOPU8YUVBA* pvopcDst, CRct& rctOrg,const VOLMode& volmd);
  227. Void dumpData (FILE* pfYuvDst, FILE* pfSegDst, const CVOPU8YUVBA* pvopcSrc, 
  228. const CRct& rctOrg, const VOLMode& volmd);
  229. Void createReconDir (UInt idx) const;
  230. Void createCmpDir (UInt idx) const;
  231. Void encodeVideoObject( Bool bObjectExists,
  232. Bool bPrevObjectExists,
  233. Int iFrame,
  234. VOPpredType predType,
  235. Int iDumpMode,
  236. Int iVO,
  237. Int iVOrelative,
  238. Int iLayer,
  239. FILE* pfYuvSrc,
  240. FILE* pfSegSrc,
  241. FILE* rgpfReconYUV[],
  242. FILE* rgpfReconSeg[],
  243. PixelC pxlcObjColor,
  244. CVideoObjectEncoder** rgpvoenc,
  245. const VOLMode& volmd,
  246. ofstream* rgpostrm[],
  247. const CVOPU8YUVBA* pvopcBaseQuant = NULL);
  248. // begin: added by Sharp (98/2/12)
  249. Void updateRefForTPS (CVideoObjectEncoder* pvopc,
  250. CEnhcBufferEncoder* BufP1, CEnhcBufferEncoder* BufP2, CEnhcBufferEncoder* BufB1, CEnhcBufferEncoder* BufB2, CEnhcBufferEncoder* BufE,
  251. Int bNoNextVOP, Int iVOrelative, Int iEcount, Int ibFrameWithRate, Int ieFrame, Bool bupdateForLastLoop);
  252. Void dumpDataOneFrame (UInt iFrame, Int iobj, const CVOPU8YUVBA* pvopcSrc, const VOLMode& volmd);
  253. Void initVObfShape (CVideoObjectEncoder** rgpvobfShape, Int iobj, 
  254.     VOLMode& volmd_back, VOPMode& vopmd_back, VOLMode& volmd_forw, VOPMode& vopmd_forw);
  255. Void encodeEnhanceVideoObject(Bool bObjectExists,
  256. Int iFrame,
  257. VOPpredType predType,
  258. Int iDumpMode,
  259. Int iVO,Int iVOrelative,
  260. FILE* pfYuvSrc,
  261. FILE* pfSegSrc,
  262. FILE* rgpfReconYUV[],
  263. FILE* rgpfReconSeg[],
  264. PixelC pxlcObjColor,
  265. CVideoObjectEncoder* rgpvoenc,
  266. const VOLMode& volmd,
  267. const VOLMode& volmd_enhn,
  268. Int iEnhnFirstFrame,
  269. ofstream* rgpostrm[],
  270. CEnhcBufferEncoder& BufP1,
  271. CEnhcBufferEncoder& BufP2,
  272. CEnhcBufferEncoder& BufB1,
  273. CEnhcBufferEncoder& BufB2,
  274. CEnhcBufferEncoder& BufE
  275. );
  276. // end: added by Sharp (98/2/12)
  277. // sprite
  278. Void readPntFile (UInt iobj);
  279. Void loadSpt (UInt iobj, CVOPU8YUVBA* pvopcDst);
  280. CRct findBoundBoxInAlpha (UInt ifr, UInt iobj);
  281. CRct findSptRct (UInt iobj);
  282. };
  283. #endif // __SESENC_HPP_