--- encoder.c 2003/10/27 00:50:05 1.95.2.46 +++ encoder.c 2003/11/16 17:41:03 1.95.2.53 @@ -21,7 +21,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: encoder.c,v 1.95.2.46 2003/10/27 00:50:05 edgomez Exp $ + * $Id: encoder.c,v 1.95.2.53 2003/11/16 17:41:03 edgomez Exp $ * ****************************************************************************/ @@ -188,7 +188,9 @@ pcreate.zones = pEnc->zones; pcreate.width = pEnc->mbParam.width; pcreate.height = pEnc->mbParam.height; - pcreate.fincr = pEnc->mbParam.fincr; + pcreate.mb_width = pEnc->mbParam.mb_width; + pcreate.mb_height = pEnc->mbParam.mb_height; + pcreate.fincr = pEnc->mbParam.fincr; pcreate.fbase = pEnc->mbParam.fbase; pcreate.param = create->plugins[n].param; @@ -648,6 +650,8 @@ data.mb_height = pEnc->mbParam.mb_height; data.fincr = frame->fincr; data.fbase = pEnc->mbParam.fbase; + data.bquant_ratio = pEnc->mbParam.bquant_ratio; + data.bquant_offset = pEnc->mbParam.bquant_offset; for (i=0; i<3; i++) { data.min_quant[i] = pEnc->mbParam.min_quant[i]; @@ -1070,8 +1074,9 @@ type = I_VOP; }else{ type = MEanalysis(&pEnc->reference->image, pEnc->current, - &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, - pEnc->iFrameNum, pEnc->bframenum_tail, xFrame->bframe_threshold); + &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, + pEnc->iFrameNum, pEnc->bframenum_tail, xFrame->bframe_threshold, + (pEnc->bframes) ? pEnc->bframes[pEnc->bframenum_head]->mbs: NULL); } } @@ -1410,6 +1415,9 @@ pEnc->fMvPrevSigma = -1; pEnc->mbParam.m_fcode = 2; + pEnc->current->is_edged = 0; /* not edged */ + pEnc->current->is_interpolated = -1; /* not interpolated (fake rounding -1) */ + return 1; /* intra */ } @@ -1452,10 +1460,13 @@ } - start_timer(); - image_setedges(pRef, pParam->edged_width, pParam->edged_height, - pParam->width, pParam->height); - stop_edges_timer(); + if (!reference->is_edged) { + start_timer(); + image_setedges(pRef, pParam->edged_width, pParam->edged_height, + pParam->width, pParam->height); + stop_edges_timer(); + reference->is_edged = 1; + } pParam->m_rounding_type = 1 - pParam->m_rounding_type; current->rounding_type = pParam->m_rounding_type; @@ -1467,13 +1478,16 @@ iLimit = mb_width * mb_height + 1; if ((current->vop_flags & XVID_VOP_HALFPEL)) { - start_timer(); - image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, - &pEnc->vInterHV, pParam->edged_width, - pParam->edged_height, - (pParam->vol_flags & XVID_VOL_QUARTERPEL), - current->rounding_type); - stop_inter_timer(); + if (reference->is_interpolated != current->rounding_type) { + start_timer(); + image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, + &pEnc->vInterHV, pParam->edged_width, + pParam->edged_height, + (pParam->vol_flags & XVID_VOL_QUARTERPEL), + current->rounding_type); + stop_inter_timer(); + reference->is_interpolated = current->rounding_type; + } } current->coding_type = P_VOP; @@ -1489,24 +1503,24 @@ if (current->motion_flags & XVID_ME_GME_REFINE) { gmcval = GlobalMotionEstRefine(¤t->warp, - current->mbs, pParam, - current, reference, - ¤t->image, - &reference->image, - &pEnc->vInterH, - &pEnc->vInterV, - &pEnc->vInterHV); - gmcval += /*current->quant */ 2 * (int)(pParam->mb_width*pParam->mb_height); + current->mbs, pParam, + current, reference, + ¤t->image, + &reference->image, + &pEnc->vInterH, + &pEnc->vInterV, + &pEnc->vInterHV); + } else { + gmcval = globalSAD(¤t->warp, pParam, current->mbs, + current, + &reference->image, + ¤t->image, + pEnc->vGMC.y); } - gmcval = globalSAD(¤t->warp, pParam, current->mbs, - current, - &reference->image, - ¤t->image, - pEnc->vGMC.y); gmcval += /*current->quant*/ 2 * (int)(pParam->mb_width*pParam->mb_height); -/* 1st '3': 3 warpoints, 2nd '3': 16th pel res (2<<3) */ + /* 1st '3': 3 warpoints, 2nd '3': 16th pel res (2<<3) */ generate_GMCparameters( 3, 3, ¤t->warp, pParam->width, pParam->height, ¤t->new_gmc_data); @@ -1781,6 +1795,17 @@ memcpy(current->mbs, reference->mbs, sizeof(MACROBLOCK) * mb_width * mb_height); } + pEnc->current->is_edged = 0; /* not edged */ + pEnc->current->is_interpolated = -1; /* not interpolated (fake rounding -1) */ + + /* what was this frame's interpolated reference will become + forward (past) reference in b-frame coding */ + + image_swap(&pEnc->vInterH, &pEnc->f_refh); + image_swap(&pEnc->vInterV, &pEnc->f_refv); + image_swap(&pEnc->vInterHV, &pEnc->f_refhv); + + /* XXX: debug { char s[100]; @@ -1832,24 +1857,38 @@ #endif /* forward */ - image_setedges(f_ref, pEnc->mbParam.edged_width, - pEnc->mbParam.edged_height, pEnc->mbParam.width, - pEnc->mbParam.height); - start_timer(); - image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, - pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, - (pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); - stop_inter_timer(); + if (!pEnc->reference->is_edged) { + image_setedges(f_ref, pEnc->mbParam.edged_width, + pEnc->mbParam.edged_height, pEnc->mbParam.width, + pEnc->mbParam.height); + pEnc->current->is_edged = 1; + } + + if (pEnc->reference->is_interpolated != 0) { + start_timer(); + image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, + pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, + (pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); + stop_inter_timer(); + pEnc->reference->is_interpolated = 0; + } /* backward */ - image_setedges(b_ref, pEnc->mbParam.edged_width, - pEnc->mbParam.edged_height, pEnc->mbParam.width, - pEnc->mbParam.height); - start_timer(); - image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, - pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, - (pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); - stop_inter_timer(); + if (!pEnc->current->is_edged) { + image_setedges(b_ref, pEnc->mbParam.edged_width, + pEnc->mbParam.edged_height, pEnc->mbParam.width, + pEnc->mbParam.height); + pEnc->current->is_edged = 1; + } + + if (pEnc->current->is_interpolated != 0) { + start_timer(); + image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, + pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, + (pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); + stop_inter_timer(); + pEnc->current->is_interpolated = 0; + } start_timer(); MotionEstimationBVOP(&pEnc->mbParam, frame, @@ -1879,7 +1918,11 @@ /* decoder ignores mb when refence block is INTER(0,0), CBP=0 */ if (mb->mode == MODE_NOT_CODED) { - /* mb->mvs[0].x = mb->mvs[0].y = mb->cbp = 0; */ + if (pEnc->mbParam.plugin_flags & XVID_REQORIGINAL) { + MBMotionCompensation(mb, x, y, f_ref, NULL, f_ref, NULL, NULL, &frame->image, + NULL, 0, 0, pEnc->mbParam.edged_width, 0, 0, 0); + } + continue; }