--- trunk/xvidcore/src/encoder.c 2002/07/19 15:02:39 318 +++ trunk/xvidcore/src/encoder.c 2002/07/21 14:05:38 325 @@ -39,7 +39,7 @@ * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.58 2002-07-19 15:02:38 chl Exp $ + * $Id: encoder.c,v 1.61 2002-07-21 14:05:38 edgomez Exp $ * ****************************************************************************/ @@ -209,7 +209,7 @@ /* 1 keyframe each 10 seconds */ - if (pParam->max_key_interval == 0) + if (pParam->max_key_interval <= 0) pParam->max_key_interval = 10 * pParam->fincr / pParam->fbase; pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE); @@ -344,6 +344,7 @@ pEnc->global = pParam->global; pEnc->mbParam.max_bframes = pParam->max_bframes; pEnc->bquant_ratio = pParam->bquant_ratio; + pEnc->frame_drop_ratio = pParam->frame_drop_ratio; pEnc->bframes = NULL; if (pEnc->mbParam.max_bframes > 0) { @@ -1722,11 +1723,37 @@ pEnc->sStat.fMvPrevSigma = fSigma; +#ifdef BFRAMES + /* frame drop code */ + // DPRINTF(DPRINTF_DEBUG, "kmu %i %i %i", pEnc->sStat.kblks, pEnc->sStat.mblks, pEnc->sStat.ublks); + if (pEnc->sStat.kblks + pEnc->sStat.mblks <= + (pEnc->frame_drop_ratio * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height) / 100) + { + pEnc->sStat.kblks = pEnc->sStat.mblks = 0; + pEnc->sStat.ublks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; + + BitstreamReset(bs); + BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 0); + + // copy reference frame details into the current frame + pEnc->current->quant = pEnc->reference->quant; + pEnc->current->motion_flags = pEnc->reference->motion_flags; + pEnc->current->rounding_type = pEnc->reference->rounding_type; + pEnc->current->fcode = pEnc->reference->fcode; + pEnc->current->bcode = pEnc->reference->bcode; + image_copy(&pEnc->current->image, &pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.height); + memcpy(pEnc->current->mbs, pEnc->reference->mbs, sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height); + + } +#endif + *pBits = BitstreamPos(bs) - *pBits; +#ifdef BFRAMES pEnc->time_pp = ((int32_t)pEnc->mbParam.fbase - (int32_t)pEnc->last_pframe + (int32_t)pEnc->mbParam.m_ticks) % (int32_t)pEnc->mbParam.fbase; pEnc->last_pframe = pEnc->mbParam.m_ticks; +#endif return 0; // inter }