--- trunk/xvidcore/src/encoder.c 2002/07/19 14:56:00 317 +++ trunk/xvidcore/src/encoder.c 2002/07/22 18:03:47 327 @@ -39,7 +39,7 @@ * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.57 2002-07-19 14:56:00 chl Exp $ + * $Id: encoder.c,v 1.63 2002-07-22 18:03:47 chl 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) { @@ -852,12 +853,12 @@ else pEnc->current->quant = pFrame->quant; - if (pEnc->current->quant < 1) +/* if (pEnc->current->quant < 1) pEnc->current->quant = 1; if (pEnc->current->quant > 31) pEnc->current->quant = 31; - +*/ pEnc->current->global_flags = pFrame->general; pEnc->current->motion_flags = pFrame->motion; @@ -1004,10 +1005,6 @@ * This will be coded as a Bidirectional Frame */ - DPRINTF(DPRINTF_DEBUG,"*** BFRAME (store) bf: head=%i tail=%i queue: head=%i tail=%i size=%i", - pEnc->bframenum_head, pEnc->bframenum_tail, - pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); - if ((pEnc->global & XVID_GLOBAL_DEBUG)) { image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 200, "BVOP"); } @@ -1019,6 +1016,18 @@ } else { pEnc->current->quant = pFrame->bquant; } + if (pEnc->current->quant < 1) + pEnc->current->quant = 1; + + if (pEnc->current->quant > 31) + pEnc->current->quant = 31; + + + DPRINTF(DPRINTF_DEBUG,"*** BFRAME (store) bf: head=%i tail=%i queue: head=%i tail=%i size=%i quant=%i\n", + pEnc->bframenum_head, pEnc->bframenum_tail, + pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size,pEnc->current->quant); + + /* store frame into bframe buffer & swap ref back to current */ SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); @@ -1722,12 +1731,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; - fprintf(stderr,"fbase=%d last_p=%d ticks=%d time_pp = %d\n",pEnc->mbParam.fbase,pEnc->last_pframe,pEnc->mbParam.m_ticks,pEnc->time_pp); - pEnc->last_pframe = pEnc->mbParam.m_ticks; +#endif + return 0; // inter } @@ -1783,7 +1817,6 @@ stop_inter_timer(); start_timer(); - fprintf(stderr,"m_ticks =%d\n",(int32_t)pEnc->mbParam.m_ticks+1); MotionEstimationBVOP(&pEnc->mbParam, frame, ((int32_t)pEnc->mbParam.fbase + (int32_t)pEnc->mbParam.m_ticks + 1 - (int32_t)pEnc->last_pframe) % pEnc->mbParam.fbase, pEnc->time_pp,