--- trunk/xvidcore/src/encoder.c 2002/04/13 16:30:02 118 +++ trunk/xvidcore/src/encoder.c 2002/04/17 14:05:54 128 @@ -80,11 +80,17 @@ pParam->fincr = (int)(pParam->fincr / div); } - if (pParam->bitrate <= 0) - pParam->bitrate = 900000; + if (pParam->rc_bitrate <= 0) + pParam->rc_bitrate = 900000; - if (pParam->rc_buffersize <= 0) - pParam->rc_buffersize = 16; + if (pParam->rc_reaction_delay_factor <= 0) + pParam->rc_reaction_delay_factor = 16; + + if (pParam->rc_averaging_period <= 0) + pParam->rc_averaging_period = 100; + + if (pParam->rc_buffer <= 0) + pParam->rc_buffer = 100; if ((pParam->min_quantizer <= 0) || (pParam->min_quantizer > 31)) pParam->min_quantizer = 1; @@ -118,7 +124,7 @@ pEnc->mbParam.quant = 4; - pEnc->bitrate = pParam->bitrate; + pEnc->bitrate = pParam->rc_bitrate; pEnc->iFrameNum = 0; pEnc->iMaxKeyInterval = pParam->max_key_interval; @@ -172,10 +178,11 @@ pParam->handle = (void *)pEnc; - if (pParam->bitrate) + if (pParam->rc_bitrate) { - RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 1000 / pParam->fincr, - pParam->max_quantizer, pParam->min_quantizer); + RateControlInit(pParam->rc_bitrate, pParam->rc_reaction_delay_factor, + pParam->rc_averaging_period, pParam->rc_buffer, pParam->fbase * 1000 / pParam->fincr, + pParam->max_quantizer, pParam->min_quantizer); } init_timer(); @@ -424,7 +431,10 @@ pMB->mode = (hint->rawhints) ? bhint->mode : BitstreamGetBits(&bs, MODEBITS); - if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) + pMB->mode = (pMB->mode == MODE_INTER_Q) ? MODE_INTER : pMB->mode; + pMB->mode = (pMB->mode == MODE_INTRA_Q) ? MODE_INTRA : pMB->mode; + + if (pMB->mode == MODE_INTER) { tmp.x = (hint->rawhints) ? bhint->mvs[0].x : BitstreamGetBits(&bs, length); tmp.y = (hint->rawhints) ? bhint->mvs[0].y : BitstreamGetBits(&bs, length); @@ -458,13 +468,23 @@ pMB->pmvs[vec].y = pMB->mvs[vec].y - pred[0].y; } } - else // intra / intra_q / stuffing / not_coded + else // intra / stuffing / not_coded { for (vec=0 ; vec<4 ; ++vec) { pMB->mvs[vec].x = pMB->mvs[vec].y = 0; } } + + if (pMB->dquant != NO_CHANGE && pMB->mode == MODE_INTER4V) + { + pMB->mode = MODE_INTRA; + + for (vec=0 ; vec<4 ; ++vec) + { + pMB->mvs[vec].x = pMB->mvs[vec].y = 0; + } + } } } }