--- encoder.c 2002/12/11 10:47:43 1.76.2.28 +++ encoder.c 2003/01/03 16:25:14 1.76.2.32 @@ -39,7 +39,7 @@ * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.76.2.28 2002/12/11 10:47:43 syskin Exp $ + * $Id: encoder.c,v 1.76.2.32 2003/01/03 16:25:14 suxen_drol Exp $ * ****************************************************************************/ @@ -73,7 +73,7 @@ ****************************************************************************/ #define ENC_CHECK(X) if(!(X)) return XVID_ERR_FORMAT -#define SWAP(A,B) { void * tmp = A; A = B; B = tmp; } +#define SWAP(_T_,A,B) { _T_ tmp = A; A = B; B = tmp; } /***************************************************************************** * Local function prototypes @@ -646,6 +646,16 @@ +/* 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; + + return P_VOP; +} + /***************************************************************************** @@ -703,9 +713,9 @@ pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); pEnc->bframenum_tail--; - SWAP(pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); - SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); + SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); FrameCodeP(pEnc, &bs, &bits, 1, 0); bframes_count = 0; @@ -781,8 +791,8 @@ if (pEnc->bframenum_dx50bvop != -1) { - SWAP(pEnc->current, pEnc->reference); - SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_dx50bvop]); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_dx50bvop]); if ((pEnc->mbParam.global & XVID_GLOBAL_DEBUG)) { image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 100, "DX50 IVOP"); @@ -796,7 +806,7 @@ } else if (input_valid) { - SWAP(pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); start_timer(); if (image_input @@ -822,7 +832,7 @@ } else if (pEnc->queue_size > 0) { - SWAP(pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); image_swap(&pEnc->current->image, &pEnc->queue[pEnc->queue_head]); pEnc->queue_head = (pEnc->queue_head + 1) % pEnc->mbParam.max_bframes; @@ -855,6 +865,7 @@ // only inc frame num, adapt quant, etc. if we havent seen it before if (pEnc->bframenum_dx50bvop < 0 ) { + mode = intra2coding_type(pFrame->intra); if (pFrame->quant == 0) pEnc->current->quant = RateControlGetQ(&pEnc->rate_control, 0); else @@ -928,14 +939,19 @@ * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ pEnc->iFrameNum++; - if (pEnc->iFrameNum == 0 || pFrame->intra == 1 || pEnc->bframenum_dx50bvop >= 0 || - (pFrame->intra < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && - pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval) - || 2 == (mode = MEanalysis(&pEnc->reference->image, pEnc->current, - &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, - (pFrame->intra < 0) ? pEnc->iFrameNum : 0, - bframes_count++))) { + if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || + (mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && + pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) + { + mode = I_VOP; + }else{ + mode = MEanalysis(&pEnc->reference->image, pEnc->current, + &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, + (mode < 0) ? pEnc->iFrameNum : 0, + bframes_count++); + } + if (mode == I_VOP) { /* * This will be coded as an Intra Frame */ @@ -969,7 +985,7 @@ pEnc->bframenum_tail--; pEnc->bframenum_dx50bvop = pEnc->bframenum_tail; - SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_dx50bvop]); + SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_dx50bvop]); if ((pEnc->mbParam.global & XVID_GLOBAL_DEBUG)) { image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 100, "DX50 BVOP->PVOP"); } @@ -999,8 +1015,7 @@ * NB : sequences like "IIBB" decode fine with msfdam but, * go screwy with divx 5.00 */ - } else if (pEnc->bframenum_tail >= pEnc->mbParam.max_bframes || mode != 0) { -// } else if (pFrame->intra == 0 || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes || mode != 0) { + } else if (mode == P_VOP || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) { /* * This will be coded as a Predicted Frame */ @@ -1024,7 +1039,7 @@ goto ipvop_loop; } - } else { + } else { /* mode == B_VOP */ /* * This will be coded as a Bidirectional Frame */ @@ -1051,8 +1066,8 @@ pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size,pEnc->current->quant); /* store frame into bframe buffer & swap ref back to current */ - SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); - SWAP(pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); pEnc->bframenum_tail++; @@ -1132,7 +1147,7 @@ ENC_CHECK(pFrame->bitstream); ENC_CHECK(pFrame->image); - SWAP(pEnc->current, pEnc->reference); + SWAP(FRAMEINFO *, pEnc->current, pEnc->reference); pEnc->current->global_flags = pFrame->general; pEnc->current->motion_flags = pFrame->motion; @@ -1548,15 +1563,6 @@ BitstreamWriteVolHeader(bs, &pEnc->mbParam, pEnc->current); - /* XXX: move this stuff to BitstreamWriteVolHeader */ -#define DIVX501B481P "DivX501b481p" - if ((pEnc->mbParam.global & XVID_GLOBAL_PACKED)) { - BitstreamWriteUserData(bs, DIVX501B481P, strlen(DIVX501B481P)); - } - -#define XVID_ID "XviD" XVID_BS_VERSION - BitstreamWriteUserData(bs, XVID_ID, strlen(XVID_ID)); - set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); @@ -1593,7 +1599,8 @@ if ((pEnc->current->global_flags & XVID_REDUCED)) { image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, - pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width); + pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width, + 16, XVID_DEC_DEBLOCKY|XVID_DEC_DEBLOCKUV); } emms(); @@ -1675,20 +1682,15 @@ pEnc->current->coding_type = P_VOP; start_timer(); - if (pEnc->current->global_flags & XVID_HINTEDME_SET) { + if (pEnc->current->global_flags & XVID_HINTEDME_SET) HintedMESet(pEnc, &bIntra); - if (bIntra == 0) { - MotionEstimationHinted(&pEnc->mbParam, pEnc->current, pEnc->reference, - &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); - } - - } else { + else bIntra = MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, iLimit); - } + stop_motion_timer(); if (bIntra == 1) return FrameCodeI(pEnc, bs, pBits); @@ -1838,7 +1840,8 @@ if ((pEnc->current->global_flags & XVID_REDUCED)) { image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, - pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width); + pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width, + 16, XVID_DEC_DEBLOCKY|XVID_DEC_DEBLOCKUV); } emms();