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

📄 vopseenc.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			ppxlcU += iUvFrmWidth;
		}

		for (y = 0; y < iUVDataHeight; y++) {
			Int size = (Int) fread (ppxlcV, sizeof (U8), m_rctPrevNoExpandY.width / 2, pfRefPicInputFile);
			if (size == 0)
				fprintf (stderr, "Unexpected end of file\n");
			ppxlcV += iUvFrmWidth;
		}
#endif
	}
//OBSS_SAIT_991015	//for OBSS BVOP_BASE
	else {
		if(m_volmd.volType == BASE_LAYER && m_volmd.fAUsage != RECTANGLE) 
			saveBaseShapeMode();			
	}
//~OBSS_SAIT_991015
	
	if (m_volmd.fAUsage != RECTANGLE) {
		if (m_vopmd.vopPredType != BVOP) {
			m_iNumMBRef = m_iNumMB;
			m_iNumMBXRef = m_iNumMBX;
			m_iNumMBYRef = m_iNumMBY;
			m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
			m_rctPrevNoExpandY = m_rctCurrVOPY;
			m_rctPrevNoExpandUV = m_rctCurrVOPUV;
			
			m_rctRefVOPY1 = m_rctCurrVOPY;
			m_rctRefVOPY1.expand (EXPANDY_REFVOP);
			m_rctRefVOPUV1 = m_rctCurrVOPUV;
			m_rctRefVOPUV1.expand (EXPANDUV_REFVOP);
			m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1);
		}
//OBSS_SAIT_991015
		else if ((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP) {
			m_iNumMBRef = m_iNumMB;
			m_iNumMBXRef = m_iNumMBX;
			m_iNumMBYRef = m_iNumMBY;
			m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
			m_rctPrevNoExpandY = m_rctCurrVOPY;
			m_rctPrevNoExpandUV = m_rctCurrVOPUV;
			
			m_rctRefVOPY1 = m_rctCurrVOPY;
			m_rctRefVOPY1.expand (EXPANDY_REFVOP);
			m_rctRefVOPUV1 = m_rctCurrVOPUV;
			m_rctRefVOPUV1.expand (EXPANDUV_REFVOP);
		}
		else if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {			//for Base layer BVOP padding 
			if(!m_volmd.bShapeOnly){	
				m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
				m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
				m_rctPrevNoExpandY = m_rctCurrVOPY;
				m_rctPrevNoExpandUV = m_rctCurrVOPUV;
			}
		}
//~OBSS_SAIT_991015

// begin:  added by by Sharp (98/2/10)
		if ( bTemporalScalability && m_vopmd.vopPredType == BVOP ) {
			m_iBVOPOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iBVOPOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
			m_rctBVOPPrevNoExpandY = m_rctCurrVOPY;
			m_rctBVOPPrevNoExpandUV = m_rctCurrVOPUV;

			m_rctBVOPRefVOPY1 = m_rctCurrVOPY;
			m_rctBVOPRefVOPY1.expand (EXPANDY_REFVOP);
			m_rctBVOPRefVOPUV1 = m_rctCurrVOPUV;
			m_rctBVOPRefVOPUV1.expand (EXPANDUV_REFVOP);
		}
// end: added by Sharp (98/2/10)

		//this is ac/dc pred stuff; clean the memory
		Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 6;
		delete [] m_rgblkmCurrMB;
		for (Int iMB = 0; iMB < m_iNumMBX; iMB++)	{
			for (Int iBlk = 0; iBlk < nBlk; iBlk++)	{
				delete [] (m_rgpmbmAbove [iMB]->rgblkm) [iBlk];
				delete [] (m_rgpmbmCurr  [iMB]->rgblkm) [iBlk];
			}
			delete [] m_rgpmbmAbove [iMB]->rgblkm;
			delete m_rgpmbmAbove [iMB];
			delete [] m_rgpmbmCurr [iMB]->rgblkm;
			delete m_rgpmbmCurr [iMB];
		}
		delete [] m_rgpmbmAbove;
		delete [] m_rgpmbmCurr;
	}

// begin: added by Sharp (98/2/10)
	if ( bTemporalScalability && m_volmd.fAUsage == RECTANGLE ) {
		m_iBVOPOffsetForPadY = m_iOffsetForPadY;
		m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;
		m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;
		m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;

		m_rctBVOPRefVOPY1 = m_rctRefVOPY1;
		m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;
	}
// end: added by Sharp (98/2/10)
	
	// __LOW_LATENCY_SPRITE_
	if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)
		return;

//OBSS_SAIT_991015
	if (m_volmd.bShapeOnly)
		return;
