--- encoder.c 2003/01/13 14:33:24 1.76.2.37 +++ encoder.c 2003/01/21 22:05:44 1.76.2.40 @@ -39,7 +39,7 @@ * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.76.2.37 2003/01/13 14:33:24 chl Exp $ + * $Id: encoder.c,v 1.76.2.40 2003/01/21 22:05:44 edgomez Exp $ * ****************************************************************************/ @@ -229,7 +229,7 @@ pEnc->bitrate = pParam->rc_bitrate; - pEnc->iFrameNum = 0; + pEnc->iFrameNum = -1; pEnc->mbParam.iMaxKeyInterval = pParam->max_key_interval; /* try to allocate frame memory */ @@ -658,10 +658,10 @@ /* convert pFrame->intra to coding_type */ static int intra2coding_type(int intra) { - if (intra < 0) return -1; - if (intra == 1) return I_VOP; - if (intra == 2) return B_VOP; - + if (intra < 0) return -1; + if (intra == 1) return I_VOP; + if (intra == 2) return B_VOP; + return P_VOP; } @@ -734,8 +734,17 @@ pFrame->length = BitstreamLength(&bs); pFrame->intra = 0; + emms(); + if (pResult) { + pResult->quant = pEnc->current->quant; + pResult->hlength = pFrame->length - (pEnc->current->sStat.iTextBits / 8); + pResult->kblks = pEnc->current->sStat.kblks; + pResult->mblks = pEnc->current->sStat.mblks; + pResult->ublks = pEnc->current->sStat.ublks; + } + return XVID_ERR_OK; } @@ -751,6 +760,14 @@ pFrame->length = BitstreamLength(&bs); pFrame->intra = 2; + if (pResult) { + pResult->quant = pEnc->current->quant; + pResult->hlength = pFrame->length - (pEnc->current->sStat.iTextBits / 8); + pResult->kblks = pEnc->current->sStat.kblks; + pResult->mblks = pEnc->current->sStat.mblks; + pResult->ublks = pEnc->current->sStat.ublks; + } + if (input_valid) queue_image(pEnc, pFrame); @@ -787,6 +804,14 @@ pFrame->length = BitstreamLength(&bs); pFrame->intra = 4; + if (pResult) { + pResult->quant = pEnc->current->quant; + pResult->hlength = pFrame->length - (pEnc->current->sStat.iTextBits / 8); + pResult->kblks = pEnc->current->sStat.kblks; + pResult->mblks = pEnc->current->sStat.mblks; + pResult->ublks = pEnc->current->sStat.ublks; + } + if (input_valid) queue_image(pEnc, pFrame); @@ -862,10 +887,43 @@ // BitstreamPutBits(&bs, 0x7f, 8); pFrame->intra = 5; + + if (pResult) { + /* + * We must decide what to put there because i know some apps + * are storing statistics about quantizers and just do + * stats[quant]++ or stats[quant-1]++ + * transcode is one of these app with its 2pass module + */ + + /* + * For now i prefer 31 than 0 that could lead to a segfault + * in transcode + */ + pResult->quant = 31; + + pResult->hlength = 0; + pResult->kblks = 0; + pResult->mblks = 0; + pResult->ublks = 0; + } + + } else { + + if (pResult) { + pResult->quant = pEnc->current->quant; + pResult->hlength = pFrame->length - (pEnc->current->sStat.iTextBits / 8); + pResult->kblks = pEnc->current->sStat.kblks; + pResult->mblks = pEnc->current->sStat.mblks; + pResult->ublks = pEnc->current->sStat.ublks; + } + } pFrame->length = BitstreamLength(&bs); + emms(); + return XVID_ERR_OK; } @@ -1002,9 +1060,8 @@ } FrameCodeP(pEnc, &bs, &bits, 1, 0); bframes_count = 0; - pFrame->intra = 0; - + } else { FrameCodeI(pEnc, &bs, &bits); @@ -1026,7 +1083,7 @@ * NB : sequences like "IIBB" decode fine with msfdam but, * go screwy with divx 5.00 */ - } else if (mode == P_VOP || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) { + } else if (mode == P_VOP || mode == S_VOP || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) { /* * This will be coded as a Predicted Frame */ @@ -1766,6 +1823,14 @@ int32_t iSAD = sad16(pEnc->current->image.y + 16*y*pEnc->mbParam.edged_width + 16*x, pEnc->vGMC.y + 16*y*pEnc->mbParam.edged_width + 16*x, pEnc->mbParam.edged_width, 65536); + + if (pEnc->current->motion_flags & PMV_CHROMA16) { + iSAD += sad8(pEnc->current->image.u + 8*y*(pEnc->mbParam.edged_width/2) + 8*x, + pEnc->vGMC.u + 8*y*(pEnc->mbParam.edged_width/2) + 8*x, pEnc->mbParam.edged_width/2); + + iSAD += sad8(pEnc->current->image.v + 8*y*(pEnc->mbParam.edged_width/2) + 8*x, + pEnc->vGMC.v + 8*y*(pEnc->mbParam.edged_width/2) + 8*x, pEnc->mbParam.edged_width/2); + } if (iSAD <= pMB->sad16) { /* mode decision GMC */