--- trunk/xvidcore/src/encoder.c 2002/07/10 19:16:32 284 +++ trunk/xvidcore/src/encoder.c 2002/07/21 14:05:38 325 @@ -32,12 +32,14 @@ * * History * - * 20.06.2002 bframe patch + * 10.07.2002 added BFRAMES_DEC_DEBUG support + * MinChen + * 20.06.2002 bframe patch * 08.05.2002 fix some problem in DEBUG mode; * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.53 2002-07-10 19:16:32 chl Exp $ + * $Id: encoder.c,v 1.61 2002-07-21 14:05:38 edgomez Exp $ * ****************************************************************************/ @@ -207,10 +209,9 @@ /* 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); if (pEnc == NULL) return XVID_ERR_MEMORY; @@ -235,6 +236,10 @@ pEnc->mbParam.m_quant_type = H263_QUANT; +#ifdef _SMP + pEnc->mbParam.num_threads = MIN(pParam->num_threads, MAXNUMTHREADS); +#endif + pEnc->sStat.fMvPrevSigma = -1; /* Fill rate control parameters */ @@ -339,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) { @@ -416,6 +422,7 @@ pEnc->mbParam.m_seconds = 0; pEnc->mbParam.m_ticks = 0; pEnc->m_framenum = 0; + pEnc->last_pframe = 1; #endif pParam->handle = (void *) pEnc; @@ -1593,20 +1600,18 @@ } else { #ifdef _SMP - if (NUMTHREADS > 1) - bIntra = - SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, - &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, - iLimit); - else + if (pEnc->mbParam.num_threads > 1) + bIntra = + SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, + &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, + iLimit); + else #endif - - bIntra = - MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, - &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, - iLimit); - - + bIntra = + MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, + &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, + iLimit); + } stop_motion_timer(); @@ -1718,8 +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 } @@ -1740,6 +1774,18 @@ IMAGE *f_ref = &pEnc->reference->image; IMAGE *b_ref = &pEnc->current->image; +#ifdef BFRAMES_DEC_DEBUG + FILE *fp; + static char first=0; +#define BFRAME_DEBUG if (!first && fp){ \ + fprintf(fp,"Y=%3d X=%3d MB=%2d CBP=%02X\n",y,x,mb->mode,mb->cbp); \ + } + + if (!first){ + fp=fopen("C:\\XVIDDBGE.TXT","w"); + } +#endif + // forward image_setedges(f_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, @@ -1763,7 +1809,10 @@ stop_inter_timer(); start_timer(); - MotionEstimationBVOP(&pEnc->mbParam, frame, pEnc->reference->mbs, f_ref, + 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, + pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, pEnc->current->mbs, b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); @@ -1806,6 +1855,11 @@ if (mb->mode == MODE_NOT_CODED) { mb->mvs[0].x = 0; mb->mvs[0].y = 0; + + mb->cbp = 0; +#ifdef BFRAMES_DEC_DEBUG + BFRAME_DEBUG +#endif continue; } @@ -1824,7 +1878,7 @@ if ((mb->mode == MODE_INTERPOLATE || mb->mode == MODE_DIRECT) && mb->cbp == 0 && mb->mvs[0].x == 0 && mb->mvs[0].y == 0) { - mb->mode = 5; // skipped + mb->mode = MODE_DIRECT_NONE_MV; // skipped } if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) { @@ -1842,6 +1896,9 @@ } // DPRINTF("%05i : [%i %i] M=%i CBP=%i MVS=%i,%i forward=%i,%i", pEnc->m_framenum, x, y, mb->mode, mb->cbp, mb->mvs[0].x, mb->mvs[0].y, forward.x, forward.y); +#ifdef BFRAMES_DEC_DEBUG + BFRAME_DEBUG +#endif start_timer(); MBCodingBVOP(mb, qcoeff, frame->fcode, frame->bcode, bs, &pEnc->sStat); @@ -1854,5 +1911,13 @@ // TODO: dynamic fcode/bcode ??? *pBits = BitstreamPos(bs) - *pBits; + +#ifdef BFRAMES_DEC_DEBUG + if (!first){ + first=1; + if (fp) + fclose(fp); + } +#endif } #endif