--- branches/dev-api-4/xvidcore/src/encoder.c 2003/03/26 14:56:49 949 +++ branches/dev-api-4/xvidcore/src/encoder.c 2003/04/27 21:18:49 999 @@ -26,7 +26,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: encoder.c,v 1.95.2.15 2003-03-26 14:56:10 edgomez Exp $ + * $Id: encoder.c,v 1.95.2.19 2003-04-27 21:18:49 edgomez Exp $ * ****************************************************************************/ @@ -151,11 +151,16 @@ if (pEnc->mbParam.fincr>0) simplify_time(&pEnc->mbParam.fincr, &pEnc->mbParam.fbase); - /* plugin */ - pEnc->num_plugins = create->num_plugins; - pEnc->plugins = xvid_malloc(sizeof(xvid_enc_plugin_t) * pEnc->num_plugins, CACHE_LINE); - if (pEnc->plugins == NULL) - goto xvid_err_memory0; + /* plugins */ + if(create->num_plugins > 0) { + pEnc->num_plugins = create->num_plugins; + pEnc->plugins = xvid_malloc(sizeof(xvid_enc_plugin_t) * pEnc->num_plugins, CACHE_LINE); + if (pEnc->plugins == NULL) + goto xvid_err_memory0; + } else { + pEnc->num_plugins = 0; + pEnc->plugins = NULL; + } for (n=0; nnum_plugins;n++) { xvid_plg_create_t pcreate; @@ -202,8 +207,8 @@ pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0); /* max keyframe interval */ - pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <=0 ? 250 : create->max_key_interval; - /*XXX: replace 250 hard code with "10seconds * framerate" */ + pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ? + 10 * pEnc->mbParam.fbase / pEnc->mbParam.fincr : create->max_key_interval; /* Bitrate allocator defaults @@ -598,8 +603,7 @@ } - if (pEnc->num_plugins>0) - { + if (pEnc->num_plugins>0) { xvid_plg_destroy_t pdestroy; memset(&pdestroy, 0, sizeof(xvid_plg_destroy_t)); @@ -664,10 +668,10 @@ data.type = XVID_TYPE_AUTO; data.quant = 2; - if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) { + if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) { data.dquant = pEnc->temp_dquants; data.dquant_stride = pEnc->mbParam.mb_width; - memset(data.dquant, 0, data.mb_width*data.mb_height); + memset(data.dquant, 0, data.mb_width*data.mb_height); } /* todo: [vol,vop,motion]_flags*/ @@ -1041,7 +1045,7 @@ }else{ type = MEanalysis(&pEnc->reference->image, pEnc->current, &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, - pEnc->iFrameNum, pEnc->bframenum_tail); + pEnc->iFrameNum, pEnc->bframenum_tail, xFrame->bframe_threshold); if (type == B_VOP && !(pEnc->current->vop_flags & XVID_VOP_DYNAMIC_BFRAMES)) { type = P_VOP; /* disable dynamic bframes */ @@ -1353,11 +1357,16 @@ } emms(); +/* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */ +#if 0 /* for divx5 compatibility, we must always pad between the packed p and b frames */ if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0) +#endif BitstreamPadAlways(bs); +#if 0 else BitstreamPad(bs); +#endif pEnc->current->length = (BitstreamPos(bs) - bits) / 8; pEnc->fMvPrevSigma = -1; @@ -1754,11 +1763,16 @@ } */ +/* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */ +#if 0 /* for divx5 compatibility, we must always pad between the packed p and b frames */ if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0) +#endif BitstreamPadAlways(bs); +#if 0 else BitstreamPad(bs); +#endif pEnc->current->length = (BitstreamPos(bs) - bits) / 8; @@ -1890,7 +1904,7 @@ /* TODO: dynamic fcode/bcode ??? */ - BitstreamPad(bs); + BitstreamPadAlways(bs); frame->length = (BitstreamPos(bs) - bits) / 8; #ifdef BFRAMES_DEC_DEBUG