//~OBSS_SAIT_991015

    if (m_vopmd.vopPredType != BVOP || (m_volmd.volType == ENHN_LAYER && !((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.fAUsage == ONE_BIT)) )	{	//OBSS_SAIT_991015
		repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);
		repeatPadUV (m_pvopcRefQ1);
		if (m_volmd.fAUsage != RECTANGLE) {
      if (m_volmd.fAUsage == EIGHT_BIT) {
			  for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 26-Nov-99
          repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcRefQ1);
        }
      }
		}
	}

	if( m_volmd.volType == ENHN_LAYER && 
		m_vopmd.vopPredType == BVOP &&
		m_vopmd.iRefSelectCode == 0){
		repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ);
		repeatPadUV (m_pvopcCurrQ);
	}

//OBSS_SAIT_991015	//Base layer BVOP padding for OBSS
    if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {
		if(!m_volmd.bShapeOnly){	
			repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ);
			repeatPadUV (m_pvopcCurrQ);
		}
		if (m_volmd.fAUsage != RECTANGLE) {
      if (m_volmd.fAUsage == EIGHT_BIT) {
  			for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 26-Nov-99
          repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcCurrQ);
        }
      }
		}
	}
//OBSS_SAIT_991015	

// GMC
	if(m_uiSprite == 2 && m_vopmd.vopPredType != BVOP)
		updateAllOrigRefVOPs (); // update all original reference (MotionEsti) VOP's
	else
