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

流媒体/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.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  11. and also edited by
  12. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  13. Takeshi Nagai (TOSHIBA CORPORATION)
  14. Toshiaki Watanabe (TOSHIBA CORPORATION)
  15. Noboru Yamaguchi (TOSHIBA CORPORATION)
  16. and also edited by
  17. David B. Shu (dbshu@hrl.com), Hughes Electronics/HRL Laboratories
  18. and also edited by
  19. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  20. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  21. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  22. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  23. as specified by the MPEG-4 Video. 
  24. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  25. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  26. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  27. The original developer of this software module and his/her company, 
  28. the subsequent editors and their companies, 
  29. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  30. Copyright is not released for non MPEG-4 Video conforming products. 
  31. Microsoft retains full right to use the code for his/her own purpose, 
  32. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  33. This copyright notice must be included in all copies or derivative works. 
  34. Copyright (c) 1996, 1997.
  35. Module Name:
  36. vopSeDec.cpp
  37. Abstract:
  38. Decoder for one Video Object.
  39. Revision History:
  40. Dec 20, 1997: Interlaced tools added by NextLevel Systems
  41.                     X. Chen (xchen@nlvl.com) B. Eifrig (beifrig@nlvl.com)
  42. *************************************************************************/
  43. #include <stdio.h>
  44. #ifdef __GNUC__
  45. #include <strstream.h>
  46. #else
  47. #include <strstrea.h>
  48. #endif
  49. #include <math.h>
  50. #include "typeapi.h"
  51. #include "codehead.h"
  52. #include "entropy/bitstrm.hpp"
  53. #include "entropy/entropy.hpp"
  54. #include "entropy/huffman.hpp"
  55. #include "global.hpp"
  56. #include "mode.hpp"
  57. #include "vopses.hpp"
  58. #include "cae.h" // Added for error resilient mode by Toshiba(1997-11-14)
  59. #include "tps_enhcbuf.hpp" // Added by Sharp(1998-02-10)
  60. #include "enhcbufdec.hpp" //
  61. #include "vopsedec.hpp"
  62. #ifdef __MFC_
  63. #ifdef _DEBUG
  64. #undef THIS_FILE
  65. static char BASED_CODE THIS_FILE[] = __FILE__;
  66. #endif
  67. #define new DEBUG_NEW    
  68. #endif // __MFC_
  69. #define _FOR_GSSP_
  70. #undef assert
  71. #define assert(a) if (!(a)) { printf("iso throw %dn", __LINE__);throw((int)0);}
  72. CVideoObjectDecoder::~CVideoObjectDecoder ()
  73. {
  74. // delete m_pistrm;
  75.   if (m_pistrm >= 0) close(m_pistrm);
  76. delete m_pbitstrmIn;
  77. delete m_pentrdecSet;
  78. delete m_pvopcRightMB;
  79. }
  80. Int CVideoObjectDecoder::h263_decode ()
  81. {
  82. static Bool first_time = TRUE;
  83. if (!first_time) 
  84. {
  85. while ( m_pbitstrmIn -> peekBits(NUMBITS_SHORT_HEADER_START_CODE) != SHORT_VIDEO_START_MARKER)
  86. {
  87. if(m_pbitstrmIn->eof()==EOF)  // [FDS] 
  88. return EOF;
  89. m_pbitstrmIn -> getBits(1);
  90. }
  91. m_pbitstrmIn -> getBits(22);
  92. video_plane_with_short_header(); 
  93. }
  94. else
  95. first_time = FALSE;
  96. m_bUseGOV=FALSE; 
  97. m_bLinkisBroken=FALSE;
  98. m_vopmd.iRoundingControl=0;
  99. m_vopmd.iIntraDcSwitchThr=0; 
  100. m_vopmd.bInterlace=FALSE;
  101. m_vopmd.bAlternateScan=FALSE;
  102. m_t=1; 
  103. m_vopmd.mvInfoForward.uiFCode=1; 
  104. m_vopmd.mvInfoForward.uiScaleFactor = 1 << (m_vopmd.mvInfoForward.uiFCode - 1);
  105. m_vopmd.mvInfoForward.uiRange = 16 << m_vopmd.mvInfoForward.uiFCode;
  106. // Added for error resilient mode by Toshiba(1998-1-16)
  107. m_vopmd.mvInfoBackward.uiFCode = 1;
  108. // End Toshiba(1998-1-16)
  109. m_vopmd.bShapeCodingType=1;
  110. // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10)
  111. if(m_volmd.volType == BASE_LAYER) {
  112. if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP) {
  113. m_tPastRef = m_tFutureRef; 
  114. m_tFutureRef = m_t; 
  115. m_iBCount = 0;
  116. }
  117. }
  118. // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer End      Sharp(1998-02-10)
  119. // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10)
  120. if(m_volmd.volType == BASE_LAYER) {
  121. updateAllRefVOPs ();            // update all reconstructed VOP'sm_pvopcRefQ1->vdlDump ("c:\refq1.vdl");
  122. }
  123. // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer End     Sharp(1998-02-10)
  124. switch(m_vopmd.vopPredType)
  125. {
  126. case IVOP:
  127. #ifdef DEBUG_OUTPUT
  128. cout << "tIVOP";
  129. #endif
  130. /*Added by SONY (98/03/30)*/
  131. if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)        m_bLinkisBroken = FALSE;
  132. /*Added by SONY (98/03/30) END*/
  133. break;
  134. case PVOP:
  135. #ifdef DEBUG_OUTPUT
  136. cout << "tPVOP (reference: t=" << m_tPastRef <<")";
  137. #endif
  138. break;
  139. default:
  140. break;
  141. }
  142. #ifdef DEBUG_OUTPUT
  143. cout << "n";
  144. cout.flush ();
  145. #endif
  146. /* Added by SONY (98/03/30)*/
  147. if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)
  148. fprintf(stderr,"WARNING: broken_link = 1  --- Output image must be broken.n");
  149. /*Added by SONY (98/03/30) End*/
  150. decodeVOP ();  
  151. CMBMode* pmbmdTmp = m_rgmbmd;
  152. m_rgmbmd = m_rgmbmdRef;
  153. m_rgmbmdRef = pmbmdTmp;
  154. CMotionVector* pmvTmp = m_rgmv;
  155. m_rgmv = m_rgmvRef;
  156. m_rgmvRef = pmvTmp;
  157. m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB;
  158. // ? For Temporal Scalability End  Sharp(1998-02-10)
  159. m_iBVOPOffsetForPadY = m_iOffsetForPadY;
  160. m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;
  161. m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;
  162. m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;
  163. m_rctBVOPRefVOPY1 = m_rctRefVOPY1;
  164. m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;
  165. // For Temporal Scalability End  Sharp(1998-02-10)
  166. repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);
  167. repeatPadUV (m_pvopcRefQ1);
  168. //reset by in RefQ1 so that no left-over from last frame
  169. return TRUE; 
  170. }
  171. Void CVideoObjectDecoder::video_plane_with_short_header()
  172. {
  173.   /* UInt uiTemporalReference = wmay */ m_pbitstrmIn -> getBits (8);
  174. m_pbitstrmIn -> getBits(5);
  175. UInt uiSourceFormat = m_pbitstrmIn -> getBits (3);
  176. if (uiSourceFormat==1) {
  177. //fprintf(stderr,"Sub-QCIF, 128x96, 8 macroblocks/gob, 6 gobs in vopn");
  178. uiNumGobsInVop=6;
  179. uiNumMacroblocksInGob=8;
  180. m_ivolWidth=128;
  181. m_ivolHeight=96;
  182. } else if (uiSourceFormat==2) {
  183. //fprintf(stderr,"QCIF, 176x144, 11 macroblocks/gob, 9 gobs in vopn");
  184. uiNumGobsInVop=9;
  185. uiNumMacroblocksInGob=11;
  186. m_ivolWidth=176;
  187. m_ivolHeight=144;
  188. } else if (uiSourceFormat==3) {
  189. //fprintf(stderr,"CIF, 352x288, 22 macroblocks/gob, 18 gobs in vopn");
  190. uiNumGobsInVop=18;
  191. uiNumMacroblocksInGob=22;
  192. m_ivolWidth=352;
  193. m_ivolHeight=288;
  194. } else if (uiSourceFormat==4) {
  195. //fprintf(stderr,"4CIF, 704x576, 88 macroblocks/gob, 18 gobs in vopn");
  196. uiNumGobsInVop=18;
  197. uiNumMacroblocksInGob=88;
  198. m_ivolWidth=704;
  199. m_ivolHeight=576;
  200. } else if (uiSourceFormat==5) {
  201. //fprintf(stderr,"16CIF, 1408x1152, 352 macroblocks/gob, 18 gobs in vopn");
  202. uiNumGobsInVop=18;
  203. uiNumMacroblocksInGob=352;
  204. m_ivolWidth=1408;
  205. m_ivolHeight=1152;
  206. } else {
  207. fprintf(stderr,"Wrong Source Format in video_plane_with_short_header()n");
  208. exit (0);
  209. }
  210. UInt uiPictureCodingType = m_pbitstrmIn -> getBits(1);
  211. if (uiPictureCodingType==0) 
  212. m_vopmd.vopPredType=IVOP;
  213. else
  214. m_vopmd.vopPredType=PVOP;
  215. m_pbitstrmIn -> getBits(4);
  216. UInt uiVopQuant = m_pbitstrmIn -> getBits(5);
  217. //fprintf(stderr,"vop_quant (0..31)             %dn",uiVopQuant);
  218. m_vopmd.intStepI=uiVopQuant; 
  219. m_vopmd.intStep=uiVopQuant; // idem
  220. m_pbitstrmIn -> getBits(1);
  221. do {
  222. uiPei = m_pbitstrmIn -> getBits(1);
  223. //fprintf(stderr,"pei gelezen %dn",uiPei);
  224. if (uiPei==1) {
  225. m_pbitstrmIn -> getBits(8);
  226. }
  227. // [bezig]
  228. } while (uiPei==1);
  229. m_uiVOId = 1; 
  230. m_volmd.iClockRate = 30; 
  231. m_iNumBitsTimeIncr = 4; 
  232. m_volmd.bShapeOnly=FALSE; 
  233. m_volmd.fAUsage = RECTANGLE; 
  234. m_volmd.bAdvPredDisable = TRUE; 
  235. m_uiSprite = FALSE; 
  236. m_volmd.bNot8Bit=FALSE; 
  237. m_volmd.uiQuantPrecision=5;
  238. m_volmd.nBits=8;
  239. m_volmd.fQuantizer=Q_H263; 
  240. m_volmd.bDataPartitioning=FALSE;
  241. m_volmd.bReversibleVlc=FALSE;
  242. m_volmd.volType=BASE_LAYER;
  243. m_volmd.ihor_sampling_factor_n=1;
  244. m_volmd.ihor_sampling_factor_m=1;
  245. m_volmd.iver_sampling_factor_n=1;
  246. m_volmd.iver_sampling_factor_m=1;
  247. m_volmd.bDeblockFilterDisable=TRUE;
  248. }
  249. void CVideoObjectDecoder::decodeShortHeaderIntraMBDC(Int *rgiCoefQ)
  250. {
  251. UInt uiIntraDC;
  252. uiIntraDC=m_pbitstrmIn->getBits(8);
  253. if (uiIntraDC==128||uiIntraDC==0) fprintf(stderr,"IntraDC = 0 of 128, not allowed in H.263 moden");
  254. if (uiIntraDC==255) uiIntraDC=128;
  255. rgiCoefQ[0]=uiIntraDC;
  256. }
  257. CVideoObjectDecoder::CVideoObjectDecoder () : CVideoObject()
  258. {
  259.   m_t = m_tPastRef = m_tFutureRef = 0;
  260.   m_iBCount = 0;
  261.   m_vopmd.iVopConstantAlphaValue = 255;
  262.   short_video_header = FALSE;
  263.   m_pbitstrmIn = new CInBitStream();
  264.   m_pentrdecSet = new CEntropyDecoderSet (*m_pbitstrmIn);
  265. }
  266. CVideoObjectDecoder::CVideoObjectDecoder (
  267. const Char* pchStrFile,
  268. Int iDisplayWidth, Int iDisplayHeight,
  269. Bool *pbSpatialScalability,
  270. Bool *p_short_video_header//,
  271. //strstreambuf* pistrm
  272. ) : CVideoObject ()
  273. {
  274. #if 0
  275. if (pistrm == NULL) {
  276. #endif
  277.   m_pistrm = open(pchStrFile, O_RDONLY);
  278.   if(m_pistrm < 0)
  279. fatal_error("Can't open bitstream file");
  280. #if 0
  281. }
  282. else {
  283. m_pistrm = (ifstream *)new istream (pistrm);
  284. }
  285. #endif
  286. m_pbitstrmIn = new CInBitStream(m_pistrm);
  287. m_pentrdecSet = new CEntropyDecoderSet (*m_pbitstrmIn);
  288. m_t = m_tPastRef = m_tFutureRef = 0;
  289. m_iBCount = 0;
  290. m_vopmd.iVopConstantAlphaValue = 255;
  291. *p_short_video_header=FALSE; // Added by KPN for short headers
  292. if (m_pbitstrmIn->peekBits(NUMBITS_SHORT_HEADER_START_CODE) == SHORT_VIDEO_START_MARKER) 
  293.  
  294. fprintf(stderr, "nBitstream with short header format detectedn"); 
  295. *p_short_video_header=TRUE;  
  296. m_pbitstrmIn -> getBits(22);
  297. video_plane_with_short_header();
  298. }
  299. else {
  300. fprintf(stderr,"nBitstream without short headers detectedn");
  301. decodeVOHead ();
  302. printf ("VO %d...n", m_uiVOId);
  303. decodeVOLHead ();
  304. short_video_header=*p_short_video_header; 
  305. postVO_VOLHeadInit(iDisplayWidth, iDisplayHeight, pbSpatialScalability);
  306. }
  307. void CVideoObjectDecoder::postVO_VOLHeadInit (Int iDisplayWidth, 
  308.       Int iDisplayHeight,
  309.       Bool *pbSpatialScalability)
  310. {
  311. /* (98/03/30 added by SONY)*/
  312. m_bLinkisBroken = FALSE;
  313. m_bUseGOV = FALSE;
  314. /* (98/03/30 added by SONY)*/
  315. // Added for error resilient mode by Toshiba(1997-11-14): Moved (1998-1-16)
  316. g_iMaxHeading = MAXHEADING_ERR;
  317. g_iMaxMiddle = MAXMIDDLE_ERR;
  318. g_iMaxTrailing = MAXTRAILING_ERR;
  319. // End Toshiba(1997-11-14)
  320. setClipTab(); // NBIT
  321. if(m_volmd.volType == ENHN_LAYER){ // check scalability type
  322. if(pbSpatialScalability != NULL)
  323. if(m_volmd.iHierarchyType == 0)
  324. *pbSpatialScalability = TRUE;
  325. else 
  326. *pbSpatialScalability = FALSE;
  327. }
  328. if (m_volmd.fAUsage == RECTANGLE) {
  329. if (m_volmd.volType == ENHN_LAYER &&
  330. (m_volmd.ihor_sampling_factor_n != m_volmd.ihor_sampling_factor_m ||
  331.        m_volmd.iver_sampling_factor_n != m_volmd.iver_sampling_factor_m )){
  332. iDisplayWidth = m_ivolWidth;
  333. iDisplayHeight= m_ivolHeight;
  334. }
  335. else if (iDisplayWidth == -1 && iDisplayHeight == -1) {
  336.   iDisplayWidth = m_ivolWidth;
  337.   iDisplayHeight = m_ivolHeight;
  338. }
  339. else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){
  340. fprintf(stderr, "nDecode aborted! This rectangular VOP stream requires displaynwidth and height to be set to %dx%d.n",
  341. m_ivolWidth, m_ivolHeight);
  342. exit(1);
  343. }
  344. }
  345. m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later
  346. /*
  347. if (m_volmd.fAUsage == RECTANGLE) {
  348. if (m_volmd.volType == ENHN_LAYER &&
  349. (m_volmd.ihor_sampling_factor_n/m_volmd.ihor_sampling_factor_m != 1||
  350.        m_volmd.iver_sampling_factor_n/m_volmd.iver_sampling_factor_m != 1)){
  351. iDisplayWidth = m_ivolWidth;
  352. iDisplayHeight= m_ivolHeight;
  353. if(pbSpatialScalability!=NULL)
  354. *pbSpatialScalability = TRUE;
  355. fprintf(stderr,"display size %d %d n",iDisplayWidth, iDisplayHeight);
  356. }
  357. else if (iDisplayWidth != m_ivolWidth || iDisplayHeight != m_ivolHeight){
  358. fprintf(stderr, "nDecode aborted! This rectangular VOP stream requires displaynwidth and height to be set to %dx%d.n",
  359. m_ivolWidth, m_ivolHeight);
  360. exit(1);
  361. }
  362. else if(pbSpatialScalability!=NULL)
  363. *pbSpatialScalability = FALSE;
  364. }
  365. m_rctDisplayWindow = CRct (0, 0, iDisplayWidth, iDisplayHeight); //same as m_rctOrg? will fixe later
  366. */
  367. if (m_uiSprite == 1) { // change iDisplay size in order to get the first sprite piece
  368. iDisplayWidth = (Int) m_rctSpt.width;
  369. iDisplayHeight = (Int) m_rctSpt.height ();
  370. }
  371. Int iMod = iDisplayWidth % MB_SIZE;
  372. Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth;
  373. iMod = iDisplayHeight % MB_SIZE;
  374. Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;
  375. m_rctRefFrameY = CRct (
  376. -EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, 
  377. EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound
  378. );
  379. m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();
  380. allocateVOLMembers (iDisplayWidth, iDisplayHeight);
  381. if (m_volmd.fAUsage == RECTANGLE) {
  382. //wchen: if sprite; set it according to the initial piece instead
  383. m_rctCurrVOPY = (m_uiSprite == 0) ? CRct (0, 0, iDisplayWidthRound, iDisplayHeightRound) : m_rctSpt;
  384. m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();
  385. m_rctRefVOPY0 = m_rctCurrVOPY;
  386. m_rctRefVOPY0.expand (EXPANDY_REFVOP);
  387. m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 ();
  388. m_rctRefVOPY1 = m_rctRefVOPY0;
  389. m_rctRefVOPUV1 = m_rctRefVOPUV0;
  390. computeVOLConstMembers (); // these VOP members are the same for all frames
  391. }
  392. // buffer for shape decoding
  393. m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE));
  394. m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY ();
  395. m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();
  396. // buffers for Temporal Scalabe Decoding Added by Sharp(1998-02-10)
  397. if (m_volmd.volType == ENHN_LAYER) {
  398. m_pBuffP1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());
  399. m_pBuffP2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());
  400. m_pBuffB1 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());
  401. m_pBuffB2 = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());
  402. m_pBuffE  = new CEnhcBufferDecoder (m_rctRefFrameY.width, m_rctRefFrameY.height ());
  403. }
  404. // buffers for Temporal Scalabe Decoding End  Sharp(1998-02-10)
  405. m_iClockRateScale = 1; // added by Sharp (98/6/26)
  406. // Set sprite_transmit_mode to STOP for the duration of VOL if (fSptUsage () == 0),
  407. // and later set to PIECE by decode_init_sprite () if (fSptUsage () == 1)
  408. m_vopmd.SpriteXmitMode = STOP;   
  409. }
  410. // for back/forward shape Added by Sharp(1998-02-10)
  411. CVideoObjectDecoder::CVideoObjectDecoder (
  412. Int iDisplayWidth, Int iDisplayHeight
  413. ) : CVideoObject ()
  414. {
  415. m_pistrm = -1;
  416. m_pbitstrmIn = NULL;
  417. m_pentrdecSet = NULL;
  418. m_uiVOId = 0;
  419. Void set_modes(VOLMode* volmd, VOPMode* vopmd);
  420. set_modes(&m_volmd, &m_vopmd); // set VOL modes, VOP modes
  421. m_vopmd.iVopConstantAlphaValue = 255;
  422. Int iMod = iDisplayWidth % MB_SIZE;
  423. Int iDisplayWidthRound = (iMod > 0) ? iDisplayWidth + MB_SIZE - iMod : iDisplayWidth;
  424. iMod = iDisplayHeight % MB_SIZE;
  425. Int iDisplayHeightRound = (iMod > 0) ? iDisplayHeight + MB_SIZE - iMod : iDisplayHeight;
  426. m_rctRefFrameY = CRct (
  427. -EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME,
  428. EXPANDY_REF_FRAME + iDisplayWidthRound, EXPANDY_REF_FRAME + iDisplayHeightRound
  429. );
  430. m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();
  431. allocateVOLMembers (iDisplayWidth, iDisplayHeight);
  432. // buffer for shape decoding
  433. m_pvopcRightMB = new CVOPU8YUVBA (m_volmd.fAUsage, CRct (0, 0, MB_SIZE, MB_SIZE));
  434. m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY ();
  435. m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();
  436. }
  437. // for back/forward shape End  Sharp(1998-02-10)
  438. Int CVideoObjectDecoder::decode (const CVOPU8YUVBA* pvopcBVOPQuant, /*strstreambuf* pistrm, */ Bool waitForI, Bool drop)
  439. {
  440. #if 0
  441. if (pistrm != NULL) {
  442. delete (istream *)m_pistrm;
  443. delete m_pbytestrmIn;
  444. delete m_pbitstrmIn;
  445. delete m_pentrdecSet;
  446. m_pistrm = (ifstream *)new istream (pistrm);
  447. m_pbytestrmIn = new CInByteStreamFile(*m_pistrm);
  448. m_pbitstrmIn = new CInBitStream (m_pbytestrmIn);
  449. m_pentrdecSet = new CEntropyDecoderSet (*m_pbitstrmIn);
  450. }
  451. #endif
  452. //sprite piece should not come here
  453. assert ((m_vopmd.SpriteXmitMode == STOP) || ( m_vopmd.SpriteXmitMode == PAUSE));
  454. if (findStartCode () == EOF)
  455. return EOF;
  456. Bool bCoded = decodeVOPHead (); // set the bounding box here
  457. if (waitForI && 
  458.     !(m_vopmd.vopPredType == IVOP)) {
  459. #ifdef DEBUG_OUTPUT
  460.   cout << "tFrame is not IVOP " << m_vopmd.vopPredType << "n";
  461.   cout.flush();
  462. #endif
  463.   return -1;
  464. }
  465. if (drop && m_vopmd.vopPredType == BVOP) {
  466.   return -1;
  467. }
  468. #ifdef DEBUG_OUTPUT
  469. cout << "t" << "Time..." << m_t << " (" << m_t / (double)m_volmd.iClockRate << " sec)n";
  470. if(bCoded == FALSE)
  471. cout << "tNot coded.n";
  472. cout.flush ();
  473. #endif
  474. Bool bPrevRefVopWasCoded = m_bCodedFutureRef;
  475. if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP)
  476. m_bCodedFutureRef = bCoded; // flag used by bvop prediction
  477. if (m_vopmd.vopPredType == SPRITE) {
  478. decodeSpt ();
  479. return TRUE;
  480. }
  481. // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10)
  482. if(m_volmd.volType == BASE_LAYER) {
  483. if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP) {
  484. if(bPrevRefVopWasCoded)
  485. m_tPastRef = m_tFutureRef;
  486. m_tFutureRef = m_t;
  487. m_iBCount = 0;
  488. }
  489. // count B-VOPs
  490. if(m_vopmd.vopPredType==BVOP)
  491. m_iBCount++;
  492. }
  493. else if (pvopcBVOPQuant != NULL) { // Spatial Scalability Enhancement Layer
  494. /* (98/03/30) modified by SONY */
  495. if(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0) {
  496. if(bPrevRefVopWasCoded)
  497. m_tPastRef = m_tFutureRef;
  498. m_tFutureRef = m_t;
  499. m_iBCount = 0;
  500. } if(m_vopmd.vopPredType == PVOP && m_vopmd.iRefSelectCode == 3) {
  501. m_tPastRef = m_t;
  502. m_tFutureRef = m_t;
  503. m_iBCount = 0;
  504. }
  505. /* (98/03/30) modified by SONY */
  506. // count B-VOPs
  507. if(m_vopmd.vopPredType==BVOP)
  508. m_iBCount++;
  509. }
  510. // set time stamps for Base/Temporal-Enhc/Spatial-Enhc Layer End      Sharp(1998-02-10)
  511. // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer Modified by Sharp(1998-02-10)
  512. if(bPrevRefVopWasCoded)
  513. {
  514. if(m_volmd.volType == BASE_LAYER) {
  515. updateAllRefVOPs ();            // update all reconstructed VOP's
  516. }
  517. else {
  518. if (pvopcBVOPQuant == NULL) // Temporal Scalability Enhancement Layer
  519. updateRefVOPsEnhc ();
  520. else { // Spatial Scalability Enhancement Layer
  521. updateAllRefVOPs (pvopcBVOPQuant);
  522. }
  523. }
  524. }
  525. // select reference frames for Base/Temporal-Enhc/Spatial-Enhc Layer End     Sharp(1998-02-10)
  526. switch(m_vopmd.vopPredType)
  527. {
  528. case IVOP:
  529. #ifdef DEBUG_OUTPUT
  530. cout << "tIVOP";
  531. #endif
  532. /*Added by SONY (98/03/30)*/
  533. if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)        m_bLinkisBroken = FALSE;
  534. /*Added by SONY (98/03/30) END*/
  535. break;
  536. case PVOP:
  537. #ifdef DEBUG_OUTPUT
  538. cout << "tPVOP (reference: t=" << m_tPastRef <<")";
  539. #endif
  540. break;
  541. case BVOP:
  542. #ifdef DEBUG_OUTPUT
  543. cout << "tBVOP (past ref: t=" << m_tPastRef
  544. << ", future ref: t=" << m_tFutureRef <<")";
  545. #endif
  546. break;
  547. default:
  548. break;
  549. }
  550. #ifdef DEBUG_OUTPUT
  551. cout << "n";
  552. cout.flush ();
  553. #endif
  554. /* Added by SONY (98/03/30)*/
  555. if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)
  556. fprintf(stderr,"WARNING: broken_link = 1  --- Output image must be broken.n");
  557. /*Added by SONY (98/03/30) End*/
  558. if(bCoded==FALSE)
  559. {
  560. if (m_vopmd.vopPredType != BVOP
  561. && m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
  562. {
  563. // give the current object a dummy size
  564. m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
  565. saveShapeMode(); // save the previous reference vop shape mode
  566. }
  567. return FALSE;
  568. }
  569. if (m_volmd.fAUsage != RECTANGLE)
  570. resetBYPlane ();
  571. if (m_volmd.fAUsage != RECTANGLE) {
  572. setRefStartingPointers ();
  573. computeVOPMembers ();
  574. }
  575. decodeVOP ();
  576. //wchen: added by sony-probably not the best way
  577. if(m_volmd.volType == ENHN_LAYER &&
  578. (m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
  579. swapVOPU8Pointers(m_pvopcCurrQ,m_pvopcRefQ1);
  580. // store the direct mode data
  581. if (m_vopmd.vopPredType != BVOP ||
  582. (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
  583. if(m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
  584. saveShapeMode();
  585. CMBMode* pmbmdTmp = m_rgmbmd;
  586. m_rgmbmd = m_rgmbmdRef;
  587. m_rgmbmdRef = pmbmdTmp;
  588. CMotionVector* pmvTmp = m_rgmv;
  589. m_rgmv = m_rgmvRef;
  590. m_rgmvRef = pmvTmp;
  591. m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB;
  592. }
  593. if (m_volmd.fAUsage != RECTANGLE) {
  594. if (m_vopmd.vopPredType != BVOP ||
  595. (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
  596. m_iNumMBRef = m_iNumMB;
  597. m_iNumMBXRef = m_iNumMBX;
  598. m_iNumMBYRef = m_iNumMBY;
  599. m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
  600. m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
  601. m_rctPrevNoExpandY = m_rctCurrVOPY;
  602. m_rctPrevNoExpandUV = m_rctCurrVOPUV;
  603. m_rctRefVOPY1 = m_rctCurrVOPY;
  604. m_rctRefVOPY1.expand (EXPANDY_REFVOP);
  605. m_rctRefVOPUV1 = m_rctCurrVOPUV;
  606. m_rctRefVOPUV1.expand (EXPANDUV_REFVOP);
  607. m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1);
  608. }
  609. else { // For Temporal Scalability Added by Sharp(1998-02-10)
  610. m_iBVOPOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
  611. m_iBVOPOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
  612. m_rctBVOPPrevNoExpandY = m_rctCurrVOPY;
  613. m_rctBVOPPrevNoExpandUV = m_rctCurrVOPUV;
  614. m_rctBVOPRefVOPY1 = m_rctCurrVOPY;
  615. m_rctBVOPRefVOPY1.expand (EXPANDY_REFVOP);
  616. m_rctBVOPRefVOPUV1 = m_rctCurrVOPUV;
  617. m_rctBVOPRefVOPUV1.expand (EXPANDUV_REFVOP);
  618. } // For Temporal Scalability End  Sharp(1998-02-10)
  619. //give a comment that this is ac/dc pred stuff
  620. Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6;
  621. delete [] m_rgblkmCurrMB;
  622. for (Int iMB = 0; iMB < m_iNumMBX; iMB++) {
  623. for (Int iBlk = 0; iBlk < nBlk; iBlk++) {
  624. delete [] (m_rgpmbmAbove [iMB]->rgblkm) [iBlk];
  625. delete [] (m_rgpmbmCurr  [iMB]->rgblkm) [iBlk];
  626. }
  627. delete [] m_rgpmbmAbove [iMB]->rgblkm;
  628. delete m_rgpmbmAbove [iMB];
  629. delete [] m_rgpmbmCurr [iMB]->rgblkm;
  630. delete m_rgpmbmCurr [iMB];
  631. }
  632. delete [] m_rgpmbmAbove;
  633. delete [] m_rgpmbmCurr;
  634. }
  635. else { // For Temporal Scalability Added by Sharp(1998-02-10)
  636. m_iBVOPOffsetForPadY = m_iOffsetForPadY;
  637. m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;
  638. m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;
  639. m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;
  640. m_rctBVOPRefVOPY1 = m_rctRefVOPY1;
  641. m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;
  642. } // For Temporal Scalability End  Sharp(1998-02-10)
  643.     if (m_vopmd.vopPredType != BVOP ||
  644. (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
  645. repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);
  646. repeatPadUV (m_pvopcRefQ1);
  647. //reset by in RefQ1 so that no left-over from last frame
  648. if (m_volmd.fAUsage != RECTANGLE)       {
  649. if (m_volmd.fAUsage == EIGHT_BIT)
  650. repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA () + m_iOffsetForPadY, m_pvopcRefQ1);
  651. }
  652. }
  653. // update buffers for temporal scalability Added by Sharp(1998-02-10)
  654. if(m_volmd.volType != BASE_LAYER)  updateBuffVOPsEnhc ();
  655. return TRUE;
  656. }
  657. Int CVideoObjectDecoder::findStartCode(int dontloop)
  658. {
  659. // ensure byte alignment
  660. m_pbitstrmIn->flush ();
  661. Int bUserData;
  662. do {
  663. bUserData = 0;
  664. while(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX)!=START_CODE_PREFIX)
  665. {
  666. m_pbitstrmIn->getBits(8);
  667. if(m_pbitstrmIn->eof()==EOF || dontloop != 0)
  668. return EOF;
  669. }
  670. m_pbitstrmIn->getBits(NUMBITS_START_CODE_PREFIX);
  671. if(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==USER_DATA_START_CODE)
  672. bUserData = 1;
  673. } while(bUserData);
  674. return 0;
  675. }
  676. Void CVideoObjectDecoder::decodeVOHead ()
  677. {
  678. findStartCode();
  679.   // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)(for Skip Session_Start_Code)
  680.   if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==SESSION_START_CODE){
  681.   m_pbitstrmIn -> getBits (NUMBITS_START_CODE_SUFFIX);
  682.   if (findStartCode () == EOF)
  683.   assert(FALSE);
  684.   }
  685.   // End Toshiba(1998-1-16:DP+RVLC)
  686. UInt uiVoStartCode = m_pbitstrmIn -> getBits (NUMBITS_VO_START_CODE);
  687. assert(uiVoStartCode == VO_START_CODE);
  688. decodeVOBody();
  689. }
  690. Void CVideoObjectDecoder::decodeVOBody ()
  691. {
  692. m_uiVOId = m_pbitstrmIn -> getBits (NUMBITS_VO_ID);
  693. }
  694. Void CVideoObjectDecoder::decodeVOLHead ()
  695. {
  696. findStartCode();
  697. UInt uiVolStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOL_START_CODE);
  698. assert(uiVolStartCode == VOL_START_CODE);
  699. decodeVOLBody();
  700. }
  701. Void CVideoObjectDecoder::decodeVOLBody()
  702. {
  703.   int ver_id;
  704. /* UInt uiVOLId = wmay */m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);
  705. // Begin: modified by Hughes   4/9/98   per clause 2.1.7. in N2171 document
  706. /* Bool bRandom = wmay */m_pbitstrmIn->getBits (1); //VOL_Random_Access
  707. // End: modified by Hughes   4/9/98
  708. /* UInt uiOLType = wmay*/m_pbitstrmIn -> getBits(8); // VOL_type_indication
  709. UInt uiOLI = m_pbitstrmIn -> getBits (1); //VOL_Is_Object_Layer_Identifier, useless flag for now
  710. if(uiOLI)
  711. {
  712.   ver_id = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid
  713. m_pbitstrmIn -> getBits (3); // video_oject_layer_priority
  714. } else {
  715.   ver_id = 1;
  716. }
  717. //assert(uiOLI == 0);
  718. UInt uiAspect = m_pbitstrmIn -> getBits (4);
  719. if(uiAspect==15) // extended PAR
  720. {
  721.   /* UInt iParWidth = wmay */ m_pbitstrmIn -> getBits (8);
  722.   /* UInt iParHeight = wmay */ m_pbitstrmIn -> getBits (8);
  723. }
  724. UInt uiMark;
  725. UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now
  726. if(uiCTP)
  727. {
  728.   /* UInt uiChromaFormat = wmay */ m_pbitstrmIn -> getBits (2);
  729.   /* UInt uiLowDelay = wmay */m_pbitstrmIn -> getBits (1);
  730. UInt uiVBVParams = m_pbitstrmIn -> getBits (1);
  731. if(uiVBVParams)
  732. {
  733.   /* UInt uiFirstHalfBitRate = wmay */m_pbitstrmIn -> getBits (15);
  734. uiMark = m_pbitstrmIn -> getBits (1);
  735. assert(uiMark==1);
  736. /* UInt uiLatterHalfBitRate = wmay */ m_pbitstrmIn -> getBits (15);
  737. uiMark = m_pbitstrmIn -> getBits (1);
  738. assert(uiMark==1);
  739. /* UInt uiFirstHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (15);
  740. uiMark = m_pbitstrmIn -> getBits (1);
  741. assert(uiMark==1);
  742. /* UInt uiLatterHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (3);
  743. /* UInt uiFirstHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (11);
  744. uiMark = m_pbitstrmIn -> getBits (1);
  745. assert(uiMark==1);
  746. /* UInt uiLatterHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (15);
  747. uiMark = m_pbitstrmIn -> getBits (1);
  748. assert(uiMark==1);
  749. }
  750. }
  751. //assert(uiCTP == 0);
  752. UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE);
  753. uiMark = m_pbitstrmIn -> getBits (1);
  754. assert(uiMark==1);
  755. m_volmd.iClockRate = m_pbitstrmIn -> getBits (NUMBITS_TIME_RESOLUTION);
  756. #ifdef DEBUG_OUTPUT
  757. cout << m_volmd.iClockRate << "n";
  758. #endif
  759. uiMark = m_pbitstrmIn -> getBits (1);
  760. assert(uiMark==1);
  761. Int iClockRate = m_volmd.iClockRate;
  762. assert (iClockRate >= 1 && iClockRate < 65536);
  763. for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++) {
  764. if (iClockRate == 1)
  765. break;
  766. iClockRate = (iClockRate >> 1);
  767. }
  768. Bool bFixFrameRate = m_pbitstrmIn -> getBits (1);
  769. //assert (bFixFrameRate == FALSE);
  770. if(bFixFrameRate)
  771. {
  772.   UInt uiFixedVOPTimeIncrement = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
  773.   m_volmd.iClockRate = m_volmd.iClockRate / uiFixedVOPTimeIncrement;
  774. // not used
  775. //
  776. //
  777. }
  778. if(uiAUsage==2)  // shape-only mode
  779. {
  780.   /* UInt uiResyncMarkerDisable = wmay */m_pbitstrmIn -> getBits (1);
  781. // default to some values - probably not all needed
  782. m_volmd.bShapeOnly=TRUE;
  783. m_volmd.fAUsage=ONE_BIT;
  784. m_volmd.bAdvPredDisable = 0;
  785. m_volmd.fQuantizer = Q_H263;
  786. m_volmd.volType = BASE_LAYER;
  787. m_volmd.bDeblockFilterDisable = TRUE;
  788. m_uiSprite = 0;
  789. m_volmd.bNot8Bit = 0;
  790. m_volmd.bComplexityEstimationDisable = 1;
  791. m_volmd.bDataPartitioning = 0;
  792. m_volmd.bReversibleVlc = FALSE;
  793. m_volmd.bDeblockFilterDisable = TRUE;
  794. return;
  795. }
  796. m_volmd.bShapeOnly=FALSE;
  797. if(uiAUsage==3)
  798. uiAUsage=2;
  799. m_volmd.fAUsage = (AlphaUsage) uiAUsage;
  800. if (m_volmd.fAUsage == RECTANGLE) {
  801. UInt uiMarker = m_pbitstrmIn -> getBits (1);
  802. //wmay for divx assert(uiMarker==1);
  803. m_ivolWidth = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH);
  804. uiMarker  = m_pbitstrmIn -> getBits (1);
  805. // wmay for divx assert(uiMarker==1);
  806. m_ivolHeight = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT);
  807. uiMarker  = m_pbitstrmIn -> getBits (1);
  808. // wmay for dixv assert(uiMarker==1);
  809. }
  810. m_vopmd.bInterlace = m_pbitstrmIn -> getBits (1); // interlace (was vop flag)
  811. m_volmd.bAdvPredDisable = m_pbitstrmIn -> getBits (1);  //VOL_obmc_Disable
  812. // decode sprite info
  813. // wmay m_uiSprite = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_USAGE);
  814. m_uiSprite = m_pbitstrmIn->getBits(ver_id == 1 ? 1 : 2);
  815. if (m_uiSprite == 1) { // sprite information
  816. Int isprite_hdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_HDIM);
  817. Int iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);
  818. assert (iMarker == 1);
  819. Int isprite_vdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_VDIM);
  820. iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);
  821. assert (iMarker == 1);
  822. Int isprite_left_edge = (m_pbitstrmIn -> getBits (1) == 0) ?
  823.     m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12));
  824. assert(isprite_left_edge%2 == 0);
  825. iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);
  826. assert (iMarker == 1);
  827. Int isprite_top_edge = (m_pbitstrmIn -> getBits (1) == 0) ?
  828.     m_pbitstrmIn->getBits (NUMBITS_SPRITE_TOP_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12));
  829. assert(isprite_top_edge%2 == 0);
  830. iMarker = m_pbitstrmIn -> getBits (MARKER_BIT);
  831. assert (iMarker == 1);
  832. m_rctSpt.left = isprite_left_edge;
  833. m_rctSpt.right = isprite_left_edge + isprite_hdim;
  834. m_rctSpt.top = isprite_top_edge;
  835. m_rctSpt.bottom = isprite_top_edge + isprite_vdim;
  836. m_rctSpt.width = isprite_hdim;
  837.         m_rctSptPieceY = m_rctSpt; //initialization; will be overwritten by first vop header
  838. m_iNumOfPnts = m_pbitstrmIn -> getBits (NUMBITS_NUM_SPRITE_POINTS);
  839. m_rgstSrcQ = new CSiteD [m_iNumOfPnts];
  840. m_rgstDstQ = new CSiteD [m_iNumOfPnts];
  841. m_uiWarpingAccuracy = m_pbitstrmIn -> getBits (NUMBITS_WARPING_ACCURACY);
  842. /* Bool bLightChange = wmay */m_pbitstrmIn -> getBits (1);
  843. // Begin: modified by Hughes   4/9/98
  844. Bool bsptMode = m_pbitstrmIn -> getBits (1);  // Low_latency_sprite_enable
  845. if (  bsptMode)
  846. m_sptMode = LOW_LATENCY ;
  847. else
  848. m_sptMode = BASIC_SPRITE ;
  849. // End: modified by Hughes   4/9/98
  850. }
  851. m_volmd.bNot8Bit = (Bool) m_pbitstrmIn -> getBits(1);
  852. if (m_volmd.bNot8Bit) {
  853. m_volmd.uiQuantPrecision = (UInt) m_pbitstrmIn -> getBits (4);
  854. m_volmd.nBits = (UInt) m_pbitstrmIn -> getBits (4);
  855. assert(m_volmd.nBits>3);
  856. } else {
  857. m_volmd.uiQuantPrecision = 5;
  858. m_volmd.nBits = 8;
  859. }
  860. if (m_volmd.fAUsage == EIGHT_BIT)
  861. {
  862. m_volmd.bNoGrayQuantUpdate = m_pbitstrmIn -> getBits (1);
  863. /* UInt uiCompMethod = wmay */m_pbitstrmIn -> getBits (1);
  864. /* UInt uiLinearComp = wmay */m_pbitstrmIn -> getBits (1);
  865. }
  866. m_volmd.fQuantizer = (Quantizer) m_pbitstrmIn -> getBits (1); 
  867. if (m_volmd.fQuantizer == Q_MPEG) {
  868. m_volmd.bLoadIntraMatrix = m_pbitstrmIn -> getBits (1);
  869. if (m_volmd.bLoadIntraMatrix) {
  870. UInt i = 0;
  871. Int iElem;
  872. do {
  873. iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);
  874. m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i]] = iElem;
  875. } while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE);
  876. for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) {
  877. m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i - 1]];
  878. }
  879. }
  880. else {
  881. memcpy (m_volmd.rgiIntraQuantizerMatrix, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  882. }
  883. m_volmd.bLoadInterMatrix = m_pbitstrmIn -> getBits (1);
  884. if (m_volmd.bLoadInterMatrix) {
  885. UInt i = 0;
  886. Int iElem;
  887. do {
  888. iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);
  889. m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i]] = iElem;
  890. } while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE);
  891. for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) {
  892. m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i - 1]];
  893. }
  894. }
  895. else {
  896. memcpy (m_volmd.rgiInterQuantizerMatrix, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  897. }
  898. if (m_volmd.fAUsage == EIGHT_BIT) {
  899. m_volmd.bLoadIntraMatrixAlpha = m_pbitstrmIn -> getBits (1);
  900. if (m_volmd.bLoadIntraMatrixAlpha) {
  901. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  902. Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);
  903. if (iElem != 0)
  904. m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem;
  905. else
  906. m_volmd.rgiIntraQuantizerMatrixAlpha [i] = m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]];
  907. }
  908. }
  909. else {
  910. #ifdef _FOR_GSSP_
  911. memcpy (m_volmd.rgiIntraQuantizerMatrixAlpha, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  912. #else
  913. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)
  914. m_volmd.rgiIntraQuantizerMatrixAlpha [i] = 16;
  915. #endif
  916. }
  917. m_volmd.bLoadInterMatrixAlpha = m_pbitstrmIn -> getBits (1);
  918. if (m_volmd.bLoadInterMatrixAlpha) {
  919. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) {
  920. Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX);
  921. if (iElem != 0)
  922. m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem;
  923. else
  924. m_volmd.rgiInterQuantizerMatrixAlpha [i] = m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]];
  925. }
  926. }
  927. else {
  928. #ifdef _FOR_GSSP_
  929. memcpy (m_volmd.rgiInterQuantizerMatrixAlpha, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  930. #else
  931. for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++)
  932. m_volmd.rgiInterQuantizerMatrixAlpha [i] = 16;
  933. #endif
  934. }
  935. }
  936. }
  937. if (ver_id != 1) // wmay
  938.   m_pbitstrmIn->getBits(1); // wmay vol quarter pixel
  939. // Bool bComplxityEsti = m_pbitstrmIn->getBits (1); //Complexity estimation; don't know how to use it
  940. // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 15 Jun 1998
  941. m_volmd.bComplexityEstimationDisable = m_pbitstrmIn -> getBits (1);
  942. if (! m_volmd.bComplexityEstimationDisable) {
  943. m_volmd.iEstimationMethod = m_pbitstrmIn -> getBits (2);
  944. if (m_volmd.iEstimationMethod != 0) {
  945. fprintf (stderr, "ERROR: Unknown complexity estimation method number %d.n", m_volmd.iEstimationMethod);
  946. exit (1);
  947. }
  948. m_volmd.bShapeComplexityEstimationDisable = m_pbitstrmIn -> getBits (1);
  949. if (! m_volmd.bShapeComplexityEstimationDisable) {
  950. m_volmd.bOpaque = m_pbitstrmIn -> getBits (1);
  951. m_volmd.bTransparent = m_pbitstrmIn -> getBits (1);
  952. m_volmd.bIntraCAE = m_pbitstrmIn -> getBits (1);
  953. m_volmd.bInterCAE = m_pbitstrmIn -> getBits (1);
  954. m_volmd.bNoUpdate = m_pbitstrmIn -> getBits (1);
  955. m_volmd.bUpsampling = m_pbitstrmIn -> getBits (1);
  956. if (!(m_volmd.bOpaque ||
  957.   m_volmd.bTransparent ||
  958.   m_volmd.bIntraCAE ||
  959.   m_volmd.bInterCAE ||
  960.   m_volmd.bNoUpdate ||
  961.   m_volmd.bUpsampling)) {
  962. fatal_error("Shape complexity estimation is enabled,nbut no correponding flag is enabled.");
  963. }
  964. }
  965. else
  966. m_volmd.bOpaque =
  967. m_volmd.bTransparent =
  968. m_volmd.bIntraCAE =
  969. m_volmd.bInterCAE =
  970. m_volmd.bNoUpdate =
  971. m_volmd.bUpsampling = false;
  972. m_volmd.bTextureComplexityEstimationSet1Disable = m_pbitstrmIn -> getBits (1);
  973. if (! m_volmd.bTextureComplexityEstimationSet1Disable) {
  974. m_volmd.bIntraBlocks = m_pbitstrmIn -> getBits (1);
  975. m_volmd.bInterBlocks = m_pbitstrmIn -> getBits (1);
  976. m_volmd.bInter4vBlocks = m_pbitstrmIn -> getBits (1);
  977. m_volmd.bNotCodedBlocks = m_pbitstrmIn -> getBits (1);
  978. if (!(m_volmd.bIntraBlocks ||
  979.   m_volmd.bInterBlocks ||
  980.   m_volmd.bInter4vBlocks ||
  981.   m_volmd.bNotCodedBlocks)) {
  982. fatal_error("Texture complexity estimation set 1 is enabled,nbut no correponding flag is enabled.");
  983. }
  984. }
  985. else
  986. m_volmd.bIntraBlocks =
  987. m_volmd.bInterBlocks =
  988. m_volmd.bInter4vBlocks =
  989. m_volmd.bNotCodedBlocks = false;
  990. uiMark = m_pbitstrmIn -> getBits (1);
  991. assert (uiMark == 1);
  992. m_volmd.bTextureComplexityEstimationSet2Disable = m_pbitstrmIn -> getBits (1);
  993. if (! m_volmd.bTextureComplexityEstimationSet2Disable) {
  994. m_volmd.bDCTCoefs = m_pbitstrmIn -> getBits (1);
  995. m_volmd.bDCTLines = m_pbitstrmIn -> getBits (1);
  996. m_volmd.bVLCSymbols = m_pbitstrmIn -> getBits (1);
  997. m_volmd.bVLCBits = m_pbitstrmIn -> getBits (1);
  998. if (!(m_volmd.bDCTCoefs ||
  999.   m_volmd.bDCTLines ||
  1000.   m_volmd.bVLCSymbols ||
  1001.   m_volmd.bVLCBits)) {
  1002. fatal_error("Texture complexity estimation set 2 is enabled,nbut no correponding flag is enabled.");
  1003. }
  1004. }
  1005. else
  1006. m_volmd.bDCTCoefs =
  1007. m_volmd.bDCTLines =
  1008. m_volmd.bVLCSymbols =
  1009. m_volmd.bVLCBits = false;
  1010. m_volmd.bMotionCompensationComplexityDisable = m_pbitstrmIn -> getBits (1);
  1011. if (! m_volmd.bMotionCompensationComplexityDisable) {
  1012. m_volmd.bAPM = m_pbitstrmIn -> getBits (1);
  1013. m_volmd.bNPM = m_pbitstrmIn -> getBits (1);
  1014. m_volmd.bInterpolateMCQ = m_pbitstrmIn -> getBits (1);
  1015. m_volmd.bForwBackMCQ = m_pbitstrmIn -> getBits (1);
  1016. m_volmd.bHalfpel2 = m_pbitstrmIn -> getBits (1);
  1017. m_volmd.bHalfpel4 = m_pbitstrmIn -> getBits (1);
  1018. if (!(m_volmd.bAPM ||
  1019.   m_volmd.bNPM ||
  1020.   m_volmd.bInterpolateMCQ ||
  1021.   m_volmd.bForwBackMCQ ||
  1022.   m_volmd.bHalfpel2 ||
  1023.   m_volmd.bHalfpel4)) {
  1024. fatal_error("Motion complexity estimation is enabled,nbut no correponding flag is enabled.");
  1025. }
  1026. }
  1027. else
  1028. m_volmd.bAPM =
  1029. m_volmd.bNPM =
  1030. m_volmd.bInterpolateMCQ =
  1031. m_volmd.bForwBackMCQ =
  1032. m_volmd.bHalfpel2 =
  1033. m_volmd.bHalfpel4 = false;
  1034. uiMark = m_pbitstrmIn -> getBits (1);
  1035. assert (uiMark == 1);
  1036. }
  1037. // END: Complexity Estimation syntax support
  1038. /* UInt uiResyncMarkerDisable = wmay */m_pbitstrmIn -> getBits (1);
  1039. // Modified by Toshiba(1998-4-7)
  1040. m_volmd.bDataPartitioning = m_pbitstrmIn -> getBits (1);
  1041. if( m_volmd.bDataPartitioning )
  1042. m_volmd.bReversibleVlc = m_pbitstrmIn -> getBits (1);
  1043. else
  1044. m_volmd.bReversibleVlc = FALSE;
  1045. // End Toshiba
  1046. //wchen: wd changes
  1047. m_volmd.volType = (m_pbitstrmIn -> getBits (1) == 0) ? BASE_LAYER : ENHN_LAYER;
  1048. m_volmd.ihor_sampling_factor_n = 1;
  1049. m_volmd.ihor_sampling_factor_m = 1;
  1050. m_volmd.iver_sampling_factor_n = 1;
  1051. m_volmd.iver_sampling_factor_m = 1;
  1052. if (m_volmd.volType == ENHN_LAYER) {
  1053. //#ifdef _Scalable_SONY_
  1054. m_volmd.iHierarchyType = m_pbitstrmIn->getBits (1); // 
  1055. if(m_volmd.iHierarchyType == 0)
  1056. fprintf(stdout,"Hierarchy_Type == 0 (Spatial scalability)n");
  1057. else if(m_volmd.iHierarchyType == 1)
  1058. fprintf(stdout,"Hierarchy_type == 1 (Temporal scalability)n");
  1059. //#endif _Scalable_SONY_
  1060. m_pbitstrmIn->getBits (4); // ref_layer_id
  1061. m_pbitstrmIn->getBits (1); // ref_layer_samping_director
  1062. m_volmd.ihor_sampling_factor_n = m_pbitstrmIn->getBits (5);
  1063. m_volmd.ihor_sampling_factor_m = m_pbitstrmIn->getBits (5);
  1064. m_volmd.iver_sampling_factor_n = m_pbitstrmIn->getBits (5);
  1065. m_volmd.iver_sampling_factor_m = m_pbitstrmIn->getBits (5);
  1066. m_volmd.iEnhnType     = m_pbitstrmIn->getBits (1); //enhancement_type
  1067. }
  1068. m_volmd.bDeblockFilterDisable = TRUE; //no deblocking filter
  1069. }
  1070. Void CVideoObjectDecoder::FakeOutVOVOLHead (int h, int w, int fr, Bool *pbSpatialScalability)
  1071. {
  1072.   m_volmd.iClockRate = fr;
  1073.   Int iClockRate = m_volmd.iClockRate;
  1074.   assert (iClockRate >= 1 && iClockRate < 65536);
  1075.   for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++) {
  1076.     if (iClockRate == 1)
  1077.       break;
  1078.     iClockRate = (iClockRate >> 1);
  1079.   }
  1080.   m_volmd.bShapeOnly = FALSE;
  1081.   m_volmd.fAUsage = RECTANGLE;
  1082.   m_ivolWidth = w;
  1083.   m_ivolHeight = h;
  1084.   m_vopmd.bInterlace = 0;
  1085.   m_volmd.bAdvPredDisable = 1;
  1086.   m_uiSprite = 0;
  1087.   m_volmd.bNot8Bit = 0;
  1088.   m_volmd.uiQuantPrecision = 5;
  1089.   m_volmd.nBits = 8;
  1090.   m_volmd.fQuantizer = Q_H263;
  1091. #if 0
  1092.   m_volmd.bLoadIntraMatrix = 0;
  1093.   memcpy (m_volmd.rgiIntraQuantizerMatrix, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1094.   m_volmd.bLoadInterMatrix = 0;
  1095.   memcpy (m_volmd.rgiInterQuantizerMatrix, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));
  1096. #endif
  1097.   m_volmd.bComplexityEstimationDisable = 1; // huh ?
  1098.   m_volmd.bDataPartitioning = 0;
  1099.   m_volmd.bReversibleVlc = FALSE;
  1100.   m_volmd.volType = BASE_LAYER;
  1101.   m_volmd.ihor_sampling_factor_n = 1;
  1102.   m_volmd.ihor_sampling_factor_m = 1;
  1103.   m_volmd.iver_sampling_factor_n = 1;
  1104.   m_volmd.iver_sampling_factor_m = 1;
  1105.   m_volmd.bDeblockFilterDisable = TRUE;
  1106.   postVO_VOLHeadInit(w, h, pbSpatialScalability);
  1107. }
  1108. Int BGComposition; // added by Sharp (98/3/24)
  1109. Bool CVideoObjectDecoder::decodeVOPHead ()
  1110. {
  1111. // Start code
  1112.   UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
  1113.   while (uiVopStartCode == GOV_START_CODE ||
  1114.  (uiVopStartCode >= 0 && uiVopStartCode <= 0x1f) ||
  1115.  uiVopStartCode == SESSION_START_CODE ||
  1116.  uiVopStartCode == VISUAL_OBJ_START_CODE ||
  1117.  (uiVopStartCode >= 0x20 && uiVopStartCode <= 0x2f)) {
  1118.     if (uiVopStartCode >= 0 && uiVopStartCode <= 0x1f) {
  1119.       decodeVOBody();
  1120.     } else if (uiVopStartCode >= 0x20 && uiVopStartCode <= 0x2f) {
  1121.       decodeVOLBody();
  1122.     } else 
  1123.       switch (uiVopStartCode) {
  1124.       case GOV_START_CODE: {
  1125. /*Added by SONY (98/03/30)*/
  1126. m_bUseGOV = TRUE;
  1127. m_bLinkisBroken = FALSE;
  1128. /*Added by SONY (98/03/30) End */
  1129. Int timecode;
  1130. timecode = m_pbitstrmIn -> getBits (5) * 3600;
  1131. timecode += m_pbitstrmIn -> getBits (6) * 60;
  1132. m_pbitstrmIn -> getBits (1);
  1133. timecode += m_pbitstrmIn -> getBits (6);
  1134. m_tModuloBaseDecd = timecode;
  1135. m_tModuloBaseDisp = timecode;
  1136. #ifdef DEBUG_OUTPUT
  1137. cout << "GOV Header (t=" << timecode << ")nn";
  1138. #endif
  1139. Int closed_gov = m_pbitstrmIn -> getBits (1);
  1140. Int broken_link = m_pbitstrmIn -> getBits (1);
  1141. /*modified by SONY (98/03/30)*/
  1142. if ((closed_gov == 0)&&(broken_link == 1))
  1143.   m_bLinkisBroken = TRUE;
  1144.       }
  1145.         break;
  1146.       default:
  1147. break;
  1148.       }
  1149. /*modified by SONY (98/03/30) End*/
  1150.     Int err = findStartCode();
  1151.     if (err == EOF) return FALSE;
  1152.     uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
  1153.   }
  1154. //980212
  1155.   if (uiVopStartCode != VOP_START_CODE) {
  1156.     printf("Illegal VOP start code %x found in header", uiVopStartCode);
  1157.   }
  1158. assert(uiVopStartCode == VOP_START_CODE);
  1159. if (m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX) == START_CODE_PREFIX) {
  1160.   return decodeVOPHead();
  1161. }
  1162. m_vopmd.vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);
  1163. // Time reference and VOP_pred_type
  1164. Int iModuloInc = 0;
  1165. while (m_pbitstrmIn -> getBits (1) != 0)
  1166. iModuloInc++;
  1167. Time tCurrSec = iModuloInc + ((m_vopmd.vopPredType != BVOP ||
  1168.   (m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER ))?
  1169. m_tModuloBaseDecd : m_tModuloBaseDisp);
  1170. // Added for error resilient mode by Toshiba(1997-11-14)
  1171. UInt uiMarker = m_pbitstrmIn -> getBits (1);
  1172. assert(uiMarker== 1);
  1173. // End Toshiba(1997-11-14)
  1174. Time tVopIncr = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
  1175. uiMarker = m_pbitstrmIn->getBits (1); // marker bit
  1176. assert(uiMarker ==1);
  1177. m_tOldModuloBaseDecd = m_tModuloBaseDecd;
  1178. m_tOldModuloBaseDisp = m_tModuloBaseDisp;
  1179. if (m_vopmd.vopPredType != BVOP ||
  1180. (m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER ))
  1181. {
  1182. m_tModuloBaseDisp = m_tModuloBaseDecd; //update most recently displayed time base
  1183. m_tModuloBaseDecd = tCurrSec;
  1184. }
  1185.     m_t = tCurrSec * m_volmd.iClockRate*m_iClockRateScale + tVopIncr*m_iClockRateScale;
  1186. if (m_pbitstrmIn->getBits (1) == 0) { //vop_coded == false
  1187. m_vopmd.bInterlace = FALSE; //wchen: temporary solution
  1188. return FALSE;
  1189. }
  1190. if (m_vopmd.vopPredType == PVOP && m_volmd.bShapeOnly==FALSE)
  1191. m_vopmd.iRoundingControl = m_pbitstrmIn->getBits (1); //"VOP_Rounding_Type"
  1192. else
  1193. m_vopmd.iRoundingControl = 0;
  1194. if (m_volmd.fAUsage != RECTANGLE) {
  1195. // Begin: modified by Hughes   4/9/98
  1196.   if (!(m_uiSprite == 1 && m_vopmd.vopPredType == IVOP)) {
  1197. // End: modified by Hughes   4/9/98
  1198. Int width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH);
  1199. // spt VOP assert (width % MB_SIZE == 0); // for sprite, may not be multiple of MB_SIZE
  1200. Int marker;
  1201. marker = m_pbitstrmIn -> getBits (1); // marker bit
  1202. assert(marker==1);
  1203. Int height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT);
  1204. // spt VOP assert (height % MB_SIZE == 0); // for sprite, may not be multiple of MB_SIZE
  1205. marker = m_pbitstrmIn -> getBits (1); // marker bit
  1206. assert(marker==1);
  1207. //wchen: cd changed to 2s complement
  1208. Int left = (m_pbitstrmIn -> getBits (1) == 0) ?
  1209. m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) : 
  1210. ((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1)));
  1211. marker = m_pbitstrmIn -> getBits (1); // marker bit
  1212. assert(marker==1);
  1213. Int top = (m_pbitstrmIn -> getBits (1) == 0) ?
  1214.    m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) : 
  1215.    ((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_VERTICAL_SPA_REF - 1)));
  1216. assert(((left | top)&1)==0); // must be even pix unit
  1217. m_rctCurrVOPY = CRct (left, top, left + width, top + height);
  1218. m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();
  1219.   }
  1220. if ( m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType == 1 ){
  1221. BGComposition = m_pbitstrmIn -> getBits (1); // modified by Sharp (98/3/24)
  1222. // assert(BackgroundComposition==1); // modified by Sharp (98/3/24)
  1223. }
  1224. m_volmd.bNoCrChange = m_pbitstrmIn -> getBits (1); //VOP_CR_Change_Disable
  1225. Int iVopConstantAlpha = m_pbitstrmIn -> getBits (1);
  1226. if(iVopConstantAlpha==1)
  1227. m_vopmd.iVopConstantAlphaValue = m_pbitstrmIn -> getBits (8);
  1228. else
  1229. m_vopmd.iVopConstantAlphaValue = 255;
  1230. m_vopmd.bShapeCodingType = (m_vopmd.vopPredType == IVOP) ? 0 : 1; // Added error resilient mode by Toshiba(1998-1-16)
  1231. }
  1232. // START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 15 Jun 1998
  1233. if (! m_volmd.bComplexityEstimationDisable) {
  1234. if (m_volmd.iEstimationMethod != 0) {
  1235. fprintf (stderr, "ERROR: Unknown estimation method number %d.n", m_volmd.iEstimationMethod);
  1236. exit (1);
  1237. }
  1238. if (m_vopmd.vopPredType == IVOP ||
  1239. m_vopmd.vopPredType == PVOP ||
  1240. m_vopmd.vopPredType == BVOP) {
  1241. if (m_volmd.bOpaque) {
  1242. printf ("dcecs_opaque = %dn", m_vopmd.iOpaque = m_pbitstrmIn -> getBits (8));
  1243. if (m_vopmd.iOpaque == 0) {
  1244. fprintf (stderr, "ERROR: Illegal null value for 'opaque' complexity estimation.n");
  1245. exit (1);
  1246. }
  1247. }
  1248. if (m_volmd.bTransparent) {
  1249. printf ("dcecs_transparent = %dn", m_vopmd.iTransparent = m_pbitstrmIn -> getBits (8));
  1250. if (m_vopmd.iTransparent == 0) {
  1251. fprintf (stderr, "ERROR: Illegal null value for 'transparent' complexity estimation.n");
  1252. exit (1);
  1253. }
  1254. }
  1255. if (m_volmd.bIntraCAE) {
  1256. printf ("dcecs_intra_cae = %dn", m_vopmd.iIntraCAE = m_pbitstrmIn -> getBits (8));
  1257. if (m_vopmd.iIntraCAE == 0) {
  1258. fprintf (stderr, "ERROR: Illegal null value for 'intra_cae' complexity estimation.n");
  1259. exit (1);
  1260. }
  1261. }
  1262. if (m_volmd.bInterCAE) {
  1263. printf ("dcecs_inter_cae = %dn", m_vopmd.iInterCAE = m_pbitstrmIn -> getBits (8));
  1264. if (m_vopmd.iInterCAE == 0) {
  1265. fprintf (stderr, "ERROR: Illegal null value for 'inter_cae' complexity estimation.n");
  1266. exit (1);
  1267. }
  1268. }
  1269. if (m_volmd.bNoUpdate) {
  1270. printf ("dcecs_no_update = %dn", m_vopmd.iNoUpdate = m_pbitstrmIn -> getBits (8));
  1271. if (m_vopmd.iNoUpdate == 0) {
  1272. fprintf (stderr, "ERROR: Illegal null value for 'no_update' complexity estimation.n");
  1273. exit (1);
  1274. }
  1275. }
  1276. if (m_volmd.bUpsampling) {
  1277. printf ("dcecs_upsampling = %dn", m_vopmd.iUpsampling = m_pbitstrmIn -> getBits (8));
  1278. if (m_vopmd.iUpsampling == 0) {
  1279. fprintf (stderr, "ERROR: Illegal null value for 'upsampling' complexity estimation.n");
  1280. exit (1);
  1281. }
  1282. }
  1283. }
  1284. if (m_volmd.bIntraBlocks) {
  1285. printf ("dcecs_intra_blocks = %dn", m_vopmd.iIntraBlocks = m_pbitstrmIn -> getBits (8));
  1286. if (m_vopmd.iIntraBlocks == 0) {
  1287. fprintf (stderr, "ERROR: Illegal null value for 'intra_blocks' complexity estimation.n");
  1288. exit (1);
  1289. }
  1290. }
  1291. if (m_volmd.bNotCodedBlocks) {
  1292. printf ("dcecs_not_coded_blocks = %dn", m_vopmd.iNotCodedBlocks = m_pbitstrmIn -> getBits (8));
  1293. if (m_vopmd.iNotCodedBlocks == 0) {
  1294. fprintf (stderr, "ERROR: Illegal null value for 'not_coded_blocks' complexity estimation.n");
  1295. exit (1);
  1296. }
  1297. }
  1298. if (m_volmd.bDCTCoefs) {
  1299. printf ("dcecs_dct_coefs = %dn", m_vopmd.iDCTCoefs = m_pbitstrmIn -> getBits (8));
  1300. if (m_vopmd.iDCTCoefs == 0) {
  1301. fprintf (stderr, "ERROR: Illegal null value for 'dct_coefs' complexity estimation.n");
  1302. exit (1);
  1303. }
  1304. }
  1305. if (m_volmd.bDCTLines) {
  1306. printf ("dcecs_dct_lines = %dn", m_vopmd.iDCTLines = m_pbitstrmIn -> getBits (8));
  1307. if (m_vopmd.iDCTLines == 0) {
  1308. fprintf (stderr, "ERROR: Illegal null value for 'dct_lines' complexity estimation.n");
  1309. exit (1);
  1310. }
  1311. }
  1312. if (m_volmd.bVLCSymbols) {
  1313. printf ("dcecs_vlc_symbols = %dn", m_vopmd.iVLCSymbols = m_pbitstrmIn -> getBits (8));
  1314. if (m_vopmd.iVLCSymbols == 0) {
  1315. fprintf (stderr, "ERROR: Illegal null value for 'vlc_symbols' complexity estimation.n");
  1316. exit (1);
  1317. }
  1318. }
  1319. if (m_volmd.bVLCBits) {
  1320. printf ("dcecs_vlc_bits = %dn", m_vopmd.iVLCBits = m_pbitstrmIn -> getBits (4));
  1321. if (m_vopmd.iVLCBits == 0) {
  1322. fprintf (stderr, "ERROR: Illegal null value for 'vlc_bits' complexity estimation.n");
  1323. exit (1);
  1324. }
  1325. }
  1326. if (m_vopmd.vopPredType == PVOP ||
  1327. m_vopmd.vopPredType == BVOP ||
  1328. m_vopmd.vopPredType == SPRITE) {
  1329. if (m_volmd.bInterBlocks) {
  1330. printf ("dcecs_inter_blocks = %dn", m_vopmd.iInterBlocks = m_pbitstrmIn -> getBits (8));
  1331. if (m_vopmd.iInterBlocks == 0) {
  1332. fprintf (stderr, "ERROR: Illegal null value for 'inter_blocks' complexity estimation.n");
  1333. exit (1);
  1334. }
  1335. }
  1336. if (m_volmd.bInter4vBlocks) {
  1337. printf ("dcecs_inter4v_blocks = %dn", m_vopmd.iInter4vBlocks = m_pbitstrmIn -> getBits (8));
  1338. if (m_vopmd.iInter4vBlocks == 0) {
  1339. fprintf (stderr, "ERROR: Illegal null value for 'inter4v_blocks' complexity estimation.n");
  1340. exit (1);
  1341. }
  1342. }
  1343. if (m_volmd.bAPM) {
  1344. printf ("dcecs_apm = %dn", m_vopmd.iAPM = m_pbitstrmIn -> getBits (8));
  1345. if (m_vopmd.iAPM == 0) {
  1346. fprintf (stderr, "ERROR: Illegal null value for 'apm' complexity estimation.n");
  1347. exit (1);
  1348. }
  1349. }
  1350. if (m_volmd.bNPM) {
  1351. printf ("dcecs_npm = %dn", m_vopmd.iNPM = m_pbitstrmIn -> getBits (8));
  1352. if (m_vopmd.iNPM == 0) {
  1353. fprintf (stderr, "ERROR: Illegal null value for 'npm' complexity estimation.n");
  1354. exit (1);
  1355. }
  1356. }
  1357. if (m_volmd.bForwBackMCQ) {
  1358. printf ("dcecs_forw_back_mc_q = %dn", m_vopmd.iForwBackMCQ = m_pbitstrmIn -> getBits (8));
  1359. if (m_vopmd.iForwBackMCQ == 0) {
  1360. fprintf (stderr, "ERROR: Illegal null value for 'forw_back_mc_q' complexity estimation.n");
  1361. exit (1);
  1362. }
  1363. }
  1364. if (m_volmd.bHalfpel2) {
  1365. printf ("dcecs_halfpel2 = %dn", m_vopmd.iHalfpel2 = m_pbitstrmIn -> getBits (8));
  1366. if (m_vopmd.iHalfpel2 == 0) {
  1367. fprintf (stderr, "ERROR: Illegal null value for 'halfpel2' complexity estimation.n");
  1368. exit (1);
  1369. }
  1370. }
  1371. if (m_volmd.bHalfpel4) {
  1372. printf ("dcecs_halfpel4 = %dn", m_vopmd.iHalfpel4 = m_pbitstrmIn -> getBits (8));
  1373. if (m_vopmd.iHalfpel4 == 0) {
  1374. fprintf (stderr, "ERROR: Illegal null value for 'halfpel4' complexity estimation.n");
  1375. exit (1);
  1376. }
  1377. }
  1378. }
  1379. if (m_vopmd.vopPredType == BVOP ||
  1380. m_vopmd.vopPredType == SPRITE) {
  1381. if (m_volmd.bInterpolateMCQ) {
  1382. printf ("dcecs_interpolate_mc_q = %dn", m_vopmd.iInterpolateMCQ = m_pbitstrmIn -> getBits (8));
  1383. if (m_vopmd.iInterpolateMCQ == 0) {
  1384. fprintf (stderr, "ERROR: Illegal null value for 'interpolate_mc_q' complexity estimation.n");
  1385. exit (1);
  1386. }
  1387. }
  1388. }
  1389. }
  1390. // END: Complexity Estimation syntax support
  1391. if(m_volmd.bShapeOnly==TRUE)
  1392. {
  1393. m_vopmd.intStep = 10; // probably not needed 
  1394. m_vopmd.intStepI = 10;
  1395. m_vopmd.intStepB = 10;
  1396. m_vopmd.mvInfoForward.uiFCode = m_vopmd.mvInfoBackward.uiFCode = 1; // Modified error resilient mode by Toshiba (1998-1-16)
  1397. m_vopmd.bInterlace = FALSE; //wchen: temporary solution
  1398. return TRUE;
  1399. }
  1400. m_vopmd.iIntraDcSwitchThr = m_pbitstrmIn->getBits (3);
  1401. // INTERLACE
  1402. if (m_vopmd.bInterlace) {
  1403. m_vopmd.bTopFieldFirst = m_pbitstrmIn -> getBits (1);
  1404.         m_vopmd.bAlternateScan = m_pbitstrmIn -> getBits (1);
  1405. assert(m_volmd.volType == BASE_LAYER);
  1406. } else
  1407. // ~INTERLACE
  1408.     {
  1409.         m_vopmd.bAlternateScan = FALSE;
  1410.     }
  1411. if (m_vopmd.vopPredType == IVOP) { 
  1412. m_vopmd.intStepI = m_vopmd.intStep = m_pbitstrmIn -> getBits (m_volmd.uiQuantPrecision); //also assign intStep to be safe
  1413. m_vopmd.mvInfoForward.uiFCode = m_vopmd.mvInfoBackward.uiFCode = 1; // Modified error resilient mode by Toshiba(1998-1-16)
  1414. if(m_volmd.fAUsage == EIGHT_BIT)
  1415. m_vopmd.intStepIAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
  1416. }
  1417. else if (m_vopmd.vopPredType == PVOP) {
  1418. m_vopmd.intStep = m_pbitstrmIn -> getBits (m_volmd.uiQuantPrecision);
  1419. if(m_volmd.fAUsage == EIGHT_BIT)
  1420. m_vopmd.intStepPAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
  1421. m_vopmd.mvInfoForward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  1422. m_vopmd.mvInfoForward.uiScaleFactor = 1 << (m_vopmd.mvInfoForward.uiFCode - 1);
  1423. m_vopmd.mvInfoForward.uiRange = 16 << m_vopmd.mvInfoForward.uiFCode;
  1424. // Added for error resilient mode by Toshiba(1998-1-16)
  1425. m_vopmd.mvInfoBackward.uiFCode = 1;
  1426. // End Toshiba(1998-1-16)
  1427. }
  1428. else if (m_vopmd.vopPredType == BVOP) {
  1429. m_vopmd.intStepB = m_vopmd.intStep = m_pbitstrmIn -> getBits (m_volmd.uiQuantPrecision); //also assign intStep to be safe
  1430. if(m_volmd.fAUsage == EIGHT_BIT)
  1431. m_vopmd.intStepBAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
  1432. m_vopmd.mvInfoForward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  1433. m_vopmd.mvInfoForward.uiScaleFactor = 1 << (m_vopmd.mvInfoForward.uiFCode - 1);
  1434. m_vopmd.mvInfoForward.uiRange = 16 << m_vopmd.mvInfoForward.uiFCode;
  1435. m_vopmd.mvInfoBackward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  1436. m_vopmd.mvInfoBackward.uiScaleFactor = 1 << (m_vopmd.mvInfoBackward.uiFCode - 1);
  1437. m_vopmd.mvInfoBackward.uiRange = 16 << m_vopmd.mvInfoBackward.uiFCode;
  1438. }
  1439. // Added for error resilient mode by Toshiba(1997-11-14)
  1440. m_vopmd.bShapeCodingType = 1;
  1441. if ( m_volmd.volType == BASE_LAYER ) // added by Sharp (98/4/13)
  1442.         if (m_volmd.fAUsage != RECTANGLE && m_vopmd.vopPredType != IVOP
  1443. && m_uiSprite != 1)
  1444. {
  1445. m_vopmd.bShapeCodingType = m_pbitstrmIn -> getBits (1);
  1446.         }
  1447. // End Toshiba(1997-11-14)
  1448. if(m_volmd.volType == ENHN_LAYER) { //sony
  1449. if( m_volmd.iEnhnType == 1 ){
  1450. m_vopmd.iLoadBakShape = m_pbitstrmIn -> getBits (1); // load_backward_shape
  1451. if(m_vopmd.iLoadBakShape){
  1452. CVOPU8YUVBA* pvopcCurr = new CVOPU8YUVBA (*(rgpbfShape [0]->pvopcReconCurr()));
  1453. copyVOPU8YUVBA(rgpbfShape [1]->m_pvopcRefQ1, pvopcCurr);
  1454. // previous backward shape is saved to current forward shape
  1455. rgpbfShape [1]->m_rctCurrVOPY.left   = rgpbfShape [0]->m_rctCurrVOPY.left;
  1456. rgpbfShape [1]->m_rctCurrVOPY.right  = rgpbfShape [0]->m_rctCurrVOPY.right;
  1457. rgpbfShape [1]->m_rctCurrVOPY.top    = rgpbfShape [0]->m_rctCurrVOPY.top;
  1458. rgpbfShape [1]->m_rctCurrVOPY.bottom = rgpbfShape [0]->m_rctCurrVOPY.bottom;
  1459. Int width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH); assert (width % MB_SIZE == 0); // has to be multiples of MB_SIZE
  1460. UInt uiMark = m_pbitstrmIn -> getBits (1);
  1461. assert (uiMark == 1);
  1462. Int height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT); assert (height % MB_SIZE == 0); // has to be multiples of MB_SIZE
  1463. uiMark = m_pbitstrmIn -> getBits (1);
  1464. assert (uiMark == 1);
  1465. width = ((width+15)>>4)<<4; // not needed if the asserts are present
  1466. height = ((height+15)>>4)<<4;
  1467. Int iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
  1468. Int left = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1);
  1469. Int marker = m_pbitstrmIn -> getBits (1); // marker bit
  1470. iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
  1471. Int top = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1);
  1472. rgpbfShape[0]->m_rctCurrVOPY = CRct (left, top, left + width, top + height);
  1473. rgpbfShape[0]->m_rctCurrVOPUV = rgpbfShape[0]->m_rctCurrVOPY.downSampleBy2 ();
  1474. // decode backward shape
  1475. rgpbfShape[0]->setRefStartingPointers ();
  1476. rgpbfShape[0]->compute_bfShapeMembers (); // clear m_pvopcRefQ1
  1477. rgpbfShape[0]->resetBYPlane ();// clear BY of RefQ1 (katata)
  1478. rgpbfShape[0]->m_volmd.bShapeOnly = TRUE;
  1479. rgpbfShape[0]->m_volmd.bNoCrChange = m_volmd.bNoCrChange; // set CR change disable(Oct. 9 1997)
  1480. rgpbfShape[0]->m_vopmd.bInterlace = FALSE;
  1481. rgpbfShape[0]->decodeIVOP_WithShape ();
  1482. m_vopmd.iLoadForShape = m_pbitstrmIn -> getBits (1); // load_forward_shape
  1483. if(m_vopmd.iLoadForShape){
  1484. width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH); assert (width % MB_SIZE == 0); // has to be multiples of MB_SIZE
  1485. uiMark = m_pbitstrmIn -> getBits (1);
  1486. assert (uiMark == 1);
  1487. height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT); assert (height % MB_SIZE == 0); // has to be multiples of MB_SIZE
  1488. uiMark = m_pbitstrmIn -> getBits (1);
  1489. assert (uiMark == 1);
  1490. width = ((width+15)>>4)<<4; // not needed if the asserts are present
  1491. height = ((height+15)>>4)<<4;
  1492. iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
  1493. left = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1);
  1494. marker = m_pbitstrmIn -> getBits (1); // marker bit
  1495. iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
  1496. top = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1);
  1497. rgpbfShape[1]->m_rctCurrVOPY = CRct (left, top, left + width, top + height);
  1498. rgpbfShape[1]->m_rctCurrVOPUV = rgpbfShape[1]->m_rctCurrVOPY.downSampleBy2 ();
  1499. // decode forward shape
  1500. rgpbfShape[1]->setRefStartingPointers ();
  1501. rgpbfShape[1]->compute_bfShapeMembers (); // clear m_pvopcRefQ1
  1502. rgpbfShape[1]->resetBYPlane ();// clear BY of RefQ1 (katata)
  1503. rgpbfShape[1]->m_volmd.bShapeOnly = TRUE;
  1504. rgpbfShape[1]->m_volmd.bNoCrChange = m_volmd.bNoCrChange; // set CR change disable(Oct. 9 1997)
  1505. rgpbfShape[1]->m_vopmd.bInterlace = FALSE;
  1506. rgpbfShape[1]->decodeIVOP_WithShape ();
  1507. }
  1508. } // end of "if(m_vopmd.iLoadBakShape)"
  1509. else
  1510. m_vopmd.iLoadForShape = 0; // no forward shape when backward shape is not decoded
  1511. }
  1512. else {
  1513. m_vopmd.iLoadForShape = 0;
  1514. m_vopmd.iLoadBakShape = 0;
  1515. }
  1516.         m_vopmd.iRefSelectCode = m_pbitstrmIn ->getBits (2) ;
  1517. }
  1518. return TRUE;
  1519. }
  1520. //added by sony for spatial scalability decoding loop
  1521. Int CVideoObjectDecoder::ReadNextVopPredType ()
  1522. {
  1523. m_pbitstrmIn -> setBookmark ();
  1524. if (findStartCode () == EOF) {
  1525. m_pbitstrmIn -> gotoBookmark ();
  1526. return EOF;
  1527. }
  1528. // Start code
  1529. UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
  1530. assert(uiVopStartCode == VOP_START_CODE);
  1531. Int vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);
  1532. // Time reference and VOP_pred_type
  1533. m_pbitstrmIn -> gotoBookmark ();
  1534. return(vopPredType);
  1535. }
  1536. Void CVideoObjectDecoder::errorInBitstream (Char* rgchErorrMsg)
  1537. {
  1538. fprintf (stderr, "%s at %dn", rgchErorrMsg, 0);
  1539. assert (FALSE);
  1540. exit (1);
  1541. }
  1542. // Added by Sharp(1998-02-10)
  1543. void CVideoObjectDecoder::updateBuffVOPsBase (
  1544. CVideoObjectDecoder* pvodecEnhc
  1545. )
  1546. {
  1547. switch(m_vopmd.vopPredType) {
  1548. case IVOP:
  1549. if (!pvodecEnhc -> m_pBuffP2 -> empty ()) // added by Sharp (98/3/11)
  1550. if ( pvodecEnhc -> m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1551. pvodecEnhc -> m_pBuffP1 -> copyBuf (*(pvodecEnhc -> m_pBuffP2)); // added by Sharp (98/3/11)
  1552. pvodecEnhc -> m_pBuffP2 -> getBuf (this);
  1553. break;
  1554. case PVOP:
  1555. if ( pvodecEnhc -> m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1556. pvodecEnhc -> m_pBuffP1 -> copyBuf (*(pvodecEnhc -> m_pBuffP2));
  1557. pvodecEnhc -> m_pBuffP2 -> getBuf (this);
  1558. break;
  1559. case BVOP:
  1560. if(!(pvodecEnhc -> m_pBuffB2 -> empty ())) {
  1561. if ( pvodecEnhc -> m_pBuffB2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1562. pvodecEnhc -> m_pBuffB1 -> copyBuf (*(pvodecEnhc -> m_pBuffB2));
  1563. }
  1564. pvodecEnhc -> m_pBuffB2 -> getBuf (this);
  1565. break;
  1566. default: exit(1);
  1567. }
  1568. }
  1569. void CVideoObjectDecoder::updateRefVOPsEnhc ()
  1570. {
  1571. Int tQ0 = 0, tQ1 = 0;
  1572. switch(m_vopmd.vopPredType) {
  1573. case IVOP: // printf(" Not defined in updateRefVOPsEnhc. n");  exit(1); // deleted by Sharp (99/1/25)
  1574. break; // added by Sharp (99/1/25)
  1575. case PVOP:
  1576. switch(m_vopmd.iRefSelectCode) {
  1577. case 0: m_pBuffE -> putBufToQ0 (this);  tQ0 = m_pBuffE -> m_t;
  1578. break;
  1579. case 1: if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
  1580. else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
  1581. break;
  1582. case 2: if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ0 (this); tQ0 = m_pBuffB2 -> m_t; }
  1583. else { m_pBuffP2 -> putBufToQ0 (this); tQ0 = m_pBuffP2 -> m_t; }
  1584. break;
  1585. case 3: // printf(" For Spatial Scalability -- Not definedn"); exit(1);
  1586. if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
  1587. else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
  1588. break;
  1589. }
  1590. m_tPastRef   = tQ0;
  1591. break;
  1592. case BVOP:
  1593. switch(m_vopmd.iRefSelectCode) {
  1594. case 0: // printf(" For Spatial Scalability -- Not definedn"); exit(1);
  1595. m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
  1596. if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ1 (this); tQ1 = m_pBuffB1 -> m_t; }
  1597. else { m_pBuffP1 -> putBufToQ1 (this); tQ1 = m_pBuffP1 -> m_t; }
  1598. break;
  1599. case 1: m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
  1600. if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ1 (this); tQ1 = m_pBuffB1 -> m_t; }
  1601. else { m_pBuffP1 -> putBufToQ1 (this); tQ1 = m_pBuffP1 -> m_t; }
  1602. break;
  1603. case 2: m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
  1604. if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ1 (this); tQ1 = m_pBuffB2 -> m_t; }
  1605. else { m_pBuffP2 -> putBufToQ1 (this); tQ1 = m_pBuffP2 -> m_t; }
  1606. break;
  1607. case 3: if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
  1608. else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
  1609. if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ1 (this); tQ1 = m_pBuffB2 -> m_t; }
  1610. else { m_pBuffP2 -> putBufToQ1 (this); tQ1 = m_pBuffP2 -> m_t; }
  1611. m_iBCount = (getTime () - tQ0);
  1612. break;
  1613. }
  1614. m_tPastRef   = tQ0;
  1615. m_tFutureRef = tQ1;
  1616. break;
  1617. default: exit(1);
  1618. }
  1619. }
  1620. void CVideoObjectDecoder::updateBuffVOPsEnhc ()
  1621. {
  1622. if ( this -> m_bCodedFutureRef == 1 ){ // added by Sharp (99/1/28)
  1623. switch(m_vopmd.vopPredType) {
  1624. case IVOP: // printf(" Not defined in updateBuffVOPsEnhc. n");  exit(1); // deleted by Sharp (99/1/25)
  1625.         m_pBuffE -> getBuf (this); // added by Sharp (99/1/22)
  1626. break; //added by Sharp (99/1/25)
  1627. case PVOP: m_pBuffE -> getBuf (this);
  1628. break;
  1629. case BVOP: m_pBuffE -> getBuf (this);
  1630. break;
  1631. default: exit(1);
  1632. }
  1633. } // added by Sharp (99/1/28)
  1634. }
  1635. void CVideoObjectDecoder::bufferB2flush ()
  1636. {
  1637. if (!(m_pBuffB2 -> empty ())) {
  1638. if ( m_pBuffB2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1639. m_pBuffB1 -> copyBuf (*m_pBuffB2);
  1640. m_pBuffB2 -> dispose ();
  1641. }
  1642. }
  1643. /* Added */
  1644. void CVideoObjectDecoder::set_enh_display_size(CRct rctDisplay, CRct *rctDisplay_SSenh)
  1645. {
  1646. float tmp_right,tmp_left,tmp_top,tmp_bottom,tmp_width;
  1647. tmp_right = (float) rctDisplay.right * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
  1648. tmp_left  = (float) rctDisplay.left  * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
  1649. tmp_width = (float) rctDisplay.width * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
  1650. tmp_top     = (float) rctDisplay.top * ((float) m_volmd.iver_sampling_factor_n / m_volmd.iver_sampling_factor_m);
  1651. tmp_bottom  = (float) rctDisplay.bottom  * ((float) m_volmd.iver_sampling_factor_n / m_volmd.iver_sampling_factor_m);
  1652. rctDisplay_SSenh->right  = (Int) tmp_right;
  1653. rctDisplay_SSenh->left   = (Int) tmp_left;
  1654. rctDisplay_SSenh->width  = (Int) tmp_width;
  1655. rctDisplay_SSenh->top    = (Int) tmp_top;
  1656. rctDisplay_SSenh->bottom = (Int) tmp_bottom;
  1657. }
  1658. void CVideoObjectDecoder::bufferB1flush ()
  1659. {
  1660. m_pBuffB1 -> dispose ();
  1661. }
  1662. void CVideoObjectDecoder::bufferP1flush ()
  1663. {
  1664. m_pBuffP1 -> dispose ();
  1665. }
  1666. void CVideoObjectDecoder::copyBufP2ToB1 ()
  1667. {
  1668. if ( m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
  1669. m_pBuffB1 -> copyBuf (*m_pBuffP2);
  1670. }
  1671. void CVideoObjectDecoder::copyRefQ1ToQ0 ()
  1672. {
  1673. copyVOPU8YUVBA(m_pvopcRefQ0, m_pvopcRefQ1);
  1674. }
  1675. Time CVideoObjectDecoder::senseTime ()
  1676. {
  1677. m_pbitstrmIn -> setBookmark ();
  1678. if (findStartCode () == EOF) {
  1679. m_pbitstrmIn -> gotoBookmark ();
  1680. return EOF;
  1681. }
  1682. // Start code
  1683. UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
  1684. if (uiVopStartCode == GOV_START_CODE) {
  1685. m_bUseGOV = TRUE;
  1686. m_bLinkisBroken = FALSE;
  1687. Int timecode;
  1688. timecode = m_pbitstrmIn -> getBits (5) * 3600;
  1689. timecode += m_pbitstrmIn -> getBits (6) * 60;
  1690. m_pbitstrmIn -> getBits (1);
  1691. timecode += m_pbitstrmIn -> getBits (6);
  1692. m_tModuloBaseDecd = timecode;
  1693. m_tModuloBaseDisp = timecode;
  1694. Int closed_gov = m_pbitstrmIn -> getBits (1);
  1695. Int broken_link = m_pbitstrmIn -> getBits (1);
  1696. if ((closed_gov == 0)&&(broken_link == 1))
  1697. m_bLinkisBroken = TRUE;
  1698. findStartCode();
  1699. /*
  1700. m_pbitstrmIn -> getBits (4);
  1701. Int uiPrefix = m_pbitstrmIn -> getBits (NUMBITS_START_CODE_PREFIX);
  1702. assert(uiPrefix == START_CODE_PREFIX);
  1703. */
  1704. uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
  1705. }
  1706. assert(uiVopStartCode == VOP_START_CODE);
  1707. m_vopmd.vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);
  1708. // Time reference and VOP_pred_type
  1709. Int iModuloInc = 0;
  1710. while (m_pbitstrmIn -> getBits (1) != 0)
  1711. iModuloInc++;
  1712. Time tCurrSec = iModuloInc + ((m_vopmd.vopPredType != BVOP || 
  1713. (m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER )) ?
  1714. m_tModuloBaseDecd : m_tModuloBaseDisp);
  1715. UInt uiMarker = m_pbitstrmIn -> getBits (1);
  1716. assert(uiMarker == 1);
  1717. Time tVopIncr = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
  1718. m_pbitstrmIn -> gotoBookmark ();
  1719. Time t = tCurrSec * m_volmd.iClockRate*m_iClockRateScale + tVopIncr*m_iClockRateScale;
  1720. return(t);
  1721. }
  1722. Time CVideoObjectDecoder::getTime ()
  1723. {
  1724. return m_t;
  1725. }
  1726. int CVideoObjectDecoder::getPredType ()
  1727. {
  1728. return m_vopmd.vopPredType;
  1729. }
  1730. Void CVideoObjectDecoder::BackgroundComposition(char* argv[], Bool bScalability, Int width, Int height, FILE *pfYUV) // modified by Sharp (98/10/26)
  1731. {
  1732.     Int iFrame = getTime (); // current frame nubmer
  1733.     Int iPrev; // previous base frame 
  1734.     Int iNext; // next     base frame 
  1735.     if(!(m_pBuffB1 -> empty ()))  iPrev = m_pBuffB1 -> m_t;
  1736.     else           iPrev = m_pBuffP1 -> m_t;
  1737.     if(!(m_pBuffB2 -> empty ()))  iNext = m_pBuffB2 -> m_t;
  1738.     else           iNext = m_pBuffP2 -> m_t;
  1739.     Void convertYuv(const CVOPU8YUVBA* pvopcSrc, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height);
  1740.     Void convertSeg(const CVOPU8YUVBA* pvopcSrc, PixelC* destBY,PixelC* destBUV,              Int width, Int height,
  1741.     Int left, Int right, Int top, Int bottom
  1742.     );
  1743.     Void bg_comp_each(PixelC* curr, PixelC* prev, PixelC* next, PixelC* mask_curr, PixelC* mask_prev, PixelC* mask_next, 
  1744.       Int curr_t, Int prev_t, Int next_t, Int width, Int height, Int CoreMode); // modified by Sharp (98/3/24)
  1745.     Void inv_convertYuv(const CVOPU8YUVBA* pvopcSrc, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height);
  1746.     //Void write420(Int num, char *name, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height);
  1747.     Void write420_sep(Int num, char *name, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height); // modified by Sharp (98/10/26)
  1748.     Void write420_jnt(FILE *pfYUV, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height); // added by Sharp (98/10/26)
  1749.     Void write_seg_test(Int num, char *name, PixelC* destY, Int width, Int height);
  1750.     PixelC* currY = new PixelC [width*height];
  1751.     PixelC* currU = new PixelC [width*height/4];
  1752.     PixelC* currV = new PixelC [width*height/4];
  1753.     PixelC* currBY  = new PixelC [width*height];
  1754.     PixelC* currBUV = new PixelC [width*height/4];
  1755.     PixelC* prevY = new PixelC [width*height];
  1756.     PixelC* prevU = new PixelC [width*height/4];
  1757.     PixelC* prevV = new PixelC [width*height/4];
  1758.     PixelC* prevBY  = new PixelC [width*height];
  1759.     PixelC* prevBUV = new PixelC [width*height/4];
  1760.     PixelC* nextY = new PixelC [width*height];
  1761.     PixelC* nextU = new PixelC [width*height/4];
  1762.     PixelC* nextV = new PixelC [width*height/4];
  1763.     PixelC* nextBY  = new PixelC [width*height];
  1764.     PixelC* nextBUV = new PixelC [width*height/4];
  1765.     // current frame
  1766.     convertYuv(pvopcReconCurr(), currY, currU, currV, width, height);
  1767.     if(pvopcReconCurr ()->pixelsBY () != NULL)
  1768.       convertSeg(pvopcReconCurr(), currBY, currBUV, width, height,
  1769.        m_rctCurrVOPY.left,
  1770.        m_rctCurrVOPY.right,
  1771.        m_rctCurrVOPY.top,
  1772.        m_rctCurrVOPY.bottom); /* forward shape */
  1773.     // previouse frame
  1774.     if(!(m_pBuffB1 -> empty ()))
  1775.       convertYuv(m_pBuffB1->m_pvopcBuf, prevY, prevU, prevV, width, height);
  1776.     else
  1777.       convertYuv(m_pBuffP1->m_pvopcBuf, prevY, prevU, prevV, width, height);
  1778.     convertSeg(rgpbfShape [1]->pvopcReconCurr (), prevBY, prevBUV, width, height,
  1779.        rgpbfShape [1]->m_rctCurrVOPY.left,
  1780.        rgpbfShape [1]->m_rctCurrVOPY.right,
  1781.        rgpbfShape [1]->m_rctCurrVOPY.top,
  1782.        rgpbfShape [1]->m_rctCurrVOPY.bottom); // forward shape
  1783. //    write_test(iPrev, "bbb", prevY, prevU, prevV, width, height);
  1784. //    write_seg_test(iPrev, "bbb", prevBY, width, height);
  1785.     // next frame
  1786.     if(!(m_pBuffB2 -> empty ()))
  1787.       convertYuv(m_pBuffB2->m_pvopcBuf, nextY, nextU, nextV, width, height);
  1788.     else
  1789.       convertYuv(m_pBuffP2->m_pvopcBuf, nextY, nextU, nextV, width, height);
  1790.     convertSeg(rgpbfShape [0]->pvopcReconCurr (), nextBY, nextBUV, width, height,
  1791.        rgpbfShape [0]->m_rctCurrVOPY.left,
  1792.        rgpbfShape [0]->m_rctCurrVOPY.right,
  1793.        rgpbfShape [0]->m_rctCurrVOPY.top,
  1794.        rgpbfShape [0]->m_rctCurrVOPY.bottom); // backward shape
  1795. //    write_test(iNext, "bbb", nextY, nextU, nextV, width, height);
  1796. //    write_seg_test(iNext, "bbb", nextBY, width, height);
  1797. // begin: modified by Sharp (98/3/24)
  1798.     bg_comp_each(currY, prevY, nextY, currBY,  prevBY,  nextBY,  iFrame, iPrev, iNext, width,   height, BGComposition == 0);
  1799.     bg_comp_each(currU, prevU, nextU, currBUV, prevBUV, nextBUV, iFrame, iPrev, iNext, width/2, height/2, BGComposition == 0);
  1800.     bg_comp_each(currV, prevV, nextV, currBUV, prevBUV, nextBUV, iFrame, iPrev, iNext, width/2, height/2, BGComposition == 0);
  1801. // end: modified by Sharp (98/3/24)
  1802. //    inv_convertYuv(pvopcReconCurr(), currY, currU, currV, width, height);
  1803. // write background compsition image
  1804. #ifdef __OUT_ONE_FRAME_ // added by Sharp (98/10/26)
  1805. static Char pchYUV [100];
  1806. sprintf (pchYUV, "%s.yuv", argv [2 + bScalability]); // modified by Sharp (98/10/26)
  1807.     write420_sep(iFrame, pchYUV, currY, currU, currV, width, height);
  1808. // begin: added by Sharp (98/10/26)
  1809. #else
  1810.     write420_jnt(pfYUV, currY, currU, currV, width, height);
  1811. #endif
  1812. // end: added by Sharp (98/10/26)
  1813.     delete currY;
  1814.     delete currU;
  1815.     delete currV;
  1816.     delete currBY;
  1817.     delete currBUV;
  1818.     delete prevY;
  1819.     delete prevU;
  1820.     delete prevV;
  1821.     delete prevBY;
  1822.     delete prevBUV;
  1823.     delete nextY;
  1824.     delete nextU;
  1825.     delete nextV;
  1826.     delete nextBY;
  1827.     delete nextBUV;
  1828. }
  1829. Void CVideoObjectDecoder::dumpDataOneFrame(char* argv[], Bool bScalability, CRct& rctDisplay)
  1830. {
  1831. Int iFrame = getTime ();
  1832. // cout << "n=== write with Sharp's format : frame no. = " << iFrame << "n";
  1833. static Char pchYUV [100], pchSeg [100];
  1834. // if(m_volmd.volType == BASE_LAYER) { // deleted by Sharp (98/11/11)
  1835. sprintf (pchYUV, "%s.yuv", argv [2 + bScalability]);
  1836. // begin: added by Sharp (99/1/25)
  1837. if ( m_volmd.iEnhnType == 1 && m_volmd.volType == ENHN_LAYER )
  1838. sprintf (pchSeg, "%s_e.seg", argv [2 + bScalability]);
  1839. else
  1840. // end: added by Sharp (99/1/25)
  1841. sprintf (pchSeg, "%s.seg", argv [2 + bScalability]);
  1842. // begin: deleted by Sharp (98/11/11)
  1843. // }
  1844. // else {
  1845. // sprintf (pchYUV, "%s_e.yuv", argv [2 + bScalability]);
  1846. // sprintf (pchSeg, "%s_e.seg", argv [2 + bScalability]);
  1847. // }
  1848. // end: deleted by Sharp (98/11/11)
  1849. sprintf (pchYUV, "%s%d", pchYUV, iFrame);
  1850. sprintf (pchSeg, "%s%d", pchSeg, iFrame);
  1851. FILE* pfYuvDst = fopen(pchYUV, "wb");
  1852. const CVOPU8YUVBA* pvopcQuant = pvopcReconCurr ();
  1853. if ( m_volmd.iEnhnType != 1 ){ // added by Sharp (99/1/18)
  1854. pvopcQuant->getPlane (Y_PLANE)->dump (pfYuvDst, rctDisplay);
  1855. pvopcQuant->getPlane (U_PLANE)->dump (pfYuvDst, rctDisplay / 2);
  1856. pvopcQuant->getPlane (V_PLANE)->dump (pfYuvDst, rctDisplay / 2);
  1857. } // added by Sharp (99/1/18)
  1858. fclose(pfYuvDst);
  1859. if (m_volmd.fAUsage != RECTANGLE) {
  1860. FILE* pfSegDst = fopen(pchSeg, "wb");
  1861. pvopcQuant->getPlane (BY_PLANE)->dump (pfSegDst, rctDisplay, m_vopmd.iVopConstantAlphaValue);
  1862. fclose(pfSegDst);
  1863. }
  1864. }
  1865. Void CVideoObjectDecoder::dumpDataAllFrame(FILE* pfReconYUV, FILE* pfReconSeg, CRct& rctDisplay)
  1866. {
  1867. const CVOPU8YUVBA* pvopcQuant = pvopcReconCurr ();
  1868.   if ( m_volmd.iEnhnType != 1 ){ // added by Sharp (99/1/18)
  1869. pvopcQuant->getPlane (Y_PLANE)->dump (pfReconYUV, rctDisplay);
  1870. pvopcQuant->getPlane (U_PLANE)->dump (pfReconYUV, rctDisplay / 2);
  1871. pvopcQuant->getPlane (V_PLANE)->dump (pfReconYUV, rctDisplay / 2);
  1872. } // added by Sharp (99/1/18)
  1873. if (m_volmd.fAUsage != RECTANGLE)
  1874. pvopcQuant->getPlane (BY_PLANE)->dump (pfReconSeg, rctDisplay, m_vopmd.iVopConstantAlphaValue);
  1875. }
  1876. void CVideoObjectDecoder::copyTobfShape ()
  1877. {
  1878.             rgpbfShape[0]->m_pistrm      = m_pistrm;
  1879.             rgpbfShape[0]->m_pbitstrmIn  = m_pbitstrmIn;
  1880.             rgpbfShape[0]->m_pentrdecSet = m_pentrdecSet;
  1881.             rgpbfShape[1]->m_pistrm      = m_pistrm;
  1882.             rgpbfShape[1]->m_pbitstrmIn  = m_pbitstrmIn;
  1883.             rgpbfShape[1]->m_pentrdecSet = m_pentrdecSet;
  1884. }
  1885. // begin: added by Sharp (98/6/26)
  1886. void CVideoObjectDecoder::setClockRateScale ( CVideoObjectDecoder *pvopdec )
  1887. {
  1888. m_iClockRateScale = pvopdec->m_volmd.iClockRate / m_volmd.iClockRate;
  1889. }
  1890. // end: added by Sharp (98/6/26)
  1891. /******************************************
  1892. *** class CEnhcBufferDecoder ***
  1893. ******************************************/
  1894. CEnhcBufferDecoder::CEnhcBufferDecoder (Int iSessionWidth, Int iSessionHeight)
  1895. : CEnhcBuffer (iSessionWidth, iSessionHeight)
  1896. {
  1897. }
  1898. Void CEnhcBufferDecoder::copyBuf (const CEnhcBufferDecoder& srcBuf)
  1899. {
  1900. m_iNumMBRef = srcBuf.m_iNumMBRef;
  1901. m_iNumMBXRef = srcBuf.m_iNumMBXRef;
  1902. m_iNumMBYRef = srcBuf.m_iNumMBYRef;
  1903. m_iOffsetForPadY = srcBuf.m_iOffsetForPadY;
  1904. m_iOffsetForPadUV = srcBuf.m_iOffsetForPadUV;
  1905. m_rctPrevNoExpandY = srcBuf.m_rctPrevNoExpandY;
  1906. m_rctPrevNoExpandUV = srcBuf.m_rctPrevNoExpandUV;
  1907. m_rctRefVOPY0 = srcBuf.m_rctRefVOPY0;
  1908. m_rctRefVOPUV0 = srcBuf.m_rctRefVOPUV0;
  1909. m_rctRefVOPY1 = srcBuf.m_rctRefVOPY1;
  1910. m_rctRefVOPUV1 = srcBuf.m_rctRefVOPUV1;
  1911. m_bCodedFutureRef = srcBuf.m_bCodedFutureRef; // added by Sharp (99/1/26)
  1912. CMBMode* pmbmdRefSrc = srcBuf.m_rgmbmdRef;
  1913. CMBMode* pmbmdRef    = m_rgmbmdRef;
  1914. CMotionVector* pmvRefSrc = srcBuf.m_rgmvRef;
  1915. CMotionVector* pmvRef = m_rgmvRef;
  1916. // TPS FIX
  1917. Int iMaxIndex = max(PVOP_MV_PER_REF_PER_MB, 2*BVOP_MV_PER_REF_PER_MB);
  1918. for (Int iMB=0; iMB<m_iNumMBRef; iMB++){
  1919. *pmbmdRef = *pmbmdRefSrc;
  1920. pmbmdRef++;
  1921. pmbmdRefSrc++;
  1922. // TPS FIX
  1923. for (Int iVecIndex=0; iVecIndex<iMaxIndex; iVecIndex++ ){
  1924. *pmvRef = *pmvRefSrc;
  1925. pmvRef++;
  1926. pmvRefSrc++;
  1927. }
  1928. }
  1929. CVOPU8YUVBA* pvop = srcBuf.m_pvopcBuf;
  1930. delete m_pvopcBuf;
  1931. m_pvopcBuf = NULL;
  1932. m_pvopcBuf = new CVOPU8YUVBA( *pvop );
  1933. m_t = srcBuf.m_t;
  1934. }
  1935. Void CEnhcBufferDecoder::getBuf(CVideoObjectDecoder* pvopc)  // get params from Base layer
  1936. {
  1937. // assert(pvopc->m_volmd.volType == BASE_LAYER);
  1938. CMBMode* pmbmdRef;
  1939. CMBMode* pmbmdRefSrc;
  1940. CMotionVector* pmvRef;
  1941. CMotionVector* pmvRefSrc;
  1942. m_bCodedFutureRef = pvopc->m_bCodedFutureRef; // added by Sharp (99/1/26)
  1943. if ( pvopc->m_vopmd.vopPredType != BVOP ){
  1944. pmbmdRef = m_rgmbmdRef;
  1945. pmbmdRefSrc = pvopc->m_rgmbmdRef;
  1946. pmvRef = m_rgmvRef;
  1947. pmvRefSrc = pvopc->m_rgmvRef;
  1948. m_iNumMBRef = pvopc->m_iNumMBRef;
  1949. m_iNumMBXRef = pvopc->m_iNumMBXRef;
  1950. m_iNumMBYRef = pvopc->m_iNumMBYRef;
  1951. }
  1952. else {
  1953. pmbmdRef = m_rgmbmdRef;
  1954. pmbmdRefSrc = pvopc->m_rgmbmd;
  1955. pmvRef = m_rgmvRef;
  1956. pmvRefSrc = pvopc->m_rgmv;
  1957. m_iNumMBRef = pvopc->m_iNumMB;
  1958. m_iNumMBXRef = pvopc->m_iNumMBX;
  1959. m_iNumMBYRef = pvopc->m_iNumMBY;
  1960. }
  1961. // TPS FIX
  1962. Int iMaxIndex = max(PVOP_MV_PER_REF_PER_MB, 2*BVOP_MV_PER_REF_PER_MB);
  1963. for (Int iMB=0; iMB<m_iNumMBRef; iMB++ ) {
  1964. *pmbmdRef = *pmbmdRefSrc;
  1965. pmbmdRef++;
  1966. pmbmdRefSrc++;
  1967. // TPS FIX
  1968. for (Int iVecIndex=0; iVecIndex<iMaxIndex; iVecIndex++ ){
  1969. *pmvRef = *pmvRefSrc;
  1970. pmvRef++;
  1971. pmvRefSrc++;
  1972. }
  1973. }
  1974. ///// 97/12/22 start
  1975. m_t = pvopc->m_t;
  1976. delete m_pvopcBuf;
  1977. m_pvopcBuf = NULL;
  1978. m_pvopcBuf = new CVOPU8YUVBA( *(pvopc->pvopcReconCurr()) );
  1979. if ( pvopc->m_vopmd.vopPredType != BVOP ) {
  1980. m_iOffsetForPadY = pvopc->m_iOffsetForPadY;
  1981. m_iOffsetForPadUV = pvopc->m_iOffsetForPadUV;
  1982. m_rctPrevNoExpandY = pvopc->m_rctPrevNoExpandY;
  1983. m_rctPrevNoExpandUV = pvopc->m_rctPrevNoExpandUV;
  1984. m_rctRefVOPY1 = pvopc->m_rctRefVOPY1;
  1985. m_rctRefVOPUV1 = pvopc->m_rctRefVOPUV1;
  1986. }
  1987. else {
  1988. m_iOffsetForPadY = pvopc->m_iBVOPOffsetForPadY;
  1989. m_iOffsetForPadUV = pvopc->m_iBVOPOffsetForPadUV;
  1990. m_rctPrevNoExpandY = pvopc->m_rctBVOPPrevNoExpandY;
  1991. m_rctPrevNoExpandUV = pvopc->m_rctBVOPPrevNoExpandUV;
  1992. m_rctRefVOPY1 = pvopc->m_rctBVOPRefVOPY1;
  1993. m_rctRefVOPUV1 = pvopc->m_rctBVOPRefVOPUV1;
  1994. }
  1995. ///// 97/12/22 end
  1996. }
  1997. Void CEnhcBufferDecoder::putBufToQ0(CVideoObjectDecoder* pvopc)  // store params to Enhancement layer pvopcRefQ0
  1998. {
  1999. assert(pvopc->m_volmd.volType == ENHN_LAYER);
  2000. delete pvopc->m_pvopcRefQ0;
  2001. pvopc->m_pvopcRefQ0 = NULL;
  2002. pvopc->m_pvopcRefQ0 = new CVOPU8YUVBA ( *m_pvopcBuf );
  2003. pvopc->m_bCodedFutureRef = m_bCodedFutureRef; // added by Sharp (99/1/26)
  2004. if ( pvopc->m_volmd.iEnhnType == 1  &&
  2005. (((pvopc->m_vopmd.iRefSelectCode == 1 || pvopc->m_vopmd.iRefSelectCode == 2) && pvopc->m_vopmd.vopPredType == PVOP) ||
  2006.  (pvopc->m_vopmd.iRefSelectCode == 3 && pvopc->m_vopmd.vopPredType == BVOP))
  2007. )
  2008. {
  2009. CRct rctRefFrameYTemp = pvopc->m_rctRefFrameY;
  2010. CRct rctRefFrameUVTemp = pvopc->m_rctRefFrameUV;
  2011. rctRefFrameYTemp.expand(-EXPANDY_REF_FRAME);
  2012. rctRefFrameUVTemp.expand(-EXPANDY_REF_FRAME/2);
  2013. pvopc->m_pvopcRefQ0->addBYPlain(rctRefFrameYTemp, rctRefFrameUVTemp);
  2014. }
  2015. // if ( pvopc->m_volmd.fAUsage != RECTANGLE ){
  2016. CMBMode* pmbmdRefSrc = m_rgmbmdRef;
  2017. CMBMode* pmbmdRef = pvopc->m_rgmbmdRef;
  2018. CMotionVector* pmvRefSrc = m_rgmvRef;
  2019. CMotionVector* pmvRef = pvopc->m_rgmvRef;
  2020. pvopc->m_iNumMBRef = m_iNumMBRef;
  2021. pvopc->m_iNumMBXRef = m_iNumMBXRef;
  2022. pvopc->m_iNumMBYRef = m_iNumMBYRef;
  2023. // TPS FIX
  2024. Int iMaxIndex = max(PVOP_MV_PER_REF_PER_MB, 2*BVOP_MV_PER_REF_PER_MB);
  2025. for (Int iMB=0; iMB<m_iNumMBRef; iMB++ ) {
  2026. *pmbmdRef = *pmbmdRefSrc;
  2027. if ( pvopc->m_volmd.iEnhnType == 1  &&
  2028. (((pvopc->m_vopmd.iRefSelectCode == 1 || pvopc->m_vopmd.iRefSelectCode == 2) && pvopc->m_vopmd.vopPredType == PVOP) ||
  2029.  (pvopc->m_vopmd.iRefSelectCode == 3 && pvopc->m_vopmd.vopPredType == BVOP))
  2030. ) {
  2031. pmbmdRef->m_shpmd = ALL_OPAQUE;
  2032. }
  2033. pmbmdRef++;
  2034. pmbmdRefSrc++;
  2035. // TPS FIX
  2036. for (Int iVecIndex=0; iVecIndex<iMaxIndex; iVecIndex++ ){
  2037. *pmvRef = *pmvRefSrc;
  2038. pmvRef ++;
  2039. pmvRefSrc ++;
  2040. }
  2041. }
  2042. pvopc->saveShapeMode ();
  2043. // for padding operation
  2044. pvopc->m_iOffsetForPadY = m_iOffsetForPadY;
  2045. pvopc->m_iOffsetForPadUV = m_iOffsetForPadUV;
  2046. pvopc->m_rctPrevNoExpandY = m_rctPrevNoExpandY;
  2047. pvopc->m_rctPrevNoExpandUV = m_rctPrevNoExpandUV;
  2048. // This part is needed for storing RefQ0
  2049. pvopc->m_rctRefVOPY0 = m_rctRefVOPY1;
  2050. pvopc->m_rctRefVOPUV0 = m_rctRefVOPUV1;
  2051. pvopc->m_pvopcRefQ0->setBoundRct(m_rctRefVOPY1);
  2052. // }
  2053. pvopc->repeatPadYOrA ((PixelC*) pvopc->m_pvopcRefQ0->pixelsY () + m_iOffsetForPadY, pvopc->m_pvopcRefQ0);
  2054. pvopc->repeatPadUV(pvopc->m_pvopcRefQ0);
  2055. if ( pvopc->m_volmd.fAUsage != RECTANGLE ){
  2056. if ( pvopc->m_volmd.fAUsage == EIGHT_BIT )
  2057. pvopc->repeatPadYOrA ((PixelC*) pvopc->m_pvopcRefQ0->pixelsA () + m_iOffsetForPadY, pvopc->m_pvopcRefQ0);
  2058. }
  2059. }
  2060. Void CEnhcBufferDecoder::putBufToQ1(CVideoObjectDecoder* pvopc)  // store params to Enhancement layer pvopcRefQ1
  2061. {
  2062. assert(pvopc->m_volmd.volType == ENHN_LAYER);
  2063. delete pvopc->m_pvopcRefQ1;
  2064. pvopc->m_pvopcRefQ1 = NULL;
  2065. pvopc->m_pvopcRefQ1 = new CVOPU8YUVBA ( *m_pvopcBuf );
  2066. pvopc->m_bCodedFutureRef = m_bCodedFutureRef; // added by Sharp (99/1/26)
  2067. if ( pvopc->m_volmd.iEnhnType == 1  &&
  2068. (((pvopc->m_vopmd.iRefSelectCode == 1 || pvopc->m_vopmd.iRefSelectCode == 2) && pvopc->m_vopmd.vopPredType == PVOP) ||
  2069. ((pvopc->m_vopmd.iRefSelectCode == 1 || pvopc->m_vopmd.iRefSelectCode == 3) && pvopc->m_vopmd.vopPredType == BVOP)) // modified by Sharp (98/5/25)
  2070. )
  2071. {
  2072. CRct rctRefFrameYTemp = pvopc->m_rctRefFrameY;
  2073. CRct rctRefFrameUVTemp = pvopc->m_rctRefFrameUV;
  2074. rctRefFrameYTemp.expand(-EXPANDY_REF_FRAME);
  2075. rctRefFrameUVTemp.expand(-EXPANDY_REF_FRAME/2);
  2076. pvopc->m_pvopcRefQ1->addBYPlain(rctRefFrameYTemp, rctRefFrameUVTemp); // modified by Sharp (98/5/25)
  2077. }
  2078. // if ( pvopc->m_volmd.fAUsage != RECTANGLE ){
  2079. CMBMode* pmbmdRefSrc = m_rgmbmdRef;
  2080. CMBMode* pmbmdRef = pvopc->m_rgmbmdRef;
  2081. CMotionVector* pmvRefSrc = m_rgmvRef;
  2082. CMotionVector* pmvRef = pvopc->m_rgmvRef;
  2083. // This part is stored in CVideoObjectDecoder::decode()
  2084. pvopc->m_iNumMBRef = m_iNumMBRef;
  2085. pvopc->m_iNumMBXRef = m_iNumMBXRef;
  2086. pvopc->m_iNumMBYRef = m_iNumMBYRef;
  2087. // TPS FIX
  2088. Int iMaxIndex = max(PVOP_MV_PER_REF_PER_MB, 2*BVOP_MV_PER_REF_PER_MB);
  2089. for (Int iMB=0; iMB<m_iNumMBRef; iMB++ ) {
  2090. *pmbmdRef = *pmbmdRefSrc;
  2091. if ( pvopc->m_volmd.iEnhnType == 1 ) {
  2092. pmbmdRef->m_shpmd = ALL_OPAQUE;
  2093. }
  2094. pmbmdRef++;
  2095. pmbmdRefSrc++;
  2096. // TPS FIX
  2097. for (Int iVecIndex=0; iVecIndex<iMaxIndex; iVecIndex++ ){
  2098. *pmvRef = *pmvRefSrc;
  2099. pmvRef ++;
  2100. pmvRefSrc++;
  2101. }
  2102. }
  2103. // for padding operation
  2104. pvopc->m_iOffsetForPadY = m_iOffsetForPadY;
  2105. pvopc->m_iOffsetForPadUV = m_iOffsetForPadUV;
  2106. pvopc->m_rctPrevNoExpandY = m_rctPrevNoExpandY;
  2107. pvopc->m_rctPrevNoExpandUV = m_rctPrevNoExpandUV;
  2108. // This part is needed for storing RefQ0
  2109. pvopc->m_rctRefVOPY1 = m_rctRefVOPY1;
  2110. pvopc->m_rctRefVOPUV1 = m_rctRefVOPUV1;
  2111. pvopc->m_pvopcRefQ1->setBoundRct(m_rctRefVOPY1);
  2112. // }
  2113. pvopc->repeatPadYOrA ((PixelC*) pvopc->m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, pvopc->m_pvopcRefQ1);
  2114. pvopc->repeatPadUV(pvopc->m_pvopcRefQ1);
  2115. if ( pvopc->m_volmd.fAUsage != RECTANGLE ){
  2116. if ( pvopc->m_volmd.fAUsage == EIGHT_BIT )
  2117. pvopc->repeatPadYOrA ((PixelC*) pvopc->m_pvopcRefQ1->pixelsA () + m_iOffsetForPadY, pvopc->m_pvopcRefQ1);
  2118. }
  2119. }