Template
148 lines
9.5 KiB
C
148 lines
9.5 KiB
C
|
|
/*!
|
|
************************************************************************
|
|
*
|
|
* \file me_umhex.h
|
|
*
|
|
* \brief
|
|
* Macro definitions and global variables for UMHEX fast
|
|
* integer pel motion estimation and fractional pel motion estimation
|
|
*
|
|
* \author
|
|
* Main contributors: (see contributors.h for copyright, address and affiliation details)
|
|
* - Zhibo Chen <chenzhibo@tsinghua.org.cn>
|
|
* - JianFeng Xu <fenax@video.mdc.tsinghua.edu.cn>
|
|
* - Wenfang Fu <fwf@video.mdc.tsinghua.edu.cn>
|
|
* - Xiaozhong Xu <xxz@video.mdc.tsinghua.edu.cn>
|
|
*
|
|
* \date
|
|
* 2006.1
|
|
************************************************************************
|
|
*/
|
|
|
|
#ifndef _ME_UMHEX_H_
|
|
#define _ME_UMHEX_H_
|
|
|
|
#include "mbuffer.h"
|
|
|
|
struct umhex_struct {
|
|
float AlphaFourth_1[8];
|
|
float AlphaFourth_2[8];
|
|
// for bipred mode
|
|
int pred_MV_ref_flag;
|
|
int BlockType_LUT[4][4];
|
|
distblk Median_Pred_Thd_MB[8];
|
|
distblk Big_Hexagon_Thd_MB[8];
|
|
distblk Multi_Ref_Thd_MB[8];
|
|
distblk Threshold_DSR_MB[8]; //!< Threshold for usage of DSR. DSR refer to JVT-Q088
|
|
byte **McostState; //!< state for integer pel search
|
|
byte **SearchState; //!< state for fractional pel search
|
|
distblk ****fastme_ref_cost; //!< store SAD information needed for forward ref-frame prediction
|
|
distblk ***fastme_l0_cost; //!< store SAD information needed for forward median and uplayer prediction
|
|
distblk ***fastme_l1_cost; //!< store SAD information needed for backward median and uplayer prediction
|
|
distblk **fastme_best_cost; //!< for multi ref early termination threshold
|
|
distblk ***fastme_l0_cost_bipred; //!< store SAD information for bipred mode
|
|
distblk ***fastme_l1_cost_bipred; //!< store SAD information for bipred mode
|
|
distblk pred_SAD; //!< SAD prediction in use.
|
|
distblk SAD_a,SAD_b,SAD_c,SAD_d;
|
|
int bipred_flag; //!< flag for bipred
|
|
int pred_MV_ref[2], pred_MV_uplayer[2]; //!< pred motion vector by space or temporal correlation,Median is provided
|
|
|
|
int UMHEX_blocktype; //!< blocktype for UMHEX SetMotionVectorPredictor
|
|
int predict_point[5][2];
|
|
//for early termination
|
|
float Bsize[8];
|
|
|
|
byte *flag_intra;
|
|
int flag_intra_SAD;
|
|
};
|
|
|
|
typedef struct umhex_struct UMHexStruct;
|
|
|
|
#define EARLY_TERMINATION \
|
|
if ((min_mcost - p_UMHex->pred_SAD)<p_UMHex->pred_SAD * betaFourth_2) \
|
|
goto fourth_2_step; \
|
|
else if((min_mcost - p_UMHex->pred_SAD) < p_UMHex->pred_SAD * betaFourth_1) \
|
|
goto fourth_1_step;
|
|
|
|
#define SEARCH_ONE_PIXEL \
|
|
if((iabs(cand.mv_x - center.mv_x)>>2) < search_range && (iabs(cand.mv_y - center.mv_y)>>2)< search_range)\
|
|
{ \
|
|
if(!p_UMHex->McostState[((cand.mv_y - center.mv_y) >> 2)+ search_range][((cand.mv_x-center.mv_x)>>2)+search_range]) \
|
|
{ \
|
|
mcost = mv_cost (p_Vid, lambda_factor, &cand, &pred); \
|
|
if(mcost<min_mcost) \
|
|
{ \
|
|
mcost += mv_block->computePredFPel(ref_picture, mv_block, \
|
|
min_mcost - mcost, &cand); \
|
|
p_UMHex->McostState[((cand.mv_y - center.mv_y) >> 2) + search_range][((cand.mv_x - center.mv_x) >> 2) + search_range] = 1; \
|
|
if (mcost < min_mcost) \
|
|
{ \
|
|
best = cand; \
|
|
min_mcost = mcost; \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SEARCH_ONE_PIXEL_BIPRED \
|
|
if((iabs(cand.mv_x - center2.mv_x) >> 2) < search_range && (iabs(cand.mv_y - center2.mv_y) >> 2) < search_range) \
|
|
{ \
|
|
if(!p_UMHex->McostState[((cand.mv_y - center2.mv_y) >> 2) + search_range][((cand.mv_x-center2.mv_x) >> 2)+search_range]) \
|
|
{ \
|
|
mcost = mv_cost (p_Vid, lambda_factor, ¢er1, &pred1); \
|
|
mcost += mv_cost (p_Vid, lambda_factor, &cand, &pred2); \
|
|
if(mcost<min_mcost) \
|
|
{ \
|
|
mcost += mv_block->computeBiPredFPel(ref_picture1, ref_picture2, \
|
|
mv_block, min_mcost - mcost, ¢er1, &cand); \
|
|
p_UMHex->McostState[((cand.mv_y - center2.mv_y) >> 2) + search_range][((cand.mv_x - center2.mv_x) >> 2) + search_range] = 1; \
|
|
if (mcost < min_mcost) \
|
|
{ \
|
|
best = cand; \
|
|
min_mcost = mcost; \
|
|
} \
|
|
} \
|
|
} \
|
|
} \
|
|
|
|
|
|
extern void UMHEX_DefineThreshold (VideoParameters *p_Vid);
|
|
extern void UMHEX_DefineThresholdMB(VideoParameters *p_Vid, InputParameters *p_Inp);
|
|
extern int UMHEX_get_mem (VideoParameters *p_Vid, InputParameters *p_Inp);
|
|
extern void UMHEX_free_mem (VideoParameters *p_Vid, InputParameters *p_Inp);
|
|
|
|
extern void UMHEX_decide_intrabk_SAD(Macroblock *currMB);
|
|
extern void UMHEX_skip_intrabk_SAD (Macroblock *currMB, int ref_max);
|
|
extern void UMHEX_setup (Macroblock *currMB, short ref, int list, int block_y, int block_x, int blocktype, MotionVector *****all_mv);
|
|
|
|
extern distblk // ==> minimum motion cost after search
|
|
UMHEXIntegerPelBlockMotionSearch (Macroblock *currMB, // <-- current Macroblock
|
|
MotionVector *pred, // <-- motion vector predictor (x) in sub-pel units
|
|
MEBlock *mv_block,
|
|
distblk min_mcost, // <-- minimum motion cost (cost for center or huge value)
|
|
int lambda_factor // <-- lagrangian parameter for determining motion cost
|
|
);
|
|
extern distblk UMHEXSubPelBlockME ( // ==> minimum motion cost after search
|
|
Macroblock *currMB, // <-- Current Macroblock
|
|
MotionVector *pred, // <-- motion vector predictor (x) in sub-pel units
|
|
MEBlock *mv_block,
|
|
distblk min_mcost, // <-- minimum motion cost (cost for center or huge value)
|
|
int* lambda // <-- lagrangian parameter for determining motion cost
|
|
);
|
|
extern distblk UMHEXSubPelBlockMotionSearch ( // ==> minimum motion cost after search
|
|
Macroblock *currMB, // <-- current Macroblock
|
|
MotionVector *pred_mv, // < <-- motion vector predictor (x|y) in sub-pel units
|
|
MEBlock *mv_block,
|
|
distblk min_mcost, // <-- minimum motion cost (cost for center or huge value)
|
|
int lambda_factor // <-- lagrangian parameter for determining motion cost
|
|
);
|
|
extern distblk UMHEXBipredIntegerPelBlockMotionSearch (Macroblock *, int,
|
|
MotionVector *, MotionVector *, MotionVector *, MotionVector *,
|
|
MEBlock *, int, distblk, int);
|
|
|
|
extern void UMHEXSetMotionVectorPredictor (Macroblock *currMB, MotionVector *pmv, struct pic_motion_params **mv_info,
|
|
short ref_frame, int list, int mb_x, int mb_y, int bl_x, int bl_y, MEBlock *mv_block);
|
|
|
|
#endif
|