// ~GMC
	if (m_volmd.bOriginalForME) {
		if (m_vopmd.vopPredType == IVOP || m_vopmd.vopPredType == PVOP || 
		    (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
			updateAllOrigRefVOPs (); // update all original reference (MotionEsti) VOP's
	}
}

Void CVideoObjectEncoder::codeVOHead ()
{
	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VO_Start_Code");
	m_pbitstrmOut -> putBits (VO_START_CODE, NUMBITS_VO_START_CODE, "VO_Start_Code");		//plus 3 bits
	m_pbitstrmOut -> putBits (m_uiVOId, NUMBITS_VO_ID, "VO_Id");
	UInt uiNumBits = NUMBITS_START_CODE_PREFIX + NUMBITS_VO_START_CODE + NUMBITS_VO_ID;;
	m_statsVOL.nBitsHead += uiNumBits;
	cout << "VO Overhead" << "\t\t" << uiNumBits << "\n\n";
	cout.flush ();
}

Void CVideoObjectEncoder::codeVOLHead (Int iSessionWidth, Int iSessionHeight)
{
	m_pbitstrmOut -> putBits (START_CODE_PREFIX, NUMBITS_START_CODE_PREFIX, "VOL_Start_Code");
	m_pbitstrmOut -> putBits (VOL_START_CODE, NUMBITS_VOL_START_CODE, "VOL_Start_Code");		//plus 4 bits
	m_pbitstrmOut -> putBits ((Int) (m_volmd.volType == ENHN_LAYER), NUMBITS_VOL_ID, "VOL_Id"); // by katata
	m_statsVOL.nBitsHead+=NUMBITS_START_CODE_PREFIX+NUMBITS_VOL_START_CODE+NUMBITS_VOL_ID;

// Begin: modified by Hughes	  4/9/98	  per clause 2.1.7. in N2171 document
	m_pbitstrmOut -> putBits ((Int) 0, 1, "VOL_Random_Access");		//isn't this a system level flg?
	m_statsVOL.nBitsHead++;
// End: modified by Hughes	  4/9/98

	m_pbitstrmOut -> putBits ((Int) 4, 8, "VOL_Type_Indicator"); // Set to indicate MAIN profile.
	m_statsVOL.nBitsHead+=8;

// GMC
	if(m_volmd.uiVerID == 2){
		m_pbitstrmOut -> putBits ((Int) 1, 1, "VOL_Is_Object_Layer_Identifier"); 
	// Here, is_object_layer_identifier is used for Version1/Version2
	// identification at this moment (tentative solution).
	// vol_type_indicator is set to indicate Main profile (not version 2).
	// need discussion at Video Group about this issue.
		m_pbitstrmOut -> putBits ((Int) 2, 4, "VOL_Verid");
		m_pbitstrmOut -> putBits ((Int) 1, 3, "VOL_Priority");
		m_statsVOL.nBitsHead+=8;
	}else{
		m_pbitstrmOut -> putBits ((Int) 0, 1, "VOL_Is_Object_Layer_Identifier"); //useless flag for now
		m_statsVOL.nBitsHead++;
	}
// ~GMC
	m_pbitstrmOut -> putBits ((Int) 1, 4, "aspect_ratio_info"); // square pix
	m_statsVOL.nBitsHead+=4;
	
	m_pbitstrmOut -> putBits (m_volmd.uiVolControlParameters, 1, "VOL_Control_Parameters"); //useless flag for now
	m_statsVOL.nBitsHead++;
	
	if(m_volmd.uiVolControlParameters)
	{
		m_pbitstrmOut -> putBits (m_volmd.uiChromaFormat, 2, "Chroma_Format");
		m_pbitstrmOut -> putBits (m_volmd.uiLowDelay, 1, "Low_Delay");
		m_pbitstrmOut -> putBits (m_volmd.uiVBVParams, 1, "VBV_Params");
		m_statsVOL.nBitsHead += 2 + 1 + 1;

		if(m_volmd.uiVBVParams)
		{
			UInt uiFirstHalfBitRate = (m_volmd.uiBitRate >> 15);
			UInt uiLatterHalfBitRate = (m_volmd.uiBitRate & 0x7fff);
			m_pbitstrmOut -> putBits (uiFirstHalfBitRate, 15, "FirstHalf_BitRate");
			m_pbitstrmOut -> putBits (1, 1, "Marker");
			m_pbitstrmOut -> putBits (uiLatterHalfBitRate, 15, "LatterHalf_BitRate");
			m_pbitstrmOut -> putBits (1, 1, "Marker");

			UInt uiFirstHalfVbvBufferSize = (m_volmd.uiVbvBufferSize >> 3);
			UInt uiLatterHalfVbvBufferSize = (m_volmd.uiVbvBufferSize & 7);
			m_pbitstrmOut -> putBits (uiFirstHalfVbvBufferSize, 15, "FirstHalf_VbvBufferSize");
			m_pbitstrmOut -> putBits (1, 1, "Marker");
			m_pbitstrmOut -> putBits (uiLatterHalfVbvBufferSize, 3, "LatterHalf_VbvBufferSize");
			
			UInt uiFirstHalfVbvBufferOccupany = (m_volmd.uiVbvBufferOccupany >> 15);
			UInt uiLatterHalfVbvBufferOccupany = (m_volmd.uiVbvBufferOccupany & 0x7fff);
			m_pbitstrmOut -> putBits (uiFirstHalfVbvBufferOccupany, 11, "FirstHalf_VbvBufferOccupany");
			m_pbitstrmOut -> putBits (1, 1, "Marker");
			m_pbitstrmOut -> putBits (uiLatterHalfVbvBufferOccupany, 15, "LatterHalf_VbvBufferOccupany");
			m_pbitstrmOut -> putBits (1, 1, "Marker");

			m_statsVOL.nBitsHead += 15 + 15 + 15 + 3 + 11 + 15;
			m_statsVOL.nBitsStuffing += 5;
		}

	}

	if(m_volmd.bShapeOnly==TRUE)
	{
		m_pbitstrmOut -> putBits ((Int) 2, NUMBITS_VOL_SHAPE, "VOL_Shape_Type");
		m_pbitstrmOut -> putBits (1, 1, "Marker");
		m_pbitstrmOut -> putBits (m_volmd.iClockRate, NUMBITS_TIME_RESOLUTION, "VOL_Time_Increment_Resolution"); 
		m_pbitstrmOut -> putBits (1, 1, "Marker");
		m_pbitstrmOut -> putBits (0, 1, "VOL_Fixed_Vop_Rate");
//OBSS_SAIT_991015
		if(m_volmd.uiVerID != 1){
			m_pbitstrmOut -> putBits (m_volmd.volType == ENHN_LAYER, 1, "VOL_Scalability");
			m_statsVOL.nBitsHead++;
			if (m_volmd.volType == ENHN_LAYER)	{
				m_pbitstrmOut -> putBits (m_volmd.ihor_sampling_factor_n_shape, 5, "VOL_Horizontal_Sampling_Factor_SHAPE");		
				m_pbitstrmOut -> putBits (m_volmd.ihor_sampling_factor_m_shape, 5, "VOL_Horizontal_Sampling_Factor_Ref_SHAPE");	
				m_pbitstrmOut -> putBits (m_volmd.iver_sampling_factor_n_shape, 5, "VOL_Vertical_Sampling_Factor_SHAPE");	
				m_pbitstrmOut -> putBits (m_volmd.iver_sampling_factor_m_shape, 5, "VOL_Vertical_Sampling_Factor_Ref_SHAPE");
				m_statsVOL.nBitsHead += 20;
//RESYNC_MARKER_FIX
				m_pbitstrmOut -> putBits (m_volmd.bResyncMarkerDisable, 1, "VOL_resync_marker_disable");
//				m_pbitstrmOut -> putBits (0, 1, "VOL_resync_marker_disable");
//~RESYNC_MARKER_FIX
			}
			else
				m_pbitstrmOut -> putBits (0, 1, "VOL_resync_marker_disable");
		}
		else
//RESYNC_MARKER_FIX
			m_pbitstrmOut -> putBits (m_volmd.bResyncMarkerDisable, 1, "VOL_resync_marker_disable");
//			m_pbitstrmOut -> putBits (0, 1, "VOL_resync_marker_disable");
//~RESYNC_MARKER_FIX

//~OBSS_SAIT_991015
		m_statsVOL.nBitsHead += NUMBITS_VOL_SHAPE + NUMBITS_TIME_RESOLUTION + 2;
		m_statsVOL.nBitsStuffing +=2;
		cout << "VOL Overhead" << "\t\t" << m_statsVOL.nBitsHead << "\n\n";
		cout.flush ();
		return;
	}
	else
	{
		Int iAUsage = (Int)m_volmd.fAUsage;
		if(iAUsage==2) // CD: 0 = rect, 1 = binary, 2 = shape only, 3 = grey alpha
			iAUsage = 3;
		m_pbitstrmOut -> putBits (iAUsage, NUMBITS_VOL_SHAPE, "VOL_Shape_Type");
		if (iAUsage==3 && m_volmd.uiVerID!=1) // MAC (SB) 2-Dec-99
		{
			if(m_volmd.iAlphaShapeExtension>=0)
				m_pbitstrmOut -> putBits ( m_volmd.iAlphaShapeExtension, 4, "VOL_Shape_Extension");
			else
				m_pbitstrmOut -> putBits ( 0, 4, "VOL_Shape_Extension");
		}
		m_pbitstrmOut -> putBits (1, 1, "Marker");
// GMC
		m_statsVOL.nBitsStuffing ++;
// ~GMC
		m_pbitstrmOut -> putBits (m_volmd.iClockRate, NUMBITS_TIME_RESOLUTION, "VOL_Time_Increment_Resolution"); 
		m_pbitstrmOut -> putBits (1, 1, "Marker");
// GMC
		m_statsVOL.nBitsStuffing ++;
// ~GMC
		m_pbitstrmOut -> putBits (0, 1, "VOL_Fixed_Vop_Rate");
		m_statsVOL.nBitsHead += NUMBITS_VOL_SHAPE + NUMBITS_TIME_RESOLUTION + 1;
		if (m_volmd.fAUsage == RECTANGLE) {
			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");
			m_statsVOL.nBitsStuffing ++;
			m_pbitstrmOut -> putBits (iSessionWidth, NUMBITS_VOP_WIDTH, "VOL_Width"); 
			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");
			m_statsVOL.nBitsStuffing ++;
			m_pbitstrmOut -> putBits (iSessionHeight, NUMBITS_VOP_HEIGHT, "VOL_Height"); 
			m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");
			m_statsVOL.nBitsStuffing ++;
			m_statsVOL.nBitsHead += NUMBITS_VOP_WIDTH + NUMBITS_VOP_HEIGHT;
		}
	}
	m_pbitstrmOut -> putBits (m_vopmd.bInterlace, (UInt) 1, "VOL_interlace");
	m_statsVOL.nBitsHead++;
	m_pbitstrmOut -> putBits (m_volmd.bAdvPredDisable, (UInt) 1, "VOL_OBMC_Disable");
	m_statsVOL.nBitsHead++;

	// code sprite info
// GMC
	if(m_volmd.uiVerID == 2){
		m_pbitstrmOut -> putBits (m_uiSprite, 2, "VOL_Sprite_Usage");
		m_statsVOL.nBitsHead += 2;
	}else{
// ~GMC
		m_pbitstrmOut -> putBits (m_uiSprite, 1, "VOL_Sprite_Usage");
		m_statsVOL.nBitsHead ++;
// GMC
	}
// ~GMC
	if (m_uiSprite == 1) {
		m_pbitstrmOut -> putBits (m_rctSpt.width, NUMBITS_SPRITE_HDIM, "SPRT_hdim");
		m_statsVOL.nBitsHead += NUMBITS_SPRITE_HDIM; 
		m_pbitstrmOut -> putBits (MARKER_BIT, 1, "Marker_Bit");
		m_statsVOL.nBitsStuffing ++;
		m_pbitstrmOut -> putBits (m_rctSpt.height (), NUMBITS_SPRITE_VDIM, "SPRT_vdim");

⌨️ 快捷键说明

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