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

流媒体/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. Simon Winder (swinder@microsoft.com), Microsoft Corporation
  8. (date: March, 1996)
  9. and edited by
  10. Hiroyuki Katata (katata@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  11. Norio Ito (norio@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  12. Shuichi Watanabe (watanabe@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  13. (date: October, 1997)
  14. and also edited by
  15. Xuemin Chen (xchen@nlvl.com). Next Level Systems, Inc.
  16. Bob Eifrig (beifrig@nlvl.com) Next Level Systems, Inc.
  17. and also edited by
  18. Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  19. and also edited by
  20. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  21. Takeshi Nagai (TOSHIBA CORPORATION)
  22. Toshiaki Watanabe (TOSHIBA CORPORATION)
  23. Noboru Yamaguchi (TOSHIBA CORPORATION)
  24.     Marc Mongenet (Marc.Mongenet@epfl.ch), Swiss Federal Institute of Technology, Lausanne (EPFL)
  25. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  26. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  27. as specified by the MPEG-4 Video. 
  28. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  29. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  30. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  31. The original developer of this software module and his/her company, 
  32. the subsequent editors and their companies, 
  33. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  34. Copyright is not released for non MPEG-4 Video conforming products. 
  35. Sharp retains full right to use the code for his/her own purpose, 
  36. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  37. This copyright notice must be included in all copies or derivative works. 
  38. Copyright (c) 1997.
  39. Module Name:
  40. encoder.cpp
  41. Abstract:
  42. caller for encoder
  43. Revision History:
  44. May 9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net
  45. *************************************************************************/
  46. #include <stdio.h>
  47. #include <stdlib.h>
  48. #ifdef __PC_COMPILER_
  49. #include <windows.h>
  50. #include <mmsystem.h>
  51. #endif // __PC_COMPILER_
  52. #include "typeapi.h"
  53. #include "codehead.h"
  54. #include "paramset.h"
  55. #include "mode.hpp"
  56. #include "tm5rc.hpp"
  57. #include "fstream.h"
  58. #include "sesenc.hpp"
  59. // #include "encoder/tps_sesenc.hpp" // deleted by Sharp (98/2/12)
  60. ///// WAVELET VTC: begin ////////////////////////////////
  61. #include "dataStruct.hpp"     // hjlee 
  62. ///// WAVELET VTC: end ////////////////////////////////
  63. #ifndef __GLOBAL_VAR_
  64. #define __GLOBAL_VAR_
  65. #endif
  66. #include "global.hpp"
  67. #ifdef __MFC_
  68. #ifdef _DEBUG
  69. #undef THIS_FILE
  70. static char BASED_CODE THIS_FILE[] = __FILE__;
  71. #endif
  72. #define new DEBUG_NEW    
  73. #endif // __MFC_
  74. #define _FOR_GSSP_
  75. #ifdef _FOR_GSSP_
  76. Int rgiDefaultIntraQMatrixAlpha [BLOCK_SQUARE_SIZE] = {
  77. 8,  17, 18, 19, 21, 23, 25, 27,
  78. 17, 18, 19, 21, 23, 25, 27, 28,
  79. 20, 21, 22, 23, 24, 26, 28, 30,
  80. 21, 22, 23, 24, 26, 28, 30, 32,
  81. 22, 23, 24, 26, 28, 30, 32, 35,
  82. 23, 24, 26, 28, 30, 32, 35, 38,
  83. 25, 26, 28, 30, 32, 35, 38, 41,
  84. 27, 28, 30, 32, 35, 38, 41, 45
  85. };
  86. Int rgiDefaultInterQMatrixAlpha [BLOCK_SQUARE_SIZE] = {
  87. 16, 17, 18, 19, 20, 21, 22, 23,
  88. 17, 18, 19, 20, 21, 22, 23, 24,
  89. 18, 19, 20, 21, 22, 23, 24, 25,
  90. 19, 20, 21, 22, 23, 24, 26, 27,
  91. 20, 21, 22, 23, 25, 26, 27, 28,
  92. 21, 22, 23, 24, 26, 27, 28, 30,
  93. 22, 23, 24, 26, 27, 28, 30, 31,
  94. 23, 24, 25, 27, 28, 30, 31, 33
  95. };
  96. #else
  97. Int rgiDefaultIntraQMatrixAlpha [BLOCK_SQUARE_SIZE] = {
  98. 16, 16, 16, 16, 16, 16, 16, 16,
  99. 16, 16, 16, 16, 16, 16, 16, 16,
  100. 16, 16, 16, 16, 16, 16, 16, 16,
  101. 16, 16, 16, 16, 16, 16, 16, 16,
  102. 16, 16, 16, 16, 16, 16, 16, 16,
  103. 16, 16, 16, 16, 16, 16, 16, 16,
  104. 16, 16, 16, 16, 16, 16, 16, 16,
  105. 16, 16, 16, 16, 16, 16, 16, 16
  106. };
  107. Int rgiDefaultInterQMatrixAlpha [BLOCK_SQUARE_SIZE] = {
  108. 16, 16, 16, 16, 16, 16, 16, 16,
  109. 16, 16, 16, 16, 16, 16, 16, 16,
  110. 16, 16, 16, 16, 16, 16, 16, 16,
  111. 16, 16, 16, 16, 16, 16, 16, 16,
  112. 16, 16, 16, 16, 16, 16, 16, 16,
  113. 16, 16, 16, 16, 16, 16, 16, 16,
  114. 16, 16, 16, 16, 16, 16, 16, 16,
  115. 16, 16, 16, 16, 16, 16, 16, 16
  116. };
  117. #endif
  118. Void nextValidLine (FILE *pfPara, UInt* pnLine);
  119. ///// WAVELET VTC: begin ////////////////////////////////
  120. Void readVTCParam(CVTCEncoder *pvtcenc, FILE *pfPara, UInt* pnLine);
  121. ///// WAVELET VTC: end ////////////////////////////////
  122. Void readBoolVOLFlag (Bool * rgbTable [2], UInt nVO, FILE * pfCfg, UInt * pnLine, Bool bAnyScalability);
  123. Void readItem(UInt *rguiTable [2], UInt nVO, FILE * pfCfg, UInt * pnLine, Bool bAnyScalability);
  124. Void RunVTCCodec(char *VTCCtlFile);
  125. Void GetIVal(CxParamSet *pPar, char *pchName, Int iInd, Int *piRtn);
  126. Void GetDVal(CxParamSet *pPar, char *pchName, Int iInd, Double *pdRtn);
  127. Void GetSVal(CxParamSet *pPar, char *pchName, Int iInd, char **ppchRtn);
  128. Void GetAVal(CxParamSet *pPar, char *pchName, Int iInd, Double **ppdRtn, Int *piCount);
  129. Void readBoolParam(CxParamSet *pPar, char *pchName, Int iInd, Bool *pbVal);
  130. Int bPrint = 0;
  131. #define VERSION_STRING "FDIS 1.02 (990812)"
  132. // please update version number when you
  133. // make changes in the following
  134. #define BASE_LAYER 0
  135. #define ENHN_LAYER 1
  136. #define NO_SCALABILITY  0
  137. #define TEMPORAL_SCALABILITY 1
  138. #define SPATIAL_SCALABILITY  2
  139. int main (int argc, Char* argv[])
  140. {
  141. UInt nLine = 1;
  142. UInt* pnLine = &nLine;
  143. FILE *pfPara;
  144. if (argc != 2) {
  145. printf ("Usage: %s parameter_filen       %s -version", argv [0], argv[0]);
  146. exit (1);
  147. }
  148. if(argv[1][0]=='-' && argv[1][1]=='v')
  149. {
  150. printf("Microsoft MPEG-4 Visual CODEC %sn",VERSION_STRING);
  151. exit(0);
  152. }
  153. if ((pfPara = fopen (argv[1], "r")) == NULL ){
  154. printf ("Parameter File Not Foundn");
  155. exit (1);
  156. }
  157. // all the parameters to the encoder
  158. Int iVersion;
  159. Int iVTCFlag;
  160. UInt uiFrmWidth, uiFrmHeight;
  161. UInt firstFrm, lastFrm;
  162. Bool bNot8Bit;
  163. UInt uiQuantPrecision;
  164. UInt nBits;
  165. UInt firstVO, lastVO;
  166. UInt nVO = 0;
  167. UInt uiFrmWidth_SS,uiFrmHeight_SS;
  168. UInt uiHor_sampling_m,uiHor_sampling_n;
  169. UInt uiVer_sampling_m,uiVer_sampling_n;
  170. Bool bAnyScalability = FALSE;
  171. Int iSpatialOption;
  172. char *pchPrefix;
  173. char *pchBmpDir;
  174. char *pchOutBmpDir;
  175. char *pchOutStrFile;
  176. char *pchSptDir;
  177. char *pchSptPntDir;
  178. Int *rgiTemporalScalabilityType;
  179. Bool *rgbSpatialScalability;
  180. Bool *rgbScalability;
  181. Int *rgiEnhancementType;
  182. AlphaUsage *rgfAlphaUsage;
  183. Bool *rgbShapeOnly;
  184. Int *rgiBinaryAlphaTH;
  185. Int *rgbNoCrChange;
  186. Int *rgiBinaryAlphaRR;
  187. Bool *rgbRoundingControlDisable;
  188. Int *rgiInitialRoundingType;
  189. Int *rgiNumPbetweenIVOP;
  190. Int *rgiNumBbetweenPVOP;
  191. Int *rgiGOVperiod;
  192. Bool *rgbDeblockFilterDisable;
  193. Int *rgiTSRate;
  194. Int *rgiEnhcTSRate;
  195. ChromType *rgfChrType;
  196. Bool *rgbAllowSkippedPMBs;
  197. SptMode *rgSpriteMode;
  198. Bool *rgbDumpMB;
  199. Bool *rgbTrace;
  200. UInt *rguiSpriteUsage; 
  201. UInt *rguiWarpingAccuracy; 
  202. Int *rgiNumPnts;
  203. UInt *rguiRateControl [2];
  204. UInt *rguiBitsBudget [2];
  205. Bool *rgbAdvPredDisable [2];
  206. Bool *rgbErrorResilientDisable [2];
  207. Bool *rgbDataPartitioning [2];
  208. Bool *rgbReversibleVlc [2];
  209. Int *rgiVPBitTh [2];
  210. Bool *rgbInterlacedCoding [2];
  211. Quantizer* rgfQuant [2];
  212. Bool *rgbLoadIntraMatrix [2];
  213. Int **rgppiIntraQuantizerMatrix [2];
  214. Bool *rgbLoadInterMatrix [2];
  215. Int **rgppiInterQuantizerMatrix [2];
  216. Bool *rgiIntraDCSwitchingThr [2];
  217. Int *rgiIStep [2];
  218. Int *rgiPStep [2];
  219. Int *rgiStepBCode [2];
  220. Bool *rgbLoadIntraMatrixAlpha [2];
  221. Int **rgppiIntraQuantizerMatrixAlpha [2];
  222. Bool *rgbLoadInterMatrixAlpha [2];
  223. Int **rgppiInterQuantizerMatrixAlpha [2];
  224. Int *rgiIStepAlpha [2];
  225. Int *rgiPStepAlpha [2];
  226. Int *rgiBStepAlpha [2];
  227. Bool *rgbNoGrayQuantUpdate [2];
  228. UInt *rguiSearchRange [2];
  229. Bool *rgbOriginalME [2];
  230. Bool *rgbComplexityEstimationDisable [2];
  231. Bool *rgbOpaque [2];
  232. Bool *rgbTransparent [2];
  233. Bool *rgbIntraCAE [2];
  234. Bool *rgbInterCAE [2];
  235. Bool *rgbNoUpdate [2];
  236. Bool *rgbUpsampling [2];
  237. Bool *rgbIntraBlocks [2];
  238. Bool *rgbInterBlocks [2];
  239. Bool *rgbInter4vBlocks [2];
  240. Bool *rgbNotCodedBlocks [2];
  241. Bool *rgbDCTCoefs [2];
  242. Bool *rgbDCTLines [2];
  243. Bool *rgbVLCSymbols [2];
  244. Bool *rgbVLCBits [2];
  245. Bool *rgbAPM [2];
  246. Bool *rgbNPM [2];
  247. Bool *rgbInterpolateMCQ [2];
  248. Bool *rgbForwBackMCQ [2];
  249. Bool *rgbHalfpel2 [2];
  250. Bool *rgbHalfpel4 [2];
  251. UInt *rguiVolControlParameters[2];
  252. UInt *rguiChromaFormat[2];
  253. UInt *rguiLowDelay[2];
  254. UInt *rguiVBVParams[2];
  255. UInt *rguiBitRate[2];
  256. UInt *rguiVbvBufferSize[2];
  257. UInt *rguiVbvBufferOccupany[2];
  258. Double *rgdFrameFrequency[2];
  259. Bool *rgbTopFieldFirst [2];
  260. Bool *rgbAlternateScan [2];
  261. Int *rgiDirectModeRadius [2];
  262. Int *rgiMVFileUsage[2];
  263. char **pchMVFileName[2];
  264. UInt iObj;
  265. Int iCh = getc(pfPara);
  266. if(iCh=='!')
  267. {
  268. // NEW STYLE PARAMETER FILE
  269. printf("New style parameter file.n");
  270. CxParamSet par;
  271. char rgBuf[80];
  272. char *pch = fgets(rgBuf, 79, pfPara);
  273. if(pch==NULL)
  274. fatal_error("Can't read magic number in parameter file");
  275. //if(strcmp("!!MS!!!n", rgBuf)!=0)
  276. // fatal_error("Bad magic number at start of parameter file");
  277. int iLine;
  278. int er = par.Load(pfPara, &iLine);
  279. if(er!=ERES_OK)
  280. exit(printf("error %d at line %d of parameter filen",er, iLine));
  281. fclose(pfPara);
  282. // process the parameters
  283. GetIVal(&par, "Version", -1, &iVersion);
  284. if(iVersion!=901)
  285. fatal_error("Incorrect parameter file version number for this compilation");
  286. GetIVal(&par, "VTC.Enable", -1, &iVTCFlag);
  287. if(iVTCFlag)
  288. {
  289. char *VTCCtlFile;
  290. GetSVal(&par, "VTC.Filename", -1, &VTCCtlFile);
  291. RunVTCCodec(VTCCtlFile);
  292. return 0;
  293. }
  294. GetIVal(&par, "Source.Width", -1, (Int *)&uiFrmWidth);
  295. GetIVal(&par, "Source.Height", -1, (Int *)&uiFrmHeight);
  296. GetIVal(&par, "Source.FirstFrame", -1, (Int *)&firstFrm);
  297. GetIVal(&par, "Source.LastFrame", -1, (Int *)&lastFrm);
  298. fatal_error("Last frame number cannot be smaller than first frame number", lastFrm >= firstFrm);
  299. GetIVal(&par, "Source.BitsPerPel", -1, (Int *)&nBits);
  300. readBoolParam(&par, "Not8Bit.Enable", -1, &bNot8Bit);
  301. GetIVal(&par, "Not8Bit.QuantPrecision", -1, (Int *)&uiQuantPrecision);
  302. if(bNot8Bit)
  303. fatal_error("When Not8Bit is enabled, the __NBIT_ compile flag must be used.", sizeof(PixelC)!=sizeof(char));
  304. else
  305. fatal_error("When Not8Bit is disabled, the __NBIT_ compile flag must not be used.", sizeof(PixelC)==sizeof(char));
  306. if(bNot8Bit==0)
  307. {
  308. uiQuantPrecision = 5;
  309. nBits = 8;
  310. }
  311. fatal_error("Number of bits per pel is out of range", nBits>=4 && nBits<=12);
  312. Int iLen;
  313. char *pchTmp;
  314. GetSVal(&par, "Source.FilePrefix", -1, &pchTmp);
  315. iLen = strlen(pchTmp) + 1;
  316. pchPrefix = new char [iLen];
  317. memcpy(pchPrefix, pchTmp, iLen);
  318. GetSVal(&par, "Source.Directory", -1, &pchTmp);
  319. iLen = strlen(pchTmp) + 1;
  320. pchBmpDir = new char [iLen];
  321. memcpy(pchBmpDir, pchTmp, iLen);
  322. GetSVal(&par, "Output.Directory.DecodedFrames", -1, &pchTmp);
  323. iLen = strlen(pchTmp) + 1;
  324. pchOutBmpDir = new char [iLen];
  325. memcpy(pchOutBmpDir, pchTmp, iLen);
  326. GetSVal(&par, "Output.Directory.Bitstream", -1, &pchTmp);
  327. iLen = strlen(pchTmp) + 1;
  328. pchOutStrFile = new char [iLen];
  329. memcpy(pchOutStrFile, pchTmp, iLen);
  330. GetSVal(&par, "Sprite.Directory", -1, &pchTmp);
  331. iLen = strlen(pchTmp) + 1;
  332. pchSptDir = new char [iLen];
  333. memcpy(pchSptDir, pchTmp, iLen);
  334. GetSVal(&par, "Sprite.Points.Directory", -1, &pchTmp);
  335. iLen = strlen(pchTmp) + 1;
  336. pchSptPntDir = new char [iLen];
  337. memcpy(pchSptPntDir, pchTmp, iLen);
  338. GetIVal(&par, "Source.ObjectIndex.First", -1, (Int *)&firstVO);
  339. GetIVal(&par, "Source.ObjectIndex.Last", -1, (Int *)&lastVO);
  340. fatal_error("First and last object indices don't make sense", lastVO>=firstVO);
  341. nVO = lastVO - firstVO + 1;
  342. // allocate per-vo parameters
  343. rgiTemporalScalabilityType = new Int [nVO];
  344. rgbSpatialScalability = new Bool [nVO];
  345. rgbScalability = new Bool [nVO];
  346. rgiEnhancementType = new Int [nVO];
  347. rgfAlphaUsage = new AlphaUsage [nVO];
  348. rgbShapeOnly = new Bool [nVO];
  349. rgiBinaryAlphaTH = new Int [nVO];
  350. rgbNoCrChange = new Bool [nVO];
  351. rgiBinaryAlphaRR = new Int [nVO];
  352. rgbRoundingControlDisable = new Bool [nVO];
  353. rgiInitialRoundingType = new Int [nVO];
  354. rgiNumPbetweenIVOP = new Int [nVO];
  355. rgiNumBbetweenPVOP = new Int [nVO];
  356. rgiGOVperiod = new Int [nVO];
  357. rgbDeblockFilterDisable = new Bool [nVO];
  358. rgiTSRate = new Int [nVO];
  359. rgiEnhcTSRate = new Int [nVO];
  360. rgfChrType = new ChromType [nVO];
  361. rgbAllowSkippedPMBs = new Bool [nVO];
  362. rgSpriteMode = new SptMode [nVO];
  363. rgbDumpMB = new Bool [nVO];
  364. rgbTrace = new Bool [nVO];
  365. rguiSpriteUsage = new UInt [nVO]; 
  366. rguiWarpingAccuracy = new UInt [nVO]; 
  367. rgiNumPnts = new Int [nVO]; 
  368. Int iL;
  369. for(iL = BASE_LAYER; iL<=ENHN_LAYER; iL++)
  370. {
  371. // allocate per-layer parameters
  372. rguiRateControl [iL] = new UInt [nVO];
  373. rguiBitsBudget [iL] = new UInt [nVO];
  374. rgbAdvPredDisable [iL] = new Bool [nVO];
  375. rgbErrorResilientDisable [iL] = new Bool [nVO];
  376. rgbDataPartitioning [iL] = new Bool [nVO];
  377. rgbReversibleVlc [iL] = new Bool [nVO];
  378. rgiVPBitTh [iL] = new Int [nVO];
  379. rgbInterlacedCoding [iL] = new Bool [nVO];
  380. rgfQuant [iL] = new Quantizer [nVO]; 
  381. rgbLoadIntraMatrix [iL] = new Bool [nVO];
  382. rgppiIntraQuantizerMatrix [iL] = new Int * [nVO];
  383. rgbLoadInterMatrix [iL] = new Bool [nVO];
  384. rgppiInterQuantizerMatrix [iL] = new Int * [nVO];
  385. rgiIntraDCSwitchingThr [iL] = new Int [nVO]; 
  386. rgiIStep [iL] = new Int [nVO]; 
  387. rgiPStep [iL] = new Int [nVO]; 
  388. rgiStepBCode [iL] = new Int [nVO]; 
  389. rgbLoadIntraMatrixAlpha [iL] = new Bool [nVO]; 
  390. rgppiIntraQuantizerMatrixAlpha [iL] = new Int * [nVO];
  391. rgbLoadInterMatrixAlpha [iL] = new Bool [nVO]; 
  392. rgppiInterQuantizerMatrixAlpha [iL] = new Int * [nVO];
  393. rgiIStepAlpha [iL] = new Int [nVO]; 
  394. rgiPStepAlpha [iL] = new Int [nVO]; 
  395. rgiBStepAlpha [iL] = new Int [nVO]; 
  396. rgbNoGrayQuantUpdate [iL] = new Bool [nVO];
  397. rguiSearchRange [iL] = new UInt [nVO];
  398. rgbOriginalME [iL] = new Bool [nVO];
  399. rgbComplexityEstimationDisable [iL] = new Bool [nVO];
  400. rgbOpaque [iL] = new Bool [nVO];
  401. rgbTransparent [iL] = new Bool [nVO];
  402. rgbIntraCAE [iL] = new Bool [nVO];
  403. rgbInterCAE [iL] = new Bool [nVO];
  404. rgbNoUpdate [iL] = new Bool [nVO];
  405. rgbUpsampling [iL] = new Bool [nVO];
  406. rgbIntraBlocks [iL] = new Bool [nVO];
  407. rgbInterBlocks [iL] = new Bool [nVO];
  408. rgbInter4vBlocks [iL] = new Bool [nVO];
  409. rgbNotCodedBlocks [iL] = new Bool [nVO];
  410. rgbDCTCoefs [iL] = new Bool [nVO];
  411. rgbDCTLines [iL] = new Bool [nVO];
  412. rgbVLCSymbols [iL] = new Bool [nVO];
  413. rgbVLCBits [iL] = new Bool [nVO];
  414. rgbAPM [iL] = new Bool [nVO];
  415. rgbNPM [iL] = new Bool [nVO];
  416. rgbInterpolateMCQ [iL] = new Bool [nVO];
  417. rgbForwBackMCQ [iL] = new Bool [nVO];
  418. rgbHalfpel2 [iL] = new Bool [nVO];
  419. rgbHalfpel4 [iL] = new Bool [nVO];
  420. rguiVolControlParameters [iL] = new UInt [nVO];
  421. rguiChromaFormat [iL] = new UInt [nVO];
  422. rguiLowDelay [iL] = new UInt [nVO];
  423. rguiVBVParams [iL] = new UInt [nVO];
  424. rguiBitRate [iL] = new UInt [nVO];
  425. rguiVbvBufferSize [iL] = new UInt [nVO];
  426. rguiVbvBufferOccupany [iL] = new UInt [nVO];
  427. rgdFrameFrequency [iL] = new Double [nVO];
  428. rgbTopFieldFirst [iL] = new Bool [nVO]; 
  429. rgbAlternateScan [iL] = new Bool [nVO]; 
  430. rgiDirectModeRadius [iL] = new Bool [nVO]; 
  431. rgiMVFileUsage[iL] = new Int [nVO];
  432. pchMVFileName[iL] = new char * [nVO];
  433. }
  434. for (iObj = 0; iObj < nVO; iObj++)
  435. {
  436. // per object alloc
  437. rgppiIntraQuantizerMatrix [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  438. rgppiIntraQuantizerMatrix [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  439. rgppiInterQuantizerMatrix [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  440. rgppiInterQuantizerMatrix [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  441. rgppiIntraQuantizerMatrixAlpha [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  442. rgppiIntraQuantizerMatrixAlpha [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  443. rgppiInterQuantizerMatrixAlpha [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  444. rgppiInterQuantizerMatrixAlpha [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  445. pchMVFileName[BASE_LAYER] [iObj] = NULL;
  446. pchMVFileName[ENHN_LAYER] [iObj] = NULL;
  447. // per object parameters
  448. GetSVal(&par, "Scalability", iObj, &pchTmp);
  449. if(strcmp(pchTmp, "Temporal")==0)
  450. {
  451. bAnyScalability = TRUE;
  452. rgbScalability[iObj] = TEMPORAL_SCALABILITY;
  453. }
  454. else if(strcmp(pchTmp, "Spatial")==0)
  455. {
  456. bAnyScalability = TRUE;
  457. rgbScalability[iObj] = SPATIAL_SCALABILITY;
  458. }
  459. else if(strcmp(pchTmp, "None")==0)
  460. {
  461. bAnyScalability = FALSE;
  462. rgbScalability[iObj] = NO_SCALABILITY;
  463. }
  464. else
  465. fatal_error("Unknown scalability type");
  466. if(rgbScalability[iObj] == SPATIAL_SCALABILITY || rgbScalability[iObj] == TEMPORAL_SCALABILITY)
  467. rgbSpatialScalability[iObj] = TRUE; 
  468. else 
  469. rgbSpatialScalability[iObj] = FALSE; 
  470. }
  471. //coded added by Sony, only deals with ONE VO.
  472. //Type option of Spatial Scalable Coding
  473. //This parameter is used for dicision VOP prediction types of Enhancement layer in Spatial Scalable Coding
  474. //If this option is set to 0, Enhancement layer is coded as "PPPPPP......",
  475. //else if set to 1 ,It's coded as "PBBBB......."
  476. if(rgbScalability[0] == SPATIAL_SCALABILITY)
  477. {
  478. fatal_error("Spatial scalability currently only works with one VO", nVO==1);
  479. GetSVal(&par, "Scalability.Spatial.PredictionType", 0, &pchTmp);
  480. if(strcmp(pchTmp, "PPP")==0)
  481. iSpatialOption = 1;
  482. else if(strcmp(pchTmp, "PBB")==0)
  483. iSpatialOption = 0;
  484. else
  485. fatal_error("Unknown spatial scalability prediction type");
  486. if (iSpatialOption == 1)
  487. fprintf(stdout,"Enhancement layer is coded as "PPPPP....."n");
  488. else
  489. fprintf(stdout,"Enhancement layer is coded as "PBBBB....."n");
  490. }
  491. if(bAnyScalability)
  492. {
  493. //Load enhancement layer (Spatial Scalable) size
  494. // should really be inside above if-statement
  495. GetIVal(&par, "Scalability.Spatial.Width", 0, (Int *)&uiFrmWidth_SS);
  496. GetIVal(&par, "Scalability.Spatial.Height", 0, (Int *)&uiFrmHeight_SS);
  497. //load upsampling factor 
  498. GetIVal(&par, "Scalability.Spatial.HorizFactor.N", 0, (Int *)&uiHor_sampling_n);
  499. GetIVal(&par, "Scalability.Spatial.HorizFactor.M", 0, (Int *)&uiHor_sampling_m);
  500. GetIVal(&par, "Scalability.Spatial.VertFactor.N", 0, (Int *)&uiVer_sampling_n);
  501. GetIVal(&par, "Scalability.Spatial.VertFactor.M", 0, (Int *)&uiVer_sampling_m);
  502. }
  503. for (iObj = 0; iObj < nVO; iObj++)
  504. {
  505. if(bAnyScalability)
  506. {
  507. // temporal scalability
  508. // form of temporal scalability indicators
  509. // case 0  Enhn    P   P   ....
  510. //         Base  I   P   P ....
  511. // case 1  Enhn    B B   B B   ....
  512. //         Base  I     P     P ....
  513. // case 2  Enhn    P   B   B   ....
  514. //         Base  I   B   P   B ....
  515. GetIVal(&par, "Scalability.Temporal.PredictionType", iObj, &rgiTemporalScalabilityType [iObj]);
  516. fatal_error("Scalability.Temporal.PredictionType must range from 0 to 4",
  517. rgiTemporalScalabilityType [iObj]>=0 && rgiTemporalScalabilityType [iObj]<=4);
  518. GetSVal(&par, "Scalability.Temporal.EnhancementType", iObj, &pchTmp);
  519. if(strcmp(pchTmp, "Full")==0)
  520. rgiEnhancementType [iObj] = 0;
  521. else if(strcmp(pchTmp, "PartC")==0)
  522. rgiEnhancementType [iObj] = 1;
  523. else if(strcmp(pchTmp, "PartNC")==0)
  524. rgiEnhancementType [iObj] = 2;
  525. else
  526. fatal_error("Unknown temporal scalability enhancement type");
  527. }
  528. // alpha usage
  529. GetSVal(&par, "Alpha.Type", iObj, &pchTmp);
  530. rgbShapeOnly[iObj] = FALSE;
  531. if(strcmp(pchTmp, "None")==0)
  532. rgfAlphaUsage[iObj] = RECTANGLE;
  533. else if(strcmp(pchTmp, "Binary")==0)
  534. rgfAlphaUsage[iObj] = ONE_BIT;
  535. else if(strcmp(pchTmp, "Gray")==0)
  536. rgfAlphaUsage[iObj] = EIGHT_BIT;
  537. else if(strcmp(pchTmp, "ShapeOnly")==0)
  538. {
  539. rgbShapeOnly[iObj] = TRUE;
  540. rgfAlphaUsage[iObj] = ONE_BIT;
  541. }
  542. else
  543. fatal_error("Unknown alpha type");
  544. GetIVal(&par, "Alpha.Binary.RoundingThreshold", iObj, &rgiBinaryAlphaTH [iObj]);
  545. fatal_error("Binary rounding threshold must be >= 0", rgiBinaryAlphaTH [iObj] >= 0);
  546. Bool bSizeConvEnable;
  547. readBoolParam(&par, "Alpha.Binary.SizeConversion.Enable", iObj, &bSizeConvEnable);
  548. rgbNoCrChange [iObj] = !bSizeConvEnable;
  549. if (rgiBinaryAlphaTH [iObj] == 0 && rgbNoCrChange [iObj] == 0)
  550. {
  551. printf("Size conversion was disabled since binary rounding threshold is zero");
  552. rgbNoCrChange [iObj] = TRUE;
  553. }
  554. GetIVal(&par, "ErrorResil.AlphaRefreshRate", iObj, &rgiBinaryAlphaRR [iObj]);
  555. fatal_error("Alpha refresh rate must be >= 0", rgiBinaryAlphaRR [iObj] >= 0);
  556. Bool bRoundingControlEnable;
  557. readBoolParam(&par, "Motion.RoundingControl.Enable", iObj, &bRoundingControlEnable);
  558. rgbRoundingControlDisable [iObj] = !bRoundingControlEnable;
  559. GetIVal(&par, "Motion.RoundingControl.StartValue", iObj, &rgiInitialRoundingType [iObj]);
  560. fatal_error("Rounding control start value must be either 0 or 1",
  561. rgiInitialRoundingType [iObj]==0 || rgiInitialRoundingType [iObj]==1);
  562. GetIVal(&par, "Motion.PBetweenICount", iObj, &rgiNumPbetweenIVOP [iObj]);
  563. if(rgiNumPbetweenIVOP [iObj] < 0)
  564. rgiNumPbetweenIVOP [iObj] = lastFrm - firstFrm + 1; //only 1 I at the beginning
  565. GetIVal(&par, "Motion.BBetweenPCount", iObj, &rgiNumBbetweenPVOP [iObj]);
  566. fatal_error("Motion.BBetweenPCount must be >= 0", rgiNumBbetweenPVOP [iObj]>=0);
  567. //number of VOP between GOV header
  568. //CAUTION:GOV period is not used in spatial scalable coding
  569. Bool bGOVEnable;
  570. readBoolParam(&par, "GOV.Enable", iObj, &bGOVEnable);
  571. if(!bGOVEnable)
  572. rgiGOVperiod[iObj] = 0;
  573. else
  574. GetIVal(&par, "GOV.Period", iObj, &rgiGOVperiod[iObj]);
  575. Bool bDeblockingFilterEnable;
  576. readBoolParam(&par, "Motion.DeblockingFilter.Enable", iObj, &bDeblockingFilterEnable);
  577. rgbDeblockFilterDisable[iObj] = !bDeblockingFilterEnable;
  578. GetSVal(&par, "Source.Format", iObj, &pchTmp);
  579. if(strcmp(pchTmp, "444")==0)
  580. rgfChrType[iObj] = FOUR_FOUR_FOUR;
  581. else if(strcmp(pchTmp, "422")==0)
  582. rgfChrType[iObj] = FOUR_TWO_TWO;
  583. else if(strcmp(pchTmp, "420")==0)
  584. rgfChrType[iObj] = FOUR_TWO_ZERO;
  585. else
  586. fatal_error("Unrecognised source format");
  587. GetSVal(&par, "Sprite.Type", iObj, &pchTmp);
  588. if(strcmp(pchTmp, "None")==0)
  589. rguiSpriteUsage[iObj] = 0;
  590. else if(strcmp(pchTmp, "Static")==0)
  591. rguiSpriteUsage[iObj] = 1;
  592. else
  593. fatal_error("Unknown value for Sprite.Type");
  594. if (rgbScalability [iObj] == TRUE && rguiSpriteUsage[iObj]==1)
  595. fatal_error("Sprite and scalability modes cannot be combined");
  596. GetSVal(&par, "Sprite.WarpAccuracy", iObj, &pchTmp);
  597. if(strcmp(pchTmp, "1/2")==0)
  598. rguiWarpingAccuracy[iObj] = 0;
  599. else if(strcmp(pchTmp, "1/4")==0)
  600. rguiWarpingAccuracy[iObj] = 1;
  601. else if(strcmp(pchTmp, "1/8")==0)
  602. rguiWarpingAccuracy[iObj] = 2;
  603. else if(strcmp(pchTmp, "1/16")==0)
  604. rguiWarpingAccuracy[iObj] = 3;
  605. else
  606. fatal_error("Unknown value for Sprite.WarpAccuracy");
  607. GetIVal(&par, "Sprite.Points", iObj, &rgiNumPnts[iObj]);
  608. fatal_error("Sprite.Points must lie in the range -1 to 4", rgiNumPnts[iObj]>=-1 && rgiNumPnts[iObj]<5);
  609. GetSVal(&par, "Sprite.Mode", iObj, &pchTmp);
  610. if(strcmp(pchTmp, "Basic")==0)
  611. rgSpriteMode[iObj] = BASIC_SPRITE;
  612. else if(strcmp(pchTmp, "LowLatency")==0)
  613. rgSpriteMode[iObj] = LOW_LATENCY;
  614. else if(strcmp(pchTmp, "PieceObject")==0)
  615. rgSpriteMode[iObj] = PIECE_OBJECT;
  616. else if(strcmp(pchTmp, "PieceUpdate")==0)
  617. rgSpriteMode[iObj] = PIECE_UPDATE;
  618. else
  619. fatal_error("Unkown value for Sprite.Mode");
  620. if(rguiSpriteUsage[iObj]==0)
  621. {
  622. rgiNumPnts[iObj] = -1;
  623. //rgSpriteMode[iObj] = -1;
  624. }
  625. readBoolParam(&par, "Trace.CreateFile.Enable", iObj, &rgbTrace[iObj]);
  626. readBoolParam(&par, "Trace.DetailedDump.Enable", iObj, &rgbDumpMB[iObj]);
  627. #ifndef __TRACE_AND_STATS_
  628. if(rgbTrace[iObj])
  629. {
  630. printf("Warning: this encoder will not generate trace information.n");
  631. printf("If you want trace information, re-compile with __TRACE_AND_STATS_ defined.n");
  632. }
  633. #endif
  634. readBoolParam(&par, "Motion.SkippedMB.Enable", iObj, &rgbAllowSkippedPMBs[iObj]);
  635. // parameters that can be different for each scalability layer
  636. Int iLayer, iLayerCount;
  637. if(rgbScalability[iObj]!=NO_SCALABILITY)
  638. iLayerCount = 2;
  639. else
  640. iLayerCount = 1;
  641. for(iLayer = 0; iLayer<iLayerCount; iLayer++)
  642. {
  643. Int iLayerObj = iObj + iLayer * nVO;
  644. // rate control
  645. GetSVal(&par, "RateControl.Type", iLayerObj, &pchTmp);
  646. if(strcmp(pchTmp, "None")==0)
  647. rguiRateControl [iLayer][iObj] = 0;
  648. else if(strcmp(pchTmp, "MP4")==0)
  649. rguiRateControl [iLayer][iObj] = RC_MPEG4;
  650. else if(strcmp(pchTmp, "TM5")==0)
  651. rguiRateControl [iLayer][iObj] = RC_TM5;
  652. else
  653. fatal_error("Unknown rate control type");
  654. // bit budget
  655. GetIVal(&par, "RateControl.BitsPerVOP", iLayerObj, (Int *)&(rguiBitsBudget[iLayer][iObj]));
  656. Bool bRVLCEnable, bDPEnable, bVPEnable;
  657. readBoolParam(&par, "ErrorResil.RVLC.Enable", iLayerObj, &bRVLCEnable);
  658. readBoolParam(&par, "ErrorResil.DataPartition.Enable", iLayerObj, &bDPEnable);
  659. readBoolParam(&par, "ErrorResil.VideoPacket.Enable", iLayerObj, &bVPEnable);
  660. rgbErrorResilientDisable [iLayer][iObj] = bVPEnable ? (iLayer!=0) : TRUE;
  661. rgbReversibleVlc [iLayer] [iObj] = bRVLCEnable ? (iLayer==0) : FALSE;
  662. rgbDataPartitioning [iLayer][iObj] = bDPEnable ? (iLayer==0) : FALSE;
  663. if(rgbErrorResilientDisable [BASE_LAYER][iObj])
  664. rgiBinaryAlphaRR [iObj] = -1;
  665. GetIVal(&par, "ErrorResil.VideoPacket.Length", iLayerObj, &rgiVPBitTh[iLayer][iObj]);
  666. if(rgbErrorResilientDisable [iLayer][iObj])
  667. rgiVPBitTh [iLayer][iObj] = -1;
  668. readBoolParam(&par, "Motion.Interlaced.Enable", iLayerObj, &rgbInterlacedCoding [iLayer][iObj]);
  669. GetSVal(&par, "Quant.Type", iLayerObj, &pchTmp);
  670. if(strcmp(pchTmp, "H263")==0)
  671. rgfQuant[iLayer][iObj] = Q_H263;
  672. else if(strcmp(pchTmp, "MPEG")==0)
  673. rgfQuant[iLayer][iObj] = Q_MPEG;
  674. else
  675. fatal_error("Unknown quantizer type");
  676. readBoolParam(&par, "Texture.QuantMatrix.Intra.Enable", iLayerObj, &rgbLoadIntraMatrix [iLayer][iObj]);
  677. if(rgbLoadIntraMatrix [iLayer][iObj])
  678. {
  679. Double *pdTmp;
  680. Int iCount;
  681. GetAVal(&par, "Texture.QuantMatrix.Intra", iLayerObj, &pdTmp, &iCount);
  682. fatal_error("Wrong number of intra quant matrix values (should be 64)", iCount<=64);
  683. Int i;
  684. for(i=0; i<iCount; i++)
  685. rgppiIntraQuantizerMatrix[iLayer][iObj][i] = (Int)pdTmp[i];
  686. if(iCount<64)
  687. rgppiIntraQuantizerMatrix[iLayer][iObj][iCount] = 0;
  688. }
  689. else
  690. memcpy (rgppiIntraQuantizerMatrix [iLayer][iObj], rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof(Int));
  691. readBoolParam(&par, "Texture.QuantMatrix.Inter.Enable", iLayerObj, &rgbLoadInterMatrix [iLayer][iObj]);
  692. if(rgbLoadInterMatrix [iLayer][iObj])
  693. {
  694. Double *pdTmp;
  695. Int iCount;
  696. GetAVal(&par, "Texture.QuantMatrix.Inter", iLayerObj, &pdTmp, &iCount);
  697. fatal_error("Wrong number of inter quant matrix values (should be 64)", iCount<=64);
  698. Int i;
  699. for(i=0; i<iCount; i++)
  700. rgppiInterQuantizerMatrix[iLayer][iObj][i] = (Int)pdTmp[i];
  701. if(iCount<64)
  702. rgppiInterQuantizerMatrix[iLayer][iObj][iCount] = 0;
  703. }
  704. else
  705. memcpy (rgppiInterQuantizerMatrix [iLayer][iObj], rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof(Int));
  706. GetIVal(&par, "Texture.IntraDCThreshold", iLayerObj, &rgiIntraDCSwitchingThr [iLayer] [iObj]);
  707. fatal_error("Intra DC Threshold must be in range 0 - 7",
  708. rgiIntraDCSwitchingThr [iLayer] [iObj] >= 0 && rgiIntraDCSwitchingThr [iLayer] [iObj] <= 7);
  709. GetIVal(&par, "Texture.QuantStep.IVOP", iLayerObj, &rgiIStep [iLayer] [iObj]);
  710. fatal_error("IVOP quantizer stepsize is out of range", 
  711. rgiIStep [iLayer] [iObj] > 0 && rgiIStep [iLayer] [iObj] < (1<<uiQuantPrecision));
  712. GetIVal(&par, "Texture.QuantStep.PVOP", iLayerObj, &rgiPStep [iLayer] [iObj]);
  713. fatal_error("PVOP quantizer stepsize is out of range", 
  714. rgiPStep [iLayer] [iObj] > 0 && rgiPStep [iLayer] [iObj] < (1<<uiQuantPrecision));
  715. GetIVal(&par, "Texture.QuantStep.BVOP", iLayerObj, &rgiStepBCode [iLayer] [iObj]);
  716. fatal_error("BVOP quantizer stepsize is out of range", 
  717. rgiStepBCode [iLayer] [iObj] > 0 && rgiStepBCode [iLayer] [iObj] < (1<<uiQuantPrecision));
  718. readBoolParam(&par, "Alpha.QuantMatrix.Intra.Enable", iLayerObj, &rgbLoadIntraMatrixAlpha [iLayer][iObj]);
  719. if(rgbLoadIntraMatrixAlpha [iLayer][iObj])
  720. {
  721. Double *pdTmp;
  722. Int iCount;
  723. GetAVal(&par, "Alpha.QuantMatrix.Intra", iLayerObj, &pdTmp, &iCount);
  724. fatal_error("Wrong number of alpha intra quant matrix values (should be 64)", iCount<=64);
  725. Int i;
  726. for(i=0; i<iCount; i++)
  727. rgppiIntraQuantizerMatrixAlpha[iLayer][iObj][i] = (Int)pdTmp[i];
  728. if(iCount<64)
  729. rgppiIntraQuantizerMatrixAlpha[iLayer][iObj][iCount] = 0;
  730. }
  731. else
  732. memcpy (rgppiIntraQuantizerMatrixAlpha [iLayer][iObj], rgiDefaultIntraQMatrixAlpha,
  733. BLOCK_SQUARE_SIZE * sizeof(Int));
  734. readBoolParam(&par, "Alpha.QuantMatrix.Inter.Enable", iLayerObj, &rgbLoadInterMatrixAlpha [iLayer][iObj]);
  735. if(rgbLoadInterMatrixAlpha [iLayer][iObj])
  736. {
  737. Double *pdTmp;
  738. Int iCount;
  739. GetAVal(&par, "Alpha.QuantMatrix.Inter", iLayerObj, &pdTmp, &iCount);
  740. fatal_error("Wrong number of alpha inter quant matrix values (should be 64)", iCount<=64);
  741. Int i;
  742. for(i=0; i<iCount; i++)
  743. rgppiInterQuantizerMatrixAlpha[iLayer][iObj][i] = (Int)pdTmp[i];
  744. if(iCount<64)
  745. rgppiInterQuantizerMatrixAlpha[iLayer][iObj][iCount] = 0;
  746. }
  747. else
  748. memcpy (rgppiInterQuantizerMatrixAlpha [iLayer][iObj], rgiDefaultInterQMatrixAlpha,
  749. BLOCK_SQUARE_SIZE * sizeof(Int));
  750. GetIVal(&par, "Alpha.QuantStep.IVOP", iLayerObj, &rgiIStepAlpha [iLayer] [iObj]);
  751. fatal_error("IVOP alpha quantizer stepsize is out of range", 
  752. rgiIStepAlpha [iLayer] [iObj] > 0 && rgiIStepAlpha [iLayer] [iObj] < 64);
  753. GetIVal(&par, "Alpha.QuantStep.PVOP", iLayerObj, &rgiPStepAlpha [iLayer] [iObj]);
  754. fatal_error("PVOP alpha quantizer stepsize is out of range", 
  755. rgiPStepAlpha [iLayer] [iObj] > 0 && rgiPStepAlpha [iLayer] [iObj] < 64);
  756. GetIVal(&par, "Alpha.QuantStep.BVOP", iLayerObj, &rgiBStepAlpha [iLayer] [iObj]);
  757. fatal_error("BVOP alpha quantizer stepsize is out of range", 
  758. rgiBStepAlpha [iLayer] [iObj] > 0 && rgiBStepAlpha [iLayer] [iObj] < 64);
  759. readBoolParam(&par, "Alpha.QuantDecouple.Enable", iLayerObj, &rgbNoGrayQuantUpdate [iLayer] [iObj]);
  760. Int iRate;
  761. GetIVal(&par, "Source.SamplingRate", iLayerObj, &iRate);
  762. fatal_error("Source sampling rate must be > 0", iRate>0);
  763. if(iLayer==BASE_LAYER)
  764. rgiTSRate[iObj] = iRate;
  765. else
  766. rgiEnhcTSRate[iObj] = iRate;
  767. GetIVal(&par, "Motion.SearchRange", iLayerObj, (Int *)&rguiSearchRange[iLayer][iObj]);
  768. fatal_error("Motion.SearchRange must be > 0", rguiSearchRange[iLayer][iObj]>0);
  769. readBoolParam(&par, "Motion.UseSourceForME.Enable", iLayerObj, &rgbOriginalME [iLayer] [iObj]);
  770. Bool bAdvPredEnable;
  771. readBoolParam(&par, "Motion.AdvancedPrediction.Enable", iLayerObj, &bAdvPredEnable);
  772. rgbAdvPredDisable [iLayer][iObj] = !bAdvPredEnable;
  773. Bool bComplexityEnable;
  774. readBoolParam(&par, "Complexity.Enable", iLayerObj, &bComplexityEnable);
  775. rgbComplexityEstimationDisable[iLayer][iObj] = !bComplexityEnable;
  776. if(bComplexityEnable)
  777. {
  778. readBoolParam(&par, "Complexity.Opaque.Enable", iLayerObj, &rgbOpaque[iLayer][iObj]);
  779. readBoolParam(&par, "Complexity.Transparent.Enable", iLayerObj, &rgbTransparent[iLayer][iObj]);
  780. readBoolParam(&par, "Complexity.IntraCAE.Enable", iLayerObj, &rgbIntraCAE[iLayer][iObj]);
  781. readBoolParam(&par, "Complexity.InterCAE.Enable", iLayerObj, &rgbInterCAE[iLayer][iObj]);
  782. readBoolParam(&par, "Complexity.NoUpdate.Enable", iLayerObj, &rgbNoUpdate[iLayer][iObj]);
  783. readBoolParam(&par, "Complexity.UpSampling.Enable", iLayerObj, &rgbUpsampling[iLayer][iObj]);
  784. readBoolParam(&par, "Complexity.IntraBlocks.Enable", iLayerObj, &rgbIntraBlocks[iLayer][iObj]);
  785. readBoolParam(&par, "Complexity.InterBlocks.Enable", iLayerObj, &rgbInterBlocks[iLayer][iObj]);
  786. readBoolParam(&par, "Complexity.Inter4VBlocks.Enable", iLayerObj, &rgbInter4vBlocks[iLayer][iObj]);
  787. readBoolParam(&par, "Complexity.NotCodedBlocks.Enable", iLayerObj, &rgbNotCodedBlocks[iLayer][iObj]);
  788. readBoolParam(&par, "Complexity.DCTCoefs.Enable", iLayerObj, &rgbDCTCoefs[iLayer][iObj]);
  789. readBoolParam(&par, "Complexity.DCTLines.Enable", iLayerObj, &rgbDCTLines[iLayer][iObj]);
  790. readBoolParam(&par, "Complexity.VLCSymbols.Enable", iLayerObj, &rgbVLCSymbols[iLayer][iObj]);
  791. readBoolParam(&par, "Complexity.VLCBits.Enable", iLayerObj, &rgbVLCBits[iLayer][iObj]);
  792. readBoolParam(&par, "Complexity.APM.Enable", iLayerObj, &rgbAPM[iLayer][iObj]);
  793. readBoolParam(&par, "Complexity.NPM.Enable", iLayerObj, &rgbNPM[iLayer][iObj]);
  794. readBoolParam(&par, "Complexity.InterpMCQ.Enable", iLayerObj, &rgbInterpolateMCQ[iLayer][iObj]);
  795. readBoolParam(&par, "Complexity.ForwBackMCQ.Enable", iLayerObj, &rgbForwBackMCQ[iLayer][iObj]);
  796. readBoolParam(&par, "Complexity.HalfPel2.Enable", iLayerObj, &rgbHalfpel2[iLayer][iObj]);
  797. readBoolParam(&par, "Complexity.HalfPel4.Enable", iLayerObj, &rgbHalfpel4[iLayer][iObj]);
  798. }
  799. else
  800. {
  801. rgbOpaque[iLayer][iObj] = 0;
  802. rgbTransparent[iLayer][iObj] = 0;
  803. rgbIntraCAE[iLayer][iObj] = 0;
  804. rgbInterCAE[iLayer][iObj] = 0;
  805. rgbNoUpdate[iLayer][iObj] = 0;
  806. rgbUpsampling[iLayer][iObj] = 0;
  807. rgbIntraBlocks[iLayer][iObj] = 0;
  808. rgbInterBlocks[iLayer][iObj] = 0;
  809. rgbInter4vBlocks[iLayer][iObj] = 0;
  810. rgbNotCodedBlocks[iLayer][iObj] = 0;
  811. rgbDCTCoefs[iLayer][iObj] = 0;
  812. rgbDCTLines[iLayer][iObj] = 0;
  813. rgbVLCSymbols[iLayer][iObj] = 0;
  814. rgbVLCBits[iLayer][iObj] = 0;
  815. rgbAPM[iLayer][iObj] = 0;
  816. rgbNPM[iLayer][iObj] = 0;
  817. rgbInterpolateMCQ[iLayer][iObj] = 0;
  818. rgbForwBackMCQ[iLayer][iObj] = 0;
  819. rgbHalfpel2[iLayer][iObj] = 0;
  820. rgbHalfpel4[iLayer][iObj] = 0;
  821. }
  822. GetDVal(&par, "Source.FrameRate", iLayerObj, &rgdFrameFrequency[iLayer][iObj]);
  823. fatal_error("Source.FrameRate is invalid", rgdFrameFrequency[iLayer][iObj] > 0.0);
  824. readBoolParam(&par, "Motion.Interlaced.TopFieldFirst.Enable", iLayerObj, &rgbTopFieldFirst [iLayer] [iObj]);
  825. readBoolParam(&par, "Motion.Interlaced.AlternativeScan.Enable", iLayerObj, &rgbAlternateScan[iLayer][iObj]);
  826. GetIVal(&par, "Motion.SearchRange.DirectMode", iLayerObj, &rgiDirectModeRadius[iLayer][iObj]);
  827. GetSVal(&par, "Motion.ReadWriteMVs", iLayerObj, &pchTmp);
  828. if(strcmp(pchTmp, "Off")==0)
  829. rgiMVFileUsage[iLayer][iObj] = 0;
  830. else if(strcmp(pchTmp, "Read")==0)
  831. rgiMVFileUsage[iLayer][iObj] = 1;
  832. else if(strcmp(pchTmp, "Write")==0)
  833. rgiMVFileUsage[iLayer][iObj] = 2;
  834. else
  835. fatal_error("Unknown mode for Motion.ReadWriteMVs");
  836. if(rgiMVFileUsage[iLayer][iObj]!=0)
  837. {
  838. GetSVal(&par, "Motion.ReadWriteMVs.Filename", iLayerObj, &pchTmp);
  839. iLen = strlen(pchTmp) + 1;
  840. pchMVFileName [iLayer] [iObj] = new char [iLen];
  841. memcpy(pchMVFileName [iLayer] [iObj], pchTmp, iLen);
  842. }
  843. Bool bVolControlEnable;
  844. readBoolParam(&par, "VOLControl.Enable", iLayerObj, &bVolControlEnable);
  845. rguiVolControlParameters[iLayer][iObj] = (UInt)bVolControlEnable;
  846. GetIVal(&par, "VOLControl.ChromaFormat", iLayerObj, (Int *)&rguiChromaFormat[iLayer][iObj]);
  847. GetIVal(&par, "VOLControl.LowDelay", iObj, (Int *)&rguiLowDelay[iLayer][iObj]);
  848. Bool bVBVParams;
  849. readBoolParam(&par, "VOLControl.VBVParams.Enable", iLayerObj, &bVBVParams);
  850. rguiVBVParams[iLayer][iObj] = (UInt)bVBVParams;
  851. GetIVal(&par, "VOLControl.Bitrate", iLayerObj, (Int *)&rguiBitRate[iLayer][iObj]);
  852. GetIVal(&par, "VOLControl.VBVBuffer.Size", iLayerObj, (Int *)&rguiVbvBufferSize[iLayer][iObj]);
  853. GetIVal(&par, "VOLControl.VBVBuffer.Occupancy", iLayerObj, (Int *)&rguiVbvBufferOccupany[iLayer][iObj]);
  854. }
  855. }
  856. }
  857. else
  858. {
  859. // OLD STYLE PARAMETER FILE
  860. ungetc(iCh, pfPara);
  861. printf("Old style parameter file.n");
  862. // verify version number
  863. nextValidLine (pfPara, pnLine);
  864. if ( fscanf (pfPara, "%u", &iVersion) != 1 ) {
  865. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  866. exit(1);
  867. }
  868. if (iVersion != 813 && iVersion != 812 && iVersion != 814 && iVersion != 815) {
  869. // version 812 does not have rounding control flags
  870. // version 813 does not have VOL control parameters
  871. // version 814 does not have skipped mb enable
  872. fprintf(stderr, "wrong parameter file version for %sn",VERSION_STRING);
  873. exit(1);
  874. }
  875. ///// WAVELET VTC: begin ///////////////////////////////
  876. // sarnoff: wavelet visual texture coding 
  877. nextValidLine (pfPara, pnLine);
  878. if ( fscanf (pfPara, "%d", &iVTCFlag) != 1) {
  879. fprintf(stderr, "wrong parameter VTC flag on line %dn", *pnLine);
  880. assert (FALSE);
  881. }
  882. assert (iVTCFlag==0 || iVTCFlag==1);
  883. // read VTC control file
  884. char VTCCtlFile[80];
  885. nextValidLine (pfPara, pnLine);
  886. if ( fscanf (pfPara, "%s", VTCCtlFile) != 1) {
  887. fprintf(stderr, "wrong parameter VTC flag on line %dn", *pnLine);
  888. assert (FALSE);
  889. }
  890. if (iVTCFlag==1) {
  891. fclose(pfPara);
  892. RunVTCCodec(VTCCtlFile);
  893. return 0;
  894. }
  895. ///// WAVELET VTC: end ///////////////////////////////
  896. // frame size code
  897. nextValidLine (pfPara, pnLine);
  898. if (fscanf (pfPara, "%u", &uiFrmWidth) != 1) {
  899. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  900. exit(1);
  901. }
  902. nextValidLine (pfPara, pnLine);
  903. if (fscanf (pfPara, "%u", &uiFrmHeight) != 1) {
  904. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  905. exit(1);
  906. }
  907. // first and last frame number
  908. nextValidLine (pfPara, pnLine);
  909. if ( fscanf (pfPara, "%u", &firstFrm) != 1) {
  910. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  911. exit(1);
  912. }
  913. nextValidLine (pfPara, pnLine);
  914. if ( fscanf (pfPara, "%u", &lastFrm) != 1) {
  915. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  916. exit(1);
  917. }
  918. assert (lastFrm >= firstFrm);
  919. // NBIT: not 8-bit flag
  920. nextValidLine (pfPara, pnLine);
  921. if ( fscanf (pfPara, "%d", &bNot8Bit) != 1) {
  922. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  923. exit(1);
  924. }
  925. assert (bNot8Bit==0 || bNot8Bit==1);
  926. if(bNot8Bit==1)
  927. {
  928. assert(sizeof(PixelC)!=sizeof(unsigned char));
  929. }
  930. else
  931. {
  932. assert(sizeof(PixelC)==sizeof(unsigned char));
  933. }
  934. // NBIT: quant precision
  935. nextValidLine (pfPara, pnLine);
  936. if ( fscanf (pfPara, "%d", &uiQuantPrecision) != 1) {
  937. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  938. exit(1);
  939. }
  940. if (bNot8Bit==0) {
  941. uiQuantPrecision = 5;
  942. }
  943. // NBIT: number of bits per pixel
  944. nextValidLine (pfPara, pnLine);
  945. if ( fscanf (pfPara, "%d", &nBits) != 1) {
  946. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  947. exit(1);
  948. }
  949. assert (nBits>=4 && nBits<=12);
  950. if (bNot8Bit==0) {
  951. nBits = 8;
  952. }
  953. // object indexes
  954. nextValidLine (pfPara, pnLine);
  955. if ( fscanf (pfPara, "%u", &firstVO) != 1) {
  956. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  957. exit(1);
  958. }
  959. nextValidLine (pfPara, pnLine);
  960. if ( fscanf (pfPara, "%u", &lastVO) != 1) {
  961. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  962. exit(1);
  963. }
  964. assert (lastVO >= firstVO);
  965. UInt nVO = lastVO - firstVO + 1;
  966. // allocate per-vo parameters
  967. rgiTemporalScalabilityType = new Int [nVO];
  968. rgbSpatialScalability = new Bool [nVO];
  969. rgbScalability = new Bool [nVO];
  970. rgiEnhancementType = new Int [nVO];
  971. rgfAlphaUsage = new AlphaUsage [nVO];
  972. rgbShapeOnly = new Bool [nVO];
  973. rgiBinaryAlphaTH = new Int [nVO];
  974. rgbNoCrChange = new Bool [nVO];
  975. rgiBinaryAlphaRR = new Int [nVO];
  976. rgbRoundingControlDisable = new Bool [nVO];
  977. rgiInitialRoundingType = new Int [nVO];
  978. rgiNumPbetweenIVOP = new Int [nVO];
  979. rgiNumBbetweenPVOP = new Int [nVO];
  980. rgiGOVperiod = new Int [nVO];
  981. rgbDeblockFilterDisable = new Bool [nVO];
  982. rgiTSRate = new Int [nVO];
  983. rgiEnhcTSRate = new Int [nVO];
  984. rgfChrType = new ChromType [nVO];
  985. rgbAllowSkippedPMBs = new Bool [nVO];
  986. rgSpriteMode = new SptMode [nVO];
  987. rgbDumpMB = new Bool [nVO];
  988. rgbTrace = new Bool [nVO];
  989. rguiSpriteUsage = new UInt [nVO]; 
  990. rguiWarpingAccuracy = new UInt [nVO]; 
  991. rgiNumPnts = new Int [nVO]; 
  992. Int iL;
  993. for(iL = BASE_LAYER; iL<=ENHN_LAYER; iL++)
  994. {
  995. // allocate per-layer parameters
  996. rguiRateControl [iL] = new UInt [nVO];
  997. rguiBitsBudget [iL] = new UInt [nVO];
  998. rgbAdvPredDisable [iL] = new Bool [nVO];
  999. rgbErrorResilientDisable [iL] = new Bool [nVO];
  1000. rgbDataPartitioning [iL] = new Bool [nVO];
  1001. rgbReversibleVlc [iL] = new Bool [nVO];
  1002. rgiVPBitTh [iL] = new Int [nVO];
  1003. rgbInterlacedCoding [iL] = new Bool [nVO];
  1004. rgfQuant [iL] = new Quantizer [nVO]; 
  1005. rgbLoadIntraMatrix [iL] = new Bool [nVO];
  1006. rgppiIntraQuantizerMatrix [iL] = new Int * [nVO];
  1007. rgbLoadInterMatrix [iL] = new Bool [nVO];
  1008. rgppiInterQuantizerMatrix [iL] = new Int * [nVO];
  1009. rgiIntraDCSwitchingThr [iL] = new Int [nVO]; 
  1010. rgiIStep [iL] = new Int [nVO]; 
  1011. rgiPStep [iL] = new Int [nVO]; 
  1012. rgiStepBCode [iL] = new Int [nVO]; 
  1013. rgbLoadIntraMatrixAlpha [iL] = new Bool [nVO]; 
  1014. rgppiIntraQuantizerMatrixAlpha [iL] = new Int * [nVO];
  1015. rgbLoadInterMatrixAlpha [iL] = new Bool [nVO]; 
  1016. rgppiInterQuantizerMatrixAlpha [iL] = new Int * [nVO];
  1017. rgiIStepAlpha [iL] = new Int [nVO]; 
  1018. rgiPStepAlpha [iL] = new Int [nVO]; 
  1019. rgiBStepAlpha [iL] = new Int [nVO]; 
  1020. rgbNoGrayQuantUpdate [iL] = new Bool [nVO];
  1021. rguiSearchRange [iL] = new UInt [nVO];
  1022. rgbOriginalME [iL] = new Bool [nVO];
  1023. rgbComplexityEstimationDisable [iL] = new Bool [nVO];
  1024. rgbOpaque [iL] = new Bool [nVO];
  1025. rgbTransparent [iL] = new Bool [nVO];
  1026. rgbIntraCAE [iL] = new Bool [nVO];
  1027. rgbInterCAE [iL] = new Bool [nVO];
  1028. rgbNoUpdate [iL] = new Bool [nVO];
  1029. rgbUpsampling [iL] = new Bool [nVO];
  1030. rgbIntraBlocks [iL] = new Bool [nVO];
  1031. rgbInterBlocks [iL] = new Bool [nVO];
  1032. rgbInter4vBlocks [iL] = new Bool [nVO];
  1033. rgbNotCodedBlocks [iL] = new Bool [nVO];
  1034. rgbDCTCoefs [iL] = new Bool [nVO];
  1035. rgbDCTLines [iL] = new Bool [nVO];
  1036. rgbVLCSymbols [iL] = new Bool [nVO];
  1037. rgbVLCBits [iL] = new Bool [nVO];
  1038. rgbAPM [iL] = new Bool [nVO];
  1039. rgbNPM [iL] = new Bool [nVO];
  1040. rgbInterpolateMCQ [iL] = new Bool [nVO];
  1041. rgbForwBackMCQ [iL] = new Bool [nVO];
  1042. rgbHalfpel2 [iL] = new Bool [nVO];
  1043. rgbHalfpel4 [iL] = new Bool [nVO];
  1044. rguiVolControlParameters [iL] = new UInt [nVO];
  1045. rguiChromaFormat [iL] = new UInt [nVO];
  1046. rguiLowDelay [iL] = new UInt [nVO];
  1047. rguiVBVParams [iL] = new UInt [nVO];
  1048. rguiBitRate [iL] = new UInt [nVO];
  1049. rguiVbvBufferSize [iL] = new UInt [nVO];
  1050. rguiVbvBufferOccupany [iL] = new UInt [nVO];
  1051. rgdFrameFrequency [iL] = new Double [nVO];
  1052. rgbTopFieldFirst [iL] = new Bool [nVO]; 
  1053. rgbAlternateScan [iL] = new Bool [nVO]; 
  1054. rgiDirectModeRadius [iL] = new Bool [nVO]; 
  1055. rgiMVFileUsage[iL] = new Int [nVO];
  1056. pchMVFileName[iL] = new char * [nVO];
  1057. }
  1058. for (iObj = 0; iObj < nVO; iObj++)
  1059. {
  1060. // per object alloc
  1061. rgppiIntraQuantizerMatrix [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1062. rgppiIntraQuantizerMatrix [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1063. rgppiInterQuantizerMatrix [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1064. rgppiInterQuantizerMatrix [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1065. rgppiIntraQuantizerMatrixAlpha [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1066. rgppiIntraQuantizerMatrixAlpha [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1067. rgppiInterQuantizerMatrixAlpha [BASE_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1068. rgppiInterQuantizerMatrixAlpha [ENHN_LAYER] [iObj] = new Int [BLOCK_SQUARE_SIZE];
  1069. }
  1070. //scalability indicators: 1 = temporal, 2 = spatial scalability
  1071. nextValidLine (pfPara, pnLine);
  1072. bAnyScalability = FALSE;
  1073. for (iObj = 0; iObj < nVO; iObj++) {
  1074. if (fscanf (pfPara, "%d", &rgbScalability [iObj]) != 1) {
  1075. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1076. exit (1);
  1077. }
  1078. if (rgbScalability[iObj] == TEMPORAL_SCALABILITY || 
  1079. rgbScalability[iObj] == SPATIAL_SCALABILITY)
  1080. bAnyScalability = TRUE;
  1081. else
  1082. assert (rgbScalability[iObj] == NO_SCALABILITY);
  1083. if(rgbScalability[iObj] == SPATIAL_SCALABILITY || rgbScalability[iObj] == TEMPORAL_SCALABILITY) // modifiedy by Sharp(98/2/12)
  1084. rgbSpatialScalability[iObj] = TRUE; 
  1085. else 
  1086. rgbSpatialScalability[iObj] = FALSE; 
  1087. }
  1088. //coded added by Sony, only deals with ONE VO.
  1089. //Type option of Spatial Scalable Coding
  1090. //This parameter is used for dicision VOP prediction types of Enhancement layer in Spatial Scalable Coding
  1091. //If this option is set to 0, Enhancement layer is coded as "PPPPPP......",
  1092. //else if set to 1 ,It's coded as "PBBBB......."
  1093. nextValidLine(pfPara,pnLine);
  1094. assert (nVO == 1);
  1095. fscanf(pfPara,"%d",&iSpatialOption);
  1096. if(rgbScalability[0] == SPATIAL_SCALABILITY)
  1097. if (iSpatialOption == 1)
  1098. fprintf(stdout,"Enhancement layer is coded as "PPPPP....."n");
  1099. else if (iSpatialOption == 0)
  1100. fprintf(stdout,"Enhancement layer is coded as "PBBBB....."n");
  1101. else {
  1102. fprintf(stderr,"The parameter "SpatialOption" is not set correctlyn");
  1103. exit(1);
  1104. }
  1105. //Load enhancement layer (Spatial Scalable) size
  1106. nextValidLine(pfPara,pnLine);
  1107. fscanf(pfPara,"%d",&uiFrmWidth_SS);
  1108. fscanf(pfPara,"%d",&uiFrmHeight_SS);
  1109. //load upsampling factor 
  1110. nextValidLine(pfPara,pnLine);
  1111. fscanf(pfPara,"%d",&uiHor_sampling_n);
  1112. fscanf(pfPara,"%d",&uiHor_sampling_m);
  1113. nextValidLine(pfPara,pnLine);
  1114. fscanf(pfPara,"%d",&uiVer_sampling_n);
  1115. fscanf(pfPara,"%d",&uiVer_sampling_m);
  1116. // form of temporal scalability indicators
  1117. // case 0  Enhn    P   P   ....
  1118. //         Base  I   P   P ....
  1119. // case 1  Enhn    B B   B B   ....
  1120. //         Base  I     P     P ....
  1121. // case 2  Enhn    P   B   B   ....
  1122. //         Base  I   B   P   B ....
  1123. nextValidLine (pfPara, pnLine);
  1124. for (iObj = 0; iObj < nVO; iObj++) {
  1125. if (fscanf (pfPara, "%d", &rgiTemporalScalabilityType [iObj]) != 1) {
  1126. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1127. exit (1);
  1128. }
  1129. assert (rgiTemporalScalabilityType [iObj] == 0 || 
  1130. rgiTemporalScalabilityType [iObj] == 1 || 
  1131. rgiTemporalScalabilityType [iObj] == 2 ||
  1132. rgiTemporalScalabilityType [iObj] == 3 ||
  1133. rgiTemporalScalabilityType [iObj] == 4);
  1134. }
  1135. // enhancement_type for scalability
  1136. nextValidLine (pfPara, pnLine);
  1137. for (iObj = 0; iObj < nVO; iObj++) {
  1138. if (fscanf (pfPara, "%d", &rgiEnhancementType [iObj]) != 1) {
  1139. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1140. exit (1);
  1141. }
  1142. assert (rgiEnhancementType [iObj] == 0 || //  entire region of the base layer is enhanced
  1143. // begin: modified by Sharp (98/3/24)
  1144. rgiEnhancementType [iObj] == 1 ||  // partial region of the base layer is enhanced (with background composition)
  1145. rgiEnhancementType [iObj] == 2);  // partial region of the base layer is enhanced (without background composition)
  1146. // end: modified by Sharp (98/3/24)
  1147. }
  1148. // rate control flag
  1149. nextValidLine (pfPara, pnLine);
  1150. for (iObj = 0; iObj < nVO; iObj++) {
  1151. if (fscanf (pfPara, "%u", &rguiRateControl [BASE_LAYER] [iObj] ) != 1) {
  1152. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1153. exit (1);
  1154. }
  1155. assert (rguiRateControl [BASE_LAYER] [iObj]  == RC_MPEG4 || 
  1156. rguiRateControl [BASE_LAYER] [iObj]  == RC_TM5 ||
  1157. rguiRateControl [BASE_LAYER] [iObj]  == 0);
  1158. }
  1159. if (bAnyScalability) {
  1160. for (iObj = 0; iObj < nVO; iObj++) {
  1161. if (fscanf (pfPara, "%u", &rguiRateControl [ENHN_LAYER] [iObj]) != 1) {
  1162. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1163. exit (1);
  1164. }
  1165. assert (rguiRateControl [ENHN_LAYER] [iObj]  == 0 || 
  1166. rguiRateControl [ENHN_LAYER] [iObj]  == RC_MPEG4 ||
  1167. rguiRateControl [ENHN_LAYER] [iObj]  == RC_TM5);
  1168. }
  1169. }
  1170. // bit budget for each object.
  1171. nextValidLine (pfPara, pnLine);
  1172. for (iObj = 0; iObj < nVO; iObj++) {
  1173. if (fscanf (pfPara, "%d", &rguiBitsBudget [BASE_LAYER] [iObj]) != 1) {
  1174. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1175. exit (1);
  1176. }
  1177. }
  1178. if (bAnyScalability) {
  1179. for (iObj = 0; iObj < nVO; iObj++) {
  1180. if (fscanf (pfPara, "%d", &rguiBitsBudget [ENHN_LAYER] [iObj]) != 1) {
  1181. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1182. exit (1);
  1183. }
  1184. assert (rguiBitsBudget [ENHN_LAYER] [iObj]  > 0);
  1185. }
  1186. }
  1187. // alpha usage for each object.  0: rectangle, 1: binary, 2: 8-bit, 3: shape only
  1188. nextValidLine (pfPara, pnLine);
  1189. for (iObj = 0; iObj < nVO; iObj++) {
  1190. UInt uiAlpha;
  1191. if (fscanf (pfPara, "%d", &uiAlpha) != 1) {
  1192. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1193. exit (1);
  1194. }
  1195. else {
  1196. assert (uiAlpha == 0 || uiAlpha == 1 || uiAlpha == 2 || uiAlpha == 3);
  1197. if(uiAlpha<3)
  1198. {
  1199. rgfAlphaUsage [iObj] = (AlphaUsage) uiAlpha;
  1200. rgbShapeOnly [iObj] = FALSE;
  1201. }
  1202. else
  1203. {
  1204. rgfAlphaUsage [iObj] = ONE_BIT;
  1205. rgbShapeOnly [iObj] = TRUE;
  1206. }
  1207. }
  1208. }
  1209. // binary shape rounding para
  1210. nextValidLine (pfPara, pnLine);
  1211. for (iObj = 0; iObj < nVO; iObj++) {
  1212. if (fscanf (pfPara, "%d", &rgiBinaryAlphaTH [iObj]) != 1) {
  1213. fprintf (stderr, "wrong parameter file format on line %dn", *pnLine);
  1214. exit (1);
  1215. }
  1216. assert (rgiBinaryAlphaTH [iObj] >= 0);
  1217. }
  1218. // binary shape size conversion flag
  1219. nextValidLine (pfPara, pnLine);
  1220. for (iObj = 0; iObj < nVO; iObj++) {
  1221. if (fscanf (pfPara, "%d", &rgbNoCrChange [iObj]) != 1) {
  1222. fprintf (stderr, "wrong parameter file format on line %dn", *pnLine);
  1223. exit (1);
  1224. }
  1225. assert (rgbNoCrChange [iObj] == TRUE || rgbNoCrChange [iObj] == FALSE); //boolean value
  1226. if (rgiBinaryAlphaTH [iObj] == 0)
  1227. assert (rgbNoCrChange [iObj] == TRUE); //MB-level size conversion of shape is off in lossless moden");
  1228. }
  1229. // Added for error resilient mode by Toshiba(1997-11-14)
  1230. nextValidLine (pfPara, pnLine);
  1231. for (iObj = 0; iObj < nVO; iObj++) {
  1232. if (fscanf (pfPara, "%d", &rgiBinaryAlphaRR [iObj]) != 1) {
  1233. fprintf (stderr, "wrong parameter file format on line %dn", *pnLine);
  1234. exit (1);
  1235. }
  1236. assert (rgiBinaryAlphaRR [iObj] >= 0);
  1237. }
  1238. // End Toshiba(1997-11-14)
  1239. // rounding control disable
  1240. if(iVersion > 812)
  1241. nextValidLine (pfPara, pnLine);
  1242. for (iObj = 0; iObj < nVO; iObj++) {
  1243. if(iVersion > 812)
  1244. {
  1245. if (fscanf (pfPara, "%d", &rgbRoundingControlDisable [iObj]) != 1) {
  1246. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1247. exit (1);
  1248. }
  1249. }
  1250. else
  1251. rgbRoundingControlDisable [iObj] = 0;
  1252. assert (rgbRoundingControlDisable [iObj]  == 0 || rgbRoundingControlDisable [iObj] == 1);
  1253. }
  1254. if(iVersion > 812)
  1255. nextValidLine (pfPara, pnLine);
  1256. for (iObj = 0; iObj < nVO; iObj++) {
  1257. if(iVersion > 812)
  1258. {
  1259. if (fscanf (pfPara, "%d", &rgiInitialRoundingType [iObj]) != 1) {
  1260. fprintf (stderr, "wrong parameter file format on line %dn", *pnLine);
  1261. exit (1);
  1262. }
  1263. }
  1264. else
  1265. rgiInitialRoundingType [iObj] = 0;
  1266. assert (rgiInitialRoundingType [iObj] == 0 || rgiInitialRoundingType [iObj] == 1);
  1267. }
  1268. // error resilient coding disable
  1269. nextValidLine (pfPara, pnLine);
  1270. Int iErrorResilientFlags;
  1271. for (iObj = 0; iObj < nVO; iObj++) {
  1272. if (fscanf (pfPara, "%d", &iErrorResilientFlags) != 1) {
  1273. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1274. exit (1);
  1275. }
  1276. rgbErrorResilientDisable [BASE_LAYER] [iObj] = iErrorResilientFlags & 0x1;
  1277. // Modified for error resilient mode by Toshiba(1998-1-16)
  1278. rgbDataPartitioning [BASE_LAYER] [iObj]  = (iErrorResilientFlags & 0x2) ? TRUE : FALSE;
  1279. rgbReversibleVlc [BASE_LAYER] [iObj]  = (iErrorResilientFlags & 0x4) ? TRUE : FALSE;
  1280. // End Toshiba(1998-1-16)
  1281. if( rgbErrorResilientDisable [BASE_LAYER] [iObj])
  1282. rgiBinaryAlphaRR [iObj] = -1;
  1283. }
  1284. if (bAnyScalability) {
  1285. for (iObj = 0; iObj < nVO; iObj++) {
  1286. if (fscanf (pfPara, "%d", &rgbErrorResilientDisable [ENHN_LAYER] [iObj]) != 1) {
  1287. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1288. exit (1);
  1289. }
  1290. assert (rgbErrorResilientDisable [ENHN_LAYER] [iObj] == TRUE); //error resilient coding not supported as for now
  1291. rgbErrorResilientDisable [ENHN_LAYER] [iObj] = TRUE;
  1292. rgbDataPartitioning [ENHN_LAYER] [iObj] = FALSE;
  1293. rgbReversibleVlc [ENHN_LAYER] [iObj] = FALSE;
  1294. }
  1295. }
  1296. // Bit threshold for video packet spacing control
  1297. nextValidLine (pfPara, pnLine);
  1298. for (iObj = 0; iObj < nVO; iObj++) {
  1299. if (fscanf (pfPara, "%d", &rgiVPBitTh [BASE_LAYER] [iObj]) != 1) {
  1300. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1301. exit (1);
  1302. }
  1303. if (rgbErrorResilientDisable [BASE_LAYER] [iObj])
  1304. rgiVPBitTh [BASE_LAYER] [iObj] = -1; // set VPBitTh to negative value
  1305. }
  1306. if (bAnyScalability) {
  1307. for (iObj = 0; iObj < nVO; iObj++) {
  1308. if (fscanf (pfPara, "%d", &rgiVPBitTh [ENHN_LAYER] [iObj]) != 1) {
  1309. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1310. exit (1);
  1311. }
  1312. rgiVPBitTh [ENHN_LAYER] [iObj] = -1;
  1313. }
  1314. }
  1315. // Interlaced coding
  1316. nextValidLine (pfPara, pnLine);
  1317. for (iObj = 0; iObj < nVO; iObj++) {
  1318. if (fscanf (pfPara, "%d", &rgbInterlacedCoding [BASE_LAYER] [iObj]) != 1) {
  1319. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1320. exit (1);
  1321. }
  1322. assert (rgbInterlacedCoding [BASE_LAYER] [iObj] == 0 || rgbInterlacedCoding [BASE_LAYER] [iObj] == 1);
  1323. }
  1324. if (bAnyScalability) {
  1325. for (iObj = 0; iObj < nVO; iObj++) {
  1326. if (fscanf (pfPara, "%d", &rgbInterlacedCoding [ENHN_LAYER] [iObj]) != 1) {
  1327. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1328. exit (1);
  1329. }
  1330. assert (rgbInterlacedCoding [ENHN_LAYER] [iObj] == 0 || rgbInterlacedCoding [ENHN_LAYER] [iObj] == 1);
  1331. }
  1332. }
  1333. // quantizer selection: 0 -- H.263, 1 -- MPEG
  1334. nextValidLine (pfPara, pnLine);
  1335. for (iObj = 0; iObj < nVO; iObj++) {
  1336.   int read;
  1337.   if (fscanf (pfPara, "%d", &read) != 1) { 
  1338. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1339. exit (1);
  1340. }
  1341.   rgfQuant [BASE_LAYER] [iObj] = (Quantizer)read;
  1342.   assert (rgfQuant [BASE_LAYER] [iObj] ==0 || rgfQuant [BASE_LAYER] [iObj] == 1);
  1343. }
  1344. if (bAnyScalability) {
  1345. for (iObj = 0; iObj < nVO; iObj++) {
  1346.   int read;
  1347.   if (fscanf (pfPara, "%d", &read) != 1) {
  1348. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1349. exit (1);
  1350.   }
  1351.   rgfQuant [ENHN_LAYER] [iObj] = (Quantizer)read;
  1352. assert (rgfQuant [ENHN_LAYER] [iObj] ==0 || rgfQuant [ENHN_LAYER] [iObj] == 1);
  1353. }
  1354. }
  1355. // load non-default intra Q-Matrix, 0 -- FALSE, 1 -- TRUE
  1356. nextValidLine (pfPara, pnLine);
  1357. for (iObj = 0; iObj < nVO; iObj++) {
  1358. if (fscanf (pfPara, "%d", &rgbLoadIntraMatrix [BASE_LAYER] [iObj]) != 1) {
  1359. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1360. exit (1);
  1361. }
  1362. assert (rgbLoadIntraMatrix [BASE_LAYER] [iObj] ==0 || 
  1363. rgbLoadIntraMatrix [BASE_LAYER] [iObj] == 1);
  1364. if (rgbLoadIntraMatrix [BASE_LAYER] [iObj]) {
  1365. UInt i = 0;
  1366. do {
  1367. if (fscanf (pfPara, "%d", &rgppiIntraQuantizerMatrix [BASE_LAYER] [iObj] [i]) != 1) {
  1368. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1369. exit (1);
  1370. }
  1371. } while (rgppiIntraQuantizerMatrix [BASE_LAYER] [iObj] [i] != 0 && ++i < BLOCK_SQUARE_SIZE);
  1372. }
  1373. else
  1374. memcpy (rgppiIntraQuantizerMatrix [BASE_LAYER] [iObj], rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1375. }
  1376. if (bAnyScalability) {
  1377. for (iObj = 0; iObj < nVO; iObj++) {
  1378. if (fscanf (pfPara, "%d", &rgbLoadIntraMatrix [ENHN_LAYER] [iObj]) != 1) {
  1379. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1380. exit (1);
  1381. }
  1382. assert (rgbLoadIntraMatrix [ENHN_LAYER] [iObj] ==0 || 
  1383. rgbLoadIntraMatrix [ENHN_LAYER] [iObj] == 1);
  1384. if (rgbLoadIntraMatrix [ENHN_LAYER] [iObj]) {
  1385. UInt i = 0;
  1386. do {
  1387. if (fscanf (pfPara, "%d", &rgppiIntraQuantizerMatrix [ENHN_LAYER] [iObj] [i]) != 1) {
  1388. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1389. exit (1);
  1390. }
  1391. } while (rgppiIntraQuantizerMatrix [ENHN_LAYER] [iObj] [i] != 0 && ++i < BLOCK_SQUARE_SIZE);
  1392. }
  1393. else
  1394. memcpy (rgppiIntraQuantizerMatrix [ENHN_LAYER] [iObj], rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1395. }
  1396. }
  1397. // load non-default inter Q-Matrix, 0 -- FALSE, 1 -- TRUE
  1398. nextValidLine (pfPara, pnLine);
  1399. for (iObj = 0; iObj < nVO; iObj++) {
  1400. if (fscanf (pfPara, "%d", &rgbLoadInterMatrix [BASE_LAYER] [iObj]) != 1) {
  1401. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1402. exit (1);
  1403. }
  1404. assert (rgbLoadInterMatrix [BASE_LAYER] [iObj] ==0 || 
  1405. rgbLoadInterMatrix [BASE_LAYER] [iObj] == 1);
  1406. if (rgbLoadInterMatrix [BASE_LAYER] [iObj]) {
  1407. UInt i = 0;
  1408. do {
  1409. if (fscanf (pfPara, "%d", &rgppiInterQuantizerMatrix [BASE_LAYER] [iObj] [i]) != 1) {
  1410. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1411. exit (1);
  1412. }
  1413. } while (rgppiInterQuantizerMatrix [BASE_LAYER] [iObj] [i] != 0 && ++i < BLOCK_SQUARE_SIZE);
  1414. }
  1415. else
  1416. memcpy (rgppiInterQuantizerMatrix [BASE_LAYER] [iObj], rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1417. }
  1418. if (bAnyScalability) {
  1419. for (iObj = 0; iObj < nVO; iObj++) {
  1420. if (fscanf (pfPara, "%d", &rgbLoadInterMatrix [ENHN_LAYER] [iObj]) != 1) {
  1421. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1422. exit (1);
  1423. }
  1424. assert (rgbLoadInterMatrix [ENHN_LAYER] [iObj] ==0 || 
  1425. rgbLoadInterMatrix [ENHN_LAYER] [iObj] == 1);
  1426. if (rgbLoadInterMatrix [ENHN_LAYER] [iObj]) {
  1427. UInt i = 0;
  1428. do {
  1429. if (fscanf (pfPara, "%d", &rgppiInterQuantizerMatrix [ENHN_LAYER] [iObj] [i]) != 1) {
  1430. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1431. exit (1);
  1432. }
  1433. } while (rgppiInterQuantizerMatrix [ENHN_LAYER] [iObj] [i] != 0 && ++i < BLOCK_SQUARE_SIZE);
  1434. }
  1435. else
  1436. memcpy (rgppiInterQuantizerMatrix [ENHN_LAYER] [iObj], rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1437. }
  1438. }
  1439. // threhold to code Intra-DC as AC
  1440. nextValidLine (pfPara, pnLine);
  1441. for (iObj = 0; iObj < nVO; iObj++) {
  1442. if (fscanf (pfPara, "%d", &(rgiIntraDCSwitchingThr [BASE_LAYER] [iObj])) != 1) {
  1443. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1444. exit (1);
  1445. }
  1446. assert (rgiIntraDCSwitchingThr [BASE_LAYER] [iObj] >= 0 && 
  1447. rgiIntraDCSwitchingThr [BASE_LAYER] [iObj] <= 7);
  1448. }
  1449. if (bAnyScalability) {
  1450. for (iObj = 0; iObj < nVO; iObj++) {
  1451. if (fscanf (pfPara, "%d", &(rgiIntraDCSwitchingThr [ENHN_LAYER] [iObj])) != 1) {
  1452. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1453. exit (1);
  1454. }
  1455. assert (rgiIntraDCSwitchingThr [ENHN_LAYER] [iObj] >= 0 && 
  1456. rgiIntraDCSwitchingThr [ENHN_LAYER] [iObj] <= 7);
  1457. }
  1458. }
  1459. // I-VO quantization stepsize
  1460. nextValidLine (pfPara, pnLine);
  1461. for (iObj = 0; iObj < nVO; iObj++) {
  1462. if (fscanf (pfPara, "%d", &(rgiIStep [BASE_LAYER] [iObj])) != 1) {
  1463. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1464. exit (1);
  1465. }
  1466. assert (rgiIStep [BASE_LAYER] [iObj] > 0 && rgiIStep [BASE_LAYER] [iObj] < (1<<uiQuantPrecision));
  1467. }
  1468. if (bAnyScalability) {
  1469. for (iObj = 0; iObj < nVO; iObj++) {
  1470. if (fscanf (pfPara, "%d", &(rgiIStep [ENHN_LAYER] [iObj])) != 1) {
  1471. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1472. exit (1);
  1473. }
  1474. assert (rgiIStep [ENHN_LAYER] [iObj] > 0 && rgiIStep [ENHN_LAYER] [iObj] < (1<<uiQuantPrecision));
  1475. }
  1476. }
  1477. // P-VO quantization stepsize
  1478. nextValidLine (pfPara, pnLine);
  1479. for (iObj = 0; iObj < nVO; iObj++) {
  1480. if (fscanf (pfPara, "%d", &(rgiPStep [BASE_LAYER] [iObj])) != 1) {
  1481. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1482. exit (1);
  1483. }
  1484. assert (rgiPStep [BASE_LAYER] [iObj] > 0 && rgiPStep [BASE_LAYER] [iObj] < (1<<uiQuantPrecision));
  1485. }
  1486. if (bAnyScalability) {
  1487. for (iObj = 0; iObj < nVO; iObj++) {
  1488. if (fscanf (pfPara, "%d", &(rgiPStep [ENHN_LAYER] [iObj])) != 1) {
  1489. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1490. exit (1);
  1491. }
  1492. assert (rgiPStep [ENHN_LAYER] [iObj] > 0 && rgiPStep [ENHN_LAYER] [iObj] < (1<<uiQuantPrecision));
  1493. }
  1494. }
  1495. // quantization stepsize for B-VOP
  1496. nextValidLine (pfPara, pnLine);
  1497. for (iObj = 0; iObj < nVO; iObj++) {
  1498. if (fscanf (pfPara, "%d", &(rgiStepBCode [BASE_LAYER] [iObj])) != 1) {
  1499. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1500. exit (1);
  1501. }
  1502. assert (rgiStepBCode [BASE_LAYER] [iObj] > 0 && rgiStepBCode [BASE_LAYER] [iObj] < (1<<uiQuantPrecision));
  1503. }
  1504. if (bAnyScalability) {
  1505. for (iObj = 0; iObj < nVO; iObj++) {
  1506. if (fscanf (pfPara, "%d", &(rgiStepBCode [ENHN_LAYER] [iObj])) != 1) {
  1507. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1508. exit (1);
  1509. }
  1510. assert (rgiStepBCode [ENHN_LAYER] [iObj] > 0 && rgiStepBCode [ENHN_LAYER] [iObj] < (1<<uiQuantPrecision));
  1511. }
  1512. }
  1513. // load non-default gray alpha intra Q-Matrix, 0 -- FALSE, 1 -- TRUE
  1514. nextValidLine (pfPara, pnLine);
  1515. for (iObj = 0; iObj < nVO; iObj++) {
  1516. if (fscanf (pfPara, "%d", &rgbLoadIntraMatrixAlpha [BASE_LAYER] [iObj]) != 1) {
  1517. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1518. exit (1);
  1519. }
  1520. assert (rgbLoadIntraMatrixAlpha [BASE_LAYER] [iObj] ==0 || 
  1521. rgbLoadIntraMatrixAlpha [BASE_LAYER] [iObj] == 1);
  1522. if (rgbLoadIntraMatrixAlpha [BASE_LAYER] [iObj]) {
  1523. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  1524. if (fscanf (pfPara, "%d", &rgppiIntraQuantizerMatrixAlpha [BASE_LAYER] [iObj] [i]) != 1) {
  1525. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1526. exit (1);
  1527. }
  1528. }
  1529. }
  1530. else
  1531. memcpy (rgppiIntraQuantizerMatrixAlpha [BASE_LAYER] [iObj], rgiDefaultIntraQMatrixAlpha, BLOCK_SQUARE_SIZE * sizeof (Int));
  1532. }
  1533. if (bAnyScalability) {
  1534. for (iObj = 0; iObj < nVO; iObj++) {
  1535. if (fscanf (pfPara, "%d", &rgbLoadIntraMatrixAlpha [ENHN_LAYER] [iObj]) != 1) {
  1536. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1537. exit (1);
  1538. }
  1539. assert (rgbLoadIntraMatrixAlpha [ENHN_LAYER] [iObj] ==0 || 
  1540. rgbLoadIntraMatrixAlpha [ENHN_LAYER] [iObj] == 1);
  1541. if (rgbLoadIntraMatrixAlpha [ENHN_LAYER] [iObj]) {
  1542. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  1543. if (fscanf (pfPara, "%d", &rgppiIntraQuantizerMatrixAlpha [ENHN_LAYER] [iObj] [i]) != 1) {
  1544. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1545. exit (1);
  1546. }
  1547. }
  1548. }
  1549. else
  1550. memcpy (rgppiIntraQuantizerMatrixAlpha [ENHN_LAYER] [iObj], rgiDefaultIntraQMatrixAlpha, BLOCK_SQUARE_SIZE * sizeof (Int));
  1551. }
  1552. }
  1553. // load non-default  gray alpha inter Q-Matrix, 0 -- FALSE, 1 -- TRUE
  1554. nextValidLine (pfPara, pnLine);
  1555. for (iObj = 0; iObj < nVO; iObj++) {
  1556. if (fscanf (pfPara, "%d", &rgbLoadInterMatrixAlpha [BASE_LAYER] [iObj]) != 1) {
  1557. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1558. exit (1);
  1559. }
  1560. assert (rgbLoadInterMatrixAlpha [BASE_LAYER] [iObj] ==0 || 
  1561. rgbLoadInterMatrixAlpha [BASE_LAYER] [iObj] == 1);
  1562. if (rgbLoadInterMatrixAlpha [BASE_LAYER] [iObj]) {
  1563. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  1564. if (fscanf (pfPara, "%d", &rgppiInterQuantizerMatrixAlpha [BASE_LAYER] [iObj] [i]) != 1) {
  1565. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1566. exit (1);
  1567. }
  1568. }
  1569. }
  1570. else
  1571. memcpy (rgppiInterQuantizerMatrixAlpha [BASE_LAYER] [iObj], rgiDefaultInterQMatrixAlpha, BLOCK_SQUARE_SIZE * sizeof (Int));
  1572. }
  1573. if (bAnyScalability) {
  1574. for (iObj = 0; iObj < nVO; iObj++) {
  1575. if (fscanf (pfPara, "%d", &rgbLoadInterMatrixAlpha [ENHN_LAYER] [iObj]) != 1) {
  1576. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1577. exit (1);
  1578. }
  1579. assert (rgbLoadInterMatrixAlpha [ENHN_LAYER] [iObj] ==0 || 
  1580. rgbLoadInterMatrixAlpha [ENHN_LAYER] [iObj] == 1);
  1581. if (rgbLoadInterMatrixAlpha [ENHN_LAYER] [iObj]) {
  1582. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  1583. if (fscanf (pfPara, "%d", &rgppiInterQuantizerMatrixAlpha [ENHN_LAYER] [iObj] [i]) != 1) {
  1584. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1585. exit (1);
  1586. }
  1587. }
  1588. }
  1589. else
  1590. memcpy (rgppiInterQuantizerMatrixAlpha [ENHN_LAYER] [iObj], rgiDefaultInterQMatrixAlpha, BLOCK_SQUARE_SIZE * sizeof (Int));
  1591. }
  1592. }
  1593. // I-VO quantization stepsize for Alpha
  1594. nextValidLine (pfPara, pnLine);
  1595. for (iObj = 0; iObj < nVO; iObj++) {
  1596. if (fscanf (pfPara, "%d", &(rgiIStepAlpha [BASE_LAYER] [iObj])) != 1) {
  1597. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1598. exit (1);
  1599. }
  1600. assert (rgiIStepAlpha [BASE_LAYER] [iObj] > 0 && rgiIStepAlpha [BASE_LAYER] [iObj] < 32);
  1601. }
  1602. if (bAnyScalability) {
  1603. for (iObj = 0; iObj < nVO; iObj++) {
  1604. if (fscanf (pfPara, "%d", &(rgiIStepAlpha [ENHN_LAYER] [iObj])) != 1) {
  1605. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1606. exit (1);
  1607. }
  1608. assert (rgiIStepAlpha [ENHN_LAYER] [iObj] > 0 && rgiIStepAlpha [ENHN_LAYER] [iObj] < 32);
  1609. }
  1610. }
  1611. // P-VO quantization stepsize for Alpha
  1612. nextValidLine (pfPara, pnLine);
  1613. for (iObj = 0; iObj < nVO; iObj++) {
  1614. if (fscanf (pfPara, "%d", &(rgiPStepAlpha [BASE_LAYER] [iObj])) != 1) {
  1615. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1616. exit (1);
  1617. }
  1618. assert (rgiPStepAlpha [BASE_LAYER] [iObj] > 0 && rgiPStepAlpha [BASE_LAYER] [iObj] < 64);
  1619. }
  1620. if (bAnyScalability) {
  1621. for (iObj = 0; iObj < nVO; iObj++) {
  1622. if (fscanf (pfPara, "%d", &(rgiPStepAlpha [ENHN_LAYER] [iObj])) != 1) {
  1623. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1624. exit (1);
  1625. }
  1626. assert (rgiPStepAlpha [ENHN_LAYER] [iObj] > 0 && rgiPStepAlpha [ENHN_LAYER] [iObj] < 64);
  1627. }
  1628. }
  1629. // B-VO quantization stepsize for Alpha
  1630. nextValidLine (pfPara, pnLine);
  1631. for (iObj = 0; iObj < nVO; iObj++) {
  1632. if (fscanf (pfPara, "%d", &(rgiBStepAlpha [BASE_LAYER] [iObj])) != 1) {
  1633. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1634. exit (1);
  1635. }
  1636. assert (rgiBStepAlpha [BASE_LAYER] [iObj] > 0 && rgiBStepAlpha [BASE_LAYER] [iObj] < 64);
  1637. }
  1638. if (bAnyScalability) {
  1639. for (iObj = 0; iObj < nVO; iObj++) {
  1640. if (fscanf (pfPara, "%d", &(rgiBStepAlpha [ENHN_LAYER] [iObj])) != 1) {
  1641. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1642. exit (1);
  1643. }
  1644. assert (rgiBStepAlpha [ENHN_LAYER] [iObj] > 0 && rgiBStepAlpha [ENHN_LAYER] [iObj] < 64);
  1645. }
  1646. }
  1647. // disable_gray_quant_update
  1648. nextValidLine (pfPara, pnLine);
  1649. for (iObj = 0; iObj < nVO; iObj++) {
  1650. if (fscanf (pfPara, "%d", &(rgbNoGrayQuantUpdate [BASE_LAYER] [iObj])) != 1) {
  1651. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1652. exit (1);
  1653. }
  1654. }
  1655. if (bAnyScalability) {
  1656. for (iObj = 0; iObj < nVO; iObj++) {
  1657. if (fscanf (pfPara, "%d", &(rgbNoGrayQuantUpdate [ENHN_LAYER] [iObj])) != 1) {
  1658. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1659. exit (1);
  1660. }
  1661. }
  1662. }
  1663. // number of P-VOP's between 2 I-VOP's; if there are B-VOPs, the no. of encode frames will multiply
  1664. nextValidLine (pfPara, pnLine);
  1665. for (iObj = 0; iObj < nVO; iObj++) {
  1666. if (fscanf (pfPara, "%d", &rgiNumPbetweenIVOP [iObj]) != 1) {
  1667. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1668. exit (1);
  1669. }
  1670. if (rgiNumPbetweenIVOP [iObj] < 0)
  1671. rgiNumPbetweenIVOP [iObj] = lastFrm - firstFrm + 1; //only 1 I at the beginning
  1672. }
  1673. // number of B-VOP's between 2 P-VOP's
  1674. nextValidLine (pfPara, pnLine);
  1675. for (iObj = 0; iObj < nVO; iObj++) {
  1676. if (fscanf (pfPara, "%d", &rgiNumBbetweenPVOP [iObj]) != 1) {
  1677. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1678. exit (1);
  1679. }
  1680. assert (rgiNumBbetweenPVOP [iObj] >= 0);
  1681. }
  1682. if(iVersion>814)
  1683. {
  1684. // rgbAllowSkippedPMBs
  1685. nextValidLine (pfPara, pnLine);
  1686. for (iObj = 0; iObj < nVO; iObj++) {
  1687. if (fscanf (pfPara, "%d", &rgbAllowSkippedPMBs [iObj]) != 1) {
  1688. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1689. exit (1);
  1690. }
  1691. assert (rgbAllowSkippedPMBs [iObj] == 0 || rgbAllowSkippedPMBs[iObj]==1);
  1692. }
  1693. }
  1694. else
  1695. for (iObj = 0; iObj < nVO; iObj++)
  1696. rgbAllowSkippedPMBs [iObj] = 1;
  1697. //added to encode GOV header by SONY 980212
  1698. //number of VOP between GOV header
  1699. //CAUTION:GOV period is not used in spatial scalable coding
  1700. nextValidLine (pfPara, pnLine);
  1701. for (iObj = 0; iObj < nVO; iObj++) {
  1702. if (fscanf (pfPara, "%d", &rgiGOVperiod [iObj]) != 1) {
  1703. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1704. exit (1);
  1705. }
  1706. assert (rgiGOVperiod [iObj] >= 0);
  1707. }
  1708. //980212
  1709. // deblocking filter disable
  1710. nextValidLine (pfPara, pnLine);
  1711. for (iObj = 0; iObj < nVO; iObj++) {
  1712. if (fscanf (pfPara, "%d", &rgbDeblockFilterDisable [iObj]) != 1) {
  1713. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1714. exit (1);
  1715. }
  1716. if (rgbDeblockFilterDisable [iObj] != TRUE) {
  1717. fprintf(stderr, "Deblocking filter is not supported in this versionn");
  1718. exit (1);
  1719. }
  1720. }
  1721. // Temporal sampling rate
  1722. nextValidLine (pfPara, pnLine);
  1723. for (iObj = 0; iObj < nVO; iObj++) {
  1724. if (fscanf (pfPara, "%d", &rgiTSRate [iObj]) != 1) {
  1725. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1726. exit (1);
  1727. }
  1728. assert (rgiTSRate [iObj] >= 1);
  1729. }
  1730. if ( bAnyScalability ){ // This part is added by Norio Ito
  1731. for (iObj = 0; iObj < nVO; iObj++) {
  1732. if (fscanf (pfPara, "%d", &rgiEnhcTSRate [iObj]) != 1) {
  1733. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1734. exit (1);
  1735. }
  1736. assert (rgiEnhcTSRate [iObj] >= 1);
  1737. }
  1738. }
  1739. // maximum displacement
  1740. nextValidLine (pfPara, pnLine);
  1741. for (iObj = 0; iObj < nVO; iObj++) {
  1742. if (fscanf (pfPara, "%d", &rguiSearchRange [BASE_LAYER] [iObj]) != 1) {
  1743. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1744. exit (1);
  1745. }
  1746. assert (rguiSearchRange [BASE_LAYER] [iObj] >= 1);
  1747. }
  1748. if (bAnyScalability) {
  1749. for (iObj = 0; iObj < nVO; iObj++) {
  1750. if (fscanf (pfPara, "%d", &rguiSearchRange [ENHN_LAYER] [iObj]) != 1) {
  1751. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1752. exit (1);
  1753. }
  1754. assert (rguiSearchRange [ENHN_LAYER] [iObj] >= 1);
  1755. }
  1756. }
  1757. // use original or reconstructed previous VO for ME
  1758. nextValidLine (pfPara, pnLine);
  1759. for (iObj = 0; iObj < nVO; iObj++) {
  1760. if (fscanf (pfPara, "%d", &rgbOriginalME [BASE_LAYER] [iObj]) != 1) {
  1761. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1762. exit (1);
  1763. }
  1764. assert (rgbOriginalME [BASE_LAYER] [iObj] == 0 || rgbOriginalME [BASE_LAYER] [iObj] == 1);
  1765. }
  1766. if (bAnyScalability) {
  1767. for (iObj = 0; iObj < nVO; iObj++) {
  1768. if (fscanf (pfPara, "%d", &rgbOriginalME [ENHN_LAYER] [iObj]) != 1) {
  1769. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1770. exit (1);
  1771. }
  1772. assert (rgbOriginalME [ENHN_LAYER] [iObj] == 0 || rgbOriginalME [ENHN_LAYER] [iObj] == 1);
  1773. }
  1774. }
  1775. // disable advance prediction (obmc only)?
  1776. nextValidLine (pfPara, pnLine);
  1777. for (iObj = 0; iObj < nVO; iObj++) {
  1778. if (fscanf (pfPara, "%d", &rgbAdvPredDisable [BASE_LAYER] [iObj]) != 1) {
  1779. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1780. exit (1);
  1781. }
  1782. assert (rgbAdvPredDisable [BASE_LAYER] [iObj] == 0 || rgbAdvPredDisable [BASE_LAYER] [iObj] == 1);
  1783. }
  1784. if (bAnyScalability) {
  1785. for (iObj = 0; iObj < nVO; iObj++) {
  1786. if (fscanf (pfPara, "%d", &rgbAdvPredDisable [ENHN_LAYER] [iObj]) != 1) {
  1787. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1788. exit (1);
  1789. }
  1790. assert (rgbAdvPredDisable [ENHN_LAYER] [iObj] == 0 || rgbAdvPredDisable [ENHN_LAYER] [iObj] == 1);
  1791. }
  1792. }
  1793. // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 16 Jun 1998
  1794. readBoolVOLFlag (rgbComplexityEstimationDisable, nVO, pfPara, pnLine, bAnyScalability);
  1795. readBoolVOLFlag (rgbOpaque, nVO, pfPara, pnLine, bAnyScalability);
  1796. readBoolVOLFlag (rgbTransparent, nVO, pfPara, pnLine, bAnyScalability);
  1797. readBoolVOLFlag (rgbIntraCAE, nVO, pfPara, pnLine, bAnyScalability);
  1798. readBoolVOLFlag (rgbInterCAE, nVO, pfPara, pnLine, bAnyScalability);
  1799. readBoolVOLFlag (rgbNoUpdate, nVO, pfPara, pnLine, bAnyScalability);
  1800. readBoolVOLFlag (rgbUpsampling, nVO, pfPara, pnLine, bAnyScalability);
  1801. readBoolVOLFlag (rgbIntraBlocks, nVO, pfPara, pnLine, bAnyScalability);
  1802. readBoolVOLFlag (rgbInterBlocks, nVO, pfPara, pnLine, bAnyScalability);
  1803. readBoolVOLFlag (rgbInter4vBlocks, nVO, pfPara, pnLine, bAnyScalability);
  1804. readBoolVOLFlag (rgbNotCodedBlocks, nVO, pfPara, pnLine, bAnyScalability);
  1805. readBoolVOLFlag (rgbDCTCoefs, nVO, pfPara, pnLine, bAnyScalability);
  1806. readBoolVOLFlag (rgbDCTLines, nVO, pfPara, pnLine, bAnyScalability);
  1807. readBoolVOLFlag (rgbVLCSymbols, nVO, pfPara, pnLine, bAnyScalability);
  1808. readBoolVOLFlag (rgbVLCBits, nVO, pfPara, pnLine, bAnyScalability);
  1809. readBoolVOLFlag (rgbAPM, nVO, pfPara, pnLine, bAnyScalability);
  1810. readBoolVOLFlag (rgbNPM, nVO, pfPara, pnLine, bAnyScalability);
  1811. readBoolVOLFlag (rgbInterpolateMCQ, nVO, pfPara, pnLine, bAnyScalability);
  1812. readBoolVOLFlag (rgbForwBackMCQ, nVO, pfPara, pnLine, bAnyScalability);
  1813. readBoolVOLFlag (rgbHalfpel2, nVO, pfPara, pnLine, bAnyScalability);
  1814. readBoolVOLFlag (rgbHalfpel4, nVO, pfPara, pnLine, bAnyScalability);
  1815. // END: Complexity Estimation syntax support
  1816. // START: VOL Control Parameters
  1817. if(iVersion>813)
  1818. {
  1819. readItem(rguiVolControlParameters, nVO, pfPara, pnLine, bAnyScalability);
  1820. readItem(rguiChromaFormat, nVO, pfPara, pnLine, bAnyScalability);
  1821. readItem(rguiLowDelay, nVO, pfPara, pnLine, bAnyScalability);
  1822. readItem(rguiVBVParams, nVO, pfPara, pnLine, bAnyScalability);
  1823. readItem(rguiBitRate, nVO, pfPara, pnLine, bAnyScalability);
  1824. readItem(rguiVbvBufferSize, nVO, pfPara, pnLine, bAnyScalability);
  1825. readItem(rguiVbvBufferOccupany, nVO, pfPara, pnLine, bAnyScalability);
  1826. }
  1827. else
  1828. {
  1829. for(iObj = 0; iObj<nVO; iObj++)
  1830. {
  1831. rguiVolControlParameters[BASE_LAYER][iObj] = 0;
  1832. rguiVolControlParameters[ENHN_LAYER][iObj] = 0;
  1833. rguiVBVParams[BASE_LAYER][iObj] = 0;
  1834. rguiVBVParams[ENHN_LAYER][iObj] = 0;
  1835. }
  1836. }
  1837. // END: VOL Control Parameters
  1838. // Interlaced CHANGE
  1839. // Sequence frame frequency (Hz).  Use double type because of 29.97Hz (etc)
  1840. nextValidLine (pfPara, pnLine);
  1841. for (iObj = 0; iObj < nVO; iObj++) {
  1842. if (fscanf (pfPara, "%lf", &(rgdFrameFrequency [BASE_LAYER] [iObj])) != 1) {
  1843. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1844. exit (1);
  1845. }
  1846. assert(rgdFrameFrequency [BASE_LAYER] [iObj] > 0.0);
  1847. }
  1848. if (bAnyScalability) {
  1849. for (iObj = 0; iObj < nVO; iObj++) {
  1850. if (fscanf (pfPara, "%lf", &(rgdFrameFrequency [ENHN_LAYER] [iObj])) != 1) {
  1851. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1852. exit (1);
  1853. }
  1854. assert(rgdFrameFrequency [ENHN_LAYER] [iObj] > 0.0);
  1855. }
  1856. }
  1857. // top field first flag
  1858. nextValidLine (pfPara, pnLine);
  1859. for (iObj = 0; iObj < nVO; iObj++) {
  1860. if (fscanf (pfPara, "%d", &(rgbTopFieldFirst [BASE_LAYER] [iObj])) != 1) {
  1861. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1862. exit (1);
  1863. }
  1864. assert (rgbTopFieldFirst [BASE_LAYER] [iObj] == 0 || 
  1865. rgbTopFieldFirst [BASE_LAYER] [iObj] == 1);
  1866. }
  1867. if (bAnyScalability) {
  1868. for (iObj = 0; iObj < nVO; iObj++) {
  1869. if (fscanf (pfPara, "%d", &(rgbTopFieldFirst [ENHN_LAYER] [iObj])) != 1) {
  1870. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1871. exit (1);
  1872. }
  1873. assert (rgbTopFieldFirst [ENHN_LAYER] [iObj] == 0 || 
  1874. rgbTopFieldFirst [ENHN_LAYER] [iObj] == 1);
  1875. }
  1876. }
  1877. // alternate scan flag
  1878. nextValidLine (pfPara, pnLine);
  1879. for (iObj = 0; iObj < nVO; iObj++) {
  1880. if (fscanf (pfPara, "%d", &(rgbAlternateScan [BASE_LAYER] [iObj])) != 1) {
  1881. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1882. exit (1);
  1883. }
  1884. assert (rgbAlternateScan [BASE_LAYER] [iObj] == 0 || 
  1885. rgbAlternateScan [BASE_LAYER] [iObj] == 1);
  1886. }
  1887. if (bAnyScalability) {
  1888. for (iObj = 0; iObj < nVO; iObj++) {
  1889. if (fscanf (pfPara, "%d", &(rgbAlternateScan [ENHN_LAYER] [iObj])) != 1) {
  1890. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1891. exit (1);
  1892. }
  1893. assert (rgbAlternateScan [ENHN_LAYER] [iObj] == 0 || 
  1894. rgbAlternateScan [ENHN_LAYER] [iObj] == 1);
  1895. }
  1896. }
  1897. // Direct Mode search radius (half luma pixel units)
  1898. nextValidLine (pfPara, pnLine);
  1899. for (iObj = 0; iObj < nVO; iObj++) {
  1900. if (fscanf (pfPara, "%d", &(rgiDirectModeRadius [BASE_LAYER] [iObj])) != 1) {
  1901. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1902. exit (1);
  1903. }
  1904. }
  1905. if (bAnyScalability) {
  1906. for (iObj = 0; iObj < nVO; iObj++) {
  1907. if (fscanf (pfPara, "%d", &(rgiDirectModeRadius [ENHN_LAYER] [iObj])) != 1) {
  1908. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1909. exit (1);
  1910. }
  1911. }
  1912. }
  1913. // motion vector file
  1914. nextValidLine(pfPara, pnLine);
  1915. for (iObj = 0; iObj < nVO; iObj++) {
  1916. if (fscanf (pfPara, "%d", &(rgiMVFileUsage [BASE_LAYER] [iObj])) != 1) {
  1917. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1918. exit (1);
  1919. }
  1920. assert (rgiMVFileUsage [BASE_LAYER] [iObj] == 0 || // 0= not used
  1921. rgiMVFileUsage [BASE_LAYER] [iObj] == 1 || // 1= read motion vectors from file
  1922. rgiMVFileUsage [BASE_LAYER] [iObj] == 2 ); // 2= write motion vectors to file
  1923. pchMVFileName [BASE_LAYER] [iObj] = NULL;
  1924. pchMVFileName [ENHN_LAYER] [iObj] = NULL;
  1925. char cFileName[256];
  1926. cFileName[0] = 0;
  1927. if ((rgiMVFileUsage [BASE_LAYER] [iObj] != 0) &&
  1928. (fscanf (pfPara, "%200s", cFileName) != 1)) {
  1929. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1930. exit (1);
  1931. }
  1932. Int iLength = strlen(cFileName) + 1;
  1933. pchMVFileName [BASE_LAYER] [iObj] = new char [iLength];
  1934. memcpy(pchMVFileName [BASE_LAYER] [iObj], cFileName, iLength);
  1935. }
  1936. if (bAnyScalability) {
  1937. for (iObj = 0; iObj < nVO; iObj++) {
  1938. if (fscanf (pfPara, "%d", &(rgiMVFileUsage [ENHN_LAYER] [iObj])) != 1) {
  1939. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1940. exit (1);
  1941. }
  1942. assert (rgiMVFileUsage [ENHN_LAYER] [iObj] == 0 || 
  1943. rgiMVFileUsage [ENHN_LAYER] [iObj] == 1 ||
  1944. rgiMVFileUsage [ENHN_LAYER] [iObj] == 2 );
  1945. char cFileName[256];
  1946. cFileName[0] = 0;
  1947. if ((rgiMVFileUsage [ENHN_LAYER] [iObj] != 0) &&
  1948. (fscanf (pfPara, "%s", cFileName) != 1)) {
  1949. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1950. exit (1);
  1951. }
  1952. Int iLength = strlen(cFileName) + 1;
  1953. pchMVFileName [ENHN_LAYER] [iObj] = new char [iLength];
  1954. memcpy(pchMVFileName [ENHN_LAYER] [iObj], cFileName, iLength);
  1955. }
  1956. }
  1957. // file information
  1958. pchPrefix = new char [256];
  1959. nextValidLine (pfPara, pnLine);
  1960. fscanf (pfPara, "%s", pchPrefix);
  1961. // original file directory
  1962. pchBmpDir = new char [256];
  1963. nextValidLine (pfPara, pnLine);
  1964. fscanf (pfPara, "%100s", pchBmpDir);
  1965. // chrominance format
  1966. nextValidLine (pfPara, pnLine);
  1967. for (iObj = 0; iObj < nVO; iObj++) {
  1968. UInt uiChrType;
  1969. if (fscanf (pfPara, "%d", &uiChrType) != 1) {
  1970. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1971. exit (1);
  1972. }
  1973. else {
  1974. assert (uiChrType == 0 || uiChrType == 1 || uiChrType == 2);
  1975. rgfChrType [iObj] = (ChromType) uiChrType;
  1976. }
  1977. }
  1978. // output file directory
  1979. pchOutBmpDir = new char [256];
  1980. nextValidLine (pfPara, pnLine);
  1981. fscanf (pfPara, "%100s", pchOutBmpDir);
  1982. // output bitstream file
  1983. pchOutStrFile = new char [256];
  1984. nextValidLine (pfPara, pnLine);
  1985. fscanf (pfPara, "%100s", pchOutStrFile);
  1986. // statistics dumping options
  1987. nextValidLine (pfPara, pnLine);
  1988. for (iObj = 0; iObj < nVO; iObj++) {
  1989. if (fscanf (pfPara, "%d", &rgbDumpMB [iObj]) != 1) {
  1990. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  1991. exit (1);
  1992. }
  1993. assert (rgbDumpMB [iObj] == 0 || rgbDumpMB [iObj] == 1);
  1994. }
  1995. // trace file options
  1996. nextValidLine (pfPara, pnLine);
  1997. for (iObj = 0; iObj < nVO; iObj++) {
  1998. if (fscanf (pfPara, "%d", &rgbTrace [iObj]) != 1) {
  1999. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2000. exit (1);
  2001. }
  2002. assert (rgbTrace [iObj] == 0 || rgbTrace [iObj] == 1);
  2003. }
  2004. // sprite info
  2005. // sprite usage
  2006. nextValidLine (pfPara, pnLine);
  2007. for (iObj = 0; iObj < nVO; iObj++) {
  2008. if (fscanf (pfPara, "%d", &rguiSpriteUsage [iObj]) != 1) {
  2009. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2010. exit (1);
  2011. }
  2012. assert ((rguiSpriteUsage [iObj] == 0) || (rguiSpriteUsage [iObj] == 1)); // only support static sprite at the moment
  2013. if (rgbScalability [iObj] == TRUE)
  2014. assert (rguiSpriteUsage [iObj] == 0);
  2015. }
  2016. // warping accuracy
  2017. nextValidLine (pfPara, pnLine);
  2018. for (iObj = 0; iObj < nVO; iObj++) {
  2019. if (fscanf (pfPara, "%d", &rguiWarpingAccuracy [iObj]) != 1) {
  2020. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2021. exit (1);
  2022. }
  2023. if (rguiSpriteUsage [iObj] != 0)
  2024. assert (rguiWarpingAccuracy [iObj] == 0 || rguiWarpingAccuracy [iObj] == 1 || rguiWarpingAccuracy [iObj] == 2 || rguiWarpingAccuracy [iObj] == 3);
  2025. }
  2026. // number of points
  2027. nextValidLine (pfPara, pnLine);
  2028. for (iObj = 0; iObj < nVO; iObj++) {
  2029. if (fscanf (pfPara, "%d", &rgiNumPnts [iObj]) != 1) {
  2030. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2031. exit (1);
  2032. }
  2033. if (rgbScalability [iObj] == TRUE)
  2034. assert (rgiNumPnts [iObj] == -1);
  2035. if (rguiSpriteUsage [iObj] == 1) 
  2036. assert (rgiNumPnts [iObj] == 0 ||
  2037. rgiNumPnts [iObj] == 1 ||
  2038. rgiNumPnts [iObj] == 2 ||
  2039. rgiNumPnts [iObj] == 3 ||
  2040. rgiNumPnts [iObj] == 4);
  2041. }
  2042. // sprite directory
  2043. pchSptDir = new char [256];
  2044. nextValidLine (pfPara, pnLine);
  2045. fscanf (pfPara, "%100s", pchSptDir);
  2046. // point directory
  2047. pchSptPntDir = new char [256];
  2048. nextValidLine (pfPara, pnLine);
  2049. fscanf (pfPara, "%100s", pchSptPntDir);
  2050. //  sprite reconstruction mode, i.e. Low-latency-sprite-enable
  2051. nextValidLine (pfPara, pnLine);
  2052. for (iObj = 0; iObj < nVO; iObj++)
  2053. {
  2054. UInt uiSptMode;
  2055. if (fscanf (pfPara, "%d", &uiSptMode) != 1) {
  2056. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2057. exit (1);
  2058. }
  2059. else {
  2060. assert (uiSptMode == 0 || uiSptMode == 1 );
  2061. rgSpriteMode[iObj] = (SptMode) uiSptMode;
  2062. }
  2063. }
  2064. fclose(pfPara);
  2065. }
  2066. CSessionEncoderParams param;
  2067. param.uiFrmWidth = uiFrmWidth;
  2068. param.uiFrmHeight = uiFrmHeight;
  2069. param.iFirstFrm = firstFrm;
  2070. param.iLastFrm = lastFrm;
  2071. param.bNot8Bit = bNot8Bit;
  2072. param.uiQuantPrecision = uiQuantPrecision;
  2073. param.nBits = nBits;
  2074. param.uiFirstVO = firstVO;
  2075. param.iLastVO = lastVO;
  2076. param.rgbSpatialScalability =  rgbSpatialScalability;
  2077. param.rgiTemporalScalabilityType = rgiTemporalScalabilityType;
  2078. param.rgiEnhancementType = rgiEnhancementType;
  2079. param.rguiRateControl = rguiRateControl;
  2080. param.rguiBudget = rguiBitsBudget;
  2081. param.rgfAlphaUsage = rgfAlphaUsage;
  2082. param.rgbShapeOnly = rgbShapeOnly;
  2083. param.rgiBinaryAlphaTH =  rgiBinaryAlphaTH;
  2084. param.rgiBinaryAlphaRR = rgiBinaryAlphaRR;
  2085. param.rgbNoCrChange = rgbNoCrChange;
  2086. param.rguiSearchRange = rguiSearchRange;
  2087. param.rgbOriginalForME = rgbOriginalME;
  2088. param.rgbAdvPredDisable = rgbAdvPredDisable;
  2089. param.rgbComplexityEstimationDisable = rgbComplexityEstimationDisable;
  2090. param.rgbOpaque = rgbOpaque;
  2091. param.rgbTransparent = rgbTransparent;
  2092. param.rgbIntraCAE = rgbIntraCAE;
  2093. param.rgbInterCAE = rgbInterCAE;
  2094. param.rgbNoUpdate = rgbNoUpdate;
  2095. param.rgbUpsampling = rgbUpsampling;
  2096. param.rgbIntraBlocks = rgbIntraBlocks;
  2097. param.rgbInterBlocks = rgbInterBlocks;
  2098. param.rgbInter4vBlocks = rgbInter4vBlocks;
  2099. param.rgbNotCodedBlocks = rgbNotCodedBlocks;
  2100. param.rgbDCTCoefs = rgbDCTCoefs;
  2101. param.rgbDCTLines = rgbDCTLines;
  2102. param.rgbVLCSymbols = rgbVLCSymbols;
  2103. param.rgbVLCBits = rgbVLCBits;
  2104. param.rgbAPM = rgbAPM;
  2105. param.rgbNPM = rgbNPM;
  2106. param.rgbInterpolateMCQ = rgbInterpolateMCQ;
  2107. param.rgbForwBackMCQ = rgbForwBackMCQ;
  2108. param.rgbHalfpel2 = rgbHalfpel2;
  2109. param.rgbHalfpel4 = rgbHalfpel4;
  2110. param.rguiVolControlParameters = rguiVolControlParameters;
  2111. param.rguiChromaFormat = rguiChromaFormat;
  2112. param.rguiLowDelay = rguiLowDelay;
  2113. param.rguiVBVParams = rguiVBVParams;
  2114. param.rguiBitRate = rguiBitRate;
  2115. param.rguiVbvBufferSize = rguiVbvBufferSize;
  2116. param.rguiVbvBufferOccupany = rguiVbvBufferOccupany;
  2117. param.rgdFrameFrequency = rgdFrameFrequency;
  2118. param.rgbInterlacedCoding = rgbInterlacedCoding;
  2119. param.rgbTopFieldFirst = rgbTopFieldFirst;
  2120. param.rgbAlternateScan = rgbAlternateScan;
  2121. param.rgiDirectModeRadius = rgiDirectModeRadius;
  2122. param.rgiMVFileUsage = rgiMVFileUsage;
  2123. param.pchMVFileName = &pchMVFileName[0];
  2124. param.rgbVPBitTh = rgiVPBitTh;
  2125. param.rgbDataPartitioning = rgbDataPartitioning;
  2126. param.rgbReversibleVlc = rgbReversibleVlc;
  2127. param.rgfQuant = rgfQuant;
  2128. param.rgbLoadIntraMatrix = rgbLoadIntraMatrix;
  2129. param.rgppiIntraQuantizerMatrix = rgppiIntraQuantizerMatrix;
  2130. param.rgbLoadInterMatrix = rgbLoadInterMatrix;
  2131. param.rgppiInterQuantizerMatrix =  rgppiInterQuantizerMatrix;
  2132. param.rgiIntraDCSwitchingThr = rgiIntraDCSwitchingThr;
  2133. param.rgiStepI = rgiIStep;
  2134. param.rgiStepP = rgiPStep;
  2135. param.rgbLoadIntraMatrixAlpha = rgbLoadIntraMatrixAlpha;
  2136. param.rgppiIntraQuantizerMatrixAlpha = rgppiIntraQuantizerMatrixAlpha;
  2137. param.rgbLoadInterMatrixAlpha = rgbLoadIntraMatrixAlpha;
  2138. param.rgppiInterQuantizerMatrixAlpha = rgppiInterQuantizerMatrixAlpha;
  2139. param.rgiStepIAlpha = rgiIStepAlpha;
  2140. param.rgiStepPAlpha = rgiPStepAlpha;
  2141. param.rgiStepBAlpha = rgiBStepAlpha;
  2142. param.rgbNoAlphaQuantUpdate = rgbNoGrayQuantUpdate;
  2143. param.rgiStepB = rgiStepBCode;
  2144. param.rgiNumOfBbetweenPVOP = rgiNumBbetweenPVOP;
  2145. param.rgiNumOfPbetweenIVOP = rgiNumPbetweenIVOP;
  2146. param.rgiGOVperiod = rgiGOVperiod;
  2147. param.rgbDeblockFilterDisable = rgbDeblockFilterDisable;
  2148. param.rgbAllowSkippedPMBs = rgbAllowSkippedPMBs;
  2149. param.pchPrefix = pchPrefix;
  2150. param.pchBmpFiles = pchBmpDir;
  2151. param.rgfChrType = rgfChrType;
  2152. param.pchOutBmpFiles = pchOutBmpDir;
  2153. param.pchOutStrFiles = pchOutStrFile;
  2154. param.rgiTemporalRate = rgiTSRate;
  2155. param.rgiEnhnTemporalRate = rgiEnhcTSRate;
  2156. param.rgbDumpMB = rgbDumpMB;
  2157. param.rgbTrace = rgbTrace;
  2158. param.rgbRoundingControlDisable =  rgbRoundingControlDisable;
  2159. param.rgiInitialRoundingType =  rgiInitialRoundingType;
  2160. param.rguiSpriteUsage = rguiSpriteUsage;
  2161. param.rguiWarpingAccuracy = rguiWarpingAccuracy;
  2162. param.rgNumOfPnts = rgiNumPnts;
  2163. param.pchSptDir = pchSptDir;
  2164. param.pchSptPntDir = pchSptPntDir;
  2165. param.pSpriteMode = rgSpriteMode;
  2166. param.iSpatialOption = iSpatialOption;
  2167. param.uiFrmWidth_SS = uiFrmWidth_SS;
  2168. param.uiFrmHeight_SS = uiFrmHeight_SS;
  2169. param.uiHor_sampling_n = uiHor_sampling_n;
  2170. param.uiHor_sampling_m = uiHor_sampling_m;
  2171. param.uiVer_sampling_n = uiVer_sampling_n;
  2172. param.uiVer_sampling_m = uiVer_sampling_m;
  2173. CSessionEncoder *penc = new CSessionEncoder(&param);
  2174. #if 0
  2175.   CSessionEncoder* penc = new CSessionEncoder (
  2176. // general info
  2177. uiFrmWidth, // frame width
  2178. uiFrmHeight, // frame height
  2179. (Int)firstFrm, // first frame number
  2180. (Int)lastFrm, // last frame number
  2181. (Bool)bNot8Bit, // NBIT: not 8-bit flag
  2182. uiQuantPrecision, // NBIT: quant precision
  2183. (UInt)nBits, // NBIT: number of bits per pixel
  2184. (Int)firstVO, // first VO index
  2185. (Int)lastVO, // last VO index
  2186. rgbSpatialScalability, // spatial scalability indicator
  2187. rgiTemporalScalabilityType, // form of temporal scalability // added by Sharp (98/02/09)
  2188. rgiEnhancementType, // enhancement_type for scalability // added by Sharp (98/02/09)
  2189. rguiRateControl,
  2190. rguiBitsBudget,
  2191. rgfAlphaUsage, // alpha usage for each VO.
  2192. rgbShapeOnly,
  2193. rgiBinaryAlphaTH,
  2194. rgiBinaryAlphaRR, // Added for error resilient mode by Toshiba(1997-11-14)
  2195. rgbNoCrChange, 
  2196. // motion estimation part for each VO
  2197. rguiSearchRange,
  2198. rgbOriginalME, // flag indicating whether use the original previous VO for ME
  2199. rgbAdvPredDisable,
  2200.             // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 17 Jun 1998
  2201. rgbComplexityEstimationDisable,
  2202. rgbOpaque,
  2203. rgbTransparent,
  2204. rgbIntraCAE,
  2205. rgbInterCAE,
  2206. rgbNoUpdate,
  2207. rgbUpsampling,
  2208. rgbIntraBlocks,
  2209. rgbInterBlocks,
  2210. rgbInter4vBlocks,
  2211. rgbNotCodedBlocks,
  2212. rgbDCTCoefs,
  2213. rgbDCTLines,
  2214. rgbVLCSymbols,
  2215. rgbVLCBits,
  2216. rgbAPM,
  2217. rgbNPM,
  2218. rgbInterpolateMCQ,
  2219. rgbForwBackMCQ,
  2220. rgbHalfpel2,
  2221. rgbHalfpel4,
  2222. // END: Complexity Estimation syntax support
  2223. // START: VOL Control Parameters
  2224. rguiVolControlParameters,
  2225. rguiChromaFormat,
  2226. rguiLowDelay,
  2227. rguiVBVParams,
  2228. rguiBitRate,
  2229. rguiVbvBufferSize,
  2230. rguiVbvBufferOccupany,
  2231. // END: VOL Control Parameters
  2232. rgdFrameFrequency,
  2233. // interlace coding flag
  2234. rgbInterlacedCoding,
  2235. rgbTopFieldFirst,
  2236.             rgbAlternateScan,
  2237. // direct mode search radius
  2238. rgiDirectModeRadius,
  2239. // motion vector file I/O
  2240. rgiMVFileUsage,
  2241. &pchMVFileName[0],
  2242. // systax mode
  2243. rgiVPBitTh, // Bit threshold for video packet spacing control
  2244. rgbDataPartitioning,  //data partitioning
  2245. rgbReversibleVlc, //reversible VLC
  2246. // for texture coding
  2247. rgfQuant,
  2248. rgbLoadIntraMatrix,
  2249. rgppiIntraQuantizerMatrix,
  2250. rgbLoadInterMatrix,
  2251. rgppiInterQuantizerMatrix,
  2252. rgiIntraDCSwitchingThr, //threshold to code dc as ac when pred. is on
  2253. rgiIStep, // I-VOP quantization stepsize
  2254. rgiPStep, // P-VOP quantization stepsize
  2255. rgbLoadIntraMatrixAlpha,
  2256. rgppiIntraQuantizerMatrixAlpha,
  2257. rgbLoadInterMatrixAlpha,
  2258. rgppiInterQuantizerMatrixAlpha,
  2259. rgiIStepAlpha, // I-VOP gray alpha quantization stepsize
  2260. rgiPStepAlpha, // P-VOP gray alpha quantization stepsize
  2261. rgiBStepAlpha, // B-VOP gray alpha quantization stepsize
  2262. rgbNoGrayQuantUpdate, //disable gray quant update within VOP
  2263. rgiStepBCode, // code for quantization stepsize for B-VOP
  2264. rgiNumBbetweenPVOP, // no of B-VOPs between P-VOPs
  2265. rgiNumPbetweenIVOP, // no of P-VOPs between I-VOPs
  2266. rgiGOVperiod,
  2267. rgbDeblockFilterDisable, //disable deblocing filter
  2268. rgbAllowSkippedPMBs,
  2269. // file information
  2270. pchPrefix, // prefix name of the movie
  2271. pchBmpDir, // bmp file directory location
  2272. rgfChrType,
  2273. pchOutBmpDir, // quantized frame file directory
  2274. pchOutStrFile, // output bitstream file
  2275. rgiTSRate,
  2276. rgiEnhcTSRate, // frame rate for enhancement layer // added by Sharp (98/02/09)
  2277. rgbDumpMB,
  2278. rgbTrace,
  2279. rgbRoundingControlDisable,
  2280. rgiInitialRoundingType,
  2281. rguiSpriteUsage,
  2282. rguiWarpingAccuracy,
  2283. rgiNumPnts,
  2284. pchSptDir,
  2285. pchSptPntDir,
  2286.             rgSpriteMode,
  2287. iSpatialOption,
  2288. uiFrmWidth_SS,
  2289. uiFrmHeight_SS,
  2290. uiHor_sampling_n,
  2291. uiHor_sampling_m,
  2292. uiVer_sampling_n,
  2293. uiVer_sampling_m
  2294. );
  2295. #endif
  2296. #ifdef __PC_COMPILER_
  2297. Int tickBegin = ::GetTickCount ();
  2298. #endif // __PC_COMPILER_
  2299. penc->encode();
  2300. #ifdef __PC_COMPILER_
  2301. Int tickAfter = ::GetTickCount ();
  2302. Int nFrames = 1 + (lastFrm - firstFrm) / rgiTSRate [0];
  2303. printf ("Total time: %dn", tickAfter - tickBegin);
  2304. Double dAverage = (Double) (tickAfter - tickBegin) / (Double) nFrames;
  2305. printf ("Total frame %dtAverage time: %.6lfn", nFrames, dAverage);
  2306. printf ("FPS %.6lfn", 1000.0 / dAverage);
  2307. #endif // __PC_COMPILER_
  2308. delete penc;
  2309. for (Int iLayer = BASE_LAYER; iLayer <= ENHN_LAYER; iLayer++) {
  2310. delete [] rguiRateControl [iLayer];
  2311. delete [] rguiBitsBudget [iLayer];
  2312. delete [] rgbErrorResilientDisable [iLayer];
  2313. delete [] rgbDataPartitioning [iLayer];
  2314. delete [] rgbReversibleVlc [iLayer];
  2315. delete [] rgiVPBitTh [iLayer];
  2316. // for texture coding
  2317. delete [] rgfQuant [iLayer];
  2318. delete [] rgiIntraDCSwitchingThr [iLayer];
  2319. delete [] rgiIStep [iLayer]; // error signal quantization stepsize
  2320. delete [] rgiPStep [iLayer]; // error signal quantization stepsize
  2321. delete [] rgiIStepAlpha [iLayer]; // error signal quantization stepsize
  2322. delete [] rgiPStepAlpha [iLayer]; // error signal quantization stepsize
  2323. delete [] rgiBStepAlpha [iLayer];
  2324. delete [] rgbNoGrayQuantUpdate [iLayer]; //discouple change of gray quant with tex. quant
  2325. delete [] rgiStepBCode [iLayer]; // error signal quantization stepsize
  2326. delete [] rgbLoadIntraMatrix [iLayer];
  2327. delete [] rgbLoadInterMatrix [iLayer];
  2328. delete [] rgbLoadIntraMatrixAlpha [iLayer];
  2329. delete [] rgbLoadInterMatrixAlpha [iLayer];
  2330. for (iObj = 0; iObj < nVO; iObj++) {
  2331. delete [] rgppiIntraQuantizerMatrix  [iLayer] [iObj];
  2332. delete [] rgppiInterQuantizerMatrix  [iLayer] [iObj];
  2333. delete [] rgppiIntraQuantizerMatrixAlpha  [iLayer] [iObj];
  2334. delete [] rgppiInterQuantizerMatrixAlpha  [iLayer] [iObj];
  2335. if(pchMVFileName [iLayer] [iObj]!=NULL)
  2336. delete [] pchMVFileName [iLayer] [iObj];
  2337. }
  2338. delete [] rgppiIntraQuantizerMatrix [iLayer];
  2339. delete [] rgppiInterQuantizerMatrix [iLayer];
  2340. delete [] rgppiIntraQuantizerMatrixAlpha [iLayer];
  2341. delete [] rgppiInterQuantizerMatrixAlpha [iLayer];
  2342. delete [] pchMVFileName [iLayer];
  2343. // for motion esti.
  2344. delete [] rgbOriginalME [iLayer];
  2345. delete [] rgbAdvPredDisable [iLayer];
  2346. delete [] rguiSearchRange [iLayer];
  2347. // for interlace coding
  2348. delete [] rgbInterlacedCoding [iLayer];
  2349. delete [] rgbTopFieldFirst [iLayer];
  2350. delete [] rgiDirectModeRadius [iLayer];
  2351. delete [] rgiMVFileUsage [iLayer];
  2352. delete [] rgdFrameFrequency [iLayer];
  2353. delete [] rgbAlternateScan [iLayer];
  2354. delete [] rgbComplexityEstimationDisable [iLayer];
  2355. delete [] rgbOpaque [iLayer];
  2356. delete [] rgbTransparent [iLayer];
  2357. delete [] rgbIntraCAE [iLayer];
  2358. delete [] rgbInterCAE [iLayer];
  2359. delete [] rgbNoUpdate [iLayer];
  2360. delete [] rgbUpsampling [iLayer];
  2361. delete [] rgbIntraBlocks [iLayer];
  2362. delete [] rgbInterBlocks [iLayer];
  2363. delete [] rgbInter4vBlocks [iLayer];
  2364. delete [] rgbNotCodedBlocks [iLayer];
  2365. delete [] rgbDCTCoefs [iLayer];
  2366. delete [] rgbDCTLines [iLayer];
  2367. delete [] rgbVLCSymbols [iLayer];
  2368. delete [] rgbVLCBits [iLayer];
  2369. delete [] rgbAPM [iLayer];
  2370. delete [] rgbNPM [iLayer];
  2371. delete [] rgbInterpolateMCQ [iLayer];
  2372. delete [] rgbForwBackMCQ [iLayer];
  2373. delete [] rgbHalfpel2 [iLayer];
  2374. delete [] rgbHalfpel4 [iLayer];
  2375. delete [] rguiVolControlParameters [iLayer];
  2376. delete [] rguiChromaFormat [iLayer];
  2377. delete [] rguiLowDelay [iLayer];
  2378. delete [] rguiVBVParams [iLayer];
  2379. delete [] rguiBitRate [iLayer];
  2380. delete [] rguiVbvBufferSize [iLayer];
  2381. delete [] rguiVbvBufferOccupany [iLayer];
  2382. }
  2383. delete [] rgbScalability;
  2384.     delete [] rgbSpatialScalability;
  2385. delete [] rgiTemporalScalabilityType;
  2386. delete [] rgiEnhancementType;
  2387. // for mask coding, should fill in later on
  2388. delete [] rgfAlphaUsage; // alpha usage for each VO.  0: binary, 1: 8-bit
  2389. delete [] rgbShapeOnly;
  2390. delete [] rgiBinaryAlphaTH;
  2391. delete [] rgiBinaryAlphaRR; // Added for error resilient mode by Toshiba(1997-11-14)
  2392. delete [] rgbNoCrChange;
  2393. delete [] rgbDeblockFilterDisable;
  2394. delete [] rgfChrType;
  2395. delete [] rgiNumBbetweenPVOP; // no of B-VOPs between P-VOPs
  2396. delete [] rgiNumPbetweenIVOP; // no of P-VOPs between I-VOPs
  2397. //added to encode GOV header by SONY 980212
  2398. delete [] rgiGOVperiod;
  2399. //980212
  2400. delete [] rgiTSRate;
  2401. delete [] rgiEnhcTSRate; // added by Norio Ito
  2402. delete [] rgbAllowSkippedPMBs;
  2403. // rounding control
  2404. delete [] rgbRoundingControlDisable;
  2405. delete [] rgiInitialRoundingType;
  2406. // sprite
  2407. delete [] rguiSpriteUsage;
  2408. delete [] rguiWarpingAccuracy;
  2409. delete [] rgiNumPnts;
  2410. delete [] rgbDumpMB;
  2411. delete [] rgbTrace;
  2412. delete [] rgSpriteMode;
  2413. delete pchPrefix;
  2414. delete pchBmpDir;
  2415. delete pchOutBmpDir;
  2416. delete pchOutStrFile;
  2417. delete pchSptDir;
  2418. delete pchSptPntDir;
  2419. return 0;
  2420. }
  2421. Void nextValidLine (FILE *pfPara, UInt* pnLine) {
  2422. U8 chBoL = 0;
  2423. Char pchPlaceHolder[200];
  2424. fgets (pchPlaceHolder, 200, pfPara); // get the next line 
  2425. (*pnLine)++;
  2426. while (feof (pfPara) == 0 && (chBoL = fgetc(pfPara)) == '%') {
  2427. // skip a line
  2428. fgets (pchPlaceHolder, 200, pfPara); // get the next line 
  2429. (*pnLine)++;
  2430. }
  2431. ungetc (chBoL, pfPara);
  2432. }
  2433. ///// WAVELET VTC: begin ///////////////////////////////
  2434. Void readVTCParam(CVTCEncoder *pvtcenc, FILE *pfVTCPara, UInt* pnLine) {
  2435. // source image path
  2436. Char *cImagePath;
  2437. cImagePath = new char[80];
  2438. nextValidLine (pfVTCPara, pnLine);
  2439. if ( fscanf (pfVTCPara, "%s", cImagePath) != 1) {
  2440. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2441. assert (FALSE);
  2442. }
  2443. // Alpha Channel 
  2444. UInt uiAlphaChannel;
  2445. nextValidLine (pfVTCPara, pnLine);
  2446. if ( fscanf (pfVTCPara, "%d", &uiAlphaChannel) != 1) {
  2447. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2448. assert (FALSE);
  2449. }
  2450. // segmentation map image path
  2451. Char *cSegImagePath;
  2452. cSegImagePath = new char[80];
  2453. nextValidLine (pfVTCPara, pnLine);
  2454. if ( fscanf (pfVTCPara, "%s", cSegImagePath) != 1) {
  2455. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2456. assert (FALSE);
  2457. }
  2458. // Alpha threshold
  2459. UInt uiAlphaTh;
  2460. nextValidLine (pfVTCPara, pnLine);
  2461. if ( fscanf (pfVTCPara, "%d", &uiAlphaTh) != 1) {
  2462. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2463. assert (FALSE);
  2464. }
  2465. // Alpha Change CR Disable 
  2466. UInt uiChangeCRDisable;
  2467. nextValidLine (pfVTCPara, pnLine);
  2468. if ( fscanf (pfVTCPara, "%d", &uiChangeCRDisable) != 1) {
  2469. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2470. assert (FALSE);
  2471. }
  2472. // output bitstream file 
  2473. Char *cOutBitsFile;
  2474. cOutBitsFile = new char[80];
  2475. nextValidLine (pfVTCPara, pnLine);
  2476. if ( fscanf (pfVTCPara, "%s", cOutBitsFile) != 1) {
  2477. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2478. assert (FALSE);
  2479. }
  2480. // color components
  2481. UInt uiColors;
  2482. nextValidLine (pfVTCPara, pnLine);
  2483. if ( fscanf (pfVTCPara, "%d", &uiColors) != 1) {
  2484. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2485. assert (FALSE);
  2486. }
  2487. // Frame width
  2488. UInt uiFrmWidth;
  2489. nextValidLine (pfVTCPara, pnLine);
  2490. if ( fscanf (pfVTCPara, "%d", &uiFrmWidth) != 1) {
  2491. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2492. assert (FALSE);
  2493. }
  2494. // Frame height
  2495. UInt uiFrmHeight; // frame height
  2496. nextValidLine (pfVTCPara, pnLine);
  2497. if ( fscanf (pfVTCPara, "%d", &uiFrmHeight) != 1) {
  2498. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2499. assert (FALSE);
  2500. }
  2501. // wavelet decomposition
  2502. UInt uiWvtDecmpLev;
  2503. nextValidLine (pfVTCPara, pnLine);
  2504. if ( fscanf (pfVTCPara, "%d", &uiWvtDecmpLev) != 1) {
  2505. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2506. assert (FALSE);
  2507. }
  2508. // wavelet type
  2509. UInt uiWvtType;
  2510. nextValidLine (pfVTCPara, pnLine);
  2511. if ( fscanf (pfVTCPara, "%d", &uiWvtType) != 1) {
  2512. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2513. assert (FALSE);
  2514. }
  2515. // hjlee 0901
  2516. // wavelet download ?
  2517. UInt uiWvtDownload;
  2518. nextValidLine (pfVTCPara, pnLine);
  2519. if ( fscanf (pfVTCPara, "%d", &uiWvtDownload) != 1) {
  2520. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2521. assert (FALSE);
  2522. }
  2523. // hjlee 0901
  2524. // wavelet uniform ?
  2525. UInt uiWvtUniform;
  2526. Int  *iWvtFilters;
  2527. nextValidLine (pfVTCPara, pnLine);
  2528. if ( fscanf (pfVTCPara, "%d", &uiWvtUniform) != 1) {
  2529. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2530. assert (FALSE);
  2531. }
  2532. /* default wavelet filters are uniform */
  2533.     if (!uiWvtDownload) 
  2534. uiWvtUniform=1;
  2535.     if (uiWvtUniform)
  2536. iWvtFilters = (Int *)malloc(sizeof(Int));
  2537.     else
  2538. iWvtFilters = (Int *)malloc(sizeof(Int)*uiWvtDecmpLev);
  2539.   
  2540.     if (iWvtFilters==NULL) 
  2541.       exit(printf("error allocating memory:  iWvtFiltersn"));
  2542.      /* read in filter numbers if applicable */
  2543.      /* for int type filter: 0, 2, 4 */
  2544.      /* for float type: 1, 3, 5-10 */
  2545.   
  2546.     if (!uiWvtDownload) {
  2547.        if (uiWvtType==0)
  2548.           iWvtFilters[0]=0;
  2549.        else
  2550.           iWvtFilters[0]=1;
  2551. }
  2552.     else if (uiWvtUniform) {
  2553. nextValidLine (pfVTCPara, pnLine);
  2554.        fscanf(pfVTCPara,"%d", iWvtFilters);
  2555.        /* check to see if the filters match its type */
  2556.        if (iWvtFilters[0] !=0 &&
  2557.            iWvtFilters[0] !=2 &&
  2558.            iWvtFilters[0] !=4) {
  2559.           if (uiWvtType==0)
  2560.          exit(printf("Filter %d is not integer filter.n", iWvtFilters[0]));
  2561.    }
  2562.        else {
  2563.           if (uiWvtType!=0)
  2564.          exit(printf("Filter %d is not float filter.n", iWvtFilters[0]));
  2565.    }
  2566. }
  2567.     else {
  2568. nextValidLine (pfVTCPara, pnLine);
  2569.        for (int spa_lev=0; spa_lev<(int)uiWvtDecmpLev; spa_lev++) {
  2570.           fscanf(pfVTCPara,"%d", iWvtFilters+spa_lev);
  2571.           /* check to see if the filters match its type */
  2572.           if (iWvtFilters[spa_lev] !=0  &&
  2573.           iWvtFilters[spa_lev] !=2 &&
  2574.   iWvtFilters[spa_lev] !=4) {
  2575.           if (uiWvtType==0)
  2576.              exit(printf("Filter %d is not integer filter.n", iWvtFilters[spa_lev]));
  2577.   }
  2578.           else {
  2579.         if (uiWvtType!=0)
  2580.            exit(printf("Filter %d is not float filter.n", iWvtFilters[spa_lev]));
  2581.   }
  2582.    }
  2583. }
  2584. // quantization type 
  2585. UInt uiQuantType;
  2586. nextValidLine (pfVTCPara, pnLine);
  2587. if ( fscanf (pfVTCPara, "%d", &uiQuantType) != 1) {
  2588. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2589. assert (FALSE);
  2590. }
  2591. // scan direction
  2592. UInt uiScanDirection;
  2593. nextValidLine (pfVTCPara, pnLine);
  2594. if ( fscanf (pfVTCPara, "%d", &uiScanDirection) != 1) {
  2595. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2596. assert (FALSE);
  2597. }
  2598. // Start Code Enable 
  2599. UInt bStartCodeEnable;
  2600. nextValidLine (pfVTCPara, pnLine);
  2601. if ( fscanf (pfVTCPara, "%d", &bStartCodeEnable) != 1) {
  2602. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2603. assert (FALSE);
  2604. }
  2605. // target spatial level 
  2606. UInt uiTargetSpatialLev;
  2607. nextValidLine (pfVTCPara, pnLine);
  2608. if ( fscanf (pfVTCPara, "%d", &uiTargetSpatialLev) != 1) {
  2609. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2610. assert (FALSE);
  2611. }
  2612. // target SNR level
  2613. UInt uiTargetSNRLev;
  2614. nextValidLine (pfVTCPara, pnLine);
  2615. if ( fscanf (pfVTCPara, "%d", &uiTargetSNRLev) != 1) {
  2616. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2617. assert (FALSE);
  2618. }
  2619. // DC-Y quantization
  2620. UInt uiQdcY;
  2621. nextValidLine (pfVTCPara, pnLine);
  2622. if ( fscanf (pfVTCPara, "%d", &uiQdcY) != 1) {
  2623. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2624. assert (FALSE);
  2625. }
  2626. // DC-UV quantization
  2627. UInt uiQdcUV;
  2628. nextValidLine (pfVTCPara, pnLine);
  2629. if ( fscanf (pfVTCPara, "%d", &uiQdcUV) != 1) {
  2630. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2631. assert (FALSE);
  2632. }
  2633. // number of spatial scalabilities
  2634. UInt uiSpatialLev;
  2635. nextValidLine (pfVTCPara, pnLine);
  2636. if ( fscanf (pfVTCPara, "%d", &uiSpatialLev) != 1) {
  2637. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2638. assert (FALSE);
  2639. }
  2640. // hjlee 0901
  2641.     /* spatial layer flexability  */
  2642. UInt defaultSpatialScale;
  2643. Int  lastWvtDecompInSpaLayer[MAXDECOMPLEV];
  2644.     if (uiQuantType == 2)
  2645. {
  2646.        if (uiSpatialLev != uiWvtDecmpLev)
  2647.        {
  2648.      /* read in usedefault */
  2649.      fscanf(pfVTCPara,"%d",&defaultSpatialScale);
  2650.      if (defaultSpatialScale==0)
  2651.  {
  2652.        /* read in spatial layer info */
  2653.        for (int spa_lev=0; spa_lev<(int)uiSpatialLev-1; ++spa_lev)   
  2654.            fscanf(pfVTCPara,"%d",&lastWvtDecompInSpaLayer[spa_lev]);
  2655.  }
  2656.        }
  2657. }
  2658. UInt uispa_lev;
  2659. UInt uisnr_lev;
  2660. SNR_PARAM *Qinfo[3];
  2661. UInt uiSNRLev;
  2662. UInt uiQuant;
  2663. Int i;
  2664. // hjlee 0901
  2665. /* SQ-BB scanning */
  2666. if (uiQuantType==1 && uiScanDirection==1) {
  2667. nextValidLine (pfVTCPara, pnLine);
  2668. if ( fscanf (pfVTCPara, "%d", &uiSNRLev) != 1) {
  2669. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2670. assert (FALSE);
  2671. }
  2672. uiSpatialLev = uiWvtDecmpLev;
  2673. for (int i=0; i<3; i++)
  2674. Qinfo[i] = new SNR_PARAM[uiSpatialLev];
  2675. for (uispa_lev=0; uispa_lev<uiSpatialLev; uispa_lev++) {
  2676. for (int col=0; col<3; col++) {
  2677. Qinfo[col][uispa_lev].SNR_scalability_levels = (int)1;
  2678. Qinfo[col][uispa_lev].Quant = new Int[uiSNRLev];
  2679. }
  2680. }
  2681. // read quant-Y
  2682. if ( fscanf (pfVTCPara, "%d", &uiQuant) != 1) {
  2683. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2684. assert (FALSE);
  2685. }
  2686. Qinfo[0][0].Quant[0] = uiQuant;
  2687. // read quant-UV
  2688. if (uiColors==3) {
  2689. if ( fscanf (pfVTCPara, "%d", &uiQuant) != 1) {
  2690. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2691. assert (FALSE);
  2692. }
  2693. Qinfo[1][0].Quant[0] = uiQuant;
  2694. Qinfo[2][0].Quant[0] = uiQuant;
  2695. }
  2696. }
  2697. else {
  2698. for (i=0; i<3; i++)
  2699. Qinfo[i] = new SNR_PARAM[uiSpatialLev];
  2700. for (uispa_lev=0; uispa_lev<uiSpatialLev; uispa_lev++) {
  2701. // number of spatial scalabilities
  2702. nextValidLine (pfVTCPara, pnLine);
  2703. if ( fscanf (pfVTCPara, "%d", &uiSNRLev) != 1) {
  2704. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2705. assert (FALSE);
  2706. }
  2707. for (int col=0; col<3; col++) {
  2708. Qinfo[col][uispa_lev].SNR_scalability_levels = (int)uiSNRLev;
  2709. Qinfo[col][uispa_lev].Quant = new Int[uiSNRLev];
  2710. }
  2711. for (uisnr_lev=0; uisnr_lev<uiSNRLev; uisnr_lev++) {
  2712. // read quant-Y
  2713. if ( fscanf (pfVTCPara, "%d", &uiQuant) != 1) {
  2714. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2715. assert (FALSE);
  2716. }
  2717. Qinfo[0][uispa_lev].Quant[uisnr_lev] = uiQuant;
  2718. // read quant-UV
  2719. if (uiColors==3) {
  2720. if ( fscanf (pfVTCPara, "%d", &uiQuant) != 1) {
  2721. fprintf(stderr, "wrong parameter on line %dn", *pnLine);
  2722. assert (FALSE);
  2723. }
  2724. Qinfo[1][uispa_lev].Quant[uisnr_lev] = uiQuant;
  2725. Qinfo[2][uispa_lev].Quant[uisnr_lev] = uiQuant;
  2726. }
  2727. }
  2728. }
  2729. }
  2730. pvtcenc -> init(
  2731.  cImagePath,
  2732.  uiAlphaChannel,
  2733.  cSegImagePath,
  2734.  uiAlphaTh,
  2735.  uiChangeCRDisable,
  2736.  cOutBitsFile,
  2737.  uiColors,
  2738.  uiFrmWidth,
  2739.  uiFrmHeight,
  2740.  uiWvtType,
  2741.  uiWvtDownload, // hjlee 0901
  2742.      uiWvtDecmpLev,
  2743.      uiWvtUniform, // hjlee 0901
  2744.  iWvtFilters,  // hjlee 0901
  2745.  uiQuantType,
  2746.  uiScanDirection,
  2747.  bStartCodeEnable,
  2748.  uiTargetSpatialLev,
  2749.  uiTargetSNRLev,
  2750.  uiQdcY,
  2751.  uiQdcUV, 
  2752.  uiSpatialLev,
  2753.  defaultSpatialScale, // hjlee 0901
  2754.      lastWvtDecompInSpaLayer, // hjlee 0901
  2755.  Qinfo  
  2756. );
  2757. }
  2758. ///// WAVELET VTC: end ///////////////////////////////
  2759. Void readBoolVOLFlag (Bool * rgbTable [2], UInt nVO, FILE * pfCfg, UInt * pnLine, Bool bAnyScalability)
  2760. {
  2761. nextValidLine (pfCfg, pnLine);
  2762. for (UInt i = 0; i < nVO; ++i) {
  2763. if (fscanf (pfCfg, "%d", & rgbTable [BASE_LAYER] [i]) != 1) {
  2764. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2765. exit (1);
  2766. }
  2767. assert (rgbTable [BASE_LAYER] [i] == 0 || rgbTable [BASE_LAYER] [i] == 1);
  2768. }
  2769. if (bAnyScalability) {
  2770. for (UInt i = 0; i < nVO; ++i) {
  2771. if (fscanf (pfCfg, "%d", & rgbTable [ENHN_LAYER] [i]) != 1) {
  2772. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2773. exit (1);
  2774. }
  2775. assert (rgbTable [ENHN_LAYER] [i] == 0 || rgbTable [ENHN_LAYER] [i] == 1);
  2776. }
  2777. }
  2778. }
  2779. Void readItem(UInt *rguiTable [2], UInt nVO, FILE * pfCfg, UInt * pnLine, Bool bAnyScalability)
  2780. {
  2781. nextValidLine (pfCfg, pnLine);
  2782. for (UInt i = 0; i < nVO; ++i) {
  2783. if (fscanf (pfCfg, "%d", & rguiTable [BASE_LAYER] [i]) != 1) {
  2784. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2785. exit (1);
  2786. }
  2787. }
  2788. if (bAnyScalability) 
  2789. {
  2790. for (UInt i = 0; i < nVO; ++i) {
  2791. if (fscanf (pfCfg, "%d", & rguiTable [ENHN_LAYER] [i]) != 1) {
  2792. fprintf(stderr, "wrong parameter file format on line %dn", *pnLine);
  2793. exit (1);
  2794. }
  2795. }
  2796. }
  2797. }
  2798. Void RunVTCCodec(char *VTCCtlFile)
  2799. {
  2800. UInt nLine = 1;
  2801. UInt* pnLine = &nLine;
  2802. FILE *pfVTCPara;
  2803. if ((pfVTCPara = fopen (VTCCtlFile, "r")) == NULL ){
  2804. printf (" vtc Parameter File Not Foundn");
  2805. exit (1);
  2806. }
  2807. CVTCEncoder vtcenc;
  2808. // read VTC control parameters
  2809. readVTCParam(&vtcenc, pfVTCPara, pnLine);
  2810. fclose(pfVTCPara);
  2811. // start VTC encoding
  2812. int targetSpatialLev = vtcenc.mzte_codec.m_iTargetSpatialLev;
  2813. int targetSNRLev = vtcenc.mzte_codec.m_iTargetSNRLev;
  2814. vtcenc.encode();
  2815. // start VTC decoding 
  2816. CVTCDecoder vtcdec;
  2817. vtcdec.decode(vtcenc.m_cOutBitsFile, "encRec.yuv", 
  2818. targetSpatialLev, targetSNRLev );
  2819. }
  2820. Void GetIVal(CxParamSet *pPar, char *pchName, Int iInd, Int *piRtn)
  2821. {
  2822. Double dVal;
  2823. Int er = pPar->GetDouble(pchName, iInd, &dVal);
  2824. if(er!=ERES_OK)
  2825. {
  2826. if(iInd<0)
  2827. printf("Error: can't find %s in parameter file.n", pchName);
  2828. else
  2829. printf("Error: can't find %s[%d] in parameter file.n", pchName, iInd);
  2830. exit(1);
  2831. }
  2832. *piRtn = (Int)dVal;
  2833. }
  2834. Void GetDVal(CxParamSet *pPar, char *pchName, Int iInd, Double *pdRtn)
  2835. {
  2836. Double dVal;
  2837. Int er = pPar->GetDouble(pchName, iInd, &dVal);
  2838. if(er!=ERES_OK)
  2839. {
  2840. if(iInd<0)
  2841. printf("Error: can't find %s in parameter file.n", pchName);
  2842. else
  2843. printf("Error: can't find %s[%d] in parameter file.n", pchName, iInd);
  2844. exit(1);
  2845. }
  2846. *pdRtn = dVal;
  2847. }
  2848. Void GetSVal(CxParamSet *pPar, char *pchName, Int iInd, char **ppchRtn)
  2849. {
  2850. char *pchVal;
  2851. Int er = pPar->GetString(pchName, iInd, &pchVal);
  2852. if(er!=ERES_OK)
  2853. {
  2854. if(iInd<0)
  2855. printf("Error: can't find %s in parameter file.n", pchName);
  2856. else
  2857. printf("Error: can't find %s[%d] in parameter file.n", pchName, iInd);
  2858. exit(1);
  2859. }
  2860. *ppchRtn = pchVal;
  2861. }
  2862. Void GetAVal(CxParamSet *pPar, char *pchName, Int iInd, Double **ppdRtn, Int *piCount)
  2863. {
  2864. Int er = pPar->GetArray(pchName, iInd, ppdRtn, piCount);
  2865. if(er!=ERES_OK)
  2866. {
  2867. if(iInd<0)
  2868. printf("Error: can't find %s in parameter file.n", pchName);
  2869. else
  2870. printf("Error: can't find %s[%d] in parameter file.n", pchName, iInd);
  2871. exit(1);
  2872. }
  2873. }
  2874. Void readBoolParam(CxParamSet *pPar, char *pchName, Int iInd, Bool *pbVal)
  2875. {
  2876. Int iVal;
  2877. GetIVal(pPar, pchName, iInd, &iVal);
  2878. if(iVal!=0 && iVal!=1)
  2879. {
  2880. char rgchErr[100];
  2881. sprintf(rgchErr, "%s must be 0 or 1", pchName);
  2882. fatal_error(rgchErr);
  2883. }
  2884. *pbVal = (Bool)iVal;
  2885. }