--- branches/dev-api-4/xvidcore/src/encoder.c 2003/07/13 09:57:51 1082 +++ branches/dev-api-4/xvidcore/src/encoder.c 2003/08/07 15:42:50 1115 @@ -21,7 +21,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.33 2003-07-13 09:57:51 syskin Exp $ + * $Id: encoder.c,v 1.95.2.38 2003-08-07 15:41:33 chl Exp $ * ****************************************************************************/ @@ -115,9 +115,9 @@ enc_create(xvid_enc_create_t * create) { Encoder *pEnc; - int n; + int n; - if (XVID_MAJOR(create->version) != 1) /* v1.x.x */ + if (XVID_VERSION_MAJOR(create->version) != 1) /* v1.x.x */ return XVID_ERR_VERSION; if (create->width%2 || create->height%2) @@ -226,8 +226,7 @@ pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0); /* max keyframe interval */ - pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ? - (10 * pEnc->mbParam.fbase) / pEnc->mbParam.fincr : create->max_key_interval; + pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ? (10 * (int)pEnc->mbParam.fbase) / (int)pEnc->mbParam.fincr : create->max_key_interval; /* allocate working frame-image memory */ @@ -741,7 +740,7 @@ for (j=0; jmbParam.mb_height; j++) for (i=0; imbParam.mb_width; i++) { - data.dquant[j*data.dquant_stride + i] = frame->mbs[j*pEnc->mbParam.mb_width + i].dquant;; + data.dquant[j*data.dquant_stride + i] = frame->mbs[j*pEnc->mbParam.mb_width + i].dquant; } } @@ -771,7 +770,7 @@ } /* call plugins */ - for (i=0; inum_plugins;i++) { + for (i=0; i<(unsigned int)pEnc->num_plugins;i++) { emms(); if (pEnc->plugins[i].func) { if (pEnc->plugins[i].func(pEnc->plugins[i].param, opt, &data, 0) < 0) { @@ -867,7 +866,7 @@ int type; Bitstream bs; - if (XVID_MAJOR(xFrame->version) != 1 || (stats && XVID_MAJOR(stats->version) != 1)) /* v1.x.x */ + if (XVID_VERSION_MAJOR(xFrame->version) != 1 || (stats && XVID_VERSION_MAJOR(stats->version) != 1)) /* v1.x.x */ return XVID_ERR_VERSION; xFrame->out_flags = 0; @@ -904,13 +903,13 @@ if (xFrame->quant_intra_matrix) { - memcpy(q->quant_intra_matrix, xFrame->quant_intra_matrix, sizeof(xFrame->quant_intra_matrix)); + memcpy(q->quant_intra_matrix, xFrame->quant_intra_matrix, 64*sizeof(unsigned char)); q->frame.quant_intra_matrix = q->quant_intra_matrix; } if (xFrame->quant_inter_matrix) { - memcpy(q->quant_inter_matrix, xFrame->quant_inter_matrix, sizeof(xFrame->quant_inter_matrix)); + memcpy(q->quant_inter_matrix, xFrame->quant_inter_matrix, 64*sizeof(unsigned char)); q->frame.quant_inter_matrix = q->quant_inter_matrix; } @@ -1253,7 +1252,7 @@ * on next enc_encode call we must flush bframes * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ -done_flush: +/*done_flush:*/ pEnc->flush_bframes = 1; @@ -1285,6 +1284,10 @@ { unsigned int i,j; int quant = frame->quant; + if (quant > 31) + frame->quant = quant = 31; + else if (quant < 1) + frame->quant = quant = 1; for (j=0; jmb_height; j++) for (i=0; imb_width; i++) { @@ -1292,7 +1295,7 @@ quant += pMB->dquant; if (quant > 31) quant = 31; - if (quant < 1) + else if (quant < 1) quant = 1; pMB->quant = quant; } @@ -1356,7 +1359,8 @@ set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); - BitstreamPadAlways(bs); + BitstreamPad(bs); + BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); pEnc->current->sStat.iTextBits = 0; @@ -1395,16 +1399,8 @@ } 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 + BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */ + pEnc->current->length = (BitstreamPos(bs) - bits) / 8; pEnc->fMvPrevSigma = -1; @@ -1437,7 +1433,7 @@ int bIntra=0, skip_possible; FRAMEINFO *const current = pEnc->current; FRAMEINFO *const reference = pEnc->reference; - MBParam * const pParam = &pEnc->mbParam; + MBParam * const pParam = &pEnc->mbParam; int mb_width = pParam->mb_width; int mb_height = pParam->mb_height; @@ -1487,7 +1483,7 @@ current->warp = GlobalMotionEst( current->mbs, pParam, current, reference, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); - if (current->motion_flags & XVID_GME_REFINE) { + if (current->motion_flags & XVID_ME_GME_REFINE) { gmcval = GlobalMotionEstRefine(¤t->warp, current->mbs, pParam, current, reference, @@ -1545,7 +1541,7 @@ set_timecodes(current,reference,pParam->fbase); if (vol_header) { BitstreamWriteVolHeader(bs, &pEnc->mbParam); - BitstreamPadAlways(bs); + BitstreamPad(bs); } BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1); @@ -1791,16 +1787,7 @@ } */ -/* 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 ((pParam->global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0) -#endif - BitstreamPadAlways(bs); -#if 0 - else - BitstreamPad(bs); -#endif + BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */ current->length = (BitstreamPos(bs) - bits) / 8; @@ -1921,7 +1908,7 @@ /* TODO: dynamic fcode/bcode ??? */ - BitstreamPadAlways(bs); + BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */ frame->length = (BitstreamPos(bs) - bits) / 8; #ifdef BFRAMES_DEC_DEBUG