--- trunk/vfw/src/codec.c 2002/04/05 14:42:37 102 +++ trunk/vfw/src/codec.c 2002/06/20 10:51:08 228 @@ -23,6 +23,9 @@ * * History: * + * 25.04.2002 ICDECOMPRESS_PREROLL + * 17.04.2002 re-enabled lumi masking for 1st pass + * 15.04.2002 updated cbr support * 04.04.2002 separated 2-pass code to 2pass.c * interlacing support * hinted ME support @@ -215,7 +218,11 @@ LRESULT compress_get_size(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput) { - return lpbiOutput->bmiHeader.biWidth * lpbiOutput->bmiHeader.biHeight * 3; + return +#ifdef BFRAMES + 2 * +#endif + lpbiOutput->bmiHeader.biWidth * lpbiOutput->bmiHeader.biHeight * 3; } @@ -236,24 +243,27 @@ switch (codec->config.mode) { case DLG_MODE_CBR : - param.bitrate = codec->config.bitrate; - param.rc_buffersize = codec->config.rc_buffersize; + param.rc_bitrate = codec->config.rc_bitrate; + param.rc_reaction_delay_factor = codec->config.rc_reaction_delay_factor; + param.rc_averaging_period = codec->config.rc_averaging_period; + param.rc_buffer = codec->config.rc_buffer; break; case DLG_MODE_VBR_QUAL : codec->config.fquant = 0; - param.bitrate = 0; + param.rc_bitrate = 0; break; case DLG_MODE_VBR_QUANT : codec->config.fquant = (float) codec->config.quant; - param.bitrate = 0; + param.rc_bitrate = 0; break; case DLG_MODE_2PASS_1 : case DLG_MODE_2PASS_2_INT : case DLG_MODE_2PASS_2_EXT : - param.bitrate = 0; + param.rc_bitrate = 0; + codec->twopass.max_framesize = (int)((double)codec->config.twopass_max_bitrate / 8.0 / ((double)codec->fbase / (double)codec->fincr)); break; case DLG_MODE_NULL : @@ -279,12 +289,16 @@ param.fincr = codec->fincr; param.fbase = codec->fbase; - param.rc_buffersize = codec->config.rc_buffersize; - param.min_quantizer = codec->config.min_pquant; param.max_quantizer = codec->config.max_pquant; param.max_key_interval = codec->config.max_key_interval; +#ifdef BFRAMES + param.packed = codec->config.packed; + param.max_bframes = codec->config.max_bframes; + param.bquant_ratio = codec->config.bquant_ratio; +#endif + switch(xvid_encore(0, XVID_ENC_CREATE, ¶m, NULL)) { case XVID_ERR_FAIL : @@ -332,6 +346,8 @@ } codec->ehandle = NULL; + + codec_2pass_finish(codec); } return ICERR_OK; @@ -360,14 +376,20 @@ frame.general |= XVID_HALFPEL; - if(codec->config.motion_search > 4) + if (codec->config.motion_search > 4) frame.general |= XVID_INTER4V; - if(((codec->config.mode == DLG_MODE_2PASS_1) ? 0 : codec->config.lum_masking) == 1) + if (codec->config.lum_masking) frame.general |= XVID_LUMIMASKING; if (codec->config.interlacing) frame.general |= XVID_INTERLACING; +// fix 1pass modes/hinted MV by koepi + if (codec->config.hinted_me && (codec->config.mode == DLG_MODE_CBR || codec->config.mode == DLG_MODE_VBR_QUAL || codec->config.mode == DLG_MODE_VBR_QUANT)) + { + codec->config.hinted_me = 0; + } +// end of ugly hack if (codec->config.hinted_me && codec->config.mode == DLG_MODE_2PASS_1) { @@ -375,7 +397,7 @@ frame.hint.rawhints = 0; frame.general |= XVID_HINTEDME_GET; } - else if (codec->config.mode == DLG_MODE_2PASS_2_EXT || codec->config.mode == DLG_MODE_2PASS_2_INT) + else if (codec->config.hinted_me && (codec->config.mode == DLG_MODE_2PASS_2_EXT || codec->config.mode == DLG_MODE_2PASS_2_INT)) { DWORD read; DWORD blocksize; @@ -478,13 +500,13 @@ { frame.intra = 1; } - else if ((codec->keyspacing < codec->config.min_key_interval && codec->framenum) && - (codec->config.mode == DLG_MODE_2PASS_1)) + else if (codec->keyspacing < codec->config.min_key_interval && codec->framenum) { DEBUG("current frame forced to p-frame"); frame.intra = 0; } + OutputDebugString(" "); switch (xvid_encore(codec->ehandle, XVID_ENC_ENCODE, &frame, &stats)) { case XVID_ERR_FAIL : @@ -522,7 +544,7 @@ if (codec->twopass.hints == INVALID_HANDLE_VALUE) { codec->twopass.hints = CreateFile(codec->config.hintfile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); - if (codec->twopass.hints == INVALID_HANDLE_VALUE) + if (codec->twopass.hints == INVALID_HANDLE_VALUE) { DEBUGERR("couldn't create hints file"); return ICERR_ERROR; @@ -663,7 +685,7 @@ frame.image = icd->lpOutput; frame.stride = icd->lpbiOutput->biWidth; - if (~((icd->dwFlags & ICDECOMPRESS_HURRYUP) | (icd->dwFlags & ICDECOMPRESS_UPDATE))) + if (~((icd->dwFlags & ICDECOMPRESS_HURRYUP) | (icd->dwFlags & ICDECOMPRESS_UPDATE) | (icd->dwFlags & ICDECOMPRESS_PREROLL))) { if ((frame.colorspace = get_colorspace(icd->lpbiOutput)) == XVID_CSP_NULL) {