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

📄 b_frame.c

📁 Mobile IP VCEG的信道模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
								}
							}
							else
							{
								iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
								jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];
								
								for (j=0;j<4;j++) {
									j2=j*4;
									for (i=0;i<4;i++) {
										i2=i*4;
#ifdef UMV
										img->mpr[i+block_x][j+block_y]=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);	// refbuf
#else
										img->mpr[i+block_x][j+block_y]=FastPelY_14 (mref_P, jjj4+j2, iii4+i2);	// refbuf
#endif
									}
								}
							}
							
							for (j=0; j < BLOCK_SIZE; j++) 
							{
								for (i=0; i < BLOCK_SIZE; i++) 
								{
									img->m7[i][j]=
										imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
								}
							}
							nonzero=dct_luma(block_x,block_y,&coeff_cost);
							if (nonzero) 
							{
								currMB->cbp |= cbp_mask;
							}
						} // block_x
					} // block_y
					
					if (coeff_cost > 3) {
						sum_cnt_nonz += coeff_cost;
					}
					else /*discard */
					{
						currMB->cbp &= (63-cbp_mask);
						for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
						{
							for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
							{
								imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
							}
						}
					}
				} // mb_x
			}	// mb_y					
			
			if (sum_cnt_nonz <= 5 ) 
			{
				currMB->cbp &= 48; /* mask bit 4 and 5 */ 
				for (i=0; i < MB_BLOCK_SIZE; i++) 
				{
					for (j=0; j < MB_BLOCK_SIZE; j++) 
					{
						imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
					}
				}
			}			
			break;
			
		case B_Bidirect :
			currMB->cbp=0;
			sum_cnt_nonz=0;
			for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2) 
			{
				for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2) 
				{
					cbp_mask=(int)pow(2,(mb_x/8+mb_y/4));
					coeff_cost=0;                                       
					for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE) 
					{						
						pic_pix_y=img->pix_y+block_y;
						pic_block_y=pic_pix_y/BLOCK_SIZE;          
						for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE) 
						{							
							pic_pix_x=img->pix_x+block_x;
							pic_block_x=pic_pix_x/BLOCK_SIZE;
							
							img->ipredmode[pic_block_x+1][pic_block_y+1]=0;

							if(input->mv_res)
							{
								ii4=(img->pix_x+block_x)*8+tmp_fwMV[0][pic_block_y][pic_block_x+4];
								jj4=(img->pix_y+block_y)*8+tmp_fwMV[1][pic_block_y][pic_block_x+4];
								iii4=(img->pix_x+block_x)*8+tmp_bwMV[0][pic_block_y][pic_block_x+4];
								jjj4=(img->pix_y+block_y)*8+tmp_bwMV[1][pic_block_y][pic_block_x+4];
								
								for (j=0;j<4;j++) {
									j2=j*8;
									for (i=0;i<4;i++) {
										i2=i*8;
#ifdef UMV
										fw_pred=UMVPelY_18 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);	// refbuf
										bw_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);	//refbuf	
#else
										fw_pred=FastPelY_18 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);	// refbuf
										bw_pred=FastPelY_18 (mref_P, jjj4+j2, iii4+i2);	//refbuf		
#endif
										//fw_pred=get_eigthpix_pel(ii4+i2,jj4+j2,img->fw_multframe_no);
										//bw_pred=get_eigthpix_pel_P(iii4+i2,jjj4+j2);
										img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
									}
								}
							}
							else
							{
								ii4=(img->pix_x+block_x)*4+tmp_fwMV[0][pic_block_y][pic_block_x+4];
								jj4=(img->pix_y+block_y)*4+tmp_fwMV[1][pic_block_y][pic_block_x+4];
								iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
								jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];
								
								for (j=0;j<4;j++) {
									j2=j*4;
									for (i=0;i<4;i++) {
										i2=i*4;
#ifdef UMV
										fw_pred=UMVPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);	// refbuf
										bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);	//refbuf	
#else
										fw_pred=FastPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);	// refbuf
										bw_pred=FastPelY_14 (mref_P, jjj4+j2, iii4+i2);	//refbuf		
