39 |
* MinChen <chenm001@163.com> |
* MinChen <chenm001@163.com> |
40 |
* 14.04.2002 added FrameCodeB() |
* 14.04.2002 added FrameCodeB() |
41 |
* |
* |
42 |
* $Id: encoder.c,v 1.76.2.27 2002-12-10 11:13:50 suxen_drol Exp $ |
* $Id: encoder.c,v 1.76.2.31 2002-12-14 06:07:02 suxen_drol Exp $ |
43 |
* |
* |
44 |
****************************************************************************/ |
****************************************************************************/ |
45 |
|
|
646 |
|
|
647 |
|
|
648 |
|
|
649 |
|
/* convert pFrame->intra to coding_type */ |
650 |
|
static int intra2coding_type(int intra) |
651 |
|
{ |
652 |
|
if (intra < 0) return -1; |
653 |
|
if (intra == 1) return I_VOP; |
654 |
|
if (intra == 2) return B_VOP; |
655 |
|
|
656 |
|
return P_VOP; |
657 |
|
} |
658 |
|
|
659 |
|
|
660 |
|
|
661 |
/***************************************************************************** |
/***************************************************************************** |
865 |
// only inc frame num, adapt quant, etc. if we havent seen it before |
// only inc frame num, adapt quant, etc. if we havent seen it before |
866 |
if (pEnc->bframenum_dx50bvop < 0 ) |
if (pEnc->bframenum_dx50bvop < 0 ) |
867 |
{ |
{ |
868 |
|
mode = intra2coding_type(pFrame->intra); |
869 |
if (pFrame->quant == 0) |
if (pFrame->quant == 0) |
870 |
pEnc->current->quant = RateControlGetQ(&pEnc->rate_control, 0); |
pEnc->current->quant = RateControlGetQ(&pEnc->rate_control, 0); |
871 |
else |
else |
939 |
* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ |
* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ |
940 |
pEnc->iFrameNum++; |
pEnc->iFrameNum++; |
941 |
|
|
942 |
if (pEnc->iFrameNum == 0 || pFrame->intra == 1 || pEnc->bframenum_dx50bvop >= 0 || |
if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || |
943 |
(pFrame->intra < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
(mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
944 |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval) |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) |
945 |
|| 2 == (mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
{ |
946 |
|
mode = I_VOP; |
947 |
|
}else{ |
948 |
|
mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
949 |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
950 |
(pFrame->intra < 0) ? pEnc->iFrameNum : 0, |
(mode < 0) ? pEnc->iFrameNum : 0, |
951 |
bframes_count++))) { |
bframes_count++); |
952 |
|
} |
953 |
|
|
954 |
|
if (mode == I_VOP) { |
955 |
/* |
/* |
956 |
* This will be coded as an Intra Frame |
* This will be coded as an Intra Frame |
957 |
*/ |
*/ |
1015 |
* NB : sequences like "IIBB" decode fine with msfdam but, |
* NB : sequences like "IIBB" decode fine with msfdam but, |
1016 |
* go screwy with divx 5.00 |
* go screwy with divx 5.00 |
1017 |
*/ |
*/ |
1018 |
} else if (pEnc->bframenum_tail >= pEnc->mbParam.max_bframes || mode != 0) { |
} else if (mode == P_VOP || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) { |
|
// } else if (pFrame->intra == 0 || pEnc->bframenum_tail >= pEnc->mbParam.max_bframes || mode != 0) { |
|
1019 |
/* |
/* |
1020 |
* This will be coded as a Predicted Frame |
* This will be coded as a Predicted Frame |
1021 |
*/ |
*/ |
1039 |
goto ipvop_loop; |
goto ipvop_loop; |
1040 |
} |
} |
1041 |
|
|
1042 |
} else { |
} else { /* mode == B_VOP */ |
1043 |
/* |
/* |
1044 |
* This will be coded as a Bidirectional Frame |
* This will be coded as a Bidirectional Frame |
1045 |
*/ |
*/ |
1608 |
if ((pEnc->current->global_flags & XVID_REDUCED)) |
if ((pEnc->current->global_flags & XVID_REDUCED)) |
1609 |
{ |
{ |
1610 |
image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, |
image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, |
1611 |
pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width); |
pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width, |
1612 |
|
16, XVID_DEC_DEBLOCKY|XVID_DEC_DEBLOCKUV); |
1613 |
} |
} |
1614 |
emms(); |
emms(); |
1615 |
|
|
1691 |
pEnc->current->coding_type = P_VOP; |
pEnc->current->coding_type = P_VOP; |
1692 |
|
|
1693 |
start_timer(); |
start_timer(); |
1694 |
if (pEnc->current->global_flags & XVID_HINTEDME_SET) { |
if (pEnc->current->global_flags & XVID_HINTEDME_SET) |
1695 |
HintedMESet(pEnc, &bIntra); |
HintedMESet(pEnc, &bIntra); |
1696 |
if (bIntra == 0) { |
else |
|
pEnc->current->fcode = FindFcode(&pEnc->mbParam, pEnc->current); |
|
|
MotionEstimationHinted(&pEnc->mbParam, pEnc->current, pEnc->reference, |
|
|
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); |
|
|
} |
|
|
|
|
|
} else { |
|
1697 |
|
|
1698 |
bIntra = |
bIntra = |
1699 |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
1700 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1701 |
iLimit); |
iLimit); |
1702 |
} |
|
1703 |
stop_motion_timer(); |
stop_motion_timer(); |
1704 |
|
|
1705 |
if (bIntra == 1) return FrameCodeI(pEnc, bs, pBits); |
if (bIntra == 1) return FrameCodeI(pEnc, bs, pBits); |
1849 |
if ((pEnc->current->global_flags & XVID_REDUCED)) |
if ((pEnc->current->global_flags & XVID_REDUCED)) |
1850 |
{ |
{ |
1851 |
image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, |
image_deblock_rrv(&pEnc->current->image, pEnc->mbParam.edged_width, |
1852 |
pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width); |
pEnc->current->mbs, mb_width, mb_height, pEnc->mbParam.mb_width, |
1853 |
|
16, XVID_DEC_DEBLOCKY|XVID_DEC_DEBLOCKUV); |
1854 |
} |
} |
1855 |
|
|
1856 |
emms(); |
emms(); |