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

📄 sys_decoder_shpdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeSSModeInter [colocatedIndex[shpmdColocatedMB]];		pmbmd->m_shpssmd = (ShapeSSMode) pentrdec->decodeSymbol ();	}	if (pmbmd->m_shpssmd == INTRA_NOT_CODED)	{		motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ1->getPlane(BY_PLANE)->pixels (),					  iX-1, iY-1);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		decideTransparencyStatus (pmbmd, ppxlcMBBY);	}	else if (pmbmd->m_shpssmd == INTRA_CODED)	{		motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ1->getPlane (BY_PLANE)->pixels (),					  iX-1, iY-1);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		decodeSIBAB (	ppxlcMBBY, ppxlcMBBYFrm, 						(pvopcRefQ1->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, 						(pvopcRefQ1->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY,						iMBX, iMBY,						(PixelC*)((pvopcRefQ1->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME));		decideTransparencyStatus (pmbmd, ppxlcMBBY);	}	else {//if lower layer has no MV then current MV is set to (0,0)		if( pmvBaseBY->iMVX	== NOT_MV && pmvBaseBY->iMVY == NOT_MV) {			pmvBaseBY->iMVX = 0;			pmvBaseBY->iMVY = 0;		}		motionCompBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ0->getPlane (BY_PLANE)->pixels (),					  (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape) + iX - 1,							  (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape) + iY - 1);	//-1 due to 18x18 motion comp		if (pmbmd->m_shpssmd == INTER_NOT_CODED)			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		else if (pmbmd->m_shpssmd == INTER_CODED){			m_iInverseCR = 1;			m_iWidthCurrBAB = BAB_SIZE;			const PixelC *ppxlcPredBAB = m_puciPredBAB->pixels ();//for bordering			copyLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcReconCurrBAB);  //used for upsample and CAE			m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB;		//assign encoding buffer			if (m_pbitstrmIn->getBits (1) == 1)	decodeInterCAEH (ppxlcPredBAB);			//right bottom border made on the fly			else								decodeInterCAEV (ppxlcPredBAB); 			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);	//copy rounded data		}		decideTransparencyStatus (pmbmd, ppxlcMBBY);	}}//for SI decodingVoid CVideoObjectDecoder::decodeSIBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm, Bool* HorSamplingChk, Bool* VerSamplingChk, Int iMBX, Int iMBY, PixelC* ppxlcRefSrc){	Int 		q0, si_coding_mode;	m_iWidthCurrBAB = BAB_SIZE;	PixelC* ppxlcReconCurrBABTr = NULL;		//for st_order	Int scan_order = 0;								copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB);  //used for upsample and CAE	Int i; Int j;	PixelC* PredSrc = ppxlcBYMB;	PixelC* PredDst = m_ppxlcReconCurrBAB+20*2+2;	double h_factor = log((double)m_volmd.ihor_sampling_factor_n_shape/m_volmd.ihor_sampling_factor_m_shape)/log((double)2);	int h_factor_int = (int)floor(h_factor+0.000001);	double v_factor = log((double)m_volmd.iver_sampling_factor_n_shape/m_volmd.iver_sampling_factor_m_shape)/log((double)2);	int v_factor_int = (int)floor(v_factor+0.000001);	Int NumTwoPowerLoopX = h_factor_int;	Bool ResidualLoopX = 0;	if(h_factor - h_factor_int > 0.000001 ) ResidualLoopX = 1;	Int NumTwoPowerLoopY = v_factor_int ; 	Bool ResidualLoopY = 0 ;	if(v_factor - v_factor_int > 0.000001 )	ResidualLoopY = 1;	for(j=0;j<16;j++){		for(i=0;i<16;i++){			*PredDst =*PredSrc;			PredDst++;PredSrc++;		}		PredDst+=4;	}	makeRightBottomBorder (m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE,(PixelC*)(ppxlcRefSrc),m_iFrameWidthY);		m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB;		//assign encoding buffer	if ( m_volmd.ihor_sampling_factor_n_shape  == 2  && m_volmd.ihor_sampling_factor_m_shape == 1 && 		m_volmd.iver_sampling_factor_n_shape  == 2  && m_volmd.iver_sampling_factor_m_shape == 1) {			//for st_order			scan_order = decideScanOrder((PixelC*) m_puciPredBAB->pixels ());		/*--  Curr BAB transposing --*/		if (scan_order){			ppxlcReconCurrBABTr = new PixelC [BAB_SIZE * BAB_SIZE];			for(Int j=0; j<BAB_SIZE; j++)			   for(Int i=0; i<BAB_SIZE; i++)				ppxlcReconCurrBABTr[j*BAB_SIZE+i]=m_ppxlcReconCurrBAB[i*BAB_SIZE+j];			m_rgpxlcCaeSymbol = ppxlcReconCurrBABTr;			Bool *tmp;			tmp = HorSamplingChk;			HorSamplingChk = VerSamplingChk;			VerSamplingChk = tmp;		}	}			StartArDecoder (m_parcodec, m_pbitstrmIn);	q0=SI_bab_type_prob[0];	si_coding_mode=ArDecodeSymbol(q0,m_parcodec,m_pbitstrmIn); //SISC	if(si_coding_mode==0) {		if(ResidualLoopX == 1 || h_factor_int>0) VerticalXORdecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC 		if(ResidualLoopY == 1 || v_factor_int>0) HorizontalXORdecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC 	}	else {		if(ResidualLoopX == 1 || h_factor_int>0) VerticalFulldecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC 		if(ResidualLoopY == 1 || v_factor_int>0) HorizontalFulldecoding(NumTwoPowerLoopX,NumTwoPowerLoopY,ResidualLoopX,ResidualLoopY,HorSamplingChk,VerSamplingChk); // SISC	}	StopArDecoder (m_parcodec, m_pbitstrmIn);	if ( m_volmd.ihor_sampling_factor_n_shape  == 2  && m_volmd.ihor_sampling_factor_m_shape == 1 && 		m_volmd.iver_sampling_factor_n_shape  == 2  && m_volmd.iver_sampling_factor_m_shape == 1) {			//for st_order			/*--  Curr BAB transposing --*/		if (scan_order){			for(j=0; j<BAB_SIZE; j++)			   for(Int i=0; i<BAB_SIZE; i++)				m_ppxlcReconCurrBAB[j*BAB_SIZE+i]=ppxlcReconCurrBABTr[i*BAB_SIZE+j];			delete [] ppxlcReconCurrBABTr;			Bool *tmp;			tmp = HorSamplingChk;			HorSamplingChk = VerSamplingChk;			VerSamplingChk = tmp;		}	}		copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);}Void CVideoObjectDecoder::VerticalXORdecoding (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_upper=0, skip_bottom=0, skip_hor=0, skip_right=0, skip_left=0;     		Int h_scan_freq=1, v_scan_freq=1;		i=0;			while(*(HorSamplingChk+i) == 0)	i++;		int tmp = i;		if (residual_scanning_hor) {			start_v = 0;			start_h = 0;			h_scan_freq=1<<num_loop_hor; 			v_scan_freq=1<<num_loop_ver;			skip_hor  = 1<<num_loop_hor;			if( tmp-(1<<num_loop_hor) >= 0 )				start_h = tmp-(1<<num_loop_hor);			else if( tmp+(1<<num_loop_hor) <= MB_SIZE-1 )	start_h = tmp+(1<<(num_loop_hor)) ;			else printf("Out of Sampling Ratio\n");			i=0;			while(*(VerSamplingChk+i) == 0)	i++;			start_v = i;			for(j=start_h;j<width-4;j+=h_scan_freq){				if( *(HorSamplingChk+j) == 1) continue;				skip_upper = start_v+1;				for(i=start_v;i<height-4;i+=v_scan_freq) {					if( *(VerSamplingChk+i) == 1) {						if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i;						else {							if( *(VerSamplingChk+i+v_scan_freq) == 0) {								if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i;								else                     skip_bottom = v_scan_freq*2; 							}							else	skip_bottom = v_scan_freq; 						}					}					else	continue;					if(j-h_scan_freq < -2)	prev=*(smb_data+i*width-2);					else 					prev=*(smb_data+i*width+j-h_scan_freq);					if(j+h_scan_freq > 17)	next=*(smb_data+i*width+17);					else					next=*(smb_data+i*width+j+h_scan_freq);					if ( j+skip_hor >15)	skip_right = MB_SIZE+1-j;					else					skip_right = skip_hor;					if ( j-skip_hor <0)		skip_left = j+2;					else					skip_left = skip_hor;					if(prev==next)	*(smb_data+i*width+j)=prev;					else 			*(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;				}			}		}		i=0;			while(*(HorSamplingChk+i) == 0)		i++;		if(i>start_h && residual_scanning_hor) tmp = start_h;		else tmp = i;		while (num_loop_hor >0){			start_v = 0;			start_h = 0;			h_scan_freq=1<<num_loop_hor; 			v_scan_freq=1<<num_loop_ver;			skip_hor  = 1<<(num_loop_hor-1);			if( tmp-(1<<(num_loop_hor-1)) >= 0 ) 	tmp = start_h = tmp-(1<<(num_loop_hor-1));			else									start_h = tmp+(1<<(num_loop_hor-1)) ;			i=0;				while(*(VerSamplingChk+i) == 0)	i++;			start_v = i;			for(j=start_h;j<(width-4);j+=h_scan_freq){				skip_upper = start_v+1;				for(i=start_v;i<(height-4);i+=v_scan_freq){					if( *(VerSamplingChk+i) == 1) {						if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i;						else {							if( *(VerSamplingChk+i+v_scan_freq) == 0) {								if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i;								else                     skip_bottom = v_scan_freq*2; 							}							else	skip_bottom = v_scan_freq; 						}					}					else	continue;					prev=*(smb_data+i*width+j-(1<<(num_loop_hor-1)));					if(j==width-1) next=prev;					else           next=*(smb_data+i*width+j+(1<<(num_loop_hor-1)));					if(j-(1<<(num_loop_hor-1)) < -2)	prev=*(smb_data+i*width-2);					else 								prev=*(smb_data+i*width+j-(1<<(num_loop_hor-1)));					if(j+(1<<(num_loop_hor-1)) > 17)	next=*(smb_data+i*width+17);					else								next=*(smb_data+i*width+j+(1<<(num_loop_hor-1)));					if ( j+skip_hor >15)		skip_right = MB_SIZE+1-j;					else						skip_right = skip_hor;					if ( j-skip_hor <0)			skip_left = j+2;					else						skip_left = skip_hor;					if(prev==next)	*(smb_data+i*width+j)=prev;					else 			*(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::VerticalFulldecoding (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_upper=0, skip_bottom=0, skip_hor=0, skip_right=0, skip_left=0;     		Int h_scan_freq=1, v_scan_freq=1;		i=0;			while(*(HorSamplingChk+i) == 1)	i++;		while(*(HorSamplingChk+i) == 0)	i++;		int tmp = i;		if (residual_scanning_hor) {			start_v = 0;			start_h = 0;			h_scan_freq=1<<num_loop_hor; 			v_scan_freq=1<<num_loop_ver;			skip_hor  = 1<<num_loop_hor;			if( tmp-(1<<num_loop_hor) >= 0 )				start_h = tmp-(1<<num_loop_hor);			else if( tmp+(1<<num_loop_hor) <= MB_SIZE-1 )	start_h = tmp+(1<<(num_loop_hor)) ;			else printf("Out of Sampling Ratio\n");			i=0;			while(*(VerSamplingChk+i) == 0)	i++;			start_v = i;			for(j=start_h;j<width-4;j+=h_scan_freq){				if( *(HorSamplingChk+j) == 1) continue;				skip_upper = start_v+1;				for(i=start_v;i<height-4;i+=v_scan_freq) {					if( *(VerSamplingChk+i) == 1) {						if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i;						else {							if( *(VerSamplingChk+i+v_scan_freq) == 0) {								if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i;								else                     skip_bottom = v_scan_freq*2; 							}							else	skip_bottom = v_scan_freq; 						}					}					else	continue;					if ( j+skip_hor >15)		skip_right = MB_SIZE+1-j;					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;				}			}		}		i=0;			while(*(HorSamplingChk+i) == 1)	i++;		while(*(HorSamplingChk+i) == 0)	i++;		if(i>start_h && residual_scanning_hor) tmp = start_h;		else tmp = i;		while (num_loop_hor >0){			start_v = 0;			start_h = 0;			h_scan_freq=1<<num_loop_hor; 			v_scan_freq=1<<num_loop_ver;			skip_hor  = 1<<(num_loop_hor-1);			if( tmp-(1<<(num_loop_hor-1)) >= 0 ) 	tmp = start_h = tmp-(1<<(num_loop_hor-1));			else									start_h = tmp+(1<<(num_loop_hor-1)) ;			i=0;				while(*(VerSamplingChk+i) == 0)	i++;			start_v = i;			for(j=start_h;j<(width-4);j+=h_scan_freq){				skip_upper = start_v+1;				for(i=start_v;i<(height-4);i+=v_scan_freq){					if( *(VerSamplingChk+i) == 1) {						if ( i+v_scan_freq >15) skip_bottom = MB_SIZE+1-i;						else {							if( *(VerSamplingChk+i+v_scan_freq) == 0) {								if (i+v_scan_freq*2 >15) skip_bottom = MB_SIZE+1-i;								else                     skip_bottom = v_scan_freq*2; 							}							else	skip_bottom = v_scan_freq; 						}					}					else	continue;					if ( j+skip_hor > 15)	skip_right = MB_SIZE+1-j;

⌨️ 快捷键说明

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