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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  4. Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
  5. Bruce Lin (blin@microsoft.com), Microsoft Corporation
  6. Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
  7. (date: March, 1996)
  8. and edited by
  9. Hiroyuki Katata (katata@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  10. Norio Ito (norio@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  11. Shuichi Watanabe (watanabe@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  12. (date: October, 1997)
  13. and also edited by
  14. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  15. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  16. (date: July, 1998)
  17. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  18. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  19. as specified by the MPEG-4 Video. 
  20. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  21. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  22. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  23. The original developer of this software module and his/her company, 
  24. the subsequent editors and their companies, 
  25. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  26. Copyright is not released for non MPEG-4 Video conforming products. 
  27. Sharp retains full right to use the code for his/her own purpose, 
  28. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  29. This copyright notice must be included in all copies or derivative works. 
  30. Copyright (c) 1997.
  31. Module Name:
  32. tps_decoder.cpp
  33. Abstract:
  34. caller for decoder for temporal scalability
  35. Revision History:
  36. *************************************************************************/
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <iostream.h>
  40. #include <fstream.h>
  41. #ifdef __PC_COMPILER_
  42. #include <windows.h>
  43. #include <mmsystem.h>
  44. #endif // __PC_COMPILER_
  45. #include "typeapi.h"
  46. #include "mode.hpp"
  47. #include "vopses.hpp"
  48. #include "entropy/bitstrm.hpp"
  49. #include "tps_enhcbuf.hpp"
  50. #include "decoder/enhcbufdec.hpp"
  51. #include "decoder/vopsedec.hpp"
  52. #include "dataStruct.hpp"
  53. #ifndef __GLOBAL_VAR_
  54. #define __GLOBAL_VAR_
  55. #endif
  56. #include "global.hpp"
  57. #ifdef __MFC_
  58. #ifdef _DEBUG
  59. #undef THIS_FILE
  60. static char BASED_CODE THIS_FILE[] = __FILE__;
  61. #endif
  62. #define new DEBUG_NEW
  63. #endif // __MFC_
  64. Void dumpFrame (const CVOPU8YUVBA* pvopcQuant, FILE* pfYUV, FILE* pfSeg, AlphaUsage, CRct& rct, UInt nBits, Int iAlphaScale, Int DumpSkip);
  65. #define MAX_TIME 99999 // for bitstreams stopped at BVOP
  66. #define USAGE "Usage: tDECODER bitstream_file [enhn_layer_bitstream_file] output_file width heightn
  67. or:    tDECODER -vtc bitstream_file output_file target_spatial_layer target_snr_layern"
  68. // Main Routine
  69. int main(int argc, char* argv[])
  70. {
  71. Bool bScalability = 0;
  72. Bool bWavelet = 0;
  73. Bool main_short_video_header; // Added by KPN for short headers [FDS]
  74. main_short_video_header = FALSE; 
  75. if(argc>1 && strcmp(argv[1],"-vtc")==0)
  76. {
  77. bWavelet = 1;
  78. if(argc != 6)
  79. {
  80. fprintf(stderr,USAGE);
  81. exit(1);
  82. }
  83. }
  84. else
  85. {
  86. if (argc < 5 || argc > 6) {
  87. fprintf (stderr,USAGE);
  88. exit(1);
  89. }
  90. else if (argc == 6)
  91. bScalability = 1;
  92. }
  93. FILE *pfBits;
  94. if ((pfBits = fopen (argv [bWavelet + 1], "rb")) == NULL )
  95. fatal_error("Bitstream File Not Found");
  96. fclose (pfBits);
  97. if (bScalability) {
  98. if ((pfBits = fopen (argv [2], "rb")) == NULL )
  99. fatal_error("Bitstream File for Enhancement Layer Not Foundn");
  100. fclose (pfBits);
  101. }
  102. if(bWavelet)
  103. {
  104. /////  WAVELET VTC: begin   /////////////////////////
  105. CVTCDecoder vtcdec;
  106. // start VTC decoding 
  107. // argv[1]: "-vtc"
  108. // argv[2]: bitstream file
  109. // argv[3]: decoded image file
  110. // argv[4]: target spatial layer
  111. // argv[5]: target SNR layer
  112. vtcdec.decode(argv[2], argv[3], atoi(argv[4]), atoi(argv[5]) );
  113. return 0;
  114. /////// WAVELET VTC: end   /////////////////////////
  115. }
  116. CRct rctDisplay       (0, 0, atoi (argv [3 + bScalability]), atoi (argv [4 + bScalability]));
  117. /*Added */
  118. CRct rctDisplay_SSenh (0, 0, atoi (argv [3 + bScalability]), atoi (argv [4 + bScalability]));
  119. Bool bTemporalScalability = 0;
  120. if (bScalability){
  121. CVideoObjectDecoder* pvodec_tps[2];
  122. cout << "Checking scalability type...n";
  123. pvodec_tps[BASE_LAYER] = new CVideoObjectDecoder (argv[1], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header);
  124. pvodec_tps[ENHN_LAYER] = new CVideoObjectDecoder (argv[2], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header);
  125. pvodec_tps[BASE_LAYER]->setClockRateScale( pvodec_tps[ENHN_LAYER] ); // added by Sharp (98/6/26)
  126. Time FirstBase = pvodec_tps[BASE_LAYER] -> senseTime ();
  127. Time FirstEnhn = pvodec_tps[ENHN_LAYER] -> senseTime ();
  128. if ( FirstBase != FirstEnhn ){
  129. bTemporalScalability = 1;
  130. cout << "Starting temporal scalability decoding...nn";
  131. }
  132. else{
  133. bTemporalScalability = 0;
  134. cout << "Starting spatial scalability decoding...nn";
  135. }
  136. delete pvodec_tps[BASE_LAYER];
  137. delete pvodec_tps[ENHN_LAYER];
  138. }
  139. if ( !bScalability || !bTemporalScalability ){
  140. CVideoObjectDecoder* pvodec [2];
  141. Bool bSpatialScalable = FALSE;
  142. //CRct rctDisplayBackup = rctDisplay; // for recovery from sprite decoding
  143. pvodec [BASE_LAYER] = new CVideoObjectDecoder (argv [1], rctDisplay.width, rctDisplay.height(), &bSpatialScalable, &main_short_video_header);
  144. // NBIT: get nBits information
  145. UInt nBits = pvodec [BASE_LAYER]->volmd ().nBits;
  146. /* Added*/
  147. if (bScalability){
  148. pvodec [ENHN_LAYER] = new CVideoObjectDecoder (argv [2], rctDisplay.width, rctDisplay.height(), &bSpatialScalable, &main_short_video_header);
  149. /*Added*/
  150. if(bSpatialScalable)
  151. pvodec[ENHN_LAYER]->set_enh_display_size(rctDisplay, &rctDisplay_SSenh);
  152. }
  153. if (pvodec [BASE_LAYER] -> fSptUsage () == 1) {
  154. // decode the initial sprite: //wchen: instead of calling decode ()
  155. pvodec [BASE_LAYER] -> decodeInitSprite ();
  156. }
  157. FILE* pfReconYUV [2];
  158. Char pchTmp [100];
  159. sprintf (pchTmp, "%s.yuv", argv [2 + bScalability]);
  160. pfReconYUV [BASE_LAYER] = fopen (pchTmp, "wb");
  161. fatal_error("cant open output yuv file",pfReconYUV [BASE_LAYER] != NULL);
  162. if (bScalability) {
  163. sprintf (pchTmp, "%s_e.yuv", argv [2 + bScalability]);
  164. pfReconYUV [ENHN_LAYER]= fopen (pchTmp, "wb");
  165. fatal_error("cant open enhancement layer output yuv file",pfReconYUV [ENHN_LAYER] != NULL);
  166. }
  167. sprintf (pchTmp, "%s.seg", argv [2 + bScalability]);
  168. FILE* pfReconSeg = NULL;
  169. if (pvodec [BASE_LAYER]-> volmd ().fAUsage != RECTANGLE) {
  170. pfReconSeg = fopen (pchTmp, "wb");
  171. fatal_error("cant open output seg file",pfReconSeg != NULL);
  172. }
  173. Int iEof = 1;
  174. Int nFrames = 0;
  175. const CVOPU8YUVBA* pvopcQuant;
  176. #ifdef __PC_COMPILER_
  177. Int tickBegin = ::GetTickCount ();
  178. #endif // __PC_COMPILER_
  179. Bool bCachedRefFrame = FALSE;
  180. Bool bCachedRefFrameCoded = FALSE;
  181. while (iEof != EOF)
  182. {
  183. if (main_short_video_header) // Added by KPN for short headers
  184. {
  185. fprintf(stderr,"Frame number: %dn", nFrames);
  186. iEof = pvodec [BASE_LAYER] -> h263_decode ();
  187. }
  188. else
  189. iEof = pvodec [BASE_LAYER] -> decode ();  
  190. if (iEof != EOF)
  191. nFrames++;
  192. if(pvodec [BASE_LAYER] -> fSptUsage () == 1)
  193. {
  194. // sprite
  195. if(iEof != EOF)
  196. {
  197. pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr();
  198. dumpFrame (pvopcQuant, pfReconYUV [BASE_LAYER], pfReconSeg, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  199. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0);
  200. }
  201. }
  202. else
  203. {
  204. if(iEof == EOF)
  205. {
  206. // dump final cached frame if present
  207. if(bCachedRefFrame)
  208. {
  209. bCachedRefFrame = FALSE;
  210. if(bCachedRefFrameCoded)
  211. {
  212. pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQLater(); // future reference
  213. dumpFrame (pvopcQuant, pfReconYUV [BASE_LAYER], pfReconSeg, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  214. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0);
  215. }
  216. else // non coded
  217. dumpNonCodedFrame(pfReconYUV [BASE_LAYER], pfReconSeg, rctDisplay, nBits);
  218. }
  219. }
  220. else
  221. {
  222. // dump if bvop
  223. if(pvodec[BASE_LAYER]->vopmd().vopPredType == BVOP)
  224. {
  225. // BVOP
  226. if(iEof != FALSE)
  227. {
  228. pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); // current vop
  229. dumpFrame (pvopcQuant, pfReconYUV [BASE_LAYER], pfReconSeg, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  230. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0);
  231. }
  232. else // non coded BVOP
  233. dumpNonCodedFrame(pfReconYUV [BASE_LAYER], pfReconSeg, rctDisplay, nBits);
  234. }
  235. else
  236. {
  237. // not a BVOP, so dump any previous cached frame
  238. if(bCachedRefFrame)
  239. {
  240. bCachedRefFrame = FALSE;
  241. if(bCachedRefFrameCoded)
  242. {
  243. pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQPrev(); // past reference
  244. dumpFrame (pvopcQuant, pfReconYUV [BASE_LAYER], pfReconSeg, pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  245. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0);
  246. }
  247. else // non coded
  248. dumpNonCodedFrame(pfReconYUV [BASE_LAYER], pfReconSeg, rctDisplay, nBits);
  249. }
  250. // cache current reference
  251. bCachedRefFrame = TRUE;
  252. bCachedRefFrameCoded = (iEof != FALSE);
  253. }
  254. }
  255. }
  256. if (bSpatialScalable == TRUE) {
  257. // if base layer is non coded, pvopcQuant=NULL, but enh layer should also be non coded.
  258. if(iEof == FALSE)
  259. pvopcQuant = NULL;
  260. else
  261. pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr();
  262. iEof = pvodec [ENHN_LAYER] -> decode (pvopcQuant);
  263. if(iEof!=EOF)
  264. nFrames++; // include enhancement layer
  265. if(iEof==FALSE)
  266. dumpNonCodedFrame(pfReconYUV [ENHN_LAYER], NULL, rctDisplay_SSenh, nBits);
  267. /* dumpNonCodedFrame(pfReconYUV [ENHN_LAYER], NULL, rctDisplay * 2, nBits);*/
  268. if (iEof != EOF && iEof!=FALSE)
  269. /*Added*/
  270. dumpFrame (pvodec [ENHN_LAYER]->pvopcReconCurr (), pfReconYUV [ENHN_LAYER], NULL, RECTANGLE, rctDisplay_SSenh,
  271. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0); // still base layer
  272. /*
  273. dumpFrame (pvodec [ENHN_LAYER]->pvopcReconCurr (), pfReconYUV [ENHN_LAYER], NULL, RECTANGLE, rctDisplay * 2,
  274. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0); // still base layer
  275. */
  276. }
  277. }
  278. #ifdef __PC_COMPILER_
  279. Int tickAfter = ::GetTickCount ();
  280. printf ("Total time: %dn", tickAfter - tickBegin);
  281. Double dAverage = (Double) (tickAfter - tickBegin) / (Double) (nFrames);
  282. printf ("Total frames: %dtAverage time: %.6lfn", nFrames, dAverage);
  283. printf ("FPS %.6lfn", 1000.0 / dAverage);
  284. #endif // __PC_COMPILER_
  285. fclose (pfReconYUV [BASE_LAYER]);
  286. if (pvodec [BASE_LAYER]->volmd ().fAUsage != RECTANGLE)
  287. fclose (pfReconSeg);
  288. delete pvodec [BASE_LAYER];
  289. if (bScalability) {
  290. fclose (pfReconYUV [ENHN_LAYER]);
  291. delete pvodec [ENHN_LAYER];
  292. }
  293. }
  294. else { // loop for temporal scalability
  295. CVideoObjectDecoder* pvodec[2];
  296. pvodec[BASE_LAYER] = new CVideoObjectDecoder (argv[1], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header); // modified by Sharp (98/7/16)
  297. UInt nBits = pvodec [BASE_LAYER]->volmd ().nBits; // added by Sharp (98/11/11)
  298. if(bScalability){
  299. pvodec[ENHN_LAYER] = new CVideoObjectDecoder (argv[2], rctDisplay.width, rctDisplay.height (), NULL, &main_short_video_header); // modified by Sharp (98/7/16)
  300. // for back/forward shape
  301. pvodec[ENHN_LAYER]->rgpbfShape[0] = new CVideoObjectDecoder (rctDisplay.width, rctDisplay.height ());
  302. pvodec[ENHN_LAYER]->rgpbfShape[1] = new CVideoObjectDecoder (rctDisplay.width, rctDisplay.height ());
  303. pvodec[BASE_LAYER]->setClockRateScale( pvodec[ENHN_LAYER] );
  304. // copy pointers
  305. pvodec[ENHN_LAYER]->copyTobfShape ();
  306. }
  307. Char pchTmp [100];
  308. FILE* pfReconYUV [2]; // following two lines are swapped by Sharp (98/10/26)
  309. #ifndef __OUT_ONE_FRAME_
  310. sprintf (pchTmp, "%s.yuv", argv [2 + bScalability]);
  311. pfReconYUV [BASE_LAYER] = fopen (pchTmp, "wb");
  312. fatal_error("cant open output yuv file",pfReconYUV [BASE_LAYER] != NULL);
  313. if (bScalability) {
  314. // sprintf (pchTmp, "%s_e.yuv", argv [2 + bScalability]); // deleted by Sharp (98/10/26)
  315. // pfReconYUV [ENHN_LAYER]= fopen (pchTmp, "wb"); // deleted by Sharp (98/10/26)
  316. pfReconYUV [ENHN_LAYER] = pfReconYUV [BASE_LAYER]; // added by Sharp (98/10/26)
  317. fatal_error("cant open enhancement layer output yuv file",pfReconYUV [ENHN_LAYER] != NULL);
  318. }
  319. sprintf (pchTmp, "%s.seg", argv [2 + bScalability]);
  320. FILE* pfReconSeg [2];
  321. if (pvodec [BASE_LAYER]-> volmd ().fAUsage != RECTANGLE) {
  322. pfReconSeg [BASE_LAYER] = fopen (pchTmp, "wb");
  323. fatal_error("cant open output seg file",pfReconSeg [BASE_LAYER] != NULL);
  324. }
  325. if (bScalability) {
  326. if (pvodec [ENHN_LAYER]-> volmd ().fAUsage != RECTANGLE) {
  327. if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType == 1) { // added by Sharp (98/10/26)
  328. sprintf (pchTmp, "%s_e.seg", argv [2 + bScalability]);
  329. pfReconSeg [ENHN_LAYER]= fopen (pchTmp, "wb");
  330. } else // added by Sharp (98/10/26)
  331. pfReconSeg [ENHN_LAYER]= pfReconSeg [BASE_LAYER]; // added by Sharp (98/10/26)
  332. fatal_error("cant open output enhancement layer seg file",pfReconSeg [ENHN_LAYER] != NULL);
  333. }
  334. }
  335. // begin: deleted by Sharp (98/10/26)
  336. // if (bScalability) 
  337. // if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType == 1) {
  338. // FILE *pfTemp;
  339. // sprintf (pchTmp, "%s_bgc.yuv", argv [2 + bScalability]);
  340. // pfTemp = fopen (pchTmp, "wb");  // clear file pointer for background composition
  341. // fclose(pfTemp);
  342. // }
  343. // end: delted by Sharp (98/10/26)
  344. #endif
  345. // for back/forward shape output 
  346. FILE* pfTestSeg = NULL;
  347. if (bScalability)
  348. if (pvodec [ENHN_LAYER]-> volmd ().iEnhnType == 1) {
  349. sprintf (pchTmp, "%s.bfseg", argv [2 + bScalability]);
  350. pfTestSeg = fopen (pchTmp, "wb"); //reconstructed Seg file(bfShape)
  351. fatal_error("cant open output bfseg file",pfTestSeg!=NULL);
  352. }
  353. int iEof = 1;
  354. #ifdef __PC_COMPILER_
  355. Int tickBegin = ::GetTickCount ();
  356. #endif // __PC_COMPILER_
  357. Time tPvopBase, tNextBase, tNextEnhc = 0;
  358. int nBaseFrames = 0;
  359. int nEnhcFrames = 0;
  360. Bool bCacheRefFrame = FALSE; // added by Sharp (98/11/18)
  361. Bool bCachedRefFrameCoded = FALSE; // added by Sharp (99/1/28)
  362. tNextBase = pvodec[BASE_LAYER] -> senseTime();
  363. while (iEof != EOF) {
  364. if (pvodec[BASE_LAYER] -> getPredType () != BVOP) { // for bitstreams stopped at BVOP
  365. iEof = pvodec[BASE_LAYER] -> decode ();
  366. if(iEof == EOF)
  367. break;
  368. if(bScalability)
  369. pvodec[BASE_LAYER] -> updateBuffVOPsBase (pvodec[ENHN_LAYER]);
  370. nBaseFrames ++;
  371. // Output BASE_LAYER
  372. #ifndef __OUT_ONE_FRAME_
  373. // begin: added by Sharp (98/11/11)
  374. if ( bCacheRefFrame ) {  // modified by by Sharp (98/11/18)
  375. if ( bCachedRefFrameCoded ) // added by Sharp (99/1/28)
  376. dumpFrame (pvodec[BASE_LAYER]->pvopcRefQPrev() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  377. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue,  0 );
  378. else // added by Sharp (99/1/28)
  379. dumpNonCodedFrame( pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], rctDisplay, nBits); // added by Sharp (99/1/28)
  380. }
  381. // begin: added by Sharp (98/11/18)
  382. else {
  383. bCacheRefFrame = TRUE;
  384. }
  385. // end: added by Sharp (98/11/18)
  386. // end: added by Sharp (98/11/11)
  387. // pvodec [BASE_LAYER]->dumpDataAllFrame (pfReconYUV [BASE_LAYER], pfReconSeg [BASE_LAYER], rctDisplay); // deleted by Sharp (98/11/11)
  388. #else
  389. pvodec [BASE_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
  390. #endif
  391. bCachedRefFrameCoded = (iEof != FALSE); // added by Sharp(99/1/28)
  392. tPvopBase = pvodec[BASE_LAYER] -> getTime ();
  393. }
  394. else { // for bitstreams stopped at BVOP
  395. tPvopBase = MAX_TIME;
  396. pvodec[BASE_LAYER] -> copyRefQ1ToQ0 ();
  397. }
  398. tNextBase = pvodec[BASE_LAYER] -> senseTime ();
  399. while((tPvopBase > tNextBase) && (tNextBase != EOF)) {
  400. iEof = pvodec[BASE_LAYER] -> decode ();
  401. if(bScalability)
  402. pvodec[BASE_LAYER] -> updateBuffVOPsBase (pvodec[ENHN_LAYER]);
  403. // Output BASE_LAYER
  404. if (iEof != EOF) {
  405. nBaseFrames ++; 
  406. // begin: deleted by Sharp (98/11/11)
  407. // #ifndef __OUT_ONE_FRAME_
  408. //  pvodec [BASE_LAYER]->dumpDataAllFrame (pfReconYUV [BASE_LAYER], pfReconSeg [BASE_LAYER], rctDisplay); // deleted by Sharp (98/11/11)
  409. // #else
  410. // end: deleted by Sharp (98/11/11)
  411. #ifdef __OUT_ONE_FRAME_ // added by Sharp (98/11/11)
  412. pvodec [BASE_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
  413. #endif
  414. }
  415. if(bScalability && tNextEnhc != EOF) {
  416. tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
  417. while((tNextBase > tNextEnhc) && (tNextEnhc != EOF)) {
  418. iEof = pvodec[ENHN_LAYER] -> decode ();
  419. nEnhcFrames ++;
  420. if (pvodec [ENHN_LAYER] -> volmd ().fAUsage != RECTANGLE) {
  421. // for background composition
  422. if(pvodec [ENHN_LAYER] -> volmd ().iEnhnType == 1) { 
  423. // should be changed to background_composition flag later.
  424. printf("============== background composition (1)n");
  425. pvodec [ENHN_LAYER] -> BackgroundComposition(argv, bScalability, rctDisplay.width, rctDisplay.height (), pfReconYUV[ENHN_LAYER]); // modified by Sharp (98/10/26)
  426. }
  427. // for back/forward shape
  428. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadBakShape) {
  429. printf("---------- output backward shapen");
  430. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[0]->pvopcReconCurr ();
  431. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  432. }
  433. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadForShape) {
  434. printf("---------- output forward shapen");
  435. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[1]->pvopcReconCurr ();
  436. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  437. }
  438. }
  439. // Output ENHN_LAYER
  440. if (iEof != EOF) {
  441. // if ( pvodec [ENHN_LAYER] -> volmd ().iEnhnType != 1 ){ // added by Sharp (98/10/26) //deleted by Sharp (99/1/25)
  442. #ifndef __OUT_ONE_FRAME_
  443. // begin: added by Sharp (99/1/28)
  444. if ( iEof != FALSE ){
  445. dumpFrame (pvodec[ENHN_LAYER]->pvopcReconCurr(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
  446. nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue,  pvodec[ENHN_LAYER]->volmd().iEnhnType );
  447. }
  448. else
  449. dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
  450. // end: added by Sharp (99/1/28)
  451. // pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay); // deleted by Sharp (99/1/28)
  452. #else
  453. pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
  454. #endif
  455. // } // added by Sharp (98/10/26) // deleted by Sharp (99/1/25)
  456. }
  457. tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
  458. }
  459. }
  460. // begin: added by Sharp (98/11/11)
  461. #ifndef __OUT_ONE_FRAME_
  462. if ( iEof != FALSE )
  463. dumpFrame (pvodec[BASE_LAYER]->pvopcReconCurr() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  464. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue,  0 );
  465. else
  466. dumpNonCodedFrame(pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], rctDisplay, nBits);
  467. #endif
  468. // end: added by Sharp (98/11/11)
  469. tNextBase = pvodec[BASE_LAYER] -> senseTime ();
  470. }
  471. if(bScalability && (tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ()) != EOF) { // modified by Sharp (99/1/25)
  472. pvodec[ENHN_LAYER] -> bufferB2flush ();
  473. // tNextEnhc = pvodec[ENHN_LAYER] -> senseTime (); // deleted by Sharp (99/1/25)
  474. while((tPvopBase > tNextEnhc) && (tNextEnhc != EOF)) {
  475. iEof = pvodec[ENHN_LAYER] -> decode ();
  476. nEnhcFrames ++;
  477. if (pvodec [ENHN_LAYER] -> volmd ().fAUsage != RECTANGLE) {
  478. // for background composition
  479. if(pvodec [ENHN_LAYER] -> volmd ().iEnhnType == 1) {
  480. // should be changed to background_composition flag later.
  481. printf("============== background composition (2)n");
  482. pvodec [ENHN_LAYER] -> BackgroundComposition(argv, bScalability, rctDisplay.width, rctDisplay.height (), pfReconYUV [ENHN_LAYER]); // modified by Sharp (98/10/26)
  483. }
  484. // for back/forward shape
  485. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadBakShape) {
  486. printf("---------- output backward shapen");
  487. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[0]->pvopcReconCurr ();
  488. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  489. }
  490. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadForShape) {
  491. printf("---------- output forward shapen");
  492. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[1]->pvopcReconCurr ();
  493. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  494. }
  495. }
  496. // Output ENHN_LAYER
  497. if (iEof != EOF) {
  498. // if ( pvodec [ENHN_LAYER] -> volmd ().iEnhnType != 1 ){ // added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
  499. #ifndef __OUT_ONE_FRAME_
  500. // begin: added by Sharp (99/1/28)
  501. if ( iEof != FALSE )
  502. dumpFrame (pvodec[ENHN_LAYER]->pvopcReconCurr(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
  503. nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue,  pvodec[ENHN_LAYER]->volmd().iEnhnType );
  504. else
  505. dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
  506. // end: added by Sharp (99/1/28)
  507. // pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay); // deleted by Sharp (99/1/28)
  508. #else
  509. pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
  510. #endif
  511. // }// added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
  512. }
  513. tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
  514. }
  515. // begin: deleted by Sharp (99/1/25)
  516. /*
  517. if((tPvopBase == tNextEnhc) && (tNextEnhc != EOF)) { // for Spatial Scalability
  518. pvodec[ENHN_LAYER] -> copyBufP2ToB1 ();
  519. iEof = pvodec[ENHN_LAYER] -> decode ();
  520. nEnhcFrames ++;
  521. }
  522. */
  523. // end: deleted by Sharp (99/1/25)
  524. // begin: added by Sharp (99/1/20)
  525.       iEof = tNextBase;
  526. #ifndef __OUT_ONE_FRAME_
  527. // begin: added by Sharp (99/1/28)
  528.       if ( iEof == EOF )
  529. if ( bCachedRefFrameCoded )
  530. // end: added by Sharp (99/1/28)
  531.         dumpFrame (pvodec[BASE_LAYER]->pvopcRefQLater() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  532.           nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue,  0 );
  533. // begin: added by Sharp (99/1/28)
  534. else
  535. dumpNonCodedFrame(pfReconYUV[BASE_LAYER], pfReconSeg[BASE_LAYER], rctDisplay, nBits);
  536. // end: added by Sharp (99/1/28)
  537. #endif
  538. // end: added by Sharp (99/1/20)
  539. pvodec[ENHN_LAYER] -> bufferB1flush ();
  540. // Enhancement Layer after Base BVOP
  541. if (tNextBase == EOF && tNextEnhc != EOF) {
  542. pvodec[ENHN_LAYER] -> copyBufP2ToB1 ();
  543. while(tNextEnhc != EOF) {
  544. iEof = pvodec[ENHN_LAYER] -> decode ();
  545. nEnhcFrames ++;
  546. if (pvodec [ENHN_LAYER] -> volmd ().fAUsage != RECTANGLE) {
  547. // for background composition
  548. if(pvodec [ENHN_LAYER] -> volmd ().iEnhnType == 1) {
  549. // should be changed to background_composition flag later.
  550. printf("============== background composition (2)n");
  551. pvodec [ENHN_LAYER] -> BackgroundComposition(argv, bScalability, rctDisplay.width, rctDisplay.height (), pfReconYUV [ENHN_LAYER]); // Modified after Sharp (98/10/26)
  552. }
  553. // for back/forward shape
  554. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadBakShape) {
  555. printf("---------- output backward shapen");
  556. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[0]->pvopcReconCurr ();
  557. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  558. }
  559. if(pvodec [ENHN_LAYER] -> vopmd ().iLoadForShape) {
  560. printf("---------- output forward shapen");
  561. const CVOPU8YUVBA* pvopcQuant = pvodec [ENHN_LAYER]->rgpbfShape[1]->pvopcReconCurr ();
  562. pvopcQuant->getPlane (BY_PLANE)->dump (pfTestSeg, rctDisplay);
  563. }
  564. }
  565. // Output ENHN_LAYER
  566. if (iEof != EOF) {
  567. // if ( pvodec [ENHN_LAYER] -> volmd ().iEnhnType != 1 ){ // added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
  568. #ifndef __OUT_ONE_FRAME_
  569. if ( iEof != FALSE )
  570. dumpFrame (pvodec[ENHN_LAYER]->pvopcReconCurr(), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay,
  571. nBits, pvodec [ENHN_LAYER]->vopmd().iVopConstantAlphaValue,  pvodec[ENHN_LAYER]->volmd().iEnhnType );
  572. else
  573. dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
  574. // pvodec [ENHN_LAYER]->dumpDataAllFrame (pfReconYUV [ENHN_LAYER], pfReconSeg [ENHN_LAYER], rctDisplay);
  575. #else
  576. pvodec [ENHN_LAYER]->dumpDataOneFrame(argv, bScalability, rctDisplay);
  577. #endif
  578. // }// added by Sharp (98/11/18) // deleted by Sharp (99/1/25)
  579. }
  580. tNextEnhc = pvodec[ENHN_LAYER] -> senseTime ();
  581. }
  582. pvodec[ENHN_LAYER] -> bufferB1flush ();
  583. }
  584. }
  585. // begin: deleted by Sharp (99/1/28)
  586. // if (bScalability) 
  587. // pvodec[ENHN_LAYER] -> bufferP1flush ();
  588. // end: deleted by Sharp (99/1/28)
  589. iEof = tNextBase;
  590. // begin: deleted by Sharp (99/1/25)
  591. /*
  592. // begin: added by Sharp (98/11/11)
  593. #ifndef __OUT_ONE_FRAME_
  594. if ( iEof == EOF )
  595. if ( iEof != FALSE )
  596. dumpFrame (pvodec[BASE_LAYER]->pvopcRefQLater() , pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER], pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
  597. nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue,  0 );
  598. else
  599. dumpNonCodedFrame(pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], rctDisplay, nBits);
  600. #endif
  601. // end: added by Sharp (98/11/11)
  602. */
  603. // end: deleted by Sharp (99/1/25)
  604. }
  605. #ifdef __PC_COMPILER_
  606. Int tickAfter = ::GetTickCount ();
  607. printf ("Total time: %dn", tickAfter - tickBegin);
  608. Double dAverage = (Double) (tickAfter - tickBegin) / (Double) (nBaseFrames + nEnhcFrames);
  609. printf ("Total frames: %dtAverage time: %.6lfn", nBaseFrames + nEnhcFrames, dAverage);
  610. printf ("FPS %.6lfn", 1000.0 / dAverage);
  611. #endif // __PC_COMPILER_
  612. #ifndef __OUT_ONE_FRAME_
  613. fclose (pfReconYUV[BASE_LAYER]);
  614. if (pvodec[BASE_LAYER]->volmd ().fAUsage != RECTANGLE)
  615. fclose (pfReconSeg [BASE_LAYER]);
  616. #endif
  617. delete pvodec[BASE_LAYER];
  618. if (bScalability) {
  619. #ifndef __OUT_ONE_FRAME_
  620. fclose (pfReconYUV[ENHN_LAYER]);
  621. if (pvodec[ENHN_LAYER]->volmd ().fAUsage != RECTANGLE)
  622. fclose (pfReconSeg [ENHN_LAYER]);
  623. #endif
  624. delete pvodec[ENHN_LAYER];
  625. }
  626. }
  627. return 0;
  628. }
  629. Void dumpFrame (const CVOPU8YUVBA* pvopcQuant, FILE* pfYUV, FILE* pfSeg, AlphaUsage fAUsage, CRct& rct, UInt nBits, Int iAlphaScale, Int DumpSkip)
  630. {
  631. if ( DumpSkip == 0 ){
  632. pvopcQuant->getPlane (Y_PLANE)->dump (pfYUV, rct);
  633. pvopcQuant->getPlane (U_PLANE)->dump (pfYUV, rct / 2);
  634. pvopcQuant->getPlane (V_PLANE)->dump (pfYUV, rct / 2);
  635. }
  636. if(pfSeg!=NULL)
  637. {
  638. if (fAUsage == ONE_BIT)
  639. pvopcQuant->getPlane (BY_PLANE)->dump (pfSeg, rct, iAlphaScale);
  640. else if (fAUsage == EIGHT_BIT)
  641. pvopcQuant->getPlane (A_PLANE)->dumpWithMask (pfSeg, pvopcQuant->getPlane (BY_PLANE),
  642. rct, iAlphaScale);
  643. }
  644. return;
  645. }