21 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
22 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
* |
* |
24 |
* $Id: estimation_bvop.c,v 1.1.2.9 2003-12-18 02:53:30 Isibaar Exp $ |
* $Id: estimation_bvop.c,v 1.1.2.10 2003-12-18 13:26:48 Isibaar Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
841 |
uint32_t skip_sad; |
uint32_t skip_sad; |
842 |
|
|
843 |
const MACROBLOCK * const b_mbs = b_reference->mbs; |
const MACROBLOCK * const b_mbs = b_reference->mbs; |
844 |
|
MACROBLOCK *const pMBs = frame->mbs; |
845 |
|
|
846 |
VECTOR f_predMV, b_predMV; |
VECTOR f_predMV, b_predMV; |
847 |
|
|
870 |
MACROBLOCK * const pMB = frame->mbs + i + j * pParam->mb_width; |
MACROBLOCK * const pMB = frame->mbs + i + j * pParam->mb_width; |
871 |
const MACROBLOCK * const b_mb = b_mbs + i + j * pParam->mb_width; |
const MACROBLOCK * const b_mb = b_mbs + i + j * pParam->mb_width; |
872 |
int interpol_search; |
int interpol_search; |
873 |
|
int bf_search = 0; |
874 |
|
int bf_thresh1, bf_thresh2; |
875 |
|
|
876 |
/* special case, if collocated block is SKIPed in P-VOP: encoding is forward (0,0), cpb=0 without further ado */ |
/* special case, if collocated block is SKIPed in P-VOP: encoding is forward (0,0), cpb=0 without further ado */ |
877 |
if (b_reference->coding_type != S_VOP) |
if (b_reference->coding_type != S_VOP) |
878 |
if (b_mb->mode == MODE_NOT_CODED) { |
if (b_mb->mode == MODE_NOT_CODED) { |
879 |
pMB->mode = MODE_NOT_CODED; |
pMB->mode = MODE_NOT_CODED; |
880 |
pMB->mvs[0] = pMB->b_mvs[0] = zeroMV; |
pMB->mvs[0] = pMB->b_mvs[0] = zeroMV; |
881 |
|
pMB->sad16 = 0; |
882 |
continue; |
continue; |
883 |
} |
} |
884 |
|
|
901 |
&best_sad, |
&best_sad, |
902 |
&Data); |
&Data); |
903 |
|
|
904 |
if (pMB->mode == MODE_DIRECT_NONE_MV) continue; |
if (pMB->mode == MODE_DIRECT_NONE_MV) { |
905 |
|
pMB->sad16 = best_sad; |
906 |
|
continue; |
907 |
|
} |
908 |
|
|
909 |
|
if (frame->motion_flags & XVID_ME_BFRAME_EARLYSTOP) { |
910 |
|
|
911 |
|
if(i > 0 && j > 0 && i < pParam->mb_width) { |
912 |
|
bf_thresh1 = ((&pMBs[(i-1) + j * pParam->mb_width])->sad16 + |
913 |
|
(&pMBs[i + (j-1) * pParam->mb_width])->sad16 + |
914 |
|
(&pMBs[(i+1) + (j-1) * pParam->mb_width])->sad16) / 3; |
915 |
|
|
916 |
|
if (((&pMBs[(i-1) + j * pParam->mb_width])->mode != MODE_FORWARD) && |
917 |
|
((&pMBs[(i-1) + j * pParam->mb_width])->mode != MODE_BACKWARD) && |
918 |
|
((&pMBs[(i-1) + j * pParam->mb_width])->mode != MODE_INTERPOLATE)) |
919 |
|
bf_search++; |
920 |
|
|
921 |
|
if (((&pMBs[i + (j - 1) * pParam->mb_width])->mode != MODE_FORWARD) && |
922 |
|
((&pMBs[i + (j - 1) * pParam->mb_width])->mode != MODE_BACKWARD) && |
923 |
|
((&pMBs[i + (j - 1) * pParam->mb_width])->mode != MODE_INTERPOLATE)) |
924 |
|
bf_search++; |
925 |
|
|
926 |
|
if (((&pMBs[(i + 1) + (j - 1) * pParam->mb_width])->mode != MODE_FORWARD) && |
927 |
|
((&pMBs[(i + 1) + (j - 1) * pParam->mb_width])->mode != MODE_BACKWARD) && |
928 |
|
((&pMBs[(i + 1) + (j - 1) * pParam->mb_width])->mode != MODE_INTERPOLATE)) |
929 |
|
bf_search++; |
930 |
|
} |
931 |
|
|
932 |
|
if ((best_sad < bf_thresh1) && (bf_search == 3)) |
933 |
|
continue; |
934 |
|
} |
935 |
|
|
936 |
/* forward search */ |
/* forward search */ |
937 |
SearchBF(f_ref, f_refH->y, f_refV->y, f_refHV->y, |
SearchBF(f_ref, f_refH->y, f_refV->y, f_refHV->y, |
976 |
switch (pMB->mode) { |
switch (pMB->mode) { |
977 |
case MODE_FORWARD: |
case MODE_FORWARD: |
978 |
f_predMV = Data.qpel ? pMB->qmvs[0] : pMB->mvs[0]; |
f_predMV = Data.qpel ? pMB->qmvs[0] : pMB->mvs[0]; |
979 |
|
pMB->sad16 = best_sad; |
980 |
break; |
break; |
981 |
case MODE_BACKWARD: |
case MODE_BACKWARD: |
982 |
b_predMV = Data.qpel ? pMB->b_qmvs[0] : pMB->b_mvs[0]; |
b_predMV = Data.qpel ? pMB->b_qmvs[0] : pMB->b_mvs[0]; |
983 |
|
pMB->sad16 = best_sad; |
984 |
break; |
break; |
985 |
case MODE_INTERPOLATE: |
case MODE_INTERPOLATE: |
986 |
f_predMV = Data.qpel ? pMB->qmvs[0] : pMB->mvs[0]; |
f_predMV = Data.qpel ? pMB->qmvs[0] : pMB->mvs[0]; |
987 |
b_predMV = Data.qpel ? pMB->b_qmvs[0] : pMB->b_mvs[0]; |
b_predMV = Data.qpel ? pMB->b_qmvs[0] : pMB->b_mvs[0]; |
988 |
|
pMB->sad16 = best_sad; |
989 |
break; |
break; |
990 |
default: |
default: |
991 |
|
pMB->sad16 = best_sad; |
992 |
break; |
break; |
993 |
} |
} |
994 |
} |
} |