7 |
* 2002 Peter Ross <pross@xvid.org> |
* 2002 Peter Ross <pross@xvid.org> |
8 |
* 2002 Daniel Smith <danielsmith@astroboymail.com> |
* 2002 Daniel Smith <danielsmith@astroboymail.com> |
9 |
* |
* |
10 |
* This program is an implementation of a part of one or more MPEG-4 |
* This file is part of XviD, a free MPEG-4 video encoder/decoder |
|
* Video tools as specified in ISO/IEC 14496-2 standard. Those intending |
|
|
* to use this software module in hardware or software products are |
|
|
* advised that its use may infringe existing patents or copyrights, and |
|
|
* any such use would be at such party's own risk. The original |
|
|
* developer of this software module and his/her company, and subsequent |
|
|
* editors and their companies, will have no liability for use of this |
|
|
* software or modifications or derivatives thereof. |
|
11 |
* |
* |
12 |
* This program is free software; you can redistribute it and/or modify |
* XviD is free software; you can redistribute it and/or modify it |
13 |
* it under the terms of the GNU General Public License as published by |
* under the terms of the GNU General Public License as published by |
14 |
* the Free Software Foundation; either version 2 of the License, or |
* the Free Software Foundation; either version 2 of the License, or |
15 |
* (at your option) any later version. |
* (at your option) any later version. |
16 |
* |
* |
23 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
24 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
25 |
* |
* |
26 |
|
* Under section 8 of the GNU General Public License, the copyright |
27 |
|
* holders of XVID explicitly forbid distribution in the following |
28 |
|
* countries: |
29 |
|
* |
30 |
|
* - Japan |
31 |
|
* - United States of America |
32 |
|
* |
33 |
|
* Linking XviD statically or dynamically with other modules is making a |
34 |
|
* combined work based on XviD. Thus, the terms and conditions of the |
35 |
|
* GNU General Public License cover the whole combination. |
36 |
|
* |
37 |
|
* As a special exception, the copyright holders of XviD give you |
38 |
|
* permission to link XviD with independent modules that communicate with |
39 |
|
* XviD solely through the VFW1.1 and DShow interfaces, regardless of the |
40 |
|
* license terms of these independent modules, and to copy and distribute |
41 |
|
* the resulting combined work under terms of your choice, provided that |
42 |
|
* every copy of the combined work is accompanied by a complete copy of |
43 |
|
* the source code of XviD (the version of XviD used to produce the |
44 |
|
* combined work), being distributed under the terms of the GNU General |
45 |
|
* Public License plus this exception. An independent module is a module |
46 |
|
* which is not derived from or based on XviD. |
47 |
|
* |
48 |
|
* Note that people who make modified versions of XviD are not obligated |
49 |
|
* to grant this special exception for their modified versions; it is |
50 |
|
* their choice whether to do so. The GNU General Public License gives |
51 |
|
* permission to release a modified version without this exception; this |
52 |
|
* exception also makes it possible to release a modified version which |
53 |
|
* carries forward this exception. |
54 |
|
* |
55 |
* $Id$ |
* $Id$ |
56 |
* |
* |
57 |
****************************************************************************/ |
****************************************************************************/ |
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 */ |
636 |
return; |
return; |
637 |
} |
} |
638 |
|
|
639 |
pEnc->current->fcode = |
pEnc->current->fcode = (hint->rawhints != 0) ? |
640 |
(hint->rawhints) ? hint->mvhint.fcode : BitstreamGetBits(&bs, |
(uint32_t)hint->mvhint.fcode : BitstreamGetBits(&bs, FCODEBITS); |
|
FCODEBITS); |
|
641 |
|
|
642 |
length = pEnc->current->fcode + 5; |
length = pEnc->current->fcode + 5; |
643 |
high = 1 << (length - 1); |
high = 1 << (length - 1); |
652 |
VECTOR tmp; |
VECTOR tmp; |
653 |
int vec; |
int vec; |
654 |
|
|
655 |
pMB->mode = |
pMB->mode = (hint->rawhints != 0) ? |
656 |
(hint->rawhints) ? bhint->mode : BitstreamGetBits(&bs, |
(uint32_t)bhint->mode : BitstreamGetBits(&bs, MODEBITS); |
|
MODEBITS); |
|
657 |
|
|
658 |
pMB->mode = (pMB->mode == MODE_INTER_Q) ? MODE_INTER : pMB->mode; |
pMB->mode = (pMB->mode == MODE_INTER_Q) ? MODE_INTER : pMB->mode; |
659 |
pMB->mode = (pMB->mode == MODE_INTRA_Q) ? MODE_INTRA : pMB->mode; |
pMB->mode = (pMB->mode == MODE_INTRA_Q) ? MODE_INTRA : pMB->mode; |
660 |
|
|
661 |
if (pMB->mode == MODE_INTER) { |
if (pMB->mode == MODE_INTER) { |
662 |
tmp.x = |
tmp.x = (hint->rawhints) ? |
663 |
(hint->rawhints) ? bhint->mvs[0].x : BitstreamGetBits(&bs, |
bhint->mvs[0].x : (int)BitstreamGetBits(&bs, length); |
664 |
length); |
tmp.y = (hint->rawhints) ? |
665 |
tmp.y = |
bhint->mvs[0].y : (int)BitstreamGetBits(&bs, length); |
|
(hint->rawhints) ? bhint->mvs[0].y : BitstreamGetBits(&bs, |
|
|
length); |
|
666 |
tmp.x -= (tmp.x >= high) ? high * 2 : 0; |
tmp.x -= (tmp.x >= high) ? high * 2 : 0; |
667 |
tmp.y -= (tmp.y >= high) ? high * 2 : 0; |
tmp.y -= (tmp.y >= high) ? high * 2 : 0; |
668 |
|
|
676 |
} |
} |
677 |
} else if (pMB->mode == MODE_INTER4V) { |
} else if (pMB->mode == MODE_INTER4V) { |
678 |
for (vec = 0; vec < 4; ++vec) { |
for (vec = 0; vec < 4; ++vec) { |
679 |
tmp.x = |
tmp.x = (hint->rawhints) ? |
680 |
(hint->rawhints) ? bhint->mvs[vec]. |
bhint->mvs[vec].x : (int)BitstreamGetBits(&bs, length); |
681 |
x : BitstreamGetBits(&bs, length); |
tmp.y = (hint->rawhints) ? |
682 |
tmp.y = |
bhint->mvs[vec].y : (int)BitstreamGetBits(&bs, length); |
|
(hint->rawhints) ? bhint->mvs[vec]. |
|
|
y : BitstreamGetBits(&bs, length); |
|
683 |
tmp.x -= (tmp.x >= high) ? high * 2 : 0; |
tmp.x -= (tmp.x >= high) ? high * 2 : 0; |
684 |
tmp.y -= (tmp.y >= high) ? high * 2 : 0; |
tmp.y -= (tmp.y >= high) ? high * 2 : 0; |
685 |
|
|
690 |
pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x; |
pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x; |
691 |
pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y; |
pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y; |
692 |
} |
} |
693 |
} else // intra / stuffing / not_coded |
} else /* intra / stuffing / not_coded */ |
694 |
{ |
{ |
695 |
for (vec = 0; vec < 4; ++vec) { |
for (vec = 0; vec < 4; ++vec) { |
696 |
pMB->mvs[vec].x = pMB->mvs[vec].y = 0; |
pMB->mvs[vec].x = pMB->mvs[vec].y = 0; |
863 |
HintedMEGet(pEnc, 1); |
HintedMEGet(pEnc, 1); |
864 |
} |
} |
865 |
|
|
866 |
return 1; // intra |
return 1; /* intra */ |
867 |
} |
} |
868 |
|
|
869 |
|
|
919 |
HintedMESet(pEnc, &bIntra); |
HintedMESet(pEnc, &bIntra); |
920 |
} else { |
} else { |
921 |
|
|
|
#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 |
|
922 |
bIntra = |
bIntra = |
923 |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
924 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1037 |
iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode); |
iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode); |
1038 |
|
|
1039 |
if ((fSigma > iSearchRange / 3) |
if ((fSigma > iSearchRange / 3) |
1040 |
&& (pEnc->mbParam.m_fcode <= 3)) // maximum search range 128 |
&& (pEnc->mbParam.m_fcode <= 3)) /* maximum search range 128 */ |
1041 |
{ |
{ |
1042 |
pEnc->mbParam.m_fcode++; |
pEnc->mbParam.m_fcode++; |
1043 |
iSearchRange *= 2; |
iSearchRange *= 2; |
1044 |
} else if ((fSigma < iSearchRange / 6) |
} else if ((fSigma < iSearchRange / 6) |
1045 |
&& (pEnc->sStat.fMvPrevSigma >= 0) |
&& (pEnc->sStat.fMvPrevSigma >= 0) |
1046 |
&& (pEnc->sStat.fMvPrevSigma < iSearchRange / 6) |
&& (pEnc->sStat.fMvPrevSigma < iSearchRange / 6) |
1047 |
&& (pEnc->mbParam.m_fcode >= 2)) // minimum search range 16 |
&& (pEnc->mbParam.m_fcode >= 2)) /* minimum search range 16 */ |
1048 |
{ |
{ |
1049 |
pEnc->mbParam.m_fcode--; |
pEnc->mbParam.m_fcode--; |
1050 |
iSearchRange /= 2; |
iSearchRange /= 2; |
1054 |
|
|
1055 |
*pBits = BitstreamPos(bs) - *pBits; |
*pBits = BitstreamPos(bs) - *pBits; |
1056 |
|
|
1057 |
return 0; // inter |
return 0; /* inter */ |
1058 |
|
|
1059 |
} |
} |