52 |
* exception also makes it possible to release a modified version which |
* exception also makes it possible to release a modified version which |
53 |
* carries forward this exception. |
* carries forward this exception. |
54 |
* |
* |
55 |
* $Id: encoder.c,v 1.87 2002-11-16 23:38:16 edgomez Exp $ |
* $Id: encoder.c,v 1.89 2002-11-28 07:27:37 suxen_drol Exp $ |
56 |
* |
* |
57 |
****************************************************************************/ |
****************************************************************************/ |
58 |
|
|
78 |
#include "quant/quant_matrix.h" |
#include "quant/quant_matrix.h" |
79 |
#include "utils/mem_align.h" |
#include "utils/mem_align.h" |
80 |
|
|
|
#ifdef _SMP |
|
|
#include "motion/smp_motion_est.h" |
|
|
#endif |
|
81 |
/***************************************************************************** |
/***************************************************************************** |
82 |
* Local macros |
* Local macros |
83 |
****************************************************************************/ |
****************************************************************************/ |
236 |
|
|
237 |
pEnc->mbParam.m_quant_type = H263_QUANT; |
pEnc->mbParam.m_quant_type = H263_QUANT; |
238 |
|
|
|
#ifdef _SMP |
|
|
pEnc->mbParam.num_threads = MIN(pParam->num_threads, MAXNUMTHREADS); |
|
|
#endif |
|
|
|
|
239 |
pEnc->sStat.fMvPrevSigma = -1; |
pEnc->sStat.fMvPrevSigma = -1; |
240 |
|
|
241 |
/* Fill rate control parameters */ |
/* Fill rate control parameters */ |
696 |
pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x; |
pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x; |
697 |
pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y; |
pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y; |
698 |
} |
} |
699 |
} else // intra / stuffing / not_coded |
} else /* intra / stuffing / not_coded */ |
700 |
{ |
{ |
701 |
for (vec = 0; vec < 4; ++vec) { |
for (vec = 0; vec < 4; ++vec) { |
702 |
pMB->mvs[vec].x = pMB->mvs[vec].y = 0; |
pMB->mvs[vec].x = pMB->mvs[vec].y = 0; |
869 |
HintedMEGet(pEnc, 1); |
HintedMEGet(pEnc, 1); |
870 |
} |
} |
871 |
|
|
872 |
return 1; // intra |
return 1; /* intra */ |
873 |
} |
} |
874 |
|
|
875 |
|
|
925 |
HintedMESet(pEnc, &bIntra); |
HintedMESet(pEnc, &bIntra); |
926 |
} else { |
} else { |
927 |
|
|
|
#ifdef _SMP |
|
|
if (pEnc->mbParam.num_threads > 1) |
|
|
bIntra = |
|
|
SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
|
|
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
|
|
iLimit); |
|
|
else |
|
|
#endif |
|
928 |
bIntra = |
bIntra = |
929 |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
930 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1043 |
iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode); |
iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode); |
1044 |
|
|
1045 |
if ((fSigma > iSearchRange / 3) |
if ((fSigma > iSearchRange / 3) |
1046 |
&& (pEnc->mbParam.m_fcode <= 3)) // maximum search range 128 |
&& (pEnc->mbParam.m_fcode <= 3)) /* maximum search range 128 */ |
1047 |
{ |
{ |
1048 |
pEnc->mbParam.m_fcode++; |
pEnc->mbParam.m_fcode++; |
1049 |
iSearchRange *= 2; |
iSearchRange *= 2; |
1050 |
} else if ((fSigma < iSearchRange / 6) |
} else if ((fSigma < iSearchRange / 6) |
1051 |
&& (pEnc->sStat.fMvPrevSigma >= 0) |
&& (pEnc->sStat.fMvPrevSigma >= 0) |
1052 |
&& (pEnc->sStat.fMvPrevSigma < iSearchRange / 6) |
&& (pEnc->sStat.fMvPrevSigma < iSearchRange / 6) |
1053 |
&& (pEnc->mbParam.m_fcode >= 2)) // minimum search range 16 |
&& (pEnc->mbParam.m_fcode >= 2)) /* minimum search range 16 */ |
1054 |
{ |
{ |
1055 |
pEnc->mbParam.m_fcode--; |
pEnc->mbParam.m_fcode--; |
1056 |
iSearchRange /= 2; |
iSearchRange /= 2; |
1060 |
|
|
1061 |
*pBits = BitstreamPos(bs) - *pBits; |
*pBits = BitstreamPos(bs) - *pBits; |
1062 |
|
|
1063 |
return 0; // inter |
return 0; /* inter */ |
1064 |
|
|
1065 |
} |
} |