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

📄 sys_decoder_shpdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					else						skip_right = skip_hor;					if ( j-skip_hor <0)			skip_left = j+2;					else						skip_left = skip_hor;					*(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_v_prob [contextSIVertical(smb_data+i*width+j,skip_right, skip_left,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;					if(skip_bottom == v_scan_freq)	skip_upper = v_scan_freq;					else							skip_upper = v_scan_freq*2;				}			}			num_loop_hor--;		}	}}Void CVideoObjectDecoder::HorizontalXORdecoding (Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){  //	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;  //	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;	PixelC* ppxlcDst  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	{		  Int		i, j; // , xor_type=0;		Int		start_v=0, start_h=0;		Int		width=20, height=20;		//		UChar	xor_value=0;		Int		prev=0, next=0;		PixelC* smb_data = ppxlcDst;			Int skip_ver=0, skip_upper=0, skip_bottom=0;		Int h_scan_freq=1, v_scan_freq=1;		i=0;			while(*(VerSamplingChk+i) == 1)	i++;		while(*(VerSamplingChk+i) == 0)	i++;		int tmp = i;		if ( residual_scanning_ver) {			start_h = 0;			start_v = 0;			v_scan_freq=1<<num_loop_ver; 			h_scan_freq=1;			skip_ver = v_scan_freq;		if( tmp-(1<<num_loop_ver) >= 0 )				start_v = tmp-(1<<num_loop_ver);		else if( tmp+(1<<num_loop_ver) <= MB_SIZE-1 )	start_v = tmp+(1<<(num_loop_ver)) ;		else printf("Out of Sampling Ratio\n");			for(i=start_v;i<(height-4);i+=v_scan_freq){				if( *(VerSamplingChk+i) == 1) continue;				for(j=start_h;j<(width-4);j+=h_scan_freq){					if(i-v_scan_freq < -2)	prev=*(smb_data+(-2)*width+j);					else 				prev=*(smb_data+(i-v_scan_freq)*width+j);					if(i+v_scan_freq > 17)	next=*(smb_data+(17)*width+j);					else				next=*(smb_data+(i+v_scan_freq)*width+j);					if ( i+skip_ver >15)	skip_bottom = MB_SIZE+1-i;					else					skip_bottom = skip_ver;					if ( i-skip_ver <0)		skip_upper = i+2;					else					skip_upper = skip_ver;					if(prev==next)  *(smb_data+i*width+j)=prev;					else			*(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;				}			}		}		i=0;			while(*(VerSamplingChk+i) == 1)	i++;		while(*(VerSamplingChk+i) == 0)	i++;		if(i>start_v && residual_scanning_ver) tmp = start_v;		else tmp = i;		while (num_loop_ver >0){			start_h = 0;			start_v = 0;			v_scan_freq=1<<num_loop_ver; 			h_scan_freq=1;			skip_ver = 1<<(num_loop_ver-1);			if( tmp-(1<<(num_loop_ver-1)) >= 0 ) 	tmp = start_v = tmp-(1<<(num_loop_ver-1));			else									start_v = tmp+(1<<(num_loop_ver-1)) ;			skip_ver = 1<<(num_loop_ver-1);			for(i=start_v;i<(height-4);i+=v_scan_freq){				for(j=start_h;j<(width-4);j+=h_scan_freq){					if(i-skip_ver < -2)	prev=*(smb_data+(-2)*width+j);					else 					prev=*(smb_data+(i-skip_ver)*width+j);					if(i+skip_ver > 17)	next=*(smb_data+(17)*width+j);					else					next=*(smb_data+(i+skip_ver)*width+j);					if(i - skip_ver < 0)	skip_upper = i +2;					else					skip_upper = skip_ver;					if(i + skip_ver > 15)	skip_bottom = MB_SIZE+1 - i ;					else					skip_bottom = skip_ver;					if(prev==next)	*(smb_data+i*width+j)=prev;					else			*(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;				}			}			num_loop_ver--;		}	}}Void CVideoObjectDecoder::HorizontalFulldecoding (Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){  //	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;	PixelC* ppxlcDst  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	{		  Int		i, j;// , xor_type=0;		Int		start_v=0, start_h=0;		Int		width=20, height=20;		//		UChar	xor_value=0;		//		Int		prev=0, next=0;		PixelC* smb_data = ppxlcDst;			Int		skip_ver=0, skip_upper=0, skip_bottom=0;		Int		h_scan_freq=1, v_scan_freq=1;		i=0;			while(*(VerSamplingChk+i) == 1)	i++;		while(*(VerSamplingChk+i) == 0)	i++;		int tmp = i;		if ( residual_scanning_ver) {			start_h = 0;			start_v = 0;			v_scan_freq = 1<<num_loop_ver; 			h_scan_freq = 1;			skip_ver = v_scan_freq;			if( tmp-(1<<num_loop_ver) >= 0 ) 				start_v = tmp-(1<<num_loop_ver);			else if( tmp+(1<<num_loop_ver) <= MB_SIZE-1 )	start_v = tmp+(1<<(num_loop_ver)) ;			else printf("Out of Sampling Ratio\n");			for(i=start_v;i<(height-4);i+=v_scan_freq){				if( *(VerSamplingChk+i) == 1) continue;				for(j=start_h;j<(width-4);j+=h_scan_freq){					if ( i+skip_ver >15)	skip_bottom = MB_SIZE+1-i;					else					skip_bottom = skip_ver;					if ( i-skip_ver <0)		skip_upper = i+2;					else					skip_upper = skip_ver;					*(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;				}			}		}		i=0;			while(*(VerSamplingChk+i) == 1)	i++;		while(*(VerSamplingChk+i) == 0)	i++;		if(i>start_v && residual_scanning_ver) tmp = start_v;		else tmp = i;		while (num_loop_ver >0){			start_h = 0;			start_v = 0;			v_scan_freq=1<<num_loop_ver; 			h_scan_freq=1;			skip_ver = 1<<(num_loop_ver-1);			if( tmp-(1<<(num_loop_ver-1)) >= 0 )	tmp = start_v = tmp-(1<<(num_loop_ver-1));			else									start_v = tmp+(1<<(num_loop_ver-1)) ;			skip_ver = 1<<(num_loop_ver-1);			for(i=start_v;i<(height-4);i+=v_scan_freq){				for(j=start_h;j<(width-4);j+=h_scan_freq){				if(i - skip_ver < 0)	skip_upper = i +2;				else					skip_upper = skip_ver;				if(i + skip_ver > 15)	skip_bottom = MB_SIZE+1 - i ;				else					skip_bottom = skip_ver;				*(smb_data+i*width+j)= (ArDecodeSymbol (enh_intra_h_prob [contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom)], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;				}			}			num_loop_ver--;		}	}}//~OBSS_SAIT_991015Int CVideoObjectDecoder::shpMdTableIndex (const CMBMode* pmbmd, Int iMBX, Int iMBY){		//get previous shape codes; 	//	Added for error resilient mode by Toshiba(1997-11-14)	Bool bLeftBndry, bRightTopBndry, bTopBndry, bLeftTopBndry;	Int iMBnum = VPMBnum(iMBX, iMBY);	bLeftBndry = bVPNoLeft(iMBnum, iMBX);	bTopBndry = bVPNoTop(iMBnum);	bRightTopBndry = bVPNoRightTop(iMBnum, iMBX);	bLeftTopBndry = bVPNoLeftTop(iMBnum, iMBX);	ShapeMode shpmdTop	= !bTopBndry ? (pmbmd - m_iNumMBX)->m_shpmd : ALL_TRANSP;	ShapeMode shpmdTopR	= !bRightTopBndry ? (pmbmd - m_iNumMBX + 1)->m_shpmd : ALL_TRANSP;	ShapeMode shpmdTopL	= !bLeftTopBndry ? (pmbmd - m_iNumMBX - 1)->m_shpmd : ALL_TRANSP;	ShapeMode shpmdLeft	= !bLeftBndry ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;	return (shpmdTopL * 81 +  shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);	//const CMBMode* pmbmdTop = pmbmd - m_iNumMBX;	//ShapeMode shpmdTop		= (iMBY > 0) ? pmbmdTop->m_shpmd : ALL_TRANSP;	//ShapeMode shpmdTopR	= (iMBY > 0 && iMBX < m_iNumMBX - 1) ? (pmbmdTop + 1)->m_shpmd : ALL_TRANSP;	//ShapeMode shpmdTopL	= (iMBY > 0 && iMBX > 0) ? (pmbmdTop - 1)->m_shpmd : ALL_TRANSP;	//ShapeMode shpmdLeft		= (iMBX > 0) ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;	//return (shpmdTopL * 81 +  shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);	// End Toshiba(1997-11-14)}Void CVideoObjectDecoder::decodeIntraCaeBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm){	if (m_volmd.bNoCrChange == TRUE || m_pbitstrmIn->getBits (1) == 0)	{		m_iInverseCR = 1;		m_iWidthCurrBAB = BAB_SIZE;		copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB);  //used for upsample and CAE		m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB;		//assign encoding buffer		if (m_pbitstrmIn->getBits (1) == 1) 			decodeIntraCAEH ();			//right bottom border made on the fly		else			decodeIntraCAEV ();	}	else	{		if (m_pbitstrmIn->getBits (1) == 0)	{			m_iInverseCR = 2;			m_iWidthCurrBAB = 12;			subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown2);			m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2;		//assign encoding buffer		}		else {			m_iInverseCR = 4;			m_iWidthCurrBAB = 8;			subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown4);			m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4;		//assign encoding buffer		}		if (m_pbitstrmIn->getBits (1) == 1) 			decodeIntraCAEH ();     //right bottom border made on the fly		else			decodeIntraCAEV (); 		upSampleShape(ppxlcBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB);	}		copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);}Void CVideoObjectDecoder::decodeIntraCAEH (){	StartArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++)	{		PixelC* ppxlcDst = ppxlcDstRow;		for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++)	{			Int iContext = contextIntra (ppxlcDst);//printf("%d ",iContext);			*ppxlcDst++ = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;		}		*ppxlcDst = *(ppxlcDst - 1);		*(ppxlcDst + 1) = *ppxlcDst;		//make right border on the fly		ppxlcDstRow += m_iWidthCurrBAB;	}//printf("\n\n");	StopArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + 		m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++)	{		//make bottom border		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		ppxlcDst++;	}}Void CVideoObjectDecoder::decodeIntraCAEV (){	StartArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++)	{		PixelC* ppxlcDst = ppxlcDstCol;		for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++)	{			Int iContext = contextIntraTranspose (ppxlcDst);			*ppxlcDst = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;			ppxlcDst += m_iWidthCurrBAB;		}		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		//make bottom border on the fly		ppxlcDstCol++;	}	StopArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++)	{		//make right border		*ppxlcDst = *(ppxlcDst - 1);		*(ppxlcDst + 1) = *ppxlcDst;		ppxlcDst += m_iWidthCurrBAB;	}}Void CVideoObjectDecoder::decodeInterCAEH (const PixelC *ppxlcPredBAB){	StartArDecoder (m_parcodec, m_pbitstrmIn);	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;	PixelC* ppxlcDstRow  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	const PixelC* ppxlcPredRow = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;	for (Int iRow = 0; iRow < iSizeMB; iRow++)	{		PixelC* ppxlcDst = ppxlcDstRow;		const PixelC* ppxlcPred = ppxlcPredRow;		for (Int iCol = 0; iCol < iSizeMB; iCol++)	{			Int iContext = contextInter (ppxlcDst, ppxlcPred);			*ppxlcDst++ = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;			ppxlcPred++;		}		*ppxlcDst = *(ppxlcDst - 1);		*(ppxlcDst + 1) = *ppxlcDst;		//make right border on the fly		ppxlcDstRow += m_iWidthCurrBAB;		ppxlcPredRow += iSizePredBAB;	}	StopArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + 		m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++)	{		//make bottom border		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		ppxlcDst++;	}}Void CVideoObjectDecoder::decodeInterCAEV (const PixelC *ppxlcPredBAB){	StartArDecoder (m_parcodec, m_pbitstrmIn);	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;	PixelC* ppxlcDstCol  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	const PixelC* ppxlcPredCol = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;	for (Int iCol = 0; iCol < iSizeMB;iCol++)	{		PixelC* ppxlcDst = ppxlcDstCol;		const PixelC* ppxlcPred = ppxlcPredCol;		for (Int iRow = 0; iRow < iSizeMB; iRow++)	{			Int iContext = contextInterTranspose (ppxlcDst, ppxlcPred);			*ppxlcDst = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;			ppxlcDst += m_iWidthCurrBAB;			ppxlcPred += iSizePredBAB;		}		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		//make bottom border on the fly		ppxlcDstCol++;		ppxlcPredCol++;	}	StopArDecoder (m_parcodec, m_pbitstrmIn);	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++)	{		//make right border		*ppxlcDst = *(ppxlcDst - 1);		*(ppxlcDst + 1) = *ppxlcDst;		ppxlcDst += m_iWidthCurrBAB;	}}Void CVideoObjectDecoder::decodeMVDS (CMotionVector& mvDiff){	mvDiff.iMVX = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();				if (mvDiff.iMVX != 0)		if (m_pbitstrmIn->getBits (1) == 0)			mvDiff.iMVX *= -1;	if (mvDiff.iMVX == 0)			mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV2->decodeSymbol () + 1;				else		mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();				if (mvDiff.iMVY != 0)		if (m_pbitstrmIn->getBits (1) == 0)			mvDiff.iMVY *= -1;	mvDiff.computeTrueMV ();}

⌨️ 快捷键说明

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