⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vopsedec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		if (! m_volmd.bTextureComplexityEstimationSet1Disable) {			m_volmd.bIntraBlocks = m_pbitstrmIn -> getBits (1);			m_volmd.bInterBlocks = m_pbitstrmIn -> getBits (1);			m_volmd.bInter4vBlocks = m_pbitstrmIn -> getBits (1);			m_volmd.bNotCodedBlocks = m_pbitstrmIn -> getBits (1);			if (!(m_volmd.bIntraBlocks ||				  m_volmd.bInterBlocks ||				  m_volmd.bInter4vBlocks ||				  m_volmd.bNotCodedBlocks)) {				fatal_error("Texture complexity estimation set 1 is enabled,\nbut no correponding flag is enabled.");			}		}		else			m_volmd.bIntraBlocks =			m_volmd.bInterBlocks =			m_volmd.bInter4vBlocks =			m_volmd.bNotCodedBlocks = false;				uiMark = m_pbitstrmIn -> getBits (1);		assert (uiMark == 1);		m_volmd.bTextureComplexityEstimationSet2Disable = m_pbitstrmIn -> getBits (1);		if (! m_volmd.bTextureComplexityEstimationSet2Disable) {			m_volmd.bDCTCoefs = m_pbitstrmIn -> getBits (1);			m_volmd.bDCTLines = m_pbitstrmIn -> getBits (1);			m_volmd.bVLCSymbols = m_pbitstrmIn -> getBits (1);			m_volmd.bVLCBits = m_pbitstrmIn -> getBits (1);			if (!(m_volmd.bDCTCoefs ||				  m_volmd.bDCTLines ||				  m_volmd.bVLCSymbols ||				  m_volmd.bVLCBits)) {				fatal_error("Texture complexity estimation set 2 is enabled,\nbut no correponding flag is enabled.");			}		}		else			m_volmd.bDCTCoefs =			m_volmd.bDCTLines =			m_volmd.bVLCSymbols =			m_volmd.bVLCBits = false;		m_volmd.bMotionCompensationComplexityDisable = m_pbitstrmIn -> getBits (1);		if (! m_volmd.bMotionCompensationComplexityDisable) {			m_volmd.bAPM = m_pbitstrmIn -> getBits (1);			m_volmd.bNPM = m_pbitstrmIn -> getBits (1);			m_volmd.bInterpolateMCQ = m_pbitstrmIn -> getBits (1);			m_volmd.bForwBackMCQ = m_pbitstrmIn -> getBits (1);			m_volmd.bHalfpel2 = m_pbitstrmIn -> getBits (1);			m_volmd.bHalfpel4 = m_pbitstrmIn -> getBits (1);			if (!(m_volmd.bAPM ||				  m_volmd.bNPM ||				  m_volmd.bInterpolateMCQ ||				  m_volmd.bForwBackMCQ ||				  m_volmd.bHalfpel2 ||				  m_volmd.bHalfpel4)) {				fatal_error("Motion complexity estimation is enabled,\nbut no correponding flag is enabled.");			}		}		else			m_volmd.bAPM =			m_volmd.bNPM =			m_volmd.bInterpolateMCQ =			m_volmd.bForwBackMCQ =			m_volmd.bHalfpel2 =			m_volmd.bHalfpel4 = false;				uiMark = m_pbitstrmIn -> getBits (1);		assert (uiMark == 1);	}	// END: Complexity Estimation syntax support	/* UInt uiResyncMarkerDisable = wmay */m_pbitstrmIn -> getBits (1);	//	Modified by Toshiba(1998-4-7)	m_volmd.bDataPartitioning = m_pbitstrmIn -> getBits (1);	if( m_volmd.bDataPartitioning )		m_volmd.bReversibleVlc = m_pbitstrmIn -> getBits (1);	else		m_volmd.bReversibleVlc = FALSE;	//	End Toshiba	//wchen: wd changes	m_volmd.volType = (m_pbitstrmIn -> getBits (1) == 0) ? BASE_LAYER : ENHN_LAYER;	m_volmd.ihor_sampling_factor_n = 1;	m_volmd.ihor_sampling_factor_m = 1;	m_volmd.iver_sampling_factor_n = 1;	m_volmd.iver_sampling_factor_m = 1;		if (m_volmd.volType == ENHN_LAYER)	{//#ifdef _Scalable_SONY_		m_volmd.iHierarchyType = m_pbitstrmIn->getBits (1); // 		if(m_volmd.iHierarchyType == 0)			fprintf(stdout,"Hierarchy_Type == 0 (Spatial scalability)\n");		else if(m_volmd.iHierarchyType == 1)			fprintf(stdout,"Hierarchy_type == 1 (Temporal scalability)\n");//#endif _Scalable_SONY_		m_pbitstrmIn->getBits (4);						// ref_layer_id		m_pbitstrmIn->getBits (1);						// ref_layer_samping_director		m_volmd.ihor_sampling_factor_n = m_pbitstrmIn->getBits (5);		m_volmd.ihor_sampling_factor_m = m_pbitstrmIn->getBits (5);		m_volmd.iver_sampling_factor_n = m_pbitstrmIn->getBits (5);		m_volmd.iver_sampling_factor_m = m_pbitstrmIn->getBits (5);		m_volmd.iEnhnType     = m_pbitstrmIn->getBits (1);			//enhancement_type	}	m_volmd.bDeblockFilterDisable = TRUE;							//no deblocking filter}Void CVideoObjectDecoder::FakeOutVOVOLHead (int h, int w, int fr, Bool *pbSpatialScalability){  m_volmd.iClockRate = fr;  Int iClockRate = m_volmd.iClockRate;  assert (iClockRate >= 1 && iClockRate < 65536);  for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++)	{	    if (iClockRate == 1)			      break;    iClockRate = (iClockRate >> 1);  }  m_volmd.bShapeOnly = FALSE;  m_volmd.fAUsage = RECTANGLE;  m_ivolWidth = w;  m_ivolHeight = h;  m_vopmd.bInterlace = 0;  m_volmd.bAdvPredDisable = 1;  m_uiSprite = 0;  m_volmd.bNot8Bit = 0;  m_volmd.uiQuantPrecision = 5;  m_volmd.nBits = 8;  m_volmd.fQuantizer = Q_H263;#if 0  m_volmd.bLoadIntraMatrix = 0;  memcpy (m_volmd.rgiIntraQuantizerMatrix, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));  m_volmd.bLoadInterMatrix = 0;  memcpy (m_volmd.rgiInterQuantizerMatrix, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));#endif  m_volmd.bComplexityEstimationDisable = 1; // huh ?  m_volmd.bDataPartitioning = 0;  m_volmd.bReversibleVlc = FALSE;  m_volmd.volType = BASE_LAYER;  m_volmd.ihor_sampling_factor_n = 1;  m_volmd.ihor_sampling_factor_m = 1;  m_volmd.iver_sampling_factor_n = 1;  m_volmd.iver_sampling_factor_m = 1;	  m_volmd.bDeblockFilterDisable = TRUE;  postVO_VOLHeadInit(w, h, pbSpatialScalability);}Int BGComposition; // added by Sharp (98/3/24)Bool CVideoObjectDecoder::decodeVOPHead (){	// Start code  UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);  while (uiVopStartCode == GOV_START_CODE ||	 (uiVopStartCode >= 0 && uiVopStartCode <= 0x1f) ||	 uiVopStartCode == SESSION_START_CODE ||	 uiVopStartCode == VISUAL_OBJ_START_CODE ||	 (uiVopStartCode >= 0x20 && uiVopStartCode <= 0x2f)) {    if (uiVopStartCode >= 0 && uiVopStartCode <= 0x1f) {      decodeVOBody();    } else if (uiVopStartCode >= 0x20 && uiVopStartCode <= 0x2f) {      decodeVOLBody();    } else       switch (uiVopStartCode) {      case GOV_START_CODE: {	/*Added by SONY (98/03/30)*/	m_bUseGOV = TRUE;	m_bLinkisBroken = FALSE;	/*Added by SONY (98/03/30) End */	Int timecode;	timecode = m_pbitstrmIn -> getBits (5) * 3600;	timecode += m_pbitstrmIn -> getBits (6) * 60;	m_pbitstrmIn -> getBits (1);	timecode += m_pbitstrmIn -> getBits (6);		m_tModuloBaseDecd = timecode;	m_tModuloBaseDisp = timecode;#ifdef DEBUG_OUTPUT	cout << "GOV Header (t=" << timecode << ")\n\n";#endif	Int closed_gov = m_pbitstrmIn -> getBits (1);	Int broken_link = m_pbitstrmIn -> getBits (1);	/*modified by SONY (98/03/30)*/	if ((closed_gov == 0)&&(broken_link == 1))	  m_bLinkisBroken = TRUE;      }        break;      default:	break;      }/*modified by SONY (98/03/30) End*/		    Int err = findStartCode();    if (err == EOF) return FALSE;    uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);  }//980212  if (uiVopStartCode != VOP_START_CODE) {    printf("Illegal VOP start code %x found in header", uiVopStartCode);  }	assert(uiVopStartCode == VOP_START_CODE);	if (m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX) == START_CODE_PREFIX) {	  return decodeVOPHead();	}	m_vopmd.vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);	// Time reference and VOP_pred_type	Int iModuloInc = 0;	while (m_pbitstrmIn -> getBits (1) != 0)		iModuloInc++;	Time tCurrSec = iModuloInc + ((m_vopmd.vopPredType != BVOP ||				  (m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER ))?				m_tModuloBaseDecd : m_tModuloBaseDisp);	//	Added for error resilient mode by Toshiba(1997-11-14)	UInt uiMarker = m_pbitstrmIn -> getBits (1);	assert(uiMarker== 1);	//	End Toshiba(1997-11-14)	Time tVopIncr = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);#if 0        printf("time bits is supposed to be %d\n", m_iNumBitsTimeIncr);#endif	uiMarker = m_pbitstrmIn->getBits (1); // marker bit	assert(uiMarker ==1);	m_tOldModuloBaseDecd = m_tModuloBaseDecd;	m_tOldModuloBaseDisp = m_tModuloBaseDisp;	if (m_vopmd.vopPredType != BVOP ||		(m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER ))	{		m_tModuloBaseDisp = m_tModuloBaseDecd;		//update most recently displayed time base		m_tModuloBaseDecd = tCurrSec;	}    m_t = tCurrSec * m_volmd.iClockRate*m_iClockRateScale + tVopIncr*m_iClockRateScale;		if (m_pbitstrmIn->getBits (1) == 0)		{		//vop_coded == false		m_vopmd.bInterlace = FALSE;	//wchen: temporary solution		return FALSE;	}	if (m_vopmd.vopPredType == PVOP && m_volmd.bShapeOnly==FALSE)		m_vopmd.iRoundingControl = m_pbitstrmIn->getBits (1); //"VOP_Rounding_Type"	else		m_vopmd.iRoundingControl = 0;	if (m_volmd.fAUsage != RECTANGLE) {// Begin: modified by Hughes	  4/9/98	  if (!(m_uiSprite == 1 && m_vopmd.vopPredType == IVOP)) {// End: modified by Hughes	  4/9/98		Int width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH);// spt VOP		assert (width % MB_SIZE == 0); // for sprite, may not be multiple of MB_SIZE		Int marker;		marker = m_pbitstrmIn -> getBits (1); // marker bit		assert(marker==1);		Int height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT);// spt VOP		assert (height % MB_SIZE == 0); // for sprite, may not be multiple of MB_SIZE		marker = m_pbitstrmIn -> getBits (1); // marker bit		assert(marker==1);		//wchen: cd changed to 2s complement		Int left = (m_pbitstrmIn -> getBits (1) == 0) ?					m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) : 					((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1)));		marker = m_pbitstrmIn -> getBits (1); // marker bit		assert(marker==1);		Int top = (m_pbitstrmIn -> getBits (1) == 0) ?				   m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) : 				   ((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_VERTICAL_SPA_REF - 1)));		assert(((left | top)&1)==0); // must be even pix unit		m_rctCurrVOPY = CRct (left, top, left + width, top + height);		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();	  }		if ( m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType == 1 ){			BGComposition = m_pbitstrmIn -> getBits (1); // modified by Sharp (98/3/24)//			assert(BackgroundComposition==1); // modified by Sharp (98/3/24)		}		m_volmd.bNoCrChange = m_pbitstrmIn -> getBits (1);	//VOP_CR_Change_Disable		Int iVopConstantAlpha = m_pbitstrmIn -> getBits (1);		if(iVopConstantAlpha==1)			m_vopmd.iVopConstantAlphaValue = m_pbitstrmIn -> getBits (8);		else			m_vopmd.iVopConstantAlphaValue = 255;		m_vopmd.bShapeCodingType = (m_vopmd.vopPredType == IVOP) ? 0 : 1; //	Added error resilient mode by Toshiba(1998-1-16)	}	// START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 15 Jun 1998	if (! m_volmd.bComplexityEstimationDisable) {		if (m_volmd.iEstimationMethod != 0) {			fprintf (stderr, "ERROR: Unknown estimation method number %d.\n", m_volmd.iEstimationMethod);			exit (1);		}				if (m_vopmd.vopPredType == IVOP ||			m_vopmd.vopPredType == PVOP ||			m_vopmd.vopPredType == BVOP) {			if (m_volmd.bOpaque) {				printf ("dcecs_opaque = %d\n", m_vopmd.iOpaque = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iOpaque == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'opaque' complexity estimation.\n");					exit (1);				}			}			if (m_volmd.bTransparent) {				printf ("dcecs_transparent = %d\n", m_vopmd.iTransparent = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iTransparent == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'transparent' complexity estimation.\n");					exit (1);				}			}			if (m_volmd.bIntraCAE) {				printf ("dcecs_intra_cae = %d\n", m_vopmd.iIntraCAE = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iIntraCAE == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'intra_cae' complexity estimation.\n");					exit (1);				}			}			if (m_volmd.bInterCAE) {				printf ("dcecs_inter_cae = %d\n", m_vopmd.iInterCAE = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iInterCAE == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'inter_cae' complexity estimation.\n");					exit (1);				}			}			if (m_volmd.bNoUpdate) {				printf ("dcecs_no_update = %d\n", m_vopmd.iNoUpdate = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iNoUpdate == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'no_update' complexity estimation.\n");					exit (1);				}			}			if (m_volmd.bUpsampling) {				printf ("dcecs_upsampling = %d\n", m_vopmd.iUpsampling = m_pbitstrmIn -> getBits (8));				if (m_vopmd.iUpsampling == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'upsampling' complexity estimation.\n");					exit (1);				}			}		}		if (m_volmd.bIntraBlocks) {			printf ("dcecs_intra_blocks = %d\n", m_vopmd.iIntraBlocks = m_pbitstrmIn -> getBits (8));			if (m_vopmd.iIntraBlocks == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'intra_blocks' complexity estimation.\n");					exit (1);				}		}		if (m_volmd.bNotCodedBlocks) {			printf ("dcecs_not_coded_blocks = %d\n", m_vopmd.iNotCodedBlocks = m_pbitstrmIn -> getBits (8));			if (m_vopmd.iNotCodedBlocks == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'not_coded_blocks' complexity estimation.\n");					exit (1);				}		}		if (m_volmd.bDCTCoefs) {			printf ("dcecs_dct_coefs = %d\n", m_vopmd.iDCTCoefs = m_pbitstrmIn -> getBits (8));			if (m_vopmd.iDCTCoefs == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'dct_coefs' complexity estimation.\n");					exit (1);				}		}		if (m_volmd.bDCTLines) {			printf ("dcecs_dct_lines = %d\n", m_vopmd.iDCTLines = m_pbitstrmIn -> getBits (8));			if (m_vopmd.iDCTLines == 0) {					fprintf (stderr, "ERROR: Illegal null value for 'dct_lines' complexity estimation.\n");					exit (1);				}		}		if (m_volmd.bVLCSymbols) {			printf ("dcecs_vlc_symbols = %d\n", m_vopmd.iVLCSymbols = m_pbitstrmIn -> getBits (8));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -