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

📄 macroblock.c

📁 Mobile IP VCEG的信道模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                                     if (level != 0)		/* leave if len=1 */
									{
										coef_ctr=coef_ctr+run+1;

										i0=DBL_SCAN[coef_ctr][0][scan_loop_ctr];
										j0=DBL_SCAN[coef_ctr][1][scan_loop_ctr];

										img->cof[i][j][i0][j0]=level*JQ1[img->qp];

										if (level!=0)
										{
											loopb[img->block_x+i+1][img->block_y+j+1]=max(loopb[img->block_x+i+1][img->block_y+j+1],2);
											loopb[img->block_x+i  ][img->block_y+j+1]=max(loopb[img->block_x+i  ][img->block_y+j+1],1);
											loopb[img->block_x+i+1][img->block_y+j  ]=max(loopb[img->block_x+i+1][img->block_y+j  ],1);
											loopb[img->block_x+i+2][img->block_y+j+1]=max(loopb[img->block_x+i+2][img->block_y+j+1],1);
											loopb[img->block_x+i+1][img->block_y+j+2]=max(loopb[img->block_x+i+1][img->block_y+j+2],1);
										}
									}
								}
							}
						}
					}
				}
			}
		}
    }

	for (j=4;j<6;j++) /* reset all chroma coeffs before read */
		for (i=0;i<4;i++)
			for (iii=0;iii<4;iii++)
				for (jjj=0;jjj<4;jjj++)
					img->cof[i][j][iii][jjj]=0;

	m2=img->mb_x*2;
	jg2=img->mb_y*2;

	/* chroma 2x2 DC coeff */
	if(cbp>15)
	{
		for (ll=0;ll<3;ll+=2)
		{
			for (i=0;i<4;i++)
				img->cofu[i]=0;

			coef_ctr=-1;
			//len=0;
            level=1;
			//for(k=0;(k<5)&&(len!=1);k++)
            for(k=0;(k<5)&&(level!=0);k++)	
			{
                if (inp->symbol_mode == UVLC)
					currSE.mapping = linfo_levrun_c2x2;
				else							
					currSE.reading = readRunLevelFromBuffer_CABAC;

				if ( img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
				{
					currSE.context = 6; // for choosing context model
					currSE.type  = SE_CHR_DC_INTRA;
				}
				else
				{
					currSE.context = 5; // for choosing context model
					currSE.type  = SE_CHR_DC_INTER; 
				}
														
#if TRACE
	            sprintf(currSE.tracestring, " 2x2 DC Chroma ");
#endif
                dP = &(currSlice->partArr[partMap[currSE.type]]);
                dP->readSyntaxElement(&currSE,img,inp,dP);
		        level = currSE.value1;
                run = currSE.value2;
                len = currSE.len;
				//if (len != 1)
// printf ("2x2 Chroma DC Coeff, mb %d, blkx, y %d %d level %d run %d len %d\n", img->current_mb_nr, block_x, block_y, level, run, len);
                if (level != 0)
				{
					coef_ctr=coef_ctr+run+1;
// Bug: img->cofu has only 4 entries, hence coef_ctr MUST be <4 (which is
// caught by the assert().  If it is bigger than 4, it starts patching the
// img->predmode pointer, which leads to bugs later on.
assert (coef_ctr < 4);					
					img->cofu[coef_ctr]=level*JQ1[QP_SCALE_CR[img->qp]];

					if (level != 0 );
					{
						for (j=0;j<2;j++)
						{
							for (i=0;i<2;i++)
							{
								loopc[m2+i+1][jg2+j+1]=max(loopc[m2+i+1][jg2+j+1],2);
							}
						}

						for (i=0;i<2;i++)
						{
							loopc[m2+i+1][jg2    ]=max(loopc[m2+i+1][jg2    ],1);
							loopc[m2+i+1][jg2+3  ]=max(loopc[m2+i+1][jg2+3  ],1);
							loopc[m2    ][jg2+i+1]=max(loopc[m2    ][jg2+i+1],1);
							loopc[m2+3  ][jg2+i+1]=max(loopc[m2+3  ][jg2+i+1],1);
						}
					}
				}
			}
			img->cof[0+ll][4][0][0]=(img->cofu[0]+img->cofu[1]+img->cofu[2]+img->cofu[3])/2;
			img->cof[1+ll][4][0][0]=(img->cofu[0]-img->cofu[1]+img->cofu[2]-img->cofu[3])/2;
			img->cof[0+ll][5][0][0]=(img->cofu[0]+img->cofu[1]-img->cofu[2]-img->cofu[3])/2;
			img->cof[1+ll][5][0][0]=(img->cofu[0]-img->cofu[1]-img->cofu[2]+img->cofu[3])/2;
		}
	}

	/* chroma AC coeff, all zero fram start_scan */
	if (cbp>31)
	{
		block_y=4;
		for (block_x=0; block_x < 4; block_x += 2)
		{
			for (j=block_y; j < block_y+2; j++)
			{
				jj=j/2;
				j1=j-4;
				for (i=block_x; i < block_x+2; i++)
				{
					ii=i/2;
					i1=i%2;
					{
						coef_ctr=0;
						//len=0;
                        level=1;
						//for(k=0;(k<16)&&(len!=1);k++)
                        for(k=0;(k<16)&&(level!=0);k++)
						{
                            if (inp->symbol_mode == UVLC)
								currSE.mapping = linfo_levrun_inter;
							else							
								currSE.reading = readRunLevelFromBuffer_CABAC;

							if ( img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
							{
								currSE.context = 8; // for choosing context model	
								currSE.type  = SE_CHR_AC_INTRA;
							}
							else
							{
								currSE.context = 7; // for choosing context model	
								currSE.type  = SE_CHR_AC_INTER; 
							}
#if TRACE
	                        sprintf(currSE.tracestring, " AC Chroma ");
#endif
                            dP = &(currSlice->partArr[partMap[currSE.type]]);
                            dP->readSyntaxElement(&currSE,img,inp,dP);
		                    level = currSE.value1;
                            run = currSE.value2;
					        len = currSE.len;
                            
// printf ("2x2 Chroma AC Coeff, mb %d, blkx, y %d %d level %d run %d len %d\n", img->current_mb_nr, block_x, block_y, level, run, len);
							//if (len != 1)
                            if (level != 0)
							{
								coef_ctr=coef_ctr+run+1;
								i0=SNGL_SCAN[coef_ctr][0];
								j0=SNGL_SCAN[coef_ctr][1];
								img->cof[i][j][i0][j0]=level*JQ1[QP_SCALE_CR[img->qp]];

								if (level!=0)
								{
									loopc[m2+i1+1][jg2+j1+1]=max(loopc[m2+i1+1][jg2+j1+1],2);

									loopc[m2+i1  ][jg2+j1+1]=max(loopc[m2+i1  ][jg2+j1+1],1);
									loopc[m2+i1+1][jg2+j1  ]=max(loopc[m2+i1+1][jg2+j1  ],1);
									loopc[m2+i1+2][jg2+j1+1]=max(loopc[m2+i1+2][jg2+j1+1],1);
									loopc[m2+i1+1][jg2+j1+2]=max(loopc[m2+i1+1][jg2+j1+2],1);
								}
							}
						}
					}
				}
			}
		}
    }   
}



/************************************************************************
*
*  Name :       decode_one_CopyMB()
*
*  Description: copy current MB from last MB
*
************************************************************************/
void decode_one_CopyMB(struct img_par *img,struct inp_par *inp)
{
    int i, j, ii, jj, uv, i3, j3;
    Macroblock *currMB = &img->mb_data[img->current_mb_nr];
    int ref_frame = currMB->ref_frame;
	int mv_mul;

	if(img->mv_res)
	  mv_mul=8;
	else
	  mv_mul=4;

	/* get luma pixel **************************************************/
    for(j=0;j<MB_BLOCK_SIZE;j++)
	{
		jj=img->pix_y+j;
		for(i=0;i<MB_BLOCK_SIZE;i++)
		{
			ii=img->pix_x+i;
		    imgY[jj][ii]=get_pixel(ref_frame,ii*mv_mul,jj*mv_mul,img);
			// imgY[jj][ii]=mref[ref_frame][jj*4][ii*4];
		}
	}

    /* get chroma pixel ***********************************************/
	for(uv=0;uv<2;uv++)
	{
		for(j=0;j<MB_BLOCK_SIZE/2;j++)
		{
			jj=img->pix_c_y+j;
			for(i=0;i<MB_BLOCK_SIZE/2;i++)
			{
				ii=img->pix_c_x+i;
				imgUV[uv][jj][ii]=mcef[ref_frame][uv][jj][ii];
			}
		}
	}

    /* set loop filter ************************************************/
	for (i=0;i<4;i++)
	{
		ii=img->block_x+i;
		i3=ii/2;
		for (j=0;j<4;j++)
		{
			jj=img->block_y+j;
			j3=jj/2;	
			if (((img->mv[ii-1+4][jj][0]/4)!=0||(img->mv[ii-1+4][jj][1]/4!=0)) && ii > 0)				
			{
				loopb[ii  ][jj+1]=max(loopb[ii  ][jj+1],1);
				loopb[ii+1][jj+1]=max(loopb[ii+1][jj+1],1);
				loopc[i3  ][j3+1]=max(loopc[i3  ][j3+1],1);
				loopc[i3+1][j3+1]=max(loopc[i3+1][j3+1],1);
			}
			if (jj > 0 &&((img->mv[ii+4][jj-1][0]/4!=0)||(img->mv[ii+4][jj-1][1]/4!=0)))
			{
				loopb[ii+1][jj  ]=max(loopb[ii+1][jj  ],1);
				loopb[ii+1][jj+1]=max(loopb[ii+1][jj+1],1);
				loopc[i3+1][j3  ]=max(loopc[i3+1][j3  ],1);
				loopc[i3+1][j3+1]=max(loopc[i3+1][j3+1],1);
			}
		}
	}	
}
/************************************************************************
*
*  Name :       decode_one_macroblock()
*
*  Description: decode one macroblock
*
************************************************************************/
int decode_one_macroblock(struct img_par *img,struct inp_par *inp)
{				
    int js[2][2];
	int i=0,j=0,ii=0,jj=0,i1=0,j1=0,j4=0,i4=0;
	int js0=0,js1=0,js2=0,js3=0,jf=0;
	int uv;
	int vec1_x=0,vec1_y=0,vec2_x=0,vec2_y=0;
	//const int ICBPTAB[6] = {0,16,32,15,31,47};
	int ioff,joff;

	int ii0,jj0,ii1,jj1,if1,jf1,if0,jf0;
	int mv_mul,f1,f2,f3,f4;

	Macroblock *currMB = &img->mb_data[img->current_mb_nr];
    int ref_frame = currMB->ref_frame;
    
	/* set variables depending on mv_res */
	if(img->mv_res)
	{
	  mv_mul=8;
	  f1=16;
	  f2=15;
	}
	else
	{
	  mv_mul=4;
	  f1=8;
	  f2=7;
	}

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

	/* luma decoding ***************************************************/

    /* get prediction for INTRA_MB_16x16 */
    if (currMB->mb_imode == INTRA_MB_NEW)
		intrapred_luma_2(img,currMB->intra_pred_modes[0]);

	for(j=0;j<MB_BLOCK_SIZE/BLOCK_SIZE;j++)
	{
		joff=j*4;
		j4=img->block_y+j;
		for(i=0;i<MB_BLOCK_SIZE/BLOCK_SIZE;i++)
		{
			ioff=i*4;
			i4=img->block_x+i;
            /* get prediction for INTRA_MB_4x4 */
			if(currMB->mb_imode == INTRA_MB_OLD)
			{
				if (intrapred(img,ioff,joff,i4,j4)==SEARCH_SYNC)  /* make 4x4 prediction block mpr from given prediction img->mb_mode */
					return SEARCH_SYNC;                   /* bit error */
			}
            /* get motion prediction for INTER_MB */
			else if(currMB->mb_imode == INTRA_MB_INTER)
			{

				for(ii=0;ii<BLOCK_SIZE;ii++)
				{
					vec2_x=(i4*4+ii)*mv_mul;
					vec1_x=vec2_x+img->mv[i4+BLOCK_SIZE][j4][0];
					for(jj=0;jj<MB_BLOCK_SIZE/BLOCK_SIZE;jj++)
					{
						vec2_y=(j4*4+jj)*mv_mul;
						vec1_y=vec2_y+img->mv[i4+4][j4][1];
						img->mpr[ii+ioff][jj+joff]=get_pixel(ref_frame,vec1_x,vec1_y,img);
						// img->mpr[ii+ioff][jj+joff]=mref[ref_frame][vec1_y][vec1_x];
					}
				}
			}

			itrans(img,ioff,joff,i,j);      /* use DCT transform and make 4x4 block m7 from prediction block mpr */

			for(ii=0;ii<BLOCK_SIZE;ii++)
			{
				for(jj=0;jj<BLOCK_SIZE;jj++)
				{
					imgY[j4*BLOCK_SIZE+jj][i4*BLOCK_SIZE+ii]=img->m7[ii][jj]; /* contruct picture from 4x4 blocks*/
				}
			}
		}
    }
	/* chroma decoding ********************************************************/

	for(uv=0;uv<2;uv++)
	{
		if (img->imod==INTRA_MB_OLD || img->imod==INTRA_MB_NEW)/* intra mode */
		{
			js0=0;
			js1=0;
			js2=0;
			js3=0;
			for(i=0;i<4;i++)
			{
				if(currMB->mb_available[0][1]) //mb_available_up
				{
					js0=js0+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i];
					js1=js1+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i+4];
				}
				if(currMB->mb_available[1][0]) //mb_available_left
				{
					js2=js2+imgUV[uv][img->pix_c_y+i][img->pix_c_x-1];
					js3=js3+imgUV[uv][img->pix_c_y+i+4][img->pix_c_x-1];
				}
			}
			if(currMB->mb_available[0][1] && currMB->mb_available[1][0]) //mb_available_up && mb_available_left
			{
				js[0][0]=(js0+js2+4)/8;
				js[1][0]=(js1+2)/4;
				js[0][1]=(js3+2)/4;
				js[1][1]=(js1+js3+4)/8;
			}
			if(currMB->mb_available[0][1] && !currMB->mb_available[1][0]) //mb_available_up && !mb_available_left
			{
				js[0][0]=(js0+2)/4;
				js[1][0]=(js1+2)/4;
				js[0][1]=(js0+2)/4;
				js[1][1]=(js1+2)/4;
			}
			if(!currMB->mb_available[0][1] && currMB->mb_available[1][0]) //mb_available_left && !mb_available_up
			{
				js[0][0]=(js2+2)/4;
				js[1][0]=(js2+2)/4;
				js[0][1]=(js3+2)/4;
				js[1][1]=(js3+2)/4;
			}
			if(!currMB->mb_available[0][1] && !currMB->mb_available[1][0]) //!mb_available_up && !mb_available_left
			{
				js[0][0]=128;
				js[1][0]=128;
				js[0][1]=128;
				js[1][1]=128;
			}
		}

		for (j=4;j<6;j++)
		{
			joff=(j-4)*4;
			j4=img->pix_c_y+joff;
			for(i=0;i<2;i++)
			{
				ioff=i*4;
				i4=img->pix_c_x+ioff;
				/* make pred */
				if(img->imod==INTRA_MB_OLD|| img->imod==INTRA_MB_NEW)/* intra */
				{
					for(ii=0;ii<4;ii++)
						for(jj=0;jj<4;jj++)
						{
							img->mpr[ii+ioff][jj+joff]=js[i][j-4];
						}
				}
				else
				{
					for(jj=0;jj<4;jj++)
					{
						jf=(j4+jj)/2;
						for(ii=0;ii<4;ii++)
						{
							if1=(i4+ii)/2;
							i1=(img->pix_c_x+ii+ioff)*f1+img->mv[if1+4][jf][0];
							j1=(img->pix_c_y+jj+joff)*f1+img->mv[if1+4][jf][1];

#ifndef UMV
							ii0=i1/f1;
							jj0=j1/f1;
							ii1=(i1+f2)/f1;
							jj1=(j1+f2)/f1;
#endif
#ifdef UMV
							ii0=max (0, min (i1/f1, img->width_cr-1));
							jj0=max (0, min (j1/f1, img->height_cr-1));
							ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
							jj1=max (0, min ((j1+f2)/f1, img->height_cr-1));
#endif

							if1=(i1 & f2);
							jf1=(j1 & f2);
							if0=f1-if1;
							jf0=f1-jf1;
							img->mpr[ii+ioff][jj+joff]=(if0*jf0*mcef[ref_frame][uv][jj0][ii0]+
							                            if1*jf0*mcef[ref_frame][uv][jj0][ii1]+
							                            if0*jf1*mcef[ref_frame][uv][jj1][ii0]+
							                            if1*jf1*mcef[ref_frame][uv][jj1][ii1]+f4)/f3;

						}
					}
				}
				itrans(img,ioff,joff,2*uv+i,j);
				for(ii=0;ii<4;ii++)
					for(jj=0;jj<4;jj++)
					{
						imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
					}
			}
		}
    }
    SetLoopfilterStrength_P(img);
    return 0;
}

⌨️ 快捷键说明

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