--- encoder.c 2002/04/05 14:40:36 1.20 +++ encoder.c 2002/04/10 07:40:51 1.23 @@ -140,6 +140,9 @@ image_create(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || image_create(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || image_create(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || +#ifdef _DEBUG + image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || +#endif (pEnc->pMBs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL) { image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); @@ -149,6 +152,9 @@ image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); +#ifdef _DEBUG + image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); +#endif if (pEnc) { xvid_free(pEnc); @@ -166,7 +172,7 @@ if (pParam->bitrate) { - RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 100 / pParam->fincr, + RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 1000 / pParam->fincr, pParam->max_quantizer, pParam->min_quantizer); } @@ -190,6 +196,9 @@ image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); +#ifdef _DEBUG + image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); +#endif xvid_free(pEnc); return XVID_ERR_OK; @@ -201,6 +210,10 @@ Bitstream bs; uint32_t bits; uint16_t write_vol_header = 0; +#ifdef _DEBUG + float psnr; + uint8_t temp[100]; +#endif start_global_timer(); @@ -223,6 +236,10 @@ EMMS(); +#ifdef _DEBUG + image_copy(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.height); +#endif + BitstreamInit(&bs, pFrame->bitstream, 0); if (pFrame->quant == 0) @@ -323,6 +340,14 @@ RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra); } +#ifdef _DEBUG + psnr = image_psnr(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, + pEnc->mbParam.width, pEnc->mbParam.height); + + sprintf(temp, "PSNR: %f\n", psnr); + DEBUG(temp); +#endif + pEnc->iFrameNum++; image_swap(&pEnc->sCurrent, &pEnc->sReference); @@ -352,57 +377,6 @@ } -static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits) -{ - - DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); - DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); - - uint16_t x, y; - - pEnc->iFrameNum = 0; - pEnc->mbParam.rounding_type = 1; - pEnc->mbParam.coding_type = I_VOP; - - BitstreamWriteVolHeader(bs, &pEnc->mbParam); - BitstreamWriteVopHeader(bs, &pEnc->mbParam); - - *pBits = BitstreamPos(bs); - - pEnc->sStat.iTextBits = 0; - pEnc->sStat.kblks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; - pEnc->sStat.mblks = pEnc->sStat.ublks = 0; - - for (y = 0; y < pEnc->mbParam.mb_height; y++) - for (x = 0; x < pEnc->mbParam.mb_width; x++) - { - MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width]; - - CodeIntraMB(pEnc, pMB); - - MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, &pEnc->sCurrent); - - start_timer(); - MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs); - stop_prediction_timer(); - - start_timer(); - MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat); - stop_coding_timer(); - } - - emms(); - - *pBits = BitstreamPos(bs) - *pBits; - pEnc->sStat.fMvPrevSigma = -1; - pEnc->sStat.iMvSum = 0; - pEnc->sStat.iMvCount = 0; - pEnc->mbParam.fixed_code = 2; - - return 1; // intra -} - - #define FCODEBITS 3 #define MODEBITS 5 @@ -604,6 +578,62 @@ } +static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits) +{ + + DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); + + uint16_t x, y; + + pEnc->iFrameNum = 0; + pEnc->mbParam.rounding_type = 1; + pEnc->mbParam.coding_type = I_VOP; + + BitstreamWriteVolHeader(bs, &pEnc->mbParam); + BitstreamWriteVopHeader(bs, &pEnc->mbParam); + + *pBits = BitstreamPos(bs); + + pEnc->sStat.iTextBits = 0; + pEnc->sStat.kblks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; + pEnc->sStat.mblks = pEnc->sStat.ublks = 0; + + for (y = 0; y < pEnc->mbParam.mb_height; y++) + for (x = 0; x < pEnc->mbParam.mb_width; x++) + { + MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width]; + + CodeIntraMB(pEnc, pMB); + + MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, &pEnc->sCurrent); + + start_timer(); + MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs); + stop_prediction_timer(); + + start_timer(); + MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat); + stop_coding_timer(); + } + + emms(); + + *pBits = BitstreamPos(bs) - *pBits; + pEnc->sStat.fMvPrevSigma = -1; + pEnc->sStat.iMvSum = 0; + pEnc->sStat.iMvCount = 0; + pEnc->mbParam.fixed_code = 2; + + if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET) + { + HintedMEGet(pEnc, 1); + } + + return 1; // intra +} + + #define INTRA_THRESHOLD 0.5 static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header) @@ -660,10 +690,6 @@ if (bIntra == 1) { - if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET) - { - HintedMEGet(pEnc, 1); - } return FrameCodeI(pEnc, bs, pBits); }