📄 macroblock.c
字号:
}
}
//===== READ FORWARD MOTION VECTORS =====
currSE.type = SE_MVD;
currSE.mapping = linfo_se;
for (j0=0; j0<2; )
{
if(currMB->mb_type!=I4MB)
{
step_h0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][0]);
step_v0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][1]);
}
if((currMB->mb_type==I4MB&&j0==0)) // for by jhzheng [2004/08/02]
{ j0 += 1; continue;}
//{break;}
for (i0=0; i0<2; )
{
k=2*j0+i0;
if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && (currMB->b8mode[k] !=0))//has forward vector
{
mv_mode = currMB->b8mode[k];
step_h = BLOCK_STEP [mv_mode][0];
step_v = BLOCK_STEP [mv_mode][1];
if (!bframe) refframe = refFrArr [img->block_y+j0][img->block_x+i0];
else refframe = img->fw_refFrArr[img->block_y+j0][img->block_x+i0];
for (j=j0; j<j0+step_v0; j+=step_v)
for (i=i0; i<i0+step_h0; i+=step_h)
{
j4 = img->block_y+j;
i4 = img->block_x+i;
// first make mv-prediction
if (!bframe)
SetMotionVectorPredictor (img, pmv, pmv+1, refframe, refFrArr, img->mv, i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016
else
SetMotionVectorPredictor (img, pmv, pmv+1, refframe, img->fw_refFrArr, img->fw_mv, i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016
for (n=0; n < 2; n++)
{
#if TRACE
snprintf(currSE.tracestring, TRACESTRING_SIZE, "FMVD (pred %d)",pmv[n]);
#endif
img->subblock_x = i; // position used for context determination
img->subblock_y = j; // position used for context determination
currSE.value2 = (!bframe ? n : 2*n); // identifies the component; only used for context determination
readSyntaxElement_UVLC(&currSE,inp);
curr_mvd = currSE.value1;
vec=curr_mvd+pmv[n]; /* find motion vector */
// need B support
if (!bframe)
{
for(ii=0;ii<step_h;ii++)
for(jj=0;jj<step_v;jj++)
img->mv[i4+ii+BLOCK_SIZE][j4+jj][n]=vec;
}
else // B frame
{
for(ii=0;ii<step_h;ii++)
for(jj=0;jj<step_v;jj++)
img->fw_mv[i4+ii+BLOCK_SIZE][j4+jj][n]=vec;
}
/* store (oversampled) mvd */
for (l=0; l < step_v; l++)
for (m=0; m < step_h; m++)
currMB->mvd[0][j+l][i+m][n] = curr_mvd;
}
}
}
else if (currMB->b8mode[k=2*j0+i0]==0)
{// direct mode
// by Junhao Zheng 2004-08-04 22:00:51
//step_v0 = step_h0 = 1;
for (j=j0; j<j0+step_v0; j++)
for (i=i0; i<i0+step_h0; i++)
{
ref= refFrArr[img->block_y+j][img->block_x+i];
img_block_y = (img->current_mb_nr%2) ? (img->block_y-4)/2:img->block_y/2;
if(ref == -1)
{
//sw
img->fw_refFrArr[img->block_y+j][img->block_x+i]=0;
img->bw_refFrArr[img->block_y+j][img->block_x+i]=0;
j4 = img->block_y+j;
i4 = img->block_x+i;
for (ii=0; ii < 2; ii++)
{
img->fw_mv[i4+BLOCK_SIZE][j4][ii]=0;
img->bw_mv[i4+BLOCK_SIZE][j4][ii]=0;
}
SetMotionVectorPredictor(img,&(img->fw_mv[i4+BLOCK_SIZE][j4][0]),
&(img->fw_mv[i4+BLOCK_SIZE][j4][1]),0,img->fw_refFrArr,
img->fw_mv,0,0,16,16, 0, 1);
SetMotionVectorPredictor(img,&(img->bw_mv[i4+BLOCK_SIZE][j4][0]),
&(img->bw_mv[i4+BLOCK_SIZE][j4][1]),0,img->bw_refFrArr,
img->bw_mv,0,0,16,16, -1, 1);
}
else
{
#ifndef CRPS
frame_no_next_P =2*img->imgtr_next_P;
// frame_no_B = 2*img->tr;
frame_no_B = 2*img->pic_distance; // Added by Xiaozhen ZHENG, 2007.05.01
delta_P = 2* (img->imgtr_next_P - img->imgtr_last_P);
delta_P = (delta_P + 512)%512; // Added by Xiaozhen ZHENG, 2007.05.01
if(!img->picture_structure)
{
if (img->current_mb_nr_fld < img->PicSizeInMbs) //top field
scale_refframe = ref == 0 ? 0 : 1;
else
scale_refframe = ref == 1 ? 1 : 2;
}
else
scale_refframe = 0;
if(img->picture_structure)
{
iTRp = (ref+1)*delta_P;
iTRp1 = (scale_refframe+1)*delta_P;
}else
{
if (img->current_mb_nr_fld < img->PicSizeInMbs) //top field
{
iTRp = delta_P*(ref/2+1)-(ref+1)%2; //the lates backward reference
iTRp1 = delta_P*(scale_refframe/2+1)-(scale_refframe+1)%2; //the lates backward reference
bw_ref = 0;
}
else
{
iTRp = 1 + delta_P*((ref+1)/2)-ref%2;
iTRp1 = 1 + delta_P*((scale_refframe+1)/2)-scale_refframe%2;
bw_ref = 1;
}
}
iTRd = frame_no_next_P - frame_no_B;
iTRb = iTRp1 - iTRd;
#else
if(!img->picture_structure)
{
if(img->current_mb_nr_fld < img->PicSizeInMbs)
{
DistanceIndexCur = 2*img->pic_distance;
if(ref==0)
{
DistanceIndexRef = 2*img->imgtr_last_P+1;
if(img->img_next_is_core_frame)
DistanceIndexRef = 2*img->img_next_core_frame_ref_distance+1;
}
else if(ref==1)
{
DistanceIndexRef = 2*img->imgtr_last_P;
if(img->img_next_is_core_frame)
DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
}
else if(ref==2)
{
DistanceIndexRef = 2*img->imgtr_last_prev_P+1;
}
else//ref==3
{
DistanceIndexRef = 2*img->imgtr_last_prev_P;
}
DistanceIndexFw0 = 2*img->imgtr_last_P+1;
DistanceIndexFw1 = 2*img->imgtr_last_P;
DistanceIndexBw0 = 2*img->imgtr_next_P;
DistanceIndexBw1 = 2*img->imgtr_next_P+1;
//DistanceIndexFw
if (DistanceIndexRef == DistanceIndexFw0)
{
scale_refframe = 0;//fw reference
DistanceIndexFw = DistanceIndexFw0;
}
else
{
scale_refframe = 1;
DistanceIndexFw = DistanceIndexFw1;
}
//DistanceIndexBw
bw_ref = 0;//bw reference
DistanceIndexBw = DistanceIndexBw0;
}
else
{
DistanceIndexCur = 2*img->pic_distance+1;
if(ref==0)
{
DistanceIndexRef = 2*img->imgtr_next_P;
}
else if(ref==1)
{
DistanceIndexRef = 2*img->imgtr_last_P+1;
if(img->img_next_is_core_frame)
DistanceIndexRef = 2*img->img_next_core_frame_ref_distance+1;
}
else if(ref==2)
{
DistanceIndexRef = 2*img->imgtr_last_P;
if(img->img_next_is_core_frame)
DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
}
else//ref==3
{
DistanceIndexRef = 2*img->imgtr_last_prev_P+1;
}
DistanceIndexFw0 = 2*img->imgtr_last_P+1;
DistanceIndexFw1 = 2*img->imgtr_last_P;
DistanceIndexBw0 = 2*img->imgtr_next_P;
DistanceIndexBw1 = 2*img->imgtr_next_P+1;
if (DistanceIndexRef == DistanceIndexFw0)
{
scale_refframe = 0;//fw reference
DistanceIndexFw = DistanceIndexFw0;
}
else
{
scale_refframe = 1;
DistanceIndexFw = DistanceIndexFw1;
}
//DistanceIndexBw
bw_ref = 1;//bw reference
DistanceIndexBw = DistanceIndexBw1;
}
}
else
{
scale_refframe = 0;
bw_ref = 0;
DistanceIndexCur = 2*img->pic_distance;
if(ref==0)
{
DistanceIndexRef = 2*img->imgtr_last_P;
if(img->img_next_is_core_frame)
DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
}
else//ref==1
{
DistanceIndexRef = 2*img->imgtr_last_prev_P;
}
DistanceIndexFw = 2*img->imgtr_last_P;
DistanceIndexBw = 2*img->imgtr_next_P;
}
BlockDistanceRef = (DistanceIndexBw - DistanceIndexRef+512)%512;
BlockDistanceFw = (DistanceIndexCur - DistanceIndexFw+512)%512;
BlockDistanceBw = (DistanceIndexBw - DistanceIndexCur+512)%512;
iTRp = BlockDistanceRef;
iTRd = BlockDistanceBw;
iTRb = BlockDistanceFw;
#endif
// Added by Xiaozhen ZHENG, 2007.05.01
iTRp = (iTRp + 512)%512;
#ifndef CRPS
iTRp1 = (iTRp1 + 512)%512;
#endif
iTRd = (iTRd + 512)%512;
iTRb = (iTRb + 512)%512;
// Added by Xiaozhen ZHENG, 2007.05.01
if(!img->picture_structure)
{
#ifndef CRPS
if (img->current_mb_nr_fld >= img->PicSizeInMbs)
scale_refframe --;
#endif
img->fw_refFrArr[img->block_y+j][img->block_x+i]=scale_refframe; // PLUS2, Krit, 7/06 (used to be + 1)
img->bw_refFrArr[img->block_y+j][img->block_x+i]=bw_ref;
}
else
{
img->fw_refFrArr[img->block_y+j][img->block_x+i]=0; // PLUS2, Krit, 7/06 (used to be + 1)
// by Junhao Zheng 2004-08-04 21:50:38
//img->bw_refFrArr[img->block_y+j][img->block_x+i]=1;
img->bw_refFrArr[img->block_y+j][img->block_x+i]=0;
}
j4 = img->block_y+j;
i4 = img->block_x+i;
for (ii=0; ii < 2; ii++)
{
if(img->mv[img->block_x+i+4][img->block_y+j][ii] < 0)
{
img->fw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1-iTRb*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14);
img->bw_mv[i4+BLOCK_SIZE][j4][ii] = ((16384/iTRp)*(1-iTRd*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14;
}
else
{
img->fw_mv[i4+BLOCK_SIZE][j4][ii] = ((16384/iTRp)*(1+iTRb*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14;
img->bw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1+iTRd*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14);
}
#ifdef half_pixel_compensation
if(!img->picture_structure && ii == 1)
{
int delt, delt2, delt_bw;
MV_compensation_fw_fw(&delt, &delt2, scale_refframe, ref);
MV_compensation_fw_bw(&delt, &delt_bw, bw_ref /*1-bw_ref*/, ref); //bw_ref differs to that in encoder
assert(delt_bw == 0);
if((img->mv[img->block_x+i+4][img->block_y+j][ii] +delt)< 0)
{
img->fw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1-iTRb*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt2;
img->bw_mv[i4+BLOCK_SIZE][j4][ii] = (((16384/iTRp)*(1-iTRd*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt_bw;
}
else
{
img->fw_mv[i4+BLOCK_SIZE][j4][ii] = (((16384/iTRp)*(1+iTRb*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt2;
img->bw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1+iTRd*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt_bw;
}
}
#endif
}
}
}
}
img_block_y = img->block_y;
i0+=max(1,step_h0);
}
j0+=max(1,step_v0);
}
//===== READ BACKWARD MOTION VECTORS =====
currSE.type = SE_MVD;
currSE.mapping = linfo_se;
img_block_y = img->block_y;
for (j0=0; j0<2; )
{
if(currMB->mb_type!=I4MB)
{
step_h0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][0]);
step_v0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][1]);
}
if((currMB->mb_type==I4MB&&j0==0))
{ j0 += 1; continue;}
for (i0=0; i0<2; )
{
k=2*j0+i0;
if ((currMB->b8pdir[k]==1 || currMB->b8pdir[k]==2) && (currMB->b8mode[k]!=0))//has backward vector
{
mv_mode = currMB->b8mode[k];
step_h = BLOCK_STEP [mv_mode][0];
step_v = BLOCK_STEP [mv_mode][1];
refframe = img->bw_refFrArr[img->block_y+j0][img->block_x+i0]; // always 0
use_scaled_mv = 0;
if(currMB->b8pdir[k]==2)
{
fw_refframe = img->fw_refFrArr[img->block_y+j0][img->block_x+i0];
// current_tr = 2*img->tr_frm; // Commented by Xiaozhen ZHENG, 2007.05.01
current_tr = 2*(img->pic_distance/2);
}
for (j=j0; j<j0+step_v0; j+=step_v)
for (i=i0; i<i0+step_h0; i+=step_h)
{
j4 = img->block_y+j;
i4 = img->block_x+i;
SetMotionVectorPredictor (img, pmv, pmv+1, refframe, img->bw_refFrArr, img->bw_mv, i, j, 8*step_h, 8*step_v, -1, 0);//Lou 1016
for (k=0; k < 2; k++)
{
#if TRACE
snprintf(currSE.tracestring, TRACESTRING_SIZE, "BMVD (pred %d)",pmv[k]);
#endif
img->subblock_x = i; // position used for context determination
img
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -