--- trunk/vfw/src/codec.c 2002/04/08 12:51:41 109 +++ 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,26 @@ 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; @@ -280,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 : @@ -363,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) { @@ -487,6 +506,7 @@ frame.intra = 0; } + OutputDebugString(" "); switch (xvid_encore(codec->ehandle, XVID_ENC_ENCODE, &frame, &stats)) { case XVID_ERR_FAIL : @@ -524,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; @@ -665,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) {