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

流媒体/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.cpp
  32. Abstract:
  33. Encoder for one video session.
  34. Revision History:
  35. Sept. 30, 1997: Error resilient tools added by Toshiba
  36. Nov.  27, 1997: Spatial Scalable tools added, and modified for Spatial Scalable
  37. by Takefumi Nagumo(nagumo@av.crl.sony.co.jp) SONY
  38. Dec 11, 1997: Interlaced tools added by NextLevel Systems (GI)
  39. (B.Eifrig, beifrig@nlvl.com, X.Chen, xchen@nlvl.com)
  40. Jun 17, 1998: add Complexity Estimation syntax support
  41. Marc Mongenet (Marc.Mongenet@epfl) - EPFL
  42. May 9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net
  43. *************************************************************************/
  44. #include "stdlib.h"
  45. #include "stdio.h"
  46. #include "math.h"
  47. #include "fstream.h"
  48. #include "iostream.h"
  49. #include "typeapi.h"
  50. #include "codehead.h"
  51. #include "global.hpp"
  52. #include "entropy/bitstrm.hpp"
  53. #include "entropy/entropy.hpp"
  54. #include "entropy/huffman.hpp"
  55. #include "mode.hpp"
  56. #include "sesenc.hpp"
  57. #include "tps_enhcbuf.hpp" // added by Sharp (98/2/12)
  58. #include "vopses.hpp"
  59. #include "vopseenc.hpp"
  60. #include "enhcbufenc.hpp" // added by Sharp (98/2/12)
  61. #ifdef __MFC_
  62. #ifdef _DEBUG
  63. #undef THIS_FILE
  64. static char BASED_CODE THIS_FILE[] = __FILE__;
  65. #endif
  66. #define new DEBUG_NEW    
  67. #endif // __MFC_
  68. #ifdef __PC_COMPILER_ //OS specific stuff
  69. #define SUB_CMPFILE "%s\%2.2d\%s.cmp"
  70. #define SUB_TRCFILE "%s\%2.2d\%s.trc"
  71. #define SUB_YUVFILE "%s\%2.2d\%s.yuv"
  72. #define SUB_SEGFILE "%s\%2.2d\%s.seg"
  73. #define ENHN_SUB_CMPFILE "%s\%2.2d\%s_e.cmp"
  74. #define ENHN_SUB_TRCFILE "%s\%2.2d\%s_e.trc"
  75. #define ENHN_SUB_YUVFILE "%s\%2.2d\%s_e.yuv"
  76. #define ENHN_SUB_SEGFILE "%s\%2.2d\%s_e.seg"
  77. #define SUB_VDLFILE "%s\%2.2d\%s.spt" //for sprite i/o
  78. #define SUB_PNTFILE "%s\%2.2d\%s.pnt" //for sprite i/o
  79. #define ROOT_YUVFILE "%s\%s.yuv"
  80. #define ROOT_SEGFILE "%s\%s.seg"
  81. #define IOS_BINARY ios::binary
  82. #define MKDIR "mkdir %s\%2.2d"
  83. #else
  84. #define SUB_CMPFILE "%s/%2.2d/%s.cmp"
  85. #define SUB_TRCFILE "%s/%2.2d/%s.trc"
  86. #define SUB_YUVFILE "%s/%2.2d/%s.yuv"
  87. #define SUB_SEGFILE "%s/%2.2d/%s.seg"
  88. #define ENHN_SUB_CMPFILE "%s/%2.2d/%s_e.cmp"
  89. #define ENHN_SUB_TRCFILE "%s/%2.2d/%s_e.trc"
  90. #define ENHN_SUB_YUVFILE "%s/%2.2d/%s_e.yuv"
  91. #define ENHN_SUB_SEGFILE "%s/%2.2d/%s_e.seg"
  92. #define SUB_VDLFILE "%s/%2.2d/%s.vdl" //for sprite i/o
  93. #define SUB_PNTFILE "%s/%2.2d/%s.pnt" //for sprite i/o
  94. #define ROOT_YUVFILE "%s/%s.yuv"
  95. #define ROOT_SEGFILE "%s/%s.seg"
  96. #define IOS_BINARY ios::binary
  97. //#define IOS_BINARY 0
  98. #define MKDIR "mkdir %s/%2.2d"
  99. #endif
  100. #define BASE_LAYER 0
  101. #define ENHN_LAYER 1
  102. #define _FOR_GSSP_
  103. Bool fileExistence (const Char* pchFile) 
  104. {
  105. Bool ret = 1;
  106. FILE* pf = fopen (pchFile, "r");
  107. if (pf == NULL)
  108. ret = 0;
  109. else
  110. fclose (pf);
  111. return ret;
  112. }
  113. Void CSessionEncoder::createReconDir (UInt idx) const
  114. {
  115. Char pchTmp [100];
  116. sprintf (pchTmp, SUB_YUVFILE, m_pchReconYUVDir, idx, m_pchPrefix);
  117. FILE* pf = fopen (pchTmp, "wb");
  118. if (pf == NULL) {
  119. sprintf (pchTmp, MKDIR, m_pchReconYUVDir, idx);
  120. system (pchTmp);
  121. }
  122. else
  123. fclose (pf);
  124. }
  125. Void CSessionEncoder::createCmpDir (UInt idx) const
  126. {
  127. Char pchTmp [100];
  128. sprintf (pchTmp, SUB_CMPFILE, m_pchOutStrFiles, idx, m_pchPrefix);
  129. FILE* pf = fopen (pchTmp, "wb");
  130. if (pf == NULL) {
  131. sprintf (pchTmp, MKDIR, m_pchOutStrFiles, idx);
  132. system (pchTmp);
  133. }
  134. else
  135. fclose (pf);
  136. }
  137. CSessionEncoder::~CSessionEncoder ()
  138. {
  139. delete [] m_rgvolmd [BASE_LAYER];
  140. delete [] m_rgvolmd [ENHN_LAYER];
  141. delete [] m_rgvopmd [BASE_LAYER];
  142. delete [] m_rgvopmd [ENHN_LAYER];
  143. // sprite 
  144. for (Int iVO = 0; iVO < m_iNumVO; iVO++) {
  145. delete [] m_ppstSrc [iVO];
  146. for (Int ifr = 0; ifr < m_iNumFrame; ifr++)
  147. delete [] m_pppstDst [iVO] [ifr];
  148. delete [] m_pppstDst [iVO];
  149. }
  150. delete [] m_ppstSrc;
  151. delete [] m_pppstDst;
  152. }
  153. CSessionEncoder::CSessionEncoder (CSessionEncoderParams *param)
  154. {
  155. m_iFirstFrame = param->iFirstFrm;
  156. m_iLastFrame = param->iLastFrm;
  157. m_iFirstVO = param->uiFirstVO; 
  158. m_iLastVO = param->iLastVO;
  159. m_rgbSpatialScalability = param->rgbSpatialScalability;
  160. m_rguiRateControl = param->rguiRateControl; 
  161. m_rguiBudget = param->rguiBudget;
  162. m_pchPrefix = param->pchPrefix; 
  163. m_pchBmpFiles = param->pchBmpFiles;
  164. m_rgfChrType = param->rgfChrType; 
  165. m_pchReconYUVDir = param->pchOutBmpFiles; 
  166. m_pchOutStrFiles = param->pchOutStrFiles;
  167. m_pchSptDir = param->pchSptDir; 
  168. m_pchSptPntDir = param->pchSptPntDir;
  169. m_rguiSpriteUsage = param->rguiSpriteUsage; 
  170. m_rguiWarpingAccuracy = param->rguiWarpingAccuracy; 
  171. m_rgNumOfPnts = param->rgNumOfPnts; 
  172. m_rgiTemporalScalabilityType = param->rgiTemporalScalabilityType;
  173. #define PARAM(abc) abc = param->abc
  174.   UInt PARAM(uiFrmWidth);
  175. UInt PARAM(uiFrmHeight);
  176. Bool PARAM(bNot8Bit);
  177. UInt PARAM(uiQuantPrecision);
  178. UInt PARAM(nBits);
  179. const Int* PARAM(rgiEnhancementType);
  180. const AlphaUsage* PARAM(rgfAlphaUsage);
  181. const Bool* PARAM(rgbShapeOnly);
  182. const Int* PARAM(rgiBinaryAlphaTH);
  183. const Int* PARAM(rgiBinaryAlphaRR);
  184. const Bool* PARAM(rgbNoCrChange);
  185. UInt** PARAM(rguiSearchRange);
  186. Bool** PARAM(rgbOriginalForME);
  187. Bool** PARAM(rgbAdvPredDisable);
  188. Bool ** PARAM(rgbComplexityEstimationDisable);
  189. Bool ** PARAM(rgbOpaque);
  190. Bool ** PARAM(rgbTransparent);
  191. Bool ** PARAM(rgbIntraCAE);
  192. Bool ** PARAM(rgbInterCAE);
  193. Bool ** PARAM(rgbNoUpdate);
  194. Bool ** PARAM(rgbUpsampling);
  195. Bool ** PARAM(rgbIntraBlocks);
  196. Bool ** PARAM(rgbInterBlocks);
  197. Bool ** PARAM(rgbInter4vBlocks);
  198. Bool ** PARAM(rgbNotCodedBlocks);
  199. Bool ** PARAM(rgbDCTCoefs);
  200. Bool ** PARAM(rgbDCTLines);
  201. Bool ** PARAM(rgbVLCSymbols);
  202. Bool ** PARAM(rgbVLCBits);
  203. Bool ** PARAM(rgbAPM);
  204. Bool ** PARAM(rgbNPM);
  205. Bool ** PARAM(rgbInterpolateMCQ);
  206. Bool ** PARAM(rgbForwBackMCQ);
  207. Bool ** PARAM(rgbHalfpel2);
  208. Bool ** PARAM(rgbHalfpel4);
  209. UInt ** PARAM(rguiVolControlParameters);
  210. UInt ** PARAM(rguiChromaFormat);
  211. UInt ** PARAM(rguiLowDelay);
  212. UInt ** PARAM(rguiVBVParams);
  213. UInt ** PARAM(rguiBitRate);
  214. UInt ** PARAM(rguiVbvBufferSize);
  215. UInt ** PARAM(rguiVbvBufferOccupany);
  216. Double** PARAM(rgdFrameFrequency);
  217. Bool** PARAM(rgbInterlacedCoding);
  218. Bool** PARAM(rgbTopFieldFirst);
  219. Bool** PARAM(rgbAlternateScan);
  220. Int** PARAM(rgiDirectModeRadius);
  221. Int** PARAM(rgiMVFileUsage);
  222. Char*** PARAM(pchMVFileName);
  223. Int** PARAM(rgbVPBitTh);
  224. Bool** PARAM(rgbDataPartitioning);
  225. Bool** PARAM(rgbReversibleVlc);
  226. Quantizer** PARAM(rgfQuant);
  227. Bool** PARAM(rgbLoadIntraMatrix);
  228. Int*** PARAM(rgppiIntraQuantizerMatrix);
  229. Bool** PARAM(rgbLoadInterMatrix);
  230. Int*** PARAM(rgppiInterQuantizerMatrix);
  231. Int** PARAM(rgiIntraDCSwitchingThr);
  232. Int** PARAM(rgiStepI);
  233. Int** PARAM(rgiStepP);
  234. Bool** PARAM(rgbLoadIntraMatrixAlpha);
  235. Int*** PARAM(rgppiIntraQuantizerMatrixAlpha);
  236. Bool** PARAM(rgbLoadInterMatrixAlpha);
  237. Int*** PARAM(rgppiInterQuantizerMatrixAlpha);
  238. Int** PARAM(rgiStepIAlpha);
  239. Int** PARAM(rgiStepPAlpha);
  240. Int** PARAM(rgiStepBAlpha);
  241. Int** PARAM(rgbNoAlphaQuantUpdate);
  242. Int** PARAM(rgiStepB);
  243. const Int* PARAM(rgiNumOfBbetweenPVOP);
  244. const Int* PARAM(rgiNumOfPbetweenIVOP);
  245. const Int* PARAM(rgiGOVperiod);
  246. const Bool* PARAM(rgbDeblockFilterDisable);
  247. const Bool *PARAM(rgbAllowSkippedPMBs);
  248. const Int* PARAM(rgiTemporalRate);
  249. const Int* PARAM(rgiEnhnTemporalRate);
  250. const Bool* PARAM(rgbDumpMB);
  251. const Bool* PARAM(rgbTrace);
  252. const Bool* PARAM(rgbRoundingControlDisable); 
  253. const Int* PARAM(rgiInitialRoundingType); 
  254. SptMode *PARAM(pSpriteMode);
  255. Int PARAM(iSpatialOption);
  256. UInt PARAM(uiFrmWidth_SS);
  257. UInt PARAM(uiFrmHeight_SS);
  258. UInt PARAM(uiHor_sampling_n);
  259. UInt PARAM(uiHor_sampling_m);
  260. UInt PARAM(uiVer_sampling_n);
  261. UInt PARAM(uiVer_sampling_m);
  262. #undef PARAM
  263. // data preparation
  264. m_iNumFrame = m_iLastFrame - m_iFirstFrame + 1;
  265. assert (m_iNumFrame > 0);
  266. m_rctOrg = CRct (0, 0, uiFrmWidth, uiFrmHeight);
  267. if( uiFrmWidth_SS !=0 && uiFrmHeight_SS!=0)
  268. m_rctOrgSpatialEnhn = CRct(0, 0, uiFrmWidth_SS, uiFrmHeight_SS);
  269. assert (uiFrmWidth <= 8192 && uiFrmHeight <= 8192); //2^13 maximum size
  270. m_iNumVO = m_iLastVO - m_iFirstVO + 1;
  271. assert (m_iNumVO > 0);
  272. m_rgvolmd [BASE_LAYER] = new VOLMode [m_iNumVO];
  273. m_rgvolmd [ENHN_LAYER] = new VOLMode [m_iNumVO];
  274. m_rgvopmd [BASE_LAYER] = new VOPMode [m_iNumVO];
  275. m_rgvopmd [ENHN_LAYER] = new VOPMode [m_iNumVO];
  276. Int iVO;
  277. for (iVO = 0; iVO < m_iNumVO; iVO++) {
  278. // set VOL and VOP mode values
  279. for (Int iLayer = BASE_LAYER; iLayer <= m_rgbSpatialScalability [iVO] * ENHN_LAYER; iLayer++) {
  280. // NBIT
  281. m_rgvolmd [iLayer][iVO].bNot8Bit  = bNot8Bit;
  282. m_rgvolmd [iLayer][iVO].uiQuantPrecision  = uiQuantPrecision;
  283. m_rgvolmd [iLayer][iVO].nBits  = nBits;
  284. m_rgvolmd [iLayer][iVO].volType = (VOLtype) iLayer;
  285. m_rgvolmd [iLayer][iVO].fAUsage = rgfAlphaUsage [iVO];
  286. m_rgvolmd [iLayer][iVO].bShapeOnly = rgbShapeOnly [iVO];
  287. m_rgvolmd [iLayer][iVO].iBinaryAlphaTH = rgiBinaryAlphaTH [iVO] * 16;  //magic no. from the vm
  288. 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)
  289. m_rgvolmd [iLayer][iVO].bNoCrChange = rgbNoCrChange [iVO];
  290. m_rgvolmd [iLayer][iVO].bOriginalForME = rgbOriginalForME [iLayer][iVO];
  291. m_rgvolmd [iLayer][iVO].bAdvPredDisable = rgbAdvPredDisable [iLayer][iVO];
  292. // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 17 Jun 1998
  293. m_rgvolmd [iLayer][iVO].bComplexityEstimationDisable = rgbComplexityEstimationDisable [iLayer][iVO];
  294. m_rgvolmd [iLayer][iVO].bOpaque = rgbOpaque [iLayer][iVO];
  295. m_rgvolmd [iLayer][iVO].bTransparent = rgbTransparent [iLayer][iVO];
  296. m_rgvolmd [iLayer][iVO].bIntraCAE = rgbIntraCAE [iLayer][iVO];
  297. m_rgvolmd [iLayer][iVO].bInterCAE = rgbInterCAE [iLayer][iVO];
  298. m_rgvolmd [iLayer][iVO].bNoUpdate = rgbNoUpdate [iLayer][iVO];
  299. m_rgvolmd [iLayer][iVO].bUpsampling = rgbUpsampling [iLayer][iVO];
  300. m_rgvolmd [iLayer][iVO].bIntraBlocks = rgbIntraBlocks [iLayer][iVO];
  301. m_rgvolmd [iLayer][iVO].bInterBlocks = rgbInterBlocks [iLayer][iVO];
  302. m_rgvolmd [iLayer][iVO].bInter4vBlocks = rgbInter4vBlocks [iLayer][iVO];
  303. m_rgvolmd [iLayer][iVO].bNotCodedBlocks = rgbNotCodedBlocks [iLayer][iVO];
  304. m_rgvolmd [iLayer][iVO].bDCTCoefs = rgbDCTCoefs [iLayer][iVO];
  305. m_rgvolmd [iLayer][iVO].bDCTLines = rgbDCTLines [iLayer][iVO];
  306. m_rgvolmd [iLayer][iVO].bVLCSymbols = rgbVLCSymbols [iLayer][iVO];
  307. m_rgvolmd [iLayer][iVO].bVLCBits = rgbVLCBits [iLayer][iVO];
  308. m_rgvolmd [iLayer][iVO].bAPM = rgbAPM [iLayer][iVO];
  309. m_rgvolmd [iLayer][iVO].bNPM = rgbNPM [iLayer][iVO];
  310. m_rgvolmd [iLayer][iVO].bInterpolateMCQ = rgbInterpolateMCQ [iLayer][iVO];
  311. m_rgvolmd [iLayer][iVO].bForwBackMCQ = rgbForwBackMCQ [iLayer][iVO];
  312. m_rgvolmd [iLayer][iVO].bHalfpel2 = rgbHalfpel2 [iLayer][iVO];
  313. m_rgvolmd [iLayer][iVO].bHalfpel4 = rgbHalfpel4 [iLayer][iVO];
  314. m_rgvolmd [iLayer][iVO].bAllowSkippedPMBs = rgbAllowSkippedPMBs [iVO];
  315. // END: Complexity Estimation syntax support
  316. // START: Vol Control Parameters
  317. if(rguiVolControlParameters[0]!=NULL)
  318. {
  319. m_rgvolmd [iLayer][iVO].uiVolControlParameters = rguiVolControlParameters [iLayer][iVO];
  320. m_rgvolmd [iLayer][iVO].uiChromaFormat = rguiChromaFormat [iLayer][iVO];
  321. m_rgvolmd [iLayer][iVO].uiLowDelay = rguiLowDelay [iLayer][iVO];
  322. m_rgvolmd [iLayer][iVO].uiVBVParams = rguiVBVParams [iLayer][iVO];
  323. m_rgvolmd [iLayer][iVO].uiBitRate = rguiBitRate [iLayer][iVO];
  324. m_rgvolmd [iLayer][iVO].uiVbvBufferSize = rguiVbvBufferSize [iLayer][iVO];
  325. m_rgvolmd [iLayer][iVO].uiVbvBufferOccupany = rguiVbvBufferOccupany [iLayer][iVO];
  326. }
  327. else
  328. m_rgvolmd [iLayer][iVO].uiVolControlParameters = 0;
  329. // END: Vol Control Parameters
  330. m_rgvolmd [iLayer][iVO].bRoundingControlDisable = (iLayer== BASE_LAYER) ? rgbRoundingControlDisable[iVO] : 0;
  331. m_rgvolmd [iLayer][iVO].iInitialRoundingType = (iLayer== BASE_LAYER) ? rgiInitialRoundingType[iVO] : 0;
  332. m_rgvolmd [iLayer][iVO].bVPBitTh = rgbVPBitTh[iLayer][iVO];
  333. m_rgvolmd [iLayer][iVO].bDataPartitioning = rgbDataPartitioning [iLayer][iVO];
  334. m_rgvolmd [iLayer][iVO].bReversibleVlc  = rgbReversibleVlc [iLayer][iVO];
  335. m_rgvolmd [iLayer][iVO].fQuantizer = rgfQuant [iLayer][iVO];
  336. m_rgvolmd [iLayer][iVO].bNoGrayQuantUpdate 
  337. = rgbNoAlphaQuantUpdate [iLayer][iVO];
  338. m_rgvolmd [iLayer][iVO].dFrameHz = rgdFrameFrequency [iLayer][iVO];
  339. m_rgvolmd [iLayer][iVO].iMVRadiusPerFrameAwayFromRef = rguiSearchRange [iLayer][iVO];
  340. m_rgvopmd [iLayer][iVO].iSearchRangeForward = rguiSearchRange [iLayer][iVO];
  341. m_rgvopmd [iLayer][iVO].iSearchRangeBackward= rguiSearchRange [iLayer][iVO];
  342. m_rgvopmd [iLayer][iVO].intStepI = rgiStepI [iLayer][iVO];
  343. m_rgvopmd [iLayer][iVO].intStep = rgiStepP [iLayer][iVO];
  344. m_rgvopmd [iLayer][iVO].intStepB = rgiStepB [iLayer][iVO];
  345. m_rgvopmd [iLayer][iVO].intStepIAlpha = rgiStepIAlpha [iLayer][iVO];
  346. m_rgvopmd [iLayer][iVO].intStepPAlpha = rgiStepPAlpha [iLayer][iVO];
  347. m_rgvopmd [iLayer][iVO].intStepBAlpha = rgiStepBAlpha [iLayer][iVO];
  348. m_rgvopmd [iLayer][iVO].iIntraDcSwitchThr 
  349. = rgiIntraDCSwitchingThr [iLayer][iVO];
  350. m_rgvopmd [iLayer][iVO].bInterlace = rgbInterlacedCoding [iLayer][iVO];
  351. m_rgvopmd [iLayer][iVO].bTopFieldFirst = rgbTopFieldFirst [iLayer][iVO];
  352. m_rgvopmd [iLayer][iVO].bAlternateScan = rgbAlternateScan [iLayer][iVO];
  353. m_rgvopmd [iLayer][iVO].iDirectModeRadius = rgiDirectModeRadius [iLayer][iVO];
  354. m_rgvolmd [iLayer][iVO].bLoadIntraMatrix= rgbLoadIntraMatrix [iLayer][iVO];
  355. m_rgvolmd [iLayer][iVO].bLoadInterMatrix= rgbLoadInterMatrix [iLayer][iVO];
  356. m_rgvolmd [iLayer][iVO].bLoadIntraMatrixAlpha 
  357. = rgbLoadIntraMatrixAlpha [iLayer][iVO];
  358. m_rgvolmd [iLayer][iVO].bLoadInterMatrixAlpha 
  359. = rgbLoadInterMatrixAlpha [iLayer][iVO];
  360. memcpy (m_rgvolmd [iLayer][iVO].rgiIntraQuantizerMatrix, rgppiIntraQuantizerMatrix [iLayer][iVO], BLOCK_SQUARE_SIZE * sizeof (Int));
  361. memcpy (m_rgvolmd [iLayer][iVO].rgiInterQuantizerMatrix, rgppiInterQuantizerMatrix [iLayer][iVO], BLOCK_SQUARE_SIZE * sizeof (Int));
  362. memcpy (m_rgvolmd [iLayer][iVO].rgiIntraQuantizerMatrixAlpha, rgppiIntraQuantizerMatrixAlpha [iLayer][iVO], BLOCK_SQUARE_SIZE * sizeof (Int));
  363. memcpy (m_rgvolmd [iLayer][iVO].rgiInterQuantizerMatrixAlpha, rgppiInterQuantizerMatrixAlpha [iLayer][iVO], BLOCK_SQUARE_SIZE * sizeof (Int));
  364. m_rgvolmd [iLayer][iVO].bDeblockFilterDisable 
  365. = rgbDeblockFilterDisable [iVO];
  366. m_rgvolmd [iLayer][iVO].iBbetweenP = rgiNumOfBbetweenPVOP [iVO];
  367. m_rgvolmd [iLayer][iVO].iPbetweenI = rgiNumOfPbetweenIVOP [iVO];
  368. m_rgvolmd [iLayer][iVO].iGOVperiod = rgiGOVperiod [iVO]; // count of o/p frames between govs
  369. // set up temporal sampling rate and clock rate from source frame rate.
  370. m_rgvolmd [iLayer][iVO].iTemporalRate = rgiTemporalRate [iVO]; // frames to skip
  371. Double dFrameHz = m_rgvolmd [iLayer][iVO].dFrameHz;
  372. // this code copes with e.g. 12.5 fps and 29.97 fps by multiplying up the ticks per second
  373. // count appropriately
  374. Int iClockRate = (int)dFrameHz;
  375. if(dFrameHz != (double)iClockRate)
  376. {
  377. iClockRate = (int)(dFrameHz * 10.0);
  378. if(dFrameHz * 10.0 != (double)iClockRate)
  379. iClockRate = (int)(dFrameHz * 100.0);  // not much point going to 1000*
  380. }
  381. m_rgvolmd [iLayer][iVO].iClockRate = iClockRate;
  382. m_rgvolmd [iLayer][iVO].bDumpMB = rgbDumpMB [iVO];
  383. m_rgvolmd [iLayer][iVO].bTrace = rgbTrace [iVO];
  384. m_rgvolmd [iLayer][iVO].bTemporalScalability = FALSE;
  385. if(m_rgvolmd[iLayer][iVO].volType == ENHN_LAYER && m_rgbSpatialScalability [iVO] && rgiTemporalRate[iVO] == rgiEnhnTemporalRate[iVO]){
  386. // modified by Sharp (98/02/09)
  387. //#ifdef _Scalable_SONY_
  388. m_rgvolmd[iLayer][iVO].iHierarchyType = 0; //iHierarchyType 0 means spatial scalability
  389. //#endif _Scalable_SONY_
  390. m_rgvolmd[iLayer][iVO].iEnhnType = 0; // Spatial Scalable Enhancement layer shuold be set to Rectangular shape
  391. m_rgvolmd[iLayer][iVO].iSpatialOption = iSpatialOption; // This Option is for Spatial Scalable
  392. m_rgvolmd[iLayer][iVO].iver_sampling_factor_n = uiVer_sampling_n;
  393. m_rgvolmd[iLayer][iVO].iver_sampling_factor_m = uiVer_sampling_m;
  394. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_n = uiHor_sampling_n;
  395. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_m = uiHor_sampling_m;
  396. // begin: added by Sharp (98/2/12)
  397. else if (m_rgbSpatialScalability [iVO] && rgiTemporalRate[iVO] != rgiEnhnTemporalRate[iVO]){
  398. m_rgvolmd [iLayer][iVO].bTemporalScalability = TRUE;
  399. //#ifdef _Scalable_SONY_
  400. m_rgvolmd[iLayer][iVO].iHierarchyType = 1; //iHierarchyType 1 means temporal scalability
  401. //#endif _Scalable_SONY_
  402. m_rgvolmd [iLayer][iVO].iEnhnType = rgiEnhancementType [iVO];
  403. if ( rgiEnhancementType[iVO] != 0 ) // modified by Sharp (98/3/24)
  404. m_rgvolmd [BASE_LAYER][iVO].fAUsage = RECTANGLE;
  405. if ( iLayer == ENHN_LAYER ) {
  406. m_rgvolmd [ENHN_LAYER][iVO].iTemporalRate = rgiEnhnTemporalRate [iVO];
  407. Double dFrameHz = m_rgvolmd [ENHN_LAYER][iVO].dFrameHz;
  408. // this code copes with e.g. 12.5 fps and 29.97 fps by multiplying up the ticks per second
  409. // count appropriately
  410. Int iClockRate = (int)dFrameHz;
  411. if(dFrameHz != (double)iClockRate)
  412. {
  413. iClockRate = (int)(dFrameHz * 10.0);
  414. if(dFrameHz * 10.0 != (double)iClockRate)
  415. iClockRate = (int)(dFrameHz * 100.0);  // not much point going to 1000*
  416. }
  417. m_rgvolmd [ENHN_LAYER][iVO].iClockRate = iClockRate;
  418. }
  419. m_rgvolmd[iLayer][iVO].iver_sampling_factor_n = 1;
  420. m_rgvolmd[iLayer][iVO].iver_sampling_factor_m = 1;
  421. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_n = 1;
  422. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_m = 1;
  423. }
  424. // end: added by Sharp (98/2/12)
  425. else {
  426. m_rgvolmd[iLayer][iVO].iver_sampling_factor_n = 1;
  427. m_rgvolmd[iLayer][iVO].iver_sampling_factor_m = 1;
  428. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_n = 1;
  429. m_rgvolmd[iLayer][iVO].ihor_sampling_factor_m = 1;
  430. }
  431. }
  432. }
  433. static Char pchYUV [100], pchSeg [100];
  434. // check whether there are data for separate layers
  435. sprintf (pchYUV, ROOT_YUVFILE, m_pchBmpFiles, m_pchPrefix);
  436. sprintf (pchSeg, ROOT_SEGFILE, m_pchBmpFiles, m_pchPrefix);
  437. m_bTexturePerVOP = !fileExistence (pchYUV);
  438. m_bAlphaPerVOP = !fileExistence (pchSeg);
  439. m_bPrevObjectExists = FALSE; // added by Sharp (98/2/13)
  440. // sprite info
  441. m_ppstSrc = new CSiteD* [m_iNumVO];
  442. m_pppstDst = new CSiteD** [m_iNumVO];
  443. for (iVO = 0; iVO < m_iNumVO; iVO++) {
  444. m_ppstSrc [iVO] = (m_rgNumOfPnts [iVO] > 0) ? new CSiteD [m_rgNumOfPnts [iVO]] : NULL;
  445. m_pppstDst [iVO] = new CSiteD* [m_iNumFrame];
  446. for (Int ifr = 0; ifr < m_iNumFrame; ifr++) {
  447. m_pppstDst [iVO] [ifr] = 
  448. (m_rgNumOfPnts [iVO] > 0) ? new CSiteD [m_rgNumOfPnts [iVO]] : 
  449. NULL;
  450. }
  451. }
  452. for (iVO = m_iFirstVO; iVO <= m_iLastVO; iVO++)
  453. if (m_rgNumOfPnts [iVO - m_iFirstVO] > 0)
  454. readPntFile (iVO);
  455.     m_SptMode = pSpriteMode[0];
  456. m_rgiMVFileUsage = rgiMVFileUsage;
  457. m_pchMVFileName  = pchMVFileName;
  458. }
  459. Void CSessionEncoder::encode ()
  460. {
  461. FILE* pfYuvSrc = NULL;
  462. FILE* pfYuvSrcSpatialEnhn = NULL;
  463. FILE* pfSegSrc = NULL;
  464. FILE* rgpfReconYUV [2];
  465. FILE* rgpfReconSeg [2];
  466. Int iVO;
  467. UInt iVOrelative = 0;
  468. // begin: added by Sharp (98/2/12)
  469. Bool bTemporalScalability = m_rgvolmd[BASE_LAYER][0].bTemporalScalability;
  470. // Bool bTemporalScalability = TRUE;
  471. // for a buffer management of temporal scalability
  472. CEnhcBufferEncoder* pBufP1 = NULL;
  473. CEnhcBufferEncoder* pBufP2 = NULL;
  474. CEnhcBufferEncoder* pBufB1 = NULL;
  475. CEnhcBufferEncoder* pBufB2 = NULL;
  476. CEnhcBufferEncoder* pBufE = NULL;
  477. // for backward/forward shape
  478. Void set_modes(VOLMode* volmd, VOPMode* vopmd);
  479. VOLMode* volmd_backShape = NULL;
  480. VOLMode* volmd_forwShape = NULL;
  481. VOPMode* vopmd_backShape = NULL;
  482. VOPMode* vopmd_forwShape = NULL;
  483. if ( bTemporalScalability ){
  484. pBufP1 = new CEnhcBufferEncoder(m_rctOrg.width, m_rctOrg.height());
  485. pBufP2 = new CEnhcBufferEncoder(m_rctOrg.width, m_rctOrg.height());
  486. pBufB1 = new CEnhcBufferEncoder(m_rctOrg.width, m_rctOrg.height());
  487. pBufB2 = new CEnhcBufferEncoder(m_rctOrg.width, m_rctOrg.height());
  488. pBufE  = new CEnhcBufferEncoder(m_rctOrg.width, m_rctOrg.height());
  489. volmd_backShape = new VOLMode;
  490. volmd_forwShape = new VOLMode;
  491. vopmd_backShape = new VOPMode;
  492. vopmd_forwShape = new VOPMode;
  493. set_modes(volmd_backShape, vopmd_backShape);
  494. set_modes(volmd_forwShape, vopmd_forwShape);
  495. }
  496. // end: added by Sharp (98/2/12)
  497. for (iVO = m_iFirstVO; iVO <= (Int) m_iLastVO; iVO++, iVOrelative++) {
  498. ofstream* rgpostrm [2];
  499. ofstream* rgpostrmTrace [2];
  500. PixelC pxlcObjColor;
  501. VOLMode volmd = m_rgvolmd [BASE_LAYER] [iVOrelative];
  502. VOLMode volmd_enhn = m_rgvolmd [ENHN_LAYER] [iVOrelative]; // added by Sharp (98/2/10)
  503. getInputFiles ( pfYuvSrc, pfSegSrc, pfYuvSrcSpatialEnhn,
  504. rgpfReconYUV, rgpfReconSeg, 
  505. rgpostrm, rgpostrmTrace, pxlcObjColor, iVO, volmd, volmd_enhn); // modified by Sharp(98/2/10)
  506. CRct rctOrg;
  507. CVideoObjectEncoder* rgpvoenc [2];
  508. if (m_rguiSpriteUsage [iVOrelative] == 1) {
  509. // change m_rctOrg to sprite size
  510. rctOrg = m_rctOrg;
  511. m_rctFrame = m_rctOrg;
  512. m_rctOrg = findSptRct (iVO);
  513. }
  514. initVOEncoder (rgpvoenc, iVO, rgpostrmTrace);
  515. #undef write
  516. rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), //VO and VOL header
  517.   rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ());
  518. if(m_rgbSpatialScalability[iVOrelative]){
  519. rgpostrm[ENHN_LAYER]->write(rgpvoenc [ENHN_LAYER]->pOutStream () ->str(),
  520. rgpvoenc [ENHN_LAYER]->pOutStream () ->pcount ());
  521. }
  522. // begin: added by Sharp (98/2/12)
  523. // for back/forward shape
  524. if ( bTemporalScalability ){
  525.   initVObfShape (rgpvoenc[ENHN_LAYER]->rgpbfShape, iVO, *volmd_backShape, *vopmd_backShape, *volmd_forwShape, *vopmd_forwShape);
  526.   // copy pointers
  527.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pchBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchBitsBuffer;
  528.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmOut   = rgpvoenc[ENHN_LAYER]->m_pbitstrmOut;
  529.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pentrencSet   = rgpvoenc[ENHN_LAYER]->m_pentrencSet;
  530.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pchShapeBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchShapeBitsBuffer; // Oct 8
  531.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmShape      = rgpvoenc[ENHN_LAYER]->m_pbitstrmShape; //
  532.   rgpvoenc[ENHN_LAYER]->rgpbfShape[0]->m_pbitstrmShapeMBOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmShapeMBOut; //
  533.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pchBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchBitsBuffer;
  534.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmOut   = rgpvoenc[ENHN_LAYER]->m_pbitstrmOut;
  535.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pentrencSet   = rgpvoenc[ENHN_LAYER]->m_pentrencSet;
  536.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pchShapeBitsBuffer = rgpvoenc[ENHN_LAYER]->m_pchShapeBitsBuffer; // Oct 8
  537.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmShape     = rgpvoenc[ENHN_LAYER]->m_pbitstrmShape; //
  538.   rgpvoenc[ENHN_LAYER]->rgpbfShape[1]->m_pbitstrmShapeMBOut = rgpvoenc[ENHN_LAYER]->m_pbitstrmShapeMBOut; //
  539. }
  540. // end: added by Sharp (98/2/12)
  541. if (m_rguiSpriteUsage [iVO - m_iFirstVO] == 1) {
  542. // load sprite data into m_pvopcOrig
  543. loadSpt (iVO, rgpvoenc [BASE_LAYER] -> m_pvopcOrig);
  544. // encode the initial sprite
  545. if (m_SptMode == BASIC_SPRITE) 
  546. rgpvoenc [BASE_LAYER] -> encode (TRUE, -1, IVOP);
  547. else
  548. rgpvoenc [BASE_LAYER] -> encodeInitSprite (rctOrg);
  549. if (m_rgNumOfPnts [iVOrelative] > 0) {
  550. // change m_pvopcRefQ1 to m_pvopcSptQ for warping
  551. rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt ();
  552. // restore m_pvopcCurrQ size to the normal one
  553. m_rctOrg = rctOrg;
  554. rgpvoenc [BASE_LAYER] -> changeSizeofCurrQ (rctOrg);
  555. }
  556. rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (), //write sprite unit
  557.   rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ());
  558. }
  559. assert (!m_rctOrg.empty ());
  560. if (rgpvoenc [BASE_LAYER]->m_uiRateControl>=RC_TM5) {
  561. assert (!m_rgbSpatialScalability [iVOrelative]);
  562. assert (!bTemporalScalability);
  563. assert (volmd.iTemporalRate==1);
  564. #ifndef __TRACE_AND_STATS_
  565. cerr << "Compile flag __TRACE_AND_STATS_ required for stats for TM5 rate control." << endl;
  566. exit(1);
  567. #endif // __TRACE_AND_STATS_
  568. char pchQname[100];
  569. pchQname[0] = 0;
  570. //if( m_bRGBfiles ) {
  571. // if( m_pchOutStrFiles && m_pchOutStrFiles[0]) sprintf (pchQname, m_pchOutStrFiles, "q", iVO);
  572. //} else {
  573. if( m_pchOutStrFiles && m_pchOutStrFiles[0]) {
  574. sprintf (pchQname, SUB_CMPFILE, m_pchOutStrFiles, iVO, m_pchPrefix);
  575. }
  576. //}
  577. rgpvoenc [BASE_LAYER]->m_tm5rc.tm5rc_init_seq ( pchQname,
  578. rgpvoenc [BASE_LAYER]->m_uiRateControl,
  579. m_rgvolmd [BASE_LAYER] [iVOrelative].fAUsage,
  580. m_rctOrg.width,
  581. m_rctOrg.height(),
  582. (UInt)((m_rguiBudget [BASE_LAYER] [iVOrelative] * m_rgvolmd [BASE_LAYER][iVOrelative].dFrameHz)
  583.  / (m_iLastFrame - m_iFirstFrame + 1)),
  584. m_rgvolmd [BASE_LAYER][iVOrelative].dFrameHz
  585. );
  586. }
  587. // algorithm for generation of IPB sequences with arbitrary shape
  588.  //   (transparency allows for possible skipped frames) 
  589.  //   P prediction across skips is not allowed 
  590. #define DUMP_CURR 0
  591. #define DUMP_PREV 1
  592. #define DUMP_NONE 2
  593. Int iRefFrame;
  594. Int iDT = volmd.iTemporalRate;
  595. Int iDT_enhn = volmd_enhn.iTemporalRate; // added by Sharp (98/2/12)
  596. Int iRefInterval = volmd.iBbetweenP + 1;
  597. Int iPCount;
  598. Bool bObjectExists;
  599. const CVOPU8YUVBA* pvopcBaseQuant = NULL;
  600. Int iEcount = 0; // added by Sharp (98/2/12)
  601. Bool bCachedRefDump = FALSE;
  602. Bool bCachedRefCoded = TRUE;
  603. Bool bPrevObjectExists = FALSE; // added by Sharp (99/1/27)
  604. for(iRefFrame = m_iFirstFrame; iRefFrame <= m_iLastFrame; iRefFrame += iDT)
  605. {
  606. // encode initial I frame or non-coded sequence
  607. if(rgpvoenc [BASE_LAYER] -> skipTest(iRefFrame,IVOP)) // rate control
  608. continue;
  609. //encode GOV header added by SONY 980212
  610. // moved down slightly by swinder 980219
  611. //CAUTION:I don't know how GOV header is encoded in sprite mode
  612. // re-done by swinder 980511
  613. // gov header is output every n output frames, where n is iGOVperiod
  614. if (volmd.iGOVperiod != 0 
  615. && ((iRefFrame-m_iFirstFrame) % (volmd.iGOVperiod * volmd.iTemporalRate)) == 0)
  616. {
  617. rgpvoenc [BASE_LAYER] -> codeGOVHead (iRefFrame - m_iFirstFrame);
  618. rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (),
  619. rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ());
  620. }
  621. //980211
  622. // first dump any cached frames, otherwise a non coded frame will be out of order
  623. if(bCachedRefDump && m_rguiSpriteUsage [iVOrelative] == 0)
  624. {
  625. bCachedRefDump = FALSE;
  626. // last ref frame needs to be output
  627. #ifndef __OUT_ONE_FRAME_
  628. if ( bCachedRefCoded )
  629. dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), m_rctOrg, volmd);
  630. else
  631. dumpNonCodedFrame(rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], m_rctOrg, volmd.nBits);
  632. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability)
  633. dumpData (rgpfReconYUV [ENHN_LAYER], rgpfReconSeg [ENHN_LAYER], rgpvoenc[ENHN_LAYER] ->pvopcRefQLater(), m_rctOrgSpatialEnhn, volmd);
  634. // begin: deleted by Sharp (98/11/11)
  635. // #else
  636. //  dumpDataOneFrame (iFrame, iVO, rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), volmd); // save one frame
  637. //  if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability)
  638. //  dumpDataOneFrame (iFrame, iVO, rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), volmd); // save one frame
  639. // end: deleted by Sharp (98/11/11)
  640. #endif
  641. }
  642. int iGOPperiod = (volmd.iPbetweenI + 1) * (volmd.iBbetweenP + 1);
  643. if (rgpvoenc [BASE_LAYER]->m_uiRateControl >= RC_TM5 && iGOPperiod != 0 
  644. && ((iRefFrame-m_iFirstFrame) % (iGOPperiod * volmd.iTemporalRate)) == 0)
  645. {
  646. Int nppic, npic = (m_iLastFrame - iRefFrame + 1) / volmd.iTemporalRate;
  647. if (iRefFrame == m_iFirstFrame) {
  648. if (npic > (iGOPperiod - volmd.iBbetweenP))
  649. npic = iGOPperiod - volmd.iBbetweenP;
  650. } else {
  651. npic += volmd.iBbetweenP;
  652. if (npic > iGOPperiod)
  653. npic = iGOPperiod;
  654. }
  655. nppic = (npic + volmd.iBbetweenP) / (volmd.iBbetweenP + 1) - 1;
  656. rgpvoenc [BASE_LAYER] -> m_tm5rc.tm5rc_init_GOP(nppic, npic - nppic - 1); //  np, nb remain
  657. }
  658. // encode non-coded frames or initial IVOPs
  659. // we always dump these out
  660. bObjectExists = loadDataSpriteCheck (iVOrelative,iRefFrame, pfYuvSrc, pfSegSrc, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd);
  661. encodeVideoObject(bObjectExists, bObjectExists, iRefFrame, IVOP, DUMP_CURR,
  662.   iVO, iVOrelative, BASE_LAYER, 
  663.   pfYuvSrc,pfSegSrc,rgpfReconYUV,rgpfReconSeg,
  664.   pxlcObjColor, rgpvoenc, volmd, rgpostrm);
  665. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability ) { // modified by Sharp (98/2/12)
  666. pvopcBaseQuant = rgpvoenc [BASE_LAYER]->pvopcReconCurr ();
  667. encodeVideoObject (bObjectExists, bObjectExists, iRefFrame, PVOP, DUMP_CURR,
  668.    iVO, iVOrelative, ENHN_LAYER,
  669.    pfYuvSrcSpatialEnhn, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  670.    pxlcObjColor, rgpvoenc, volmd, rgpostrm,
  671.    pvopcBaseQuant);
  672. }
  673. // begin: added by Sharp (98/2/12)
  674. else if (m_rgbSpatialScalability [iVOrelative] && bTemporalScalability)
  675. pBufP2->getBuf( rgpvoenc[BASE_LAYER] );
  676. // end: added by Sharp (98/2/12)
  677. // go to next frame if this was not coded or we are just coding sprites
  678. if(!bObjectExists)
  679. continue; 
  680. // we dumped first frame so rest must be delayed by one for re-order
  681. iPCount = volmd.iPbetweenI;
  682. Int iWaitInterval = 0;
  683. while (TRUE) {
  684. // search for next reference frame
  685. Int iSearchFrame;
  686. for(iSearchFrame = iRefFrame + iDT * iRefInterval + iWaitInterval;
  687. iSearchFrame > iRefFrame; iSearchFrame -= iDT)
  688. if(iSearchFrame <= m_iLastFrame)
  689. {
  690. bObjectExists = loadDataSpriteCheck(iVOrelative,iSearchFrame, pfYuvSrc, pfSegSrc, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd);
  691. break;  // found a suitable reference frame
  692. // may not be coded
  693. }
  694. if(iSearchFrame==iRefFrame)
  695. break;
  696. if (rgpvoenc [BASE_LAYER] -> skipTest(iSearchFrame,iPCount ? PVOP : IVOP)) // rate control
  697. {
  698. // too early! need to wait a frame
  699. iWaitInterval += iDT;
  700. continue;
  701. }
  702. iWaitInterval = 0;
  703. CVOPU8YUVBA* pvopcBasePVOPQuant = NULL;
  704. // begin: added by Sharp (98/2/12)
  705. if ( bTemporalScalability )
  706. if ( pBufP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  707. pBufP1->copyBuf ( *pBufP2 );
  708. // end: added by Sharp (98/2/12)
  709. // encode the next reference frame
  710. //Bool bCachedRefDumpSaveForSpatialScalability = bCachedRefDump;
  711. if(iPCount==0)
  712. {
  713. //added to encode GOV header by SONY 980212
  714. // moved to here by swinder 980219
  715. //CAUTION:I don't know how GOV header is encoded in sprite mode - SONY
  716. // update by swinder 980511
  717. if (volmd.iGOVperiod != 0 
  718. && ((iSearchFrame-m_iFirstFrame) % (volmd.iGOVperiod * volmd.iTemporalRate)) == 0)
  719. {
  720. //modified by SONY (98/03/30)
  721. rgpvoenc [BASE_LAYER] -> codeGOVHead (iRefFrame - m_iFirstFrame + iDT);
  722. //modified by SONY (98/03/30) End
  723. /* rgpvoenc [BASE_LAYER] -> codeGOVHead (iSearchFrame - m_iFirstFrame);
  724. Original*/ // why was this changed? - swinder
  725. rgpostrm [BASE_LAYER]->write (rgpvoenc [BASE_LAYER]->pOutStream ()->str (),
  726. rgpvoenc [BASE_LAYER]->pOutStream ()->pcount ());
  727. }
  728. //980212
  729. int iGOPperiod = (volmd.iPbetweenI + 1) * (volmd.iBbetweenP + 1);
  730. if (rgpvoenc [BASE_LAYER]->m_uiRateControl >= RC_TM5 && iGOPperiod != 0 
  731. && ((iSearchFrame-m_iFirstFrame) % (iGOPperiod * volmd.iTemporalRate)) == 0)
  732. {
  733. Int nppic, npic = (m_iLastFrame - iSearchFrame + 1) / volmd.iTemporalRate;
  734. if (iRefFrame == m_iFirstFrame) {
  735. if (npic > (iGOPperiod - volmd.iBbetweenP))
  736. npic = iGOPperiod - volmd.iBbetweenP;
  737. } else {
  738. npic += volmd.iBbetweenP;
  739. if (npic > iGOPperiod)
  740. npic = iGOPperiod;
  741. }
  742. nppic = (npic + volmd.iBbetweenP) / (volmd.iBbetweenP + 1) - 1;
  743. rgpvoenc [BASE_LAYER] -> m_tm5rc.tm5rc_init_GOP(nppic, npic - nppic - 1); //  np, nb remain
  744. }
  745. // encode IVOP
  746. encodeVideoObject(bObjectExists, bPrevObjectExists, iSearchFrame, IVOP, bCachedRefDump ? DUMP_PREV : DUMP_NONE, // modified by Sharp (99/1/27)
  747.   iVO, iVOrelative, BASE_LAYER, 
  748.   pfYuvSrc, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  749.     pxlcObjColor, rgpvoenc, volmd, rgpostrm);
  750. bCachedRefDump = TRUE; // need to output this frame later
  751. bCachedRefCoded = bObjectExists;
  752. iPCount = volmd.iPbetweenI;
  753. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability )  // modified by Sharp
  754.                         pvopcBasePVOPQuant = new CVOPU8YUVBA (*(rgpvoenc [BASE_LAYER]->pvopcReconCurr ()),
  755.          rgpvoenc [BASE_LAYER]->pvopcReconCurr ()->whereY());
  756. // begin: added by Sharp (98/2/12)
  757. else if (m_rgbSpatialScalability [iVOrelative] && bTemporalScalability)
  758. pBufP2->getBuf( rgpvoenc[BASE_LAYER] );
  759. // end: added by Sharp (98/2/12)
  760. }
  761. else
  762. {
  763. // encoder PVOP
  764. encodeVideoObject(bObjectExists, bPrevObjectExists, iSearchFrame, PVOP, bCachedRefDump ? DUMP_PREV : DUMP_NONE, // modified by Sharp (99/1/27)
  765.   iVO, iVOrelative, BASE_LAYER, 
  766.   pfYuvSrcSpatialEnhn, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  767.   pxlcObjColor, rgpvoenc, volmd, rgpostrm);
  768. bCachedRefDump = TRUE; // need to output this frame later
  769. bCachedRefCoded = bObjectExists;
  770. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability )  // modified by Sharp (98/2/12)
  771. pvopcBasePVOPQuant = new CVOPU8YUVBA (*(rgpvoenc [BASE_LAYER]->pvopcReconCurr ()),
  772.          rgpvoenc [BASE_LAYER]->pvopcReconCurr ()->whereY());
  773. // begin: added by Sharp (98/2/12)
  774. else if (m_rgbSpatialScalability [iVOrelative] && bTemporalScalability)
  775. pBufP2->getBuf( rgpvoenc[BASE_LAYER] );
  776. // end: added by Sharp (98/2/12)
  777. if (iPCount>0)  // needed to handle iPCount = -1
  778. iPCount--;
  779. }
  780. bPrevObjectExists = bObjectExists;
  781. // encode B frames if needed
  782. Int iBFrame = iRefFrame + iDT; // added by Sharp (98/2/12)
  783. if(iRefInterval>1)
  784. {
  785. Bool bCachedBVOP = FALSE; // added by Sharp (98/11/11)
  786. // Int iBFrame;  // deleted by Sharp (98/2/12)
  787. for(iBFrame = iRefFrame + iDT; iBFrame < iSearchFrame; iBFrame += iDT)
  788. {
  789. if(rgpvoenc [BASE_LAYER] -> skipTest(iBFrame,BVOP))
  790. continue;
  791. bObjectExists = loadDataSpriteCheck(iVOrelative,iBFrame, pfYuvSrc, pfSegSrc, pxlcObjColor, rgpvoenc [BASE_LAYER]->m_pvopcOrig, volmd);
  792. encodeVideoObject (bObjectExists, bObjectExists, iBFrame, BVOP, bTemporalScalability ? DUMP_NONE: DUMP_CURR, // modified by Sharp (98/11/11)
  793.    iVO, iVOrelative, BASE_LAYER,
  794.    pfYuvSrc,pfSegSrc,rgpfReconYUV,rgpfReconSeg,
  795.    pxlcObjColor,rgpvoenc,volmd,rgpostrm);
  796. bCachedBVOP = bTemporalScalability ? TRUE : FALSE; // added by Sharp (98/11/11)
  797. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability) { // modified by Sharp (98/2/12)
  798. pvopcBaseQuant = rgpvoenc [BASE_LAYER]->pvopcReconCurr ();
  799. // Spatial Scalabe BVOP 
  800. encodeVideoObject (bObjectExists, bObjectExists, iBFrame, BVOP, DUMP_CURR, 
  801.    iVO, iVOrelative, ENHN_LAYER,
  802.    pfYuvSrcSpatialEnhn, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  803.    pxlcObjColor, rgpvoenc, volmd, rgpostrm,
  804.    pvopcBaseQuant);
  805. }
  806. // begin: added by Sharp (98/2/12)
  807. else if (m_rgbSpatialScalability [iVOrelative] && bTemporalScalability)
  808. pBufB2->getBuf( rgpvoenc[BASE_LAYER] );
  809. if ( m_rgbSpatialScalability [iVOrelative] && bTemporalScalability ) {  // for TPS enhancement layer
  810. rgpvoenc [ENHN_LAYER] -> m_iBCount = 0;
  811. for (Int iEFrame = iBFrame - iDT + iDT_enhn; iEFrame < iBFrame; iEFrame += iDT_enhn ) {
  812. updateRefForTPS( rgpvoenc[ENHN_LAYER], pBufP1, pBufP2, pBufB1, pBufB2, pBufE,
  813. 0, iVOrelative, iEcount, iBFrame-iDT+iDT_enhn, iEFrame, 0 );
  814. iEcount++;
  815. encodeEnhanceVideoObject(bObjectExists, iEFrame, rgpvoenc[ENHN_LAYER]->m_vopmd.vopPredType, DUMP_CURR,
  816. iVO,iVOrelative, pfYuvSrc,pfSegSrc,rgpfReconYUV,rgpfReconSeg,
  817. pxlcObjColor,rgpvoenc[ENHN_LAYER],volmd, volmd_enhn, iBFrame - iDT + iDT_enhn, rgpostrm,
  818. *pBufP1, *pBufP2, *pBufB1, *pBufB2, *pBufE
  819. );
  820. if ( !pBufB2->empty() ){
  821. if ( pBufB2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  822. pBufB1->copyBuf( *pBufB2 );
  823. pBufB2->dispose();
  824. }
  825. }
  826. }
  827. // end: added by Sharp (98/2/12)
  828. // begin: added by Sharp (98/11/11)
  829. if(bCachedBVOP && m_rguiSpriteUsage [iVOrelative] == 0)
  830. {
  831. // only for temporal scalability
  832. #ifndef __OUT_ONE_FRAME_
  833. // last ref frame needs to be output
  834. dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER],
  835. rgpvoenc[BASE_LAYER] ->pvopcReconCurr(), m_rctOrg, volmd);
  836. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability)
  837. dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER],
  838. rgpvoenc[BASE_LAYER] ->pvopcReconCurr(), m_rctOrgSpatialEnhn, volmd);
  839. #endif
  840. bCachedBVOP = FALSE;
  841. }
  842. // end: added by Sharp (98/11/11)
  843. }
  844. }
  845. if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability) { // modified by Sharp (98/2/12)
  846. /* (98/3/30) modified by SONY*/
  847. if (iPCount == volmd.iPbetweenI)        {
  848. /* (98/3/20) modified by SONY(end)*/
  849. /*            ORIGINAL
  850. if (iPCount == 0)       {
  851. */
  852. encodeVideoObject(TRUE, TRUE, iSearchFrame, PVOP,
  853.   DUMP_CURR, // sony
  854.   iVO, iVOrelative, ENHN_LAYER, 
  855.   pfYuvSrcSpatialEnhn, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  856.   pxlcObjColor,rgpvoenc,volmd,rgpostrm,
  857.   pvopcBasePVOPQuant);
  858. }
  859. else {
  860. VOPpredType PrevType = (rgpvoenc[ENHN_LAYER]->m_volmd.iSpatialOption == 0 )? BVOP: PVOP;
  861. encodeVideoObject (bObjectExists, bObjectExists, iSearchFrame, PrevType,
  862.    DUMP_CURR, // sony
  863.    iVO, iVOrelative, ENHN_LAYER, 
  864.    pfYuvSrcSpatialEnhn, pfSegSrc, rgpfReconYUV, rgpfReconSeg,
  865.    pxlcObjColor, rgpvoenc, volmd, rgpostrm,
  866.    pvopcBasePVOPQuant);
  867. }
  868. delete pvopcBasePVOPQuant;
  869. }
  870. // begin: added by Sharp (98/2/12)
  871. else if ( m_rgbSpatialScalability [iVOrelative] && bTemporalScalability ){  // loop for TPS enhancement layer
  872. rgpvoenc [ENHN_LAYER] -> m_iBCount = 0;
  873. for (Int iEFrame = iSearchFrame - iDT + iDT_enhn; iEFrame < iSearchFrame; iEFrame += iDT_enhn ) {
  874. updateRefForTPS( rgpvoenc[ENHN_LAYER], pBufP1, pBufP2, pBufB1, pBufB2, pBufE,
  875. 0, iVOrelative, iEcount, iBFrame-iDT+iDT_enhn, iEFrame, 0 );
  876. iEcount++;
  877. encodeEnhanceVideoObject(bObjectExists, iEFrame, rgpvoenc[ENHN_LAYER]->m_vopmd.vopPredType, DUMP_CURR,
  878. iVO,iVOrelative,pfYuvSrc,pfSegSrc,rgpfReconYUV,rgpfReconSeg,
  879. pxlcObjColor,rgpvoenc[ENHN_LAYER],volmd, volmd_enhn, iSearchFrame - iDT + iDT_enhn, rgpostrm,
  880. *pBufP1, *pBufP2, *pBufB1, *pBufB2, *pBufE
  881. );
  882. }
  883. pBufB1->dispose();
  884. }
  885. // end: added by Sharp (98/2/12)
  886. // move onwards
  887. iRefFrame = iSearchFrame;
  888. }
  889. }
  890. if(bCachedRefDump && m_rguiSpriteUsage [iVOrelative] == 0)
  891. {
  892. // last ref frame needs to be output
  893. #ifndef __OUT_ONE_FRAME_
  894. if ( bCachedRefCoded )
  895. dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), m_rctOrg, volmd);
  896. else
  897. dumpNonCodedFrame(rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], m_rctOrg, volmd.nBits);
  898. // begin deleted by sony
  899. // if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability)
  900. // dumpData (rgpfReconYUV [BASE_LAYER], rgpfReconSeg [BASE_LAYER], rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), m_rctOrgSpatialEnhn, volmd);
  901. // end deleted by sony
  902. bCachedRefDump = FALSE; // added by Sharp (98/11/11)
  903. // begin: deleted by Sharp (98/11/11)
  904. //#else
  905. // dumpDataOneFrame (iFrame, iVO, rgpvoenc[BASE_LAYER] ->pvopcRefQLater(), volmd); // save one frame
  906. // if (m_rgbSpatialScalability [iVOrelative] && !bTemporalScalability)
  907. // dumpDataOneFrame (iFrame, iVO, rgpvoenc[ENHN_LAYER] ->pvopcRefQLater(), volmd); // save one frame
  908. // end: deleted by Sharp (98/11/11)
  909. #endif
  910. }
  911. cout << "nBASE VOL " << iVO << "n";
  912. CStatistics sts = rgpvoenc [BASE_LAYER] -> statVOL ();
  913. #ifdef __TRACE_AND_STATS_
  914. sts.print (TRUE); // dumping statistics
  915. #endif // __TRACE_AND_STATS_
  916. delete rgpvoenc [BASE_LAYER];
  917. fclose (rgpfReconYUV [BASE_LAYER]);
  918. if (m_rgvolmd [BASE_LAYER] [iVOrelative].fAUsage != RECTANGLE) {
  919. fclose (rgpfReconSeg [BASE_LAYER]);
  920. }
  921. delete rgpostrm [BASE_LAYER];
  922. delete rgpostrmTrace [BASE_LAYER];
  923. if (m_rgbSpatialScalability [iVOrelative] == TRUE) {
  924. cout << "nEHNANCED VOL " << iVO << "n";
  925. sts = rgpvoenc [ENHN_LAYER] -> statVOL ();
  926. #ifdef __TRACE_AND_STATS_
  927. sts.print (TRUE); // dumping statistics
  928. #endif // __TRACE_AND_STATS_
  929. delete rgpvoenc [ENHN_LAYER];
  930. fclose (rgpfReconYUV [ENHN_LAYER]);
  931. if (m_rgvolmd [BASE_LAYER] [iVOrelative].fAUsage != RECTANGLE) {
  932. fclose (rgpfReconSeg [ENHN_LAYER]);
  933. }
  934. delete rgpostrm [ENHN_LAYER];
  935. delete rgpostrmTrace [ENHN_LAYER];
  936. }
  937. }
  938. }
  939. Bool CSessionEncoder::loadDataSpriteCheck(UInt iVOrelative,UInt iFrame, FILE* pfYuvSrc, FILE* pfSegSrc, PixelC pxlcObjColor, CVOPU8YUVBA* pvopcDst, const VOLMode& volmd)
  940. {
  941. Bool bObjectExists = TRUE;
  942. if(m_rguiSpriteUsage [iVOrelative] == 0)
  943. bObjectExists = loadData (iFrame,pfYuvSrc,pfSegSrc, pxlcObjColor, pvopcDst, m_rctOrg, volmd);
  944. return bObjectExists;
  945. }
  946. Void CSessionEncoder::encodeVideoObject(Bool bObjectExists,
  947. Bool bPrevObjectExists,
  948. Int iFrame,
  949. VOPpredType predType,
  950. Int iDumpMode,
  951. Int iVO,
  952. Int iVOrelative,
  953. Int iLayer,
  954. FILE* pfYuvSrc,
  955. FILE* pfSegSrc,
  956. FILE* rgpfReconYUV[],
  957. FILE* rgpfReconSeg[],
  958. PixelC pxlcObjColor,
  959. CVideoObjectEncoder** rgpvoenc,
  960. const VOLMode& volmd,
  961. ofstream* rgpostrm[],
  962. const CVOPU8YUVBA* pvopcBaseQuant)
  963. {
  964. CRct rctOrg;
  965. if (m_rguiSpriteUsage [iVOrelative] == 0) {
  966.         rctOrg = m_rctOrg;
  967. if (iLayer == ENHN_LAYER) { 
  968. rctOrg = m_rctOrgSpatialEnhn;
  969. if((rgpvoenc [iLayer] -> skipTest((Time)iFrame,predType)))  // rate control
  970. return;
  971. bObjectExists = loadData(iFrame, pfYuvSrc, pfSegSrc, pxlcObjColor, rgpvoenc [iLayer]->m_pvopcOrig, rctOrg, volmd);
  972. }
  973. rgpvoenc [iLayer] -> encode (bObjectExists, (Time) (iFrame - m_iFirstFrame), predType, pvopcBaseQuant);
  974. if (iLayer == ENHN_LAYER)
  975. rgpvoenc [iLayer]-> swapSpatialScalabilityBVOP ();
  976. }
  977. else {
  978.         rctOrg = m_rctFrame;
  979. CRct rctWarp = (m_rgNumOfPnts [iVO - m_iFirstVO] > 0)? 
  980.                         findBoundBoxInAlpha (iFrame, iVO) : m_rctOrg;
  981. rgpvoenc [BASE_LAYER]->encodeSptTrajectory (iFrame, m_pppstDst [iVO - m_iFirstVO] [iFrame - m_iFirstFrame], rctWarp);
  982. bObjectExists = TRUE;
  983. }
  984. //dump the output
  985. // begin: added by Sharp (99/1/28)
  986. #ifndef __OUT_ONE_FRAME_
  987. if(iDumpMode==DUMP_CURR || m_rguiSpriteUsage [iVOrelative] != 0)
  988. {
  989. if (bObjectExists) 
  990. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc[iLayer] ->pvopcReconCurr(), rctOrg, volmd);
  991. else
  992. dumpNonCodedFrame(rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rctOrg, volmd.nBits);
  993. }
  994. else if(iDumpMode==DUMP_PREV){ // dump previous reference frame
  995. if ( bPrevObjectExists )
  996. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc[iLayer] ->pvopcRefQPrev(), rctOrg, volmd);
  997. else
  998. dumpNonCodedFrame(rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rctOrg, volmd.nBits);
  999. }
  1000. #else
  1001. if (bObjectExists) 
  1002. dumpDataOneFrame (iFrame, iVO, rgpvoenc[iLayer] ->pvopcReconCurr(), volmd); // save one frame
  1003. else
  1004. dumpNonCodedFrame(rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rctOrg, volmd.nBits);
  1005. #endif
  1006. // end: added by Sharp (99/1/28)
  1007. // begin: deleted by Sharp (99/1/28)
  1008. /*
  1009. if (bObjectExists) {
  1010. // begin: modified by Sharp (98/11/11)
  1011. // begin: modification by Sharp (98/2/12)
  1012. #ifndef __OUT_ONE_FRAME_
  1013. if(iDumpMode==DUMP_CURR || m_rguiSpriteUsage [iVOrelative] != 0)
  1014. {
  1015. // dump current reconstructed frame
  1016. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc[iLayer] ->pvopcReconCurr(), rctOrg, volmd);
  1017. }
  1018. else if(iDumpMode==DUMP_PREV) // dump previous reference frame
  1019. {
  1020. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc[iLayer] ->pvopcRefQPrev(), rctOrg, volmd);
  1021. }
  1022. // end: modification by Sharp (98/2/12)
  1023. #else
  1024. dumpDataOneFrame (iFrame, iVO, rgpvoenc[iLayer] ->pvopcReconCurr(), volmd); // save one frame
  1025. #endif
  1026. // end: modified by Sharp (98/11/11)
  1027. }
  1028. #ifndef __OUT_ONE_FRAME_ // added by Sharp (98/11/11)
  1029. else
  1030. dumpNonCodedFrame(rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rctOrg, volmd.nBits);
  1031. #endif // added by Sharp (98/11/11)
  1032. */
  1033. // end: deleted by Sharp (99/1/28)
  1034. rgpostrm [iLayer]->write (rgpvoenc [iLayer]->pOutStream ()->str (),
  1035. rgpvoenc [iLayer]->pOutStream ()->pcount ());
  1036. }
  1037. Void CSessionEncoder::readPntFile (UInt iobj)
  1038. {
  1039. Char pchtmp [100];
  1040. sprintf (pchtmp, SUB_PNTFILE, m_pchSptPntDir, iobj, m_pchPrefix);
  1041. FILE* pfPnt = fopen (pchtmp, "r");
  1042. if(pfPnt==NULL)
  1043. fatal_error("Can't open sprite point file");
  1044. Int numPnt;
  1045. Int iVOidx = iobj - m_iFirstVO;
  1046. fscanf (pfPnt, "%d", &numPnt);
  1047. assert (numPnt == m_rgNumOfPnts [iVOidx]);
  1048. Int ifrF;
  1049. Double dblX, dblY;
  1050. for (Int ip = 0; ip < numPnt; ip++)
  1051. fscanf (pfPnt, "%lf%lf", &m_ppstSrc [iVOidx] [ip].x, &m_ppstSrc [iVOidx] [ip].y); // not used
  1052. while (fscanf (pfPnt, "%d", &ifrF) != EOF) {
  1053. if ((ifrF >= m_iFirstFrame) && (ifrF <= m_iLastFrame)) {
  1054. for (Int ip = 0; ip < numPnt; ip++) {
  1055. fscanf (pfPnt, "%lf %lf", &dblX, &dblY);
  1056. Int iFrmIndex = ifrF - m_iFirstFrame;
  1057. if (iFrmIndex % (m_rgvolmd [BASE_LAYER] [iVOidx].iTemporalRate) == 0) {
  1058. m_pppstDst [iVOidx] [iFrmIndex] [ip].x = dblX;
  1059. m_pppstDst [iVOidx] [iFrmIndex] [ip].y = dblY;
  1060. }
  1061. }
  1062. } else {
  1063. for (Int ip = 0; ip < numPnt; ip++) {
  1064. fscanf (pfPnt, "%lf %lf", &dblX, &dblY);
  1065. }
  1066. }
  1067. }
  1068. }
  1069. Void CSessionEncoder::loadSpt (UInt iobj, CVOPU8YUVBA* pvopcDst)
  1070. {
  1071. Char pchSpt [100];
  1072. sprintf (pchSpt, SUB_VDLFILE, m_pchSptDir, iobj, m_pchPrefix);
  1073. FILE* pf = fopen (pchSpt, "rb");
  1074. // read overhead
  1075. Int c0 = getc (pf);
  1076. Int c1 = getc (pf);
  1077. Int c2 = getc (pf);
  1078. assert (c0 == 'S' && (c1 == 'P' || c2 == 'T') );
  1079. CRct rctSpt;
  1080. Bool bAUsage;
  1081. fread (&rctSpt.left, sizeof (CoordI), 1, pf);
  1082. fread (&rctSpt.top, sizeof (CoordI), 1, pf);
  1083. fread (&rctSpt.right, sizeof (CoordI), 1, pf);
  1084. fread (&rctSpt.bottom, sizeof (CoordI), 1, pf);
  1085. fread (&bAUsage, sizeof (Int), 1, pf);
  1086. #ifndef _FOR_GSSP_
  1087. assert (bAUsage != EIGHT_BIT); // sprite with Alpha channel is not supported at this moment
  1088. #endif
  1089. Int iYDataHeight = m_rctOrg.height ();
  1090. Int iUVDataHeight = m_rctOrg.height () / 2;
  1091. Int iYFrmWidth = pvopcDst->whereY ().width;
  1092. Int iUvFrmWidth = pvopcDst->whereUV ().width;
  1093. Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
  1094. Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
  1095. PixelC* ppxlcY = (PixelC*) pvopcDst->pixelsY () + nSkipYPixel;
  1096. PixelC* ppxlcU = (PixelC*) pvopcDst->pixelsU () + nSkipUvPixel;
  1097. PixelC* ppxlcV = (PixelC*) pvopcDst->pixelsV () + nSkipUvPixel;
  1098. CoordI y;
  1099. for (y = 0; y < iYDataHeight; y++) {
  1100. Int size = (Int) fread (ppxlcY, sizeof (U8), m_rctOrg.width, pf);
  1101. if (size == 0)
  1102. fprintf (stderr, "Unexpected end of filen");
  1103. ppxlcY += iYFrmWidth;
  1104. }
  1105. for (y = 0; y < iUVDataHeight; y++) {
  1106. Int size = (Int) fread (ppxlcU, sizeof (U8), m_rctOrg.width / 2, pf);
  1107. if (size == 0)
  1108. fprintf (stderr, "Unexpected end of filen");
  1109. ppxlcU += iUvFrmWidth;
  1110. }
  1111. for (y = 0; y < iUVDataHeight; y++) {
  1112. Int size = (Int) fread (ppxlcV, sizeof (U8), m_rctOrg.width / 2, pf);
  1113. if (size == 0)
  1114. fprintf (stderr, "Unexpected end of filen");
  1115. ppxlcV += iUvFrmWidth;
  1116. }
  1117. PixelC* ppxlcBY = (PixelC*) pvopcDst->pixelsBY () + nSkipYPixel;
  1118. //Int iObjectExist = 0;
  1119. if ((bAUsage == ONE_BIT) && (pvopcDst -> fAUsage () == ONE_BIT)) { // load Alpha
  1120. //binary
  1121. for (CoordI y = 0; y < iYDataHeight; y++) {
  1122. Int size = (Int) fread (ppxlcBY, sizeof (U8), m_rctOrg.width, pf);
  1123. if (size == 0)
  1124. fprintf (stderr, "Unexpected end of filen");
  1125. ppxlcBY += iYFrmWidth;
  1126. }
  1127. ((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
  1128. }
  1129. #ifdef _FOR_GSSP_
  1130. else if ((bAUsage == EIGHT_BIT) && (pvopcDst -> fAUsage () == EIGHT_BIT)) { // load Alpha
  1131. //grayscale alpha
  1132. PixelC* ppxlcA = (PixelC*) pvopcDst->pixelsA () + nSkipYPixel;
  1133. for (CoordI y = 0; y < iYDataHeight; y++) {
  1134. for (CoordI x = 0; x < m_rctOrg.width; x++) {
  1135. PixelC pxlcCurr = getc (pf);
  1136. ppxlcA [x]  = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? pxlcCurr : transpValue;
  1137. ppxlcBY [x] = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? opaqueValue : transpValue;
  1138. }
  1139. ppxlcBY += iYFrmWidth;
  1140. ppxlcA  += iYFrmWidth;
  1141. }
  1142. ((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
  1143. }
  1144. #endif
  1145. }
  1146. Void CSessionEncoder::getInputFiles (FILE*& pfYuvSrc, FILE*& pfAlpSrc, FILE*& pfYuvSrcSpatialEnhn,
  1147.  FILE* rgpfReconYUV [], FILE* rgpfReconSeg [], 
  1148.  ofstream* rgpostrm [], ofstream* rgpostrmTrace [],
  1149.  PixelC& pxlcObjColor, Int iobj, const VOLMode& volmd, const VOLMode& volmd_enhn)
  1150. {
  1151. static Char pchYUV [100], pchSeg [100], pchCmp [100], pchTrace [100];
  1152. //output files
  1153. createCmpDir (iobj);
  1154. sprintf (pchCmp, SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1155. sprintf (pchTrace, SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1156. rgpostrm [BASE_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
  1157. rgpostrmTrace [BASE_LAYER] = NULL;
  1158. if (volmd.bTrace)
  1159. rgpostrmTrace [BASE_LAYER] = new ofstream (pchTrace);
  1160. // prepare for the reconstructed files
  1161. createReconDir (iobj); // create a directory for the reconstructed YUV in case it doesn't exist
  1162. sprintf (pchYUV, SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1163. sprintf (pchSeg, SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1164. rgpfReconSeg [BASE_LAYER] = NULL;
  1165. rgpfReconSeg [ENHN_LAYER] = NULL;
  1166. rgpfReconYUV [BASE_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
  1167. assert (rgpfReconYUV [BASE_LAYER] != NULL);
  1168. if (volmd.fAUsage != RECTANGLE) {
  1169. rgpfReconSeg [BASE_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
  1170. assert (rgpfReconSeg [BASE_LAYER] != NULL);
  1171. }
  1172. /*
  1173. if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE) {
  1174. sprintf (pchCmp, ENHN_SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1175. sprintf (pchTrace, ENHN_SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1176. rgpostrm [ENHN_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
  1177. rgpostrmTrace [ENHN_LAYER] = NULL;
  1178. if (volmd.bTrace)
  1179. rgpostrmTrace [ENHN_LAYER] = new ofstream (pchTrace);
  1180. sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1181. sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1182. rgpfReconYUV [ENHN_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
  1183. if (volmd.fAUsage != RECTANGLE) {
  1184. rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
  1185. assert (FALSE); // no spatial scalability for shape
  1186. }
  1187. }
  1188. */ //wchen: moved down 
  1189. if (!m_bTexturePerVOP) 
  1190. sprintf (pchYUV, ROOT_YUVFILE, m_pchBmpFiles, m_pchPrefix);
  1191. else 
  1192. sprintf (pchYUV, SUB_YUVFILE, m_pchBmpFiles, iobj, m_pchPrefix);
  1193. pfYuvSrc = fopen (pchYUV, "rb");
  1194. if (pfYuvSrc == NULL) {
  1195. fprintf (stderr, "can't open %sn", pchYUV);
  1196. exit (1);
  1197. }
  1198. if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE) {
  1199. sprintf (pchCmp, ENHN_SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1200. sprintf (pchTrace, ENHN_SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
  1201. rgpostrm [ENHN_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
  1202. rgpostrmTrace [ENHN_LAYER] = NULL;
  1203. if (volmd_enhn.bTrace) // modified by Sharp (98/2/12)
  1204. rgpostrmTrace [ENHN_LAYER] = new ofstream (pchTrace);
  1205. // begin: added by Sharp (98/10/26)
  1206. if ( volmd_enhn.bTemporalScalability == TRUE ){
  1207. rgpfReconYUV [ENHN_LAYER] = rgpfReconYUV[BASE_LAYER];
  1208. if (volmd_enhn.fAUsage != RECTANGLE) {
  1209. if ( volmd_enhn.iEnhnType == 0 )
  1210. rgpfReconSeg [ENHN_LAYER] = rgpfReconSeg[BASE_LAYER];
  1211. else{
  1212. sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1213. rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
  1214. }
  1215. }
  1216. } else {
  1217. // end: added by Sharp (98/10/26)
  1218. sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1219. sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1220. rgpfReconYUV [ENHN_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
  1221. if (volmd_enhn.fAUsage != RECTANGLE) { // modified by Sharp (98/2/12)
  1222. rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
  1223. // deleted by Sharp (98/10/26)
  1224. // begin: added by Sharp (98/2/10)
  1225. // if ( volmd.bTemporalScalability == TRUE )
  1226. // assert (rgpfReconSeg [ENHN_LAYER] != NULL);
  1227. // else
  1228. // end: added by Sharp (98/2/10)
  1229. // end: deleted by Sharp (98/10/26)
  1230. assert (FALSE); // no spatial scalability for shape
  1231. }
  1232. } // added by Sharp (98/10/26)
  1233. if ( volmd_enhn.bTemporalScalability == FALSE ){ // added by Sharp (98/2/10)
  1234. if (!m_bTexturePerVOP) { 
  1235. fprintf (stderr,"m_bTexturePerVOP != 0 is not applyed for spatial scalable codingn");
  1236. }
  1237. else 
  1238. sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchBmpFiles, iobj, m_pchPrefix);
  1239. pfYuvSrcSpatialEnhn = fopen (pchYUV, "rb");
  1240. if (pfYuvSrcSpatialEnhn == NULL){
  1241. fprintf (stderr,"can't open %sn", pchYUV);
  1242. exit(1);
  1243. }
  1244. } // added by Sharp (98/2/10)
  1245. }
  1246. if (volmd.fAUsage != RECTANGLE ||
  1247. m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE && volmd_enhn.fAUsage != RECTANGLE) { // load Alpha // modified by Sharp (98/2/12)
  1248. if (!m_bAlphaPerVOP) {
  1249. pxlcObjColor = iobj;
  1250. sprintf (pchSeg, ROOT_SEGFILE, m_pchBmpFiles, m_pchPrefix);
  1251. }
  1252. else {
  1253. pxlcObjColor = opaqueValue;   // out data notation
  1254. sprintf (pchSeg, SUB_SEGFILE, m_pchBmpFiles, iobj, m_pchPrefix);
  1255. }
  1256. pfAlpSrc = fopen (pchSeg, "rb");
  1257. if (pfAlpSrc == NULL) {
  1258. fprintf (stderr, "can't open %sn", pchSeg);
  1259. exit (1);
  1260. }
  1261. }
  1262. // begin: deleted by Sharp (98/10/26)
  1263. // begin: added by Sharp (98/2/10)
  1264. // #ifndef __OUT_ONE_FRAME_
  1265. //  if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE && volmd_enhn.bTemporalScalability == TRUE && volmd_enhn.iEnhnType != 0) { // modified by Sharp (98/3/24)
  1266. //  FILE *pfTemp;
  1267. //  sprintf (pchYUV, "%s/%2.2d/%s_bgc.yuv", m_pchReconYUVDir, iobj, m_pchPrefix);
  1268. //  pfTemp = fopen (pchYUV, "wb");  // clear file pointer for background composition
  1269. //  fclose(pfTemp);
  1270. //  }
  1271. // #endif
  1272. // end: added by Sharp (98/2/10)
  1273. // end: deleted by Sharp (98/10/26)
  1274. }
  1275. Void CSessionEncoder::initVOEncoder (CVideoObjectEncoder** rgpvoenc, Int iobj, ofstream* rgpostrmTrace [])
  1276. {
  1277. Int iVOidx = iobj - m_iFirstVO;
  1278. Bool bTemporalScalability = m_rgvolmd[BASE_LAYER][iVOidx].bTemporalScalability; // added by Sharp (98/2/10)
  1279. // Bool bTemporalScalability = TRUE; // added by Sharp (98/2/10)
  1280. if (m_rgbSpatialScalability [iVOidx] == TRUE) {
  1281. rgpvoenc [BASE_LAYER] = new CVideoObjectEncoder (
  1282. iobj, 
  1283. m_rgvolmd [BASE_LAYER] [iVOidx], 
  1284. m_rgvopmd [BASE_LAYER] [iVOidx], 
  1285. m_iFirstFrame,
  1286. m_iLastFrame,
  1287. m_rctOrg.width,
  1288. m_rctOrg.height(),
  1289. m_rguiRateControl [BASE_LAYER] [iVOidx],
  1290. m_rguiBudget [BASE_LAYER] [iVOidx],
  1291. rgpostrmTrace [BASE_LAYER],
  1292. m_rguiWarpingAccuracy [iVOidx],
  1293. m_rgNumOfPnts [iVOidx],
  1294. m_pppstDst [iVOidx],
  1295. m_SptMode,
  1296. m_rctFrame,
  1297.                                                         m_rctOrg,
  1298. m_rgiMVFileUsage [BASE_LAYER][iVOidx],
  1299. m_pchMVFileName  [BASE_LAYER][iVOidx]);
  1300. // begin: added by Sharp (98/2/10)
  1301. if ( bTemporalScalability )
  1302. rgpvoenc [ENHN_LAYER] = new CVideoObjectEncoder (
  1303. iobj, 
  1304. m_rgvolmd [ENHN_LAYER] [iVOidx],
  1305. m_rgvopmd [ENHN_LAYER] [iVOidx], 
  1306. m_iFirstFrame,
  1307. m_iLastFrame,
  1308. m_rctOrg.width,
  1309. m_rctOrg.height(),
  1310. m_rguiRateControl [ENHN_LAYER] [iVOidx],
  1311. m_rguiBudget [ENHN_LAYER] [iVOidx],
  1312. rgpostrmTrace [ENHN_LAYER],
  1313. 0,
  1314. -1,
  1315.                                                         m_pppstDst [iVOidx],
  1316. m_SptMode,
  1317. m_rctFrame,
  1318. m_rctOrgSpatialEnhn,
  1319. m_rgiMVFileUsage [ENHN_LAYER][iVOidx],
  1320. m_pchMVFileName  [ENHN_LAYER][iVOidx]);
  1321. else
  1322. // end: added by Sharp (98/2/10)
  1323. rgpvoenc [ENHN_LAYER] = new CVideoObjectEncoder (
  1324. iobj, 
  1325. m_rgvolmd [ENHN_LAYER] [iVOidx],
  1326. m_rgvopmd [ENHN_LAYER] [iVOidx], 
  1327. m_iFirstFrame,
  1328. m_iLastFrame,
  1329. m_rctOrgSpatialEnhn.width,
  1330. m_rctOrgSpatialEnhn.height (),
  1331. m_rguiRateControl [ENHN_LAYER] [iVOidx],
  1332. m_rguiBudget [ENHN_LAYER] [iVOidx],
  1333. rgpostrmTrace [ENHN_LAYER],
  1334. 0,
  1335. -1,
  1336.                                                         m_pppstDst [iVOidx],
  1337. m_SptMode,
  1338. m_rctFrame,
  1339. m_rctOrgSpatialEnhn,
  1340. m_rgiMVFileUsage [ENHN_LAYER][iVOidx],
  1341. m_pchMVFileName  [ENHN_LAYER][iVOidx]);
  1342. }
  1343. else {
  1344. rgpvoenc [BASE_LAYER] = new CVideoObjectEncoder (
  1345. iobj, 
  1346. m_rgvolmd [BASE_LAYER] [iVOidx], 
  1347. m_rgvopmd [BASE_LAYER] [iVOidx], 
  1348. m_iFirstFrame,
  1349. m_iLastFrame,
  1350. m_rctOrg.width,
  1351. m_rctOrg.height (),
  1352. m_rguiRateControl [BASE_LAYER] [iVOidx],
  1353. m_rguiBudget [BASE_LAYER] [iVOidx],
  1354. rgpostrmTrace [BASE_LAYER],
  1355. m_rguiWarpingAccuracy [iVOidx],
  1356. m_rgNumOfPnts [iVOidx],
  1357. m_pppstDst [iVOidx],
  1358. m_SptMode,
  1359. m_rctFrame,
  1360.                                                         m_rctOrg,
  1361. m_rgiMVFileUsage [BASE_LAYER][iVOidx],
  1362. m_pchMVFileName  [BASE_LAYER][iVOidx]);
  1363. }
  1364. }
  1365. Bool CSessionEncoder::loadData (UInt iFrame, FILE* pfYuvSrc, FILE* pfSegSrc, PixelC pxlcObjColor, CVOPU8YUVBA* pvopcDst, CRct& rctOrg, const VOLMode& volmd)
  1366. {
  1367. Int iLeadingPixels = iFrame * rctOrg.area ();
  1368. if (volmd.nBits<=8) {
  1369. fseek (pfYuvSrc, iLeadingPixels + iLeadingPixels / 2, SEEK_SET); //4:2:0
  1370. } else { // NBIT: 2 bytes per pixel, Y component plus UV
  1371. fseek (pfYuvSrc, iLeadingPixels * 3, SEEK_SET);
  1372. }
  1373. if (volmd.fAUsage != RECTANGLE)
  1374. fseek (pfSegSrc, iLeadingPixels, SEEK_SET);
  1375. Int iYDataHeight = rctOrg.height ();
  1376. Int iUVDataHeight = rctOrg.height () / 2;
  1377. Int iYFrmWidth = pvopcDst->whereY ().width;
  1378. Int iUvFrmWidth = pvopcDst->whereUV ().width;
  1379. Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
  1380. Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
  1381. PixelC* ppxlcY = (PixelC*) pvopcDst->pixelsY () + nSkipYPixel;
  1382. PixelC* ppxlcU = (PixelC*) pvopcDst->pixelsU () + nSkipUvPixel;
  1383. PixelC* ppxlcV = (PixelC*) pvopcDst->pixelsV () + nSkipUvPixel;
  1384. CoordI y,x;
  1385. for (y = 0; y < iYDataHeight; y++) {
  1386. Int size = (Int) fread (ppxlcY, sizeof (PixelC), rctOrg.width, pfYuvSrc);
  1387. if (size == 0)
  1388. fprintf (stderr, "Unexpected end of filen");
  1389. ppxlcY += iYFrmWidth;
  1390. }
  1391.  /* modified by Rockwell (98/05/08)
  1392. if (volmd.nBits<=8) {*/
  1393. for (y = 0; y < iUVDataHeight; y++) {
  1394. Int size = (Int) fread (ppxlcU, sizeof (PixelC), rctOrg.width / 2, pfYuvSrc);
  1395. if (size == 0)
  1396. fprintf (stderr, "Unexpected end of filen");
  1397. ppxlcU += iUvFrmWidth;
  1398. }
  1399. for (y = 0; y < iUVDataHeight; y++) {
  1400. Int size = (Int) fread (ppxlcV, sizeof (PixelC), rctOrg.width / 2, pfYuvSrc);
  1401. if (size == 0)
  1402. fprintf (stderr, "Unexpected end of filen");
  1403. ppxlcV += iUvFrmWidth;
  1404. }
  1405.   /* modified by Rockwell (98/05/08)
  1406.   } else { // NBIT: fill UV space with default pixel value
  1407. Int iDefval = 1<<(volmd.nBits-1);
  1408. Int iUVDataWidth = rctOrg.width / 2;
  1409. for (y = 0; y < iUVDataHeight; y++) {
  1410. for (x = 0; x < iUVDataWidth; x++) {
  1411. ppxlcU[x] = iDefval;
  1412. ppxlcV[x] = iDefval;
  1413. }
  1414. ppxlcU += iUvFrmWidth;
  1415. ppxlcV += iUvFrmWidth;
  1416. }
  1417.     }
  1418.   */
  1419. PixelC* ppxlcBY = (PixelC*) pvopcDst->pixelsBY () + nSkipYPixel;
  1420. Int iObjectExist = 0;
  1421. if (volmd.fAUsage == ONE_BIT) { // load Alpha
  1422. //binary
  1423. for (y = 0; y < iYDataHeight; y++) {
  1424. for (x = 0; x < rctOrg.width; x++) {
  1425. PixelC pxlcCurr = getc (pfSegSrc);
  1426. ppxlcBY [x] = (pxlcCurr == pxlcObjColor) ? opaqueValue : transpValue;
  1427. iObjectExist += ppxlcBY [x];
  1428. }
  1429. ppxlcBY += iYFrmWidth;
  1430. }
  1431. ((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
  1432. }
  1433. else if (volmd.fAUsage == EIGHT_BIT) { // load Alpha
  1434. //gray
  1435. PixelC* ppxlcA = (PixelC*) pvopcDst->pixelsA () + nSkipYPixel;
  1436. for (y = 0; y < iYDataHeight; y++) {
  1437. for (x = 0; x < rctOrg.width; x++) {
  1438. PixelC pxlcCurr = getc (pfSegSrc);
  1439. ppxlcA [x]  = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? pxlcCurr : transpValue;
  1440. ppxlcBY [x] = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? opaqueValue : transpValue;
  1441. iObjectExist += ppxlcBY [x];
  1442. }
  1443. ppxlcBY += iYFrmWidth;
  1444. ppxlcA  += iYFrmWidth;
  1445. }
  1446. ((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
  1447. }
  1448. else                                                                                                        //rectangle
  1449. iObjectExist = 1;
  1450. /* static int ini = 0;
  1451. if(ini = 0)
  1452. {
  1453. srand(123421);
  1454. ini = 1;
  1455. }
  1456. int k = rand();
  1457. if((k%4)==0)
  1458. iObjectExist = 0;*/
  1459. return (iObjectExist != 0);
  1460. }
  1461. CRct CSessionEncoder::findBoundBoxInAlpha (UInt ifr, UInt iobj)
  1462. {
  1463. CIntImage* pfiARet = NULL;
  1464. Char pchSeg [100];
  1465. if (m_rgvolmd [BASE_LAYER] [iobj].fAUsage != RECTANGLE) { // load Alpha
  1466. if (!m_bAlphaPerVOP) {
  1467. sprintf (pchSeg, ROOT_SEGFILE, m_pchBmpFiles, m_pchPrefix);
  1468. pfiARet = alphaFromCompFile (pchSeg, ifr, iobj, m_rctOrg);
  1469. }
  1470. else {
  1471. sprintf (pchSeg, SUB_SEGFILE, m_pchBmpFiles, iobj, m_pchPrefix);
  1472. pfiARet = new CIntImage (pchSeg, ifr, m_rctOrg);
  1473. pfiARet -> threshold (64);
  1474. }
  1475. CRct rctBoundingBox = pfiARet -> whereVisible ();
  1476. if (rctBoundingBox.left % 2 != 0)
  1477. rctBoundingBox.left--;
  1478. if (rctBoundingBox.top % 2 != 0)
  1479. rctBoundingBox.top--;
  1480. if (rctBoundingBox.right % 2 != 0)
  1481. rctBoundingBox.right++;
  1482. if (rctBoundingBox.bottom % 2 != 0)
  1483. rctBoundingBox.bottom++;
  1484. rctBoundingBox.width = rctBoundingBox.right - rctBoundingBox.left;
  1485. delete pfiARet;
  1486. return rctBoundingBox;
  1487. }
  1488. else
  1489. return m_rctOrg;
  1490. }
  1491. CRct CSessionEncoder::findSptRct (UInt iobj)
  1492. {
  1493. CRct rctSpt;
  1494. Char pchSpt [100];
  1495. sprintf (pchSpt, SUB_VDLFILE, m_pchSptDir, iobj, m_pchPrefix);
  1496. FILE* pf = fopen (pchSpt, "rb");
  1497. // read overhead
  1498. Int c0 = getc (pf);
  1499. Int c1 = getc (pf);
  1500. Int c2 = getc (pf);
  1501. assert (c0 == 'S' && (c1 == 'P' || c2 == 'T') );
  1502. fread (&rctSpt.left, sizeof (CoordI), 1, pf);
  1503. fread (&rctSpt.top, sizeof (CoordI), 1, pf);
  1504. fread (&rctSpt.right, sizeof (CoordI), 1, pf);
  1505. fread (&rctSpt.bottom, sizeof (CoordI), 1, pf);
  1506. assert (rctSpt.left % 2 == 0);
  1507. assert (rctSpt.top % 2 == 0);
  1508. rctSpt.width = rctSpt.right - rctSpt.left;
  1509. fclose (pf);
  1510. return rctSpt;
  1511. }
  1512. Void CSessionEncoder::dumpData (FILE* pfYuvDst, FILE* pfSegDst, 
  1513. const CVOPU8YUVBA* pvopcSrc, 
  1514. const CRct& rctOrg, const VOLMode& volmd)
  1515. {
  1516. Int iYDataHeight = rctOrg.height ();
  1517. Int iUVDataHeight = rctOrg.height () / 2;
  1518. Int iYFrmWidth = pvopcSrc->whereY ().width;
  1519. Int iUvFrmWidth = pvopcSrc->whereUV ().width;
  1520. Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
  1521. Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
  1522. const PixelC* ppxlcY = pvopcSrc->pixelsY () + nSkipYPixel;
  1523. const PixelC* ppxlcU = pvopcSrc->pixelsU () + nSkipUvPixel;
  1524. const PixelC* ppxlcV = pvopcSrc->pixelsV () + nSkipUvPixel;
  1525. if ( volmd.iEnhnType == 0 || volmd.volType == BASE_LAYER ){ // added by Sharp (99/1/20)
  1526. CoordI y;
  1527. for (y = 0; y < iYDataHeight; y++) {
  1528. Int size = (Int) fwrite (ppxlcY, sizeof (PixelC), rctOrg.width, pfYuvDst);
  1529. if (size == 0)
  1530. exit(fprintf (stderr, "Can't write to filen"));
  1531. ppxlcY += iYFrmWidth;
  1532. }
  1533.     // NBIT: now there is a UV component when nBits>8
  1534. for (y = 0; y < iUVDataHeight; y++) {
  1535. Int size = (Int) fwrite (ppxlcU, sizeof (PixelC), rctOrg.width / 2, pfYuvDst);
  1536. if (size == 0)
  1537. exit(fprintf (stderr, "Can't write to filen"));
  1538. ppxlcU += iUvFrmWidth;
  1539. }
  1540. for (y = 0; y < iUVDataHeight; y++) {
  1541. Int size = (Int) fwrite (ppxlcV, sizeof (PixelC), rctOrg.width / 2, pfYuvDst);
  1542. if (size == 0)
  1543. exit(fprintf (stderr, "Can't write to filen"));
  1544. ppxlcV += iUvFrmWidth;
  1545. }
  1546.   } // added by Sharp (99/1/20)
  1547. // if ( volmd.iEnhnType == 0) { // added by Sharp (98/10/26)
  1548. if (volmd.fAUsage == ONE_BIT) {
  1549. const PixelC* ppxlcBY = pvopcSrc->pixelsBY () + nSkipYPixel;
  1550. for (CoordI y = 0; y < iYDataHeight; y++) {
  1551.     if (volmd.bNot8Bit==0) {
  1552. /* Int size = (Int)*/ fwrite (ppxlcBY, sizeof (PixelC), m_rctOrg.width, pfSegDst);
  1553.     } else { // NBIT: here PixelC is unsigned short
  1554. const PixelC* ppxlcBYAux = ppxlcBY;
  1555. for (CoordI x = 0; x < m_rctOrg.width; x++, ppxlcBYAux++) {
  1556. fwrite(ppxlcBYAux, sizeof(PixelC), 1, pfSegDst);
  1557. }
  1558.     }
  1559. ppxlcBY += iYFrmWidth;
  1560. }
  1561. } else if (volmd.fAUsage == EIGHT_BIT) {
  1562. const PixelC* ppxlcBY = pvopcSrc->pixelsBY () + nSkipYPixel;
  1563. const PixelC* ppxlcA = pvopcSrc->pixelsA () + nSkipYPixel;
  1564. const PixelC pxlcZero = 0;
  1565. for (CoordI y = 0; y < iYDataHeight; y++) {
  1566. const PixelC* ppxlcBYAux = ppxlcBY;
  1567. const PixelC* ppxlcAAux = ppxlcA;
  1568. CoordI x;
  1569. for( x = 0; x < m_rctOrg.width; x++, ppxlcBYAux++, ppxlcAAux++)
  1570. if(*ppxlcBYAux)
  1571. fwrite(ppxlcAAux, sizeof(PixelC), 1, pfSegDst);
  1572. else
  1573. fwrite(&pxlcZero, sizeof(PixelC), 1, pfSegDst);
  1574. ppxlcA += iYFrmWidth;
  1575. ppxlcBY += iYFrmWidth;
  1576. }
  1577. }
  1578. // } // added by Sharp (98/10/26)
  1579. }
  1580. Void CSessionEncoder::updateRefForTPS (
  1581. CVideoObjectEncoder* pvopc,
  1582. CEnhcBufferEncoder* BufP1,
  1583. CEnhcBufferEncoder* BufP2,
  1584. CEnhcBufferEncoder* BufB1,
  1585. CEnhcBufferEncoder* BufB2,
  1586. CEnhcBufferEncoder* BufE,
  1587. Int bNoNextVOP,
  1588. Int iVOrelative,
  1589. Int iEcount,
  1590. Int ibFrameWithRate,
  1591. Int ieFrame,
  1592. Bool bupdateForLastLoop
  1593. )
  1594. {
  1595. if ( (m_rgiTemporalScalabilityType[iVOrelative] == 2 && iEcount == 0) ||
  1596. (m_rgiTemporalScalabilityType[iVOrelative] == 0 && ieFrame == ibFrameWithRate) ){
  1597. if ( BufP1 -> m_bCodedFutureRef == 1 ){ // added by Sharp (99/1/26)
  1598. pvopc -> setPredType(PVOP);
  1599. pvopc -> setRefSelectCode(1);
  1600. if ( BufB1 -> empty() )
  1601. BufP1 -> putBufToQ0 ( pvopc );
  1602. else
  1603. BufB1 -> putBufToQ0 ( pvopc );
  1604. } else // added by Sharp (99/1/26)
  1605. pvopc -> setPredType(IVOP); // added by Sharp (99/1/26)
  1606. } else if ( m_rgiTemporalScalabilityType[iVOrelative] == 2 ){
  1607. pvopc -> setPredType(BVOP);
  1608. pvopc -> setRefSelectCode(1);
  1609. BufE -> putBufToQ0 ( pvopc );
  1610. if ( BufB1 -> empty() )
  1611. BufP1 -> putBufToQ1( pvopc );
  1612. else
  1613. BufB1 -> putBufToQ1( pvopc );
  1614. } else if ( m_rgiTemporalScalabilityType[iVOrelative] == 1 ){
  1615. if ( bNoNextVOP && !bupdateForLastLoop ) {
  1616. pvopc -> setPredType(BVOP);
  1617. pvopc -> setRefSelectCode(3);
  1618. if ( BufB1 -> empty() )
  1619. BufP1 -> putBufToQ0( pvopc );
  1620. else
  1621. BufB1 -> putBufToQ0( pvopc );
  1622. if ( BufB2 -> empty() )
  1623. BufP2 -> putBufToQ1( pvopc );
  1624. else
  1625. BufB2 -> putBufToQ1( pvopc );
  1626. }
  1627. else if ( bNoNextVOP && bupdateForLastLoop ) {
  1628. if ( BufP1 -> m_bCodedFutureRef == 1 ){ // added by Sharp (99/1/26)
  1629. pvopc -> setPredType(PVOP);
  1630. pvopc -> setRefSelectCode(1);
  1631. if ( BufB1 -> empty() )
  1632. BufP1 -> putBufToQ0 ( pvopc );
  1633. else
  1634. BufB1 -> putBufToQ0 ( pvopc );
  1635. } else // added by Sharp (99/1/26)
  1636. pvopc -> setPredType(IVOP); // added by Sharp (99/1/26)
  1637. }
  1638. else {
  1639. Time prevTime;
  1640. Time nextTime;
  1641. pvopc -> setPredType(BVOP);
  1642. pvopc -> setRefSelectCode(3);
  1643. if ( BufB1 -> empty() ){
  1644. BufP1 -> putBufToQ0( pvopc );
  1645. // cout << "Time of Q0:" << BufP1 -> m_t << "n";
  1646. prevTime = BufP1 -> m_t;
  1647. }
  1648. else{
  1649. BufB1 -> putBufToQ0( pvopc );
  1650. // cout << "Time of Q0:" << BufB1 -> m_t << "n";
  1651. prevTime = BufB1 -> m_t;
  1652. }
  1653. if ( BufB2 -> empty() ){
  1654. BufP2 -> putBufToQ1( pvopc );
  1655. // cout << "Time of Q1:" << BufP2 -> m_t << "n";
  1656. nextTime = BufP2 -> m_t;
  1657. }
  1658. else{
  1659. BufB2 -> putBufToQ1( pvopc );
  1660. // cout << "Time of Q1:" << BufB2 -> m_t << "n";
  1661. nextTime = BufB2 -> m_t;
  1662. }
  1663. pvopc -> m_tPastRef = prevTime;
  1664. pvopc -> m_tFutureRef = nextTime;
  1665. }
  1666. // begin: added by Sharp (99/1/25)
  1667.   else if ( m_rgiTemporalScalabilityType[iVOrelative] == 3 && iEcount == 0) {
  1668. if ( BufP1 -> m_bCodedFutureRef == 1 ){
  1669.         pvopc -> setPredType(PVOP);
  1670.         pvopc -> setRefSelectCode(2);
  1671.         if ( BufB2 -> empty() )
  1672.           BufP2 -> putBufToQ1 ( pvopc );
  1673.         else
  1674.           BufB2 -> putBufToQ1 ( pvopc );
  1675.     } else {
  1676.       pvopc -> setPredType(IVOP);
  1677.     }
  1678.   } else if ( m_rgiTemporalScalabilityType[iVOrelative] == 3 ){
  1679.     pvopc -> setPredType(BVOP);
  1680.     pvopc -> setRefSelectCode(2);
  1681.     BufE -> putBufToQ0 ( pvopc );
  1682.     if ( BufB2 -> empty() )
  1683.       BufP2 -> putBufToQ1( pvopc );
  1684.     else
  1685.       BufB2 -> putBufToQ1( pvopc );
  1686.   } else if (m_rgiTemporalScalabilityType[iVOrelative] == 4 ){
  1687.     pvopc -> setPredType(PVOP);
  1688.     pvopc -> setRefSelectCode(2);
  1689.     if ( BufB2 -> empty() )
  1690.       BufP2 -> putBufToQ1 ( pvopc );
  1691.     else
  1692.       BufB2 -> putBufToQ1 ( pvopc );
  1693.   }
  1694. // end: added by Sharp (99/1/25)
  1695. else {
  1696. if ( BufE -> m_bCodedFutureRef == 1 ){ // added by Sharp (99/1/26)
  1697. pvopc -> setPredType(PVOP);
  1698. pvopc -> setRefSelectCode(0);
  1699. BufE -> putBufToQ0 ( pvopc );
  1700. } else // added by Sharp (99/1/26)
  1701. pvopc -> setPredType(IVOP); // added by Sharp (99/1/26)
  1702. }
  1703. }
  1704. // for back/foward shape
  1705. Void CSessionEncoder::initVObfShape (CVideoObjectEncoder** rgpbfShape, 
  1706. Int iobj, // ofstream* rgpostrmTrace [],
  1707. VOLMode& volmd_back, 
  1708. VOPMode& vopmd_back,
  1709. VOLMode& volmd_forw, 
  1710. VOPMode& vopmd_forw
  1711. ) // made from initVOEncoder()
  1712. {
  1713. rgpbfShape [0] = new CVideoObjectEncoder ( iobj, 
  1714. volmd_back,
  1715. vopmd_back,
  1716. m_rctOrg.width,
  1717. m_rctOrg.height () //,
  1718.      );
  1719. rgpbfShape [1] = new CVideoObjectEncoder ( iobj, 
  1720. volmd_forw,
  1721. vopmd_forw,
  1722. m_rctOrg.width,
  1723. m_rctOrg.height () //,
  1724.      );
  1725. }
  1726. Void CSessionEncoder::dumpDataOneFrame (UInt iFrame, Int iobj, const CVOPU8YUVBA* pvopcSrc, const VOLMode& volmd)
  1727. {
  1728. static Int iYDataHeight = m_rctOrg.height ();
  1729. static Int iUVDataHeight = m_rctOrg.height () / 2;
  1730. static Int iYFrmWidth = pvopcSrc->whereY ().width;
  1731. static Int iUvFrmWidth = pvopcSrc->whereUV ().width;
  1732. static Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
  1733. static Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
  1734. const PixelC* ppxlcY = pvopcSrc->pixelsY () + nSkipYPixel;
  1735. const PixelC* ppxlcU = pvopcSrc->pixelsU () + nSkipUvPixel;
  1736. const PixelC* ppxlcV = pvopcSrc->pixelsV () + nSkipUvPixel;
  1737. // cout << "n=== write in separate format : frame no. =" << iFrame << "n";
  1738. static Char pchYUV [100], pchSeg [100];
  1739. CoordI y;
  1740. // if(volmd.volType == BASE_LAYER) { // deleted by Sharp (98/11/11)
  1741. sprintf (pchYUV, SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1742. sprintf (pchSeg, SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1743. // } // deleted by Sharp (98/11/11)
  1744. // begin: deleted by Sharp (98/11/11)
  1745. // else {
  1746. // sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1747. // sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
  1748. // }
  1749. // end: deleted by Sharp (98/11/11)
  1750. sprintf (pchYUV, "%s%d", pchYUV, iFrame);
  1751. sprintf (pchSeg, "%s%d", pchSeg, iFrame);
  1752. FILE* pfYuvDst = fopen(pchYUV, "wb");
  1753. for (y = 0; y < iYDataHeight; y++) {
  1754. Int size = (Int) fwrite (ppxlcY, sizeof (PixelC), m_rctOrg.width, pfYuvDst);
  1755. if (size == 0)
  1756. exit(fprintf (stderr, "Can't write to file(Y)n"));
  1757. ppxlcY += iYFrmWidth;
  1758. }
  1759. for (y = 0; y < iUVDataHeight; y++) {
  1760. Int size = (Int) fwrite (ppxlcU, sizeof (PixelC), m_rctOrg.width / 2, pfYuvDst);
  1761. if (size == 0)
  1762. exit(fprintf (stderr, "Can't write to file(U)n"));
  1763. ppxlcU += iUvFrmWidth;
  1764. }
  1765. for (y = 0; y < iUVDataHeight; y++) {
  1766. Int size = (Int) fwrite (ppxlcV, sizeof (PixelC), m_rctOrg.width / 2, pfYuvDst);
  1767. if (size == 0)
  1768. exit(fprintf (stderr, "Can't write to file(V)n"));
  1769. ppxlcV += iUvFrmWidth;
  1770. }
  1771. fclose(pfYuvDst);
  1772. if (volmd.fAUsage != RECTANGLE) {
  1773. FILE* pfSegDst = fopen(pchSeg, "wb");
  1774. const PixelC* ppxlcA = (volmd.fAUsage == ONE_BIT) ? pvopcSrc->pixelsBY () + nSkipYPixel
  1775.   : pvopcSrc->pixelsA () + nSkipYPixel;
  1776. for (y = 0; y < iYDataHeight; y++) {
  1777. Int size = (Int) fwrite (ppxlcA, sizeof (PixelC), m_rctOrg.width, pfSegDst);
  1778. if (size == 0)
  1779. exit(fprintf (stderr, "Can't write to file(B)n"));
  1780. ppxlcA += iYFrmWidth;
  1781. }
  1782. fclose(pfSegDst);
  1783. }
  1784. }
  1785. Void CSessionEncoder::encodeEnhanceVideoObject(Bool bObjectExists,
  1786. Int iFrame,
  1787. VOPpredType predType,
  1788. Int iDumpMode,
  1789. Int iVO,Int iVOrelative,
  1790. FILE* pfYuvSrc,
  1791. FILE* pfSegSrc,
  1792. FILE* rgpfReconYUV[],
  1793. FILE* rgpfReconSeg[],
  1794. PixelC pxlcObjColor,
  1795. CVideoObjectEncoder* rgpvoenc,
  1796. const VOLMode& volmd,
  1797. const VOLMode& volmd_enhn,
  1798. Int iEnhnFirstFrame,
  1799. ofstream* rgpostrm[],
  1800. CEnhcBufferEncoder& BufP1,
  1801. CEnhcBufferEncoder& BufP2,
  1802. CEnhcBufferEncoder& BufB1,
  1803. CEnhcBufferEncoder& BufB2,
  1804. CEnhcBufferEncoder& BufE
  1805. )
  1806. {
  1807. Int ieFramebShape; // for back/forward shape : frame number of backward shape
  1808. Int ieFramefShape; // for back/forward shape : frame number of forward shape
  1809. // m_bPrevObjectExists = FALSE; // added by Sharp (98/2/10)
  1810. Int iLayer = 1;
  1811. if (m_rguiSpriteUsage [iVOrelative] == 0) {
  1812. bObjectExists = loadData (iFrame, pfYuvSrc, pfSegSrc, pxlcObjColor, rgpvoenc ->m_pvopcOrig, m_rctOrg, volmd_enhn);
  1813. if ( rgpvoenc -> m_volmd.iEnhnType == 1) {
  1814. rgpvoenc -> set_LoadShape(&ieFramebShape, &ieFramefShape, volmd.iTemporalRate, 
  1815. iFrame, m_iFirstFrame, iEnhnFirstFrame );
  1816. if ( bObjectExists && !m_bPrevObjectExists && rgpvoenc -> m_volmd.iEnhnType == 1 )
  1817. { // bVOPVisible reflect a value of VOP_CODED
  1818. rgpvoenc -> m_vopmd.iLoadBakShape = 1;
  1819. rgpvoenc -> m_vopmd.iLoadForShape = 1;
  1820. }
  1821. m_bPrevObjectExists = bObjectExists;
  1822. // printf("FLAG: %d, %dn", rgpvoenc -> m_vopmd.iLoadBakShape, rgpvoenc -> m_vopmd.iLoadForShape );
  1823. if(rgpvoenc -> m_vopmd.iLoadBakShape) {
  1824. rgpvoenc  -> m_vopmd.iLoadBakShape = loadData (ieFramebShape, pfYuvSrc, pfSegSrc, pxlcObjColor, 
  1825. rgpvoenc ->rgpbfShape [0]->m_pvopcOrig, m_rctOrg, rgpvoenc ->rgpbfShape[0]->m_volmd);
  1826. if ( !rgpvoenc -> m_vopmd.iLoadBakShape )
  1827. cout << "Load_backward_shape was ON, but turned off because of no shapen";
  1828. }
  1829. if(rgpvoenc -> m_vopmd.iLoadForShape) {
  1830. rgpvoenc -> m_vopmd.iLoadForShape = loadData (ieFramefShape, pfYuvSrc, pfSegSrc, pxlcObjColor, 
  1831. rgpvoenc ->rgpbfShape [1]->m_pvopcOrig, m_rctOrg, rgpvoenc ->rgpbfShape[1]->m_volmd);
  1832. if ( !rgpvoenc -> m_vopmd.iLoadForShape )
  1833. cout << "Load_forward_shape was ON, but turned off because of no shapen";
  1834. }
  1835. }
  1836. // begin: added by Sharp (98/3/24)
  1837. else if ( rgpvoenc -> m_volmd.iEnhnType == 2 ) {
  1838. rgpvoenc -> m_vopmd.iLoadBakShape = 0;
  1839. rgpvoenc -> m_vopmd.iLoadForShape = 0;
  1840. }
  1841. // end: added by Sharp (98/3/24)
  1842. rgpvoenc -> encode (bObjectExists, (Time) (iFrame - m_iFirstFrame), predType); //, pvopcBaseQuant
  1843. // for background composition
  1844. if(rgpvoenc -> m_volmd.iEnhnType != 0) {
  1845. // should be changed to background_composition flag later. // modified by Sharp (98/3/24)
  1846. // printf("Performing B.C. ... Time = (%d, %d, %d)n", iFrame, ieFramefShape, ieFramebShape);
  1847. rgpvoenc -> BackgroundComposition(m_rctOrg.width, m_rctOrg.height (),
  1848. iFrame, ieFramefShape, ieFramebShape,
  1849. BufP1.m_pvopcBuf,
  1850. BufP2.m_pvopcBuf,
  1851. BufB1.m_pvopcBuf,
  1852. BufB2.m_pvopcBuf,
  1853. m_pchReconYUVDir, iVO, m_pchPrefix,
  1854. rgpfReconYUV[iLayer]); // modified by Sharp (98/10/26)
  1855. }
  1856. } // sprite
  1857. //dump the output
  1858. if (bObjectExists) {
  1859. // if ( rgpvoenc -> m_volmd.iEnhnType == 0 ){ // added by Sharp (98/10/26) // deleted by Sharp (99/1/25)
  1860. // begin: modified by Sharp (98/11/11)
  1861. #ifndef __OUT_ONE_FRAME_
  1862. if(iDumpMode==DUMP_CURR)
  1863. {
  1864. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc ->pvopcReconCurr (), m_rctOrg, volmd_enhn);
  1865. }
  1866. else if(iDumpMode==DUMP_PREV)
  1867. {
  1868. dumpData (rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], rgpvoenc ->pvopcRefQPrev (), m_rctOrg, volmd_enhn);
  1869. }
  1870. #else
  1871. dumpDataOneFrame (iFrame, iVO, rgpvoenc ->pvopcReconCurr(), volmd_enhn); // save one frame
  1872. #endif
  1873. // end: modified by Sharp (98/11/11)
  1874. // } // added by Sharp (98/10/26) // deleted by Sharp (99/1/25)
  1875. }
  1876. #ifndef __OUT_ONE_FRAME_ // added by Sharp (98/11/11)
  1877. else
  1878. dumpNonCodedFrame(rgpfReconYUV [iLayer], rgpfReconSeg [iLayer], m_rctOrg, volmd_enhn.nBits);
  1879. #endif // added by Sharp (98/11/11)
  1880. rgpostrm[ENHN_LAYER] ->write (rgpvoenc ->pOutStream ()->str (), rgpvoenc ->pOutStream ()->pcount ());
  1881. if ( rgpvoenc -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1882. BufE.getBuf( rgpvoenc );
  1883. }