#endif
										img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
									}
								}
							}

							for (j=0; j < BLOCK_SIZE; j++) 
							{
								for (i=0; i < BLOCK_SIZE; i++) 
								{
									img->m7[i][j]=
										imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
								}
							}
							nonzero=dct_luma(block_x,block_y,&coeff_cost);
							if (nonzero) 
							{
								currMB->cbp |= cbp_mask;
							}
						} // block_x
					} // block_y
					
					if (coeff_cost > 3) {
						sum_cnt_nonz += coeff_cost;
					}
					else /*discard */
					{
						currMB->cbp &= (63-cbp_mask);
						for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
						{
							for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
							{
								imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
							}
						}
					}
				} // mb_x
			}	// mb_y					
			
			if (sum_cnt_nonz <= 5 ) 
			{
				currMB->cbp &= 48; /* mask bit 4 and 5 */ 
				for (i=0; i < MB_BLOCK_SIZE; i++) 
				{
					for (j=0; j < MB_BLOCK_SIZE; j++) 
					{
						imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
					}
				}
			}			
			break;
			
		case B_Direct :
			currMB->cbp=0;
			sum_cnt_nonz=0;
			for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2) 
			{
				for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2) 
				{
					cbp_mask=(int)pow(2,(mb_x/8+mb_y/4));
					coeff_cost=0;                                       
					for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE) 
					{						
						pic_pix_y=img->pix_y+block_y;
						pic_block_y=pic_pix_y/BLOCK_SIZE;          
						for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE) 
						{							
							pic_pix_x=img->pix_x+block_x;
							pic_block_x=pic_pix_x/BLOCK_SIZE;
							
							img->ipredmode[pic_block_x+1][pic_block_y+1]=0;
							
							if(input->mv_res)
							{
								ii4 =(img->pix_x+block_x)*8+dfMV[0][pic_block_y][pic_block_x+4];
								jj4 =(img->pix_y+block_y)*8+dfMV[1][pic_block_y][pic_block_x+4];
								iii4=(img->pix_x+block_x)*8+dbMV[0][pic_block_y][pic_block_x+4];
								jjj4=(img->pix_y+block_y)*8+dbMV[1][pic_block_y][pic_block_x+4];
								
								// next P is intra mode
								if(refFrArr[pic_block_y][pic_block_x]==-1)
									ref_inx=(img->number-1)%img->buf_cycle;
								// next P is skip or inter mode
								else
									ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;
								
								for (j=0;j<4;j++) {
									j2=j*8;
									for (i=0;i<4;i++) {
										i2=i*8;								
#ifdef UMV
										df_pred=UMVPelY_18 (mref[ref_inx], jj4+j2, ii4+i2);
										db_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);
#else
										df_pred=FastPelY_18 (mref[ref_inx], jj4+j2, ii4+i2);
										db_pred=FastPelY_18 (mref_P, jjj4+j2, iii4+i2);
#endif

										//df_pred=get_eigthpix_pel(ii4+i2,jj4+j2,ref_inx);
										//db_pred=get_eigthpix_pel_P(iii4+i2,jjj4+j2);

										// df_pred=mref[ref_inx][jj4+j2][ii4+i2];
										// db_pred=mref_P[jjj4+j2][iii4+i2];
										img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);                
									}
								}
							}
							else
							{
								ii4 =(img->pix_x+block_x)*4+dfMV[0][pic_block_y][pic_block_x+4];
								jj4 =(img->pix_y+block_y)*4+dfMV[1][pic_block_y][pic_block_x+4];
								iii4=(img->pix_x+block_x)*4+dbMV[0][pic_block_y][pic_block_x+4];
								jjj4=(img->pix_y+block_y)*4+dbMV[1][pic_block_y][pic_block_x+4];
								
								// next P is intra mode
								if(refFrArr[pic_block_y][pic_block_x]==-1)
									ref_inx=(img->number-1)%img->buf_cycle;
								// next P is skip or inter mode
								else
									ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;
								
								for (j=0;j<4;j++) {
									j2=j*4;
									for (i=0;i<4;i++) {
										i2=i*4;								
#ifdef UMV
										df_pred=UMVPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
										db_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);
#else
										df_pred=FastPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
										db_pred=FastPelY_14 (mref_P, jjj4+j2, iii4+i2);
#endif
										img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);                
									}
								}
							}
							// LG : direct residual coding
							for (j=0; j < BLOCK_SIZE; j++) 
							{
								for (i=0; i < BLOCK_SIZE; i++) 
								{
									img->m7[i][j]=										
										imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
								}
							}
							nonzero=dct_luma(block_x,block_y,&coeff_cost);
							if (nonzero) 
							{
								currMB->cbp |= cbp_mask;
							}
						} // block_x
					} // block_y
					
					// LG : direct residual coding
					if (coeff_cost > 3) {
						sum_cnt_nonz += coeff_cost;
					}
					else /*discard */
					{
						currMB->cbp &= (63-cbp_mask);
						
						for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
						{
							for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
							{
								imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
							}
						}				
					} 
				} // mb_x
			} // mb_y					
			
			// LG : direct residual coding
			if (sum_cnt_nonz <= 5 ) 
			{
				currMB->cbp &= 48; /* mask bit 4 and 5 */ 
				for (i=0; i < MB_BLOCK_SIZE; i++) 
				{
					for (j=0; j < MB_BLOCK_SIZE; j++) 
					{
						imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
					}
				}
			}			
			break;
			
		default:
			break;
	} // switch()	  
}

/************************************************************************
*
*  Name :       ChromaCoding_B()
*
*  Description: Performs DCT, quantization, run/level pre-coding and IDCT 
*               for the chrominance of a B-frame macroblock; 
*								current cbp and cr_cbp are affected 
*
************************************************************************/

void ChromaCoding_B(int *cr_cbp)
{
	int i, j;
	int uv, ii,jj,ii0,jj0,ii1,jj1,if1,jf1,if0,jf0,f1,f2,f3,f4;	
	int pic_block_y, pic_block_x, ref_inx, fw_pred, bw_pred;
	Macroblock *currMB = &img->mb_data[img->current_mb_nr];

	if(input->mv_res)
	{
	  f1=16;
	  f2=15;
	}
	else
	{
	  f1=8;
	  f2=7;
	}

	f3=f1*f1;
	f4=f3/2;

	*cr_cbp=0;
	for (uv=0; uv < 2; uv++) 
	{      
		if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW) 
		{
			intrapred_chroma(img->pix_c_x,img->pix_c_y,uv); 
		}        
		else if(img->imod == B_Forward)  
		{
			for (j=0; j < MB_BLOCK_SIZE/2; j++) 
			{
				pic_block_y=(img->pix_c_y+j)/2;
				for (i=0; i < MB_BLOCK_SIZE/2; i++) 
				{
					pic_block_x=(img->pix_c_x+i)/2;
					ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
					jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
					ii0=ii/f1;
					jj0=jj/f1;
					ii1=(ii+f2)/f1;
					jj1=(jj+f2)/f1;
#endif
#ifdef UMV
					ii0= max (0, min (img->width_cr-1, ii/f1));
					jj0= max (0, min (img->height_cr-1, jj/f1));
					ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
					jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif

					if1=(ii & f2);
					jf1=(jj & f2);
					if0=f1-if1;
					jf0=f1-jf1;
					img->mpr[i][j]=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
									if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+
									if0*jf1*mcef[img->fw_multframe_no][uv][jj1][ii0]+
									if1*jf1*mcef[img->fw_multframe_no][uv][jj1][ii1]+f4)/f3;
						
					img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j]; 
				}
			}
		}
		else if(img->imod == B_Backward)  
		{
			for (j=0; j < MB_BLOCK_SIZE/2; j++) 
			{
				pic_block_y=(img->pix_c_y+j)/2;
				for (i=0; i < MB_BLOCK_SIZE/2; i++) 
				{
					pic_block_x=(img->pix_c_x+i)/2;

					ii=(img->pix_c_x+i)*f1+tmp_bwMV[0][pic_block_y][pic_block_x+4];
					jj=(img->pix_c_y+j)*f1+tmp_bwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
					ii0=ii/f1;
					jj0=jj/f1;
					ii1=(ii+f2)/f1;
					jj1=(jj+f2)/f1;
#endif
#ifdef UMV
					ii0= max (0, min (img->width_cr-1, ii/f1));
					jj0= max (0, min (img->height_cr-1, jj/f1));
					ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
					jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif
					if1=(ii & f2);
					jf1=(jj & f2);
					if0=f1-if1;
					jf0=f1-jf1;
					img->mpr[i][j]=(if0*jf0*mcef_P[uv][jj0][ii0]+if1*jf0*mcef_P[uv][jj0][ii1]+
										if0*jf1*mcef_P[uv][jj1][ii0]+if1*jf1*mcef_P[uv][jj1][ii1]+f4)/f3;

					img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j]; 
				}
			}
		}
		else if(img->imod == B_Bidirect)  
		{
			for (j=0; j < MB_BLOCK_SIZE/2; j++) 
			{
				pic_block_y=(img->pix_c_y+j)/2;
				for (i=0; i < MB_BLOCK_SIZE/2; i++) 
				{
					pic_block_x=(img->pix_c_x+i)/2;

					ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
					jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
					ii0=ii/f1;
					jj0=jj/f1;
					ii1=(ii+f2)/f1;
					jj1=(jj+f2)/f1;
#endif
#ifdef UMV
					ii0= max (0, min (img->width_cr-1, ii/f1));
					jj0= max (0, min (img->height_cr-1, jj/f1));
					ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
					jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif

					if1=(ii & f2);
					jf1=(jj & f2);
					if0=f1-if1;
					jf0=f1-jf1;
					fw_pred=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
							 if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+

⌨️ 快捷键说明

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