diff options
Diffstat (limited to 'vp8/common/blockd.h')
-rw-r--r-- | vp8/common/blockd.h | 422 |
1 files changed, 203 insertions, 219 deletions
diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h index 26ac8262d..3c60b10ae 100644 --- a/vp8/common/blockd.h +++ b/vp8/common/blockd.h @@ -25,7 +25,7 @@ void vpx_log(const char *format, ...); #define TRUE 1 #define FALSE 0 -//#define MODE_STATS +// #define MODE_STATS /*#define DCPRED 1*/ #define DCPREDSIMTHRESH 0 @@ -47,9 +47,8 @@ void vpx_log(const char *format, ...); #define SEGMENT_DELTADATA 0 #define SEGMENT_ABSDATA 1 -typedef struct -{ - int r, c; +typedef struct { + int r, c; } POS; #define PLANE_TYPE_Y_NO_DC 0 @@ -59,12 +58,11 @@ typedef struct typedef char ENTROPY_CONTEXT; -typedef struct -{ - ENTROPY_CONTEXT y1[4]; - ENTROPY_CONTEXT u[2]; - ENTROPY_CONTEXT v[2]; - ENTROPY_CONTEXT y2; +typedef struct { + ENTROPY_CONTEXT y1[4]; + ENTROPY_CONTEXT u[2]; + ENTROPY_CONTEXT v[2]; + ENTROPY_CONTEXT y2; } ENTROPY_CONTEXT_PLANES; extern const unsigned char vp8_block2left[25]; @@ -73,60 +71,56 @@ extern const unsigned char vp8_block2left_8x8[25]; extern const unsigned char vp8_block2above_8x8[25]; #define VP8_COMBINEENTROPYCONTEXTS( Dest, A, B) \ - Dest = ((A)!=0) + ((B)!=0); + Dest = ((A)!=0) + ((B)!=0); -typedef enum -{ - KEY_FRAME = 0, - INTER_FRAME = 1 +typedef enum { + KEY_FRAME = 0, + INTER_FRAME = 1 } FRAME_TYPE; -typedef enum -{ - DC_PRED, /* average of above and left pixels */ - V_PRED, /* vertical prediction */ - H_PRED, /* horizontal prediction */ +typedef enum { + DC_PRED, /* average of above and left pixels */ + V_PRED, /* vertical prediction */ + H_PRED, /* horizontal prediction */ #if CONFIG_NEWINTRAMODES - D45_PRED, /* Directional 45 deg prediction [anti-clockwise from 0 deg hor] */ - D135_PRED, /* Directional 135 deg prediction [anti-clockwise from 0 deg hor] */ - D117_PRED, /* Directional 112 deg prediction [anti-clockwise from 0 deg hor] */ - D153_PRED, /* Directional 157 deg prediction [anti-clockwise from 0 deg hor] */ - D27_PRED, /* Directional 22 deg prediction [anti-clockwise from 0 deg hor] */ - D63_PRED, /* Directional 67 deg prediction [anti-clockwise from 0 deg hor] */ + D45_PRED, /* Directional 45 deg prediction [anti-clockwise from 0 deg hor] */ + D135_PRED, /* Directional 135 deg prediction [anti-clockwise from 0 deg hor] */ + D117_PRED, /* Directional 112 deg prediction [anti-clockwise from 0 deg hor] */ + D153_PRED, /* Directional 157 deg prediction [anti-clockwise from 0 deg hor] */ + D27_PRED, /* Directional 22 deg prediction [anti-clockwise from 0 deg hor] */ + D63_PRED, /* Directional 67 deg prediction [anti-clockwise from 0 deg hor] */ #endif - TM_PRED, /* Truemotion prediction */ - I8X8_PRED, /* 8x8 based prediction, each 8x8 has its own prediction mode */ - B_PRED, /* block based prediction, each block has its own prediction mode */ + TM_PRED, /* Truemotion prediction */ + I8X8_PRED, /* 8x8 based prediction, each 8x8 has its own prediction mode */ + B_PRED, /* block based prediction, each block has its own prediction mode */ - NEARESTMV, - NEARMV, - ZEROMV, - NEWMV, - SPLITMV, + NEARESTMV, + NEARMV, + ZEROMV, + NEWMV, + SPLITMV, - MB_MODE_COUNT + MB_MODE_COUNT } MB_PREDICTION_MODE; // Segment level features. -typedef enum -{ - SEG_LVL_ALT_Q = 0, // Use alternate Quantizer .... - SEG_LVL_ALT_LF = 1, // Use alternate loop filter value... - SEG_LVL_REF_FRAME = 2, // Optional Segment reference frame - SEG_LVL_MODE = 3, // Optional Segment mode - SEG_LVL_EOB = 4, // EOB end stop marker. - SEG_LVL_TRANSFORM = 5, // Block transform size. - SEG_LVL_MAX = 6 // Number of MB level features supported +typedef enum { + SEG_LVL_ALT_Q = 0, // Use alternate Quantizer .... + SEG_LVL_ALT_LF = 1, // Use alternate loop filter value... + SEG_LVL_REF_FRAME = 2, // Optional Segment reference frame + SEG_LVL_MODE = 3, // Optional Segment mode + SEG_LVL_EOB = 4, // EOB end stop marker. + SEG_LVL_TRANSFORM = 5, // Block transform size. + SEG_LVL_MAX = 6 // Number of MB level features supported } SEG_LVL_FEATURES; // Segment level features. -typedef enum -{ - TX_4X4 = 0, // 4x4 dct transform - TX_8X8 = 1, // 8x8 dct transform +typedef enum { + TX_4X4 = 0, // 4x4 dct transform + TX_8X8 = 1, // 8x8 dct transform - TX_SIZE_MAX = 2 // Number of differnt transforms avaialble + TX_SIZE_MAX = 2 // Number of differnt transforms avaialble } TX_SIZE; @@ -136,28 +130,27 @@ typedef enum #define VP8_MVREFS (1 + SPLITMV - NEARESTMV) -typedef enum -{ - B_DC_PRED, /* average of above and left pixels */ - B_TM_PRED, +typedef enum { + B_DC_PRED, /* average of above and left pixels */ + B_TM_PRED, - B_VE_PRED, /* vertical prediction */ - B_HE_PRED, /* horizontal prediction */ + B_VE_PRED, /* vertical prediction */ + B_HE_PRED, /* horizontal prediction */ - B_LD_PRED, - B_RD_PRED, + B_LD_PRED, + B_RD_PRED, - B_VR_PRED, - B_VL_PRED, - B_HD_PRED, - B_HU_PRED, + B_VR_PRED, + B_VL_PRED, + B_HD_PRED, + B_HU_PRED, - LEFT4X4, - ABOVE4X4, - ZERO4X4, - NEW4X4, + LEFT4X4, + ABOVE4X4, + ZERO4X4, + NEW4X4, - B_MODE_COUNT + B_MODE_COUNT } B_PREDICTION_MODE; #define VP8_BINTRAMODES (B_HU_PRED + 1) /* 10 */ @@ -167,196 +160,190 @@ typedef enum modes for the Y blocks to the left and above us; for interframes, there is a single probability table. */ -union b_mode_info -{ - struct { - B_PREDICTION_MODE first; +union b_mode_info { + struct { + B_PREDICTION_MODE first; #if CONFIG_COMP_INTRA_PRED - B_PREDICTION_MODE second; + B_PREDICTION_MODE second; #endif - } as_mode; - struct { - int_mv first; - int_mv second; - } as_mv; + } as_mode; + struct { + int_mv first; + int_mv second; + } as_mv; }; -typedef enum -{ - INTRA_FRAME = 0, - LAST_FRAME = 1, - GOLDEN_FRAME = 2, - ALTREF_FRAME = 3, - MAX_REF_FRAMES = 4 +typedef enum { + INTRA_FRAME = 0, + LAST_FRAME = 1, + GOLDEN_FRAME = 2, + ALTREF_FRAME = 3, + MAX_REF_FRAMES = 4 } MV_REFERENCE_FRAME; -typedef struct -{ - MB_PREDICTION_MODE mode, uv_mode; +typedef struct { + MB_PREDICTION_MODE mode, uv_mode; #if CONFIG_COMP_INTRA_PRED - MB_PREDICTION_MODE second_mode, second_uv_mode; + MB_PREDICTION_MODE second_mode, second_uv_mode; #endif - MV_REFERENCE_FRAME ref_frame, second_ref_frame; - TX_SIZE txfm_size; - int_mv mv, second_mv; - unsigned char partitioning; - unsigned char mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */ - unsigned char need_to_clamp_mvs; - unsigned char need_to_clamp_secondmv; - unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */ - - // Flags used for prediction status of various bistream signals - unsigned char seg_id_predicted; - unsigned char ref_predicted; - - // Indicates if the mb is part of the image (1) vs border (0) - // This can be useful in determining whether the MB provides - // a valid predictor - unsigned char mb_in_image; + MV_REFERENCE_FRAME ref_frame, second_ref_frame; + TX_SIZE txfm_size; + int_mv mv, second_mv; + unsigned char partitioning; + unsigned char mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */ + unsigned char need_to_clamp_mvs; + unsigned char need_to_clamp_secondmv; + unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */ + + // Flags used for prediction status of various bistream signals + unsigned char seg_id_predicted; + unsigned char ref_predicted; + + // Indicates if the mb is part of the image (1) vs border (0) + // This can be useful in determining whether the MB provides + // a valid predictor + unsigned char mb_in_image; #if CONFIG_PRED_FILTER - // Flag to turn prediction signal filter on(1)/off(0 ) at the MB level - unsigned int pred_filter_enabled; + // Flag to turn prediction signal filter on(1)/off(0 ) at the MB level + unsigned int pred_filter_enabled; #endif } MB_MODE_INFO; -typedef struct -{ - MB_MODE_INFO mbmi; - union b_mode_info bmi[16]; +typedef struct { + MB_MODE_INFO mbmi; + union b_mode_info bmi[16]; } MODE_INFO; -typedef struct -{ - short *qcoeff; - short *dqcoeff; - unsigned char *predictor; - short *diff; - short *dequant; +typedef struct { + short *qcoeff; + short *dqcoeff; + unsigned char *predictor; + short *diff; + short *dequant; - /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ - unsigned char **base_pre; - unsigned char **base_second_pre; - int pre; - int pre_stride; + /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ + unsigned char **base_pre; + unsigned char **base_second_pre; + int pre; + int pre_stride; - unsigned char **base_dst; - int dst; - int dst_stride; + unsigned char **base_dst; + int dst; + int dst_stride; - int eob; + int eob; - union b_mode_info bmi; + union b_mode_info bmi; } BLOCKD; -typedef struct MacroBlockD -{ - DECLARE_ALIGNED(16, short, diff[400]); /* from idct diff */ - DECLARE_ALIGNED(16, unsigned char, predictor[384]); - DECLARE_ALIGNED(16, short, qcoeff[400]); - DECLARE_ALIGNED(16, short, dqcoeff[400]); - DECLARE_ALIGNED(16, char, eobs[25]); +typedef struct MacroBlockD { + DECLARE_ALIGNED(16, short, diff[400]); /* from idct diff */ + DECLARE_ALIGNED(16, unsigned char, predictor[384]); + DECLARE_ALIGNED(16, short, qcoeff[400]); + DECLARE_ALIGNED(16, short, dqcoeff[400]); + DECLARE_ALIGNED(16, char, eobs[25]); - /* 16 Y blocks, 4 U, 4 V, 1 DC 2nd order block, each with 16 entries. */ - BLOCKD block[25]; - int fullpixel_mask; + /* 16 Y blocks, 4 U, 4 V, 1 DC 2nd order block, each with 16 entries. */ + BLOCKD block[25]; + int fullpixel_mask; - YV12_BUFFER_CONFIG pre; /* Filtered copy of previous frame reconstruction */ - struct { - uint8_t *y_buffer, *u_buffer, *v_buffer; - } second_pre; - YV12_BUFFER_CONFIG dst; + YV12_BUFFER_CONFIG pre; /* Filtered copy of previous frame reconstruction */ + struct { + uint8_t *y_buffer, *u_buffer, *v_buffer; + } second_pre; + YV12_BUFFER_CONFIG dst; - MODE_INFO *prev_mode_info_context; - MODE_INFO *mode_info_context; - int mode_info_stride; + MODE_INFO *prev_mode_info_context; + MODE_INFO *mode_info_context; + int mode_info_stride; - FRAME_TYPE frame_type; + FRAME_TYPE frame_type; - int up_available; - int left_available; + int up_available; + int left_available; - /* Y,U,V,Y2 */ - ENTROPY_CONTEXT_PLANES *above_context; - ENTROPY_CONTEXT_PLANES *left_context; + /* Y,U,V,Y2 */ + ENTROPY_CONTEXT_PLANES *above_context; + ENTROPY_CONTEXT_PLANES *left_context; - /* 0 indicates segmentation at MB level is not enabled. Otherwise the individual bits indicate which features are active. */ - unsigned char segmentation_enabled; + /* 0 indicates segmentation at MB level is not enabled. Otherwise the individual bits indicate which features are active. */ + unsigned char segmentation_enabled; - /* 0 (do not update) 1 (update) the macroblock segmentation map. */ - unsigned char update_mb_segmentation_map; + /* 0 (do not update) 1 (update) the macroblock segmentation map. */ + unsigned char update_mb_segmentation_map; - /* 0 (do not update) 1 (update) the macroblock segmentation feature data. */ - unsigned char update_mb_segmentation_data; + /* 0 (do not update) 1 (update) the macroblock segmentation feature data. */ + unsigned char update_mb_segmentation_data; - /* 0 (do not update) 1 (update) the macroblock segmentation feature data. */ - unsigned char mb_segment_abs_delta; + /* 0 (do not update) 1 (update) the macroblock segmentation feature data. */ + unsigned char mb_segment_abs_delta; - /* Per frame flags that define which MB level features (such as quantizer or loop filter level) */ - /* are enabled and when enabled the proabilities used to decode the per MB flags in MB_MODE_INFO */ + /* Per frame flags that define which MB level features (such as quantizer or loop filter level) */ + /* are enabled and when enabled the proabilities used to decode the per MB flags in MB_MODE_INFO */ - // Probability Tree used to code Segment number - vp8_prob mb_segment_tree_probs[MB_FEATURE_TREE_PROBS]; + // Probability Tree used to code Segment number + vp8_prob mb_segment_tree_probs[MB_FEATURE_TREE_PROBS]; - // Segment features - signed char segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX]; - unsigned int segment_feature_mask[MAX_MB_SEGMENTS]; + // Segment features + signed char segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX]; + unsigned int segment_feature_mask[MAX_MB_SEGMENTS]; #if CONFIG_FEATUREUPDATES - // keep around the last set so we can figure out what updates... - unsigned int old_segment_feature_mask[MAX_MB_SEGMENTS]; - signed char old_segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX]; + // keep around the last set so we can figure out what updates... + unsigned int old_segment_feature_mask[MAX_MB_SEGMENTS]; + signed char old_segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX]; #endif - /* mode_based Loop filter adjustment */ - unsigned char mode_ref_lf_delta_enabled; - unsigned char mode_ref_lf_delta_update; - - /* Delta values have the range +/- MAX_LOOP_FILTER */ - signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS]; /* 0 = Intra, Last, GF, ARF */ - signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; /* 0 = Intra, Last, GF, ARF */ - signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS]; /* 0 = BPRED, ZERO_MV, MV, SPLIT */ - signed char mode_lf_deltas[MAX_MODE_LF_DELTAS]; /* 0 = BPRED, ZERO_MV, MV, SPLIT */ - - /* Distance of MB away from frame edges */ - int mb_to_left_edge; - int mb_to_right_edge; - int mb_to_top_edge; - int mb_to_bottom_edge; - - unsigned int frames_since_golden; - unsigned int frames_till_alt_ref_frame; - vp8_subpix_fn_t subpixel_predict; - vp8_subpix_fn_t subpixel_predict8x4; - vp8_subpix_fn_t subpixel_predict8x8; - vp8_subpix_fn_t subpixel_predict16x16; - vp8_subpix_fn_t subpixel_predict_avg; - vp8_subpix_fn_t subpixel_predict_avg8x4; - vp8_subpix_fn_t subpixel_predict_avg8x8; - vp8_subpix_fn_t subpixel_predict_avg16x16; + /* mode_based Loop filter adjustment */ + unsigned char mode_ref_lf_delta_enabled; + unsigned char mode_ref_lf_delta_update; + + /* Delta values have the range +/- MAX_LOOP_FILTER */ + signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS]; /* 0 = Intra, Last, GF, ARF */ + signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; /* 0 = Intra, Last, GF, ARF */ + signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS]; /* 0 = BPRED, ZERO_MV, MV, SPLIT */ + signed char mode_lf_deltas[MAX_MODE_LF_DELTAS]; /* 0 = BPRED, ZERO_MV, MV, SPLIT */ + + /* Distance of MB away from frame edges */ + int mb_to_left_edge; + int mb_to_right_edge; + int mb_to_top_edge; + int mb_to_bottom_edge; + + unsigned int frames_since_golden; + unsigned int frames_till_alt_ref_frame; + vp8_subpix_fn_t subpixel_predict; + vp8_subpix_fn_t subpixel_predict8x4; + vp8_subpix_fn_t subpixel_predict8x8; + vp8_subpix_fn_t subpixel_predict16x16; + vp8_subpix_fn_t subpixel_predict_avg; + vp8_subpix_fn_t subpixel_predict_avg8x4; + vp8_subpix_fn_t subpixel_predict_avg8x8; + vp8_subpix_fn_t subpixel_predict_avg16x16; #if CONFIG_HIGH_PRECISION_MV - int allow_high_precision_mv; + int allow_high_precision_mv; #endif /* CONFIG_HIGH_PRECISION_MV */ - void *current_bc; + void *current_bc; - int corrupted; + int corrupted; #if ARCH_X86 || ARCH_X86_64 - /* This is an intermediate buffer currently used in sub-pixel motion search - * to keep a copy of the reference area. This buffer can be used for other - * purpose. - */ - DECLARE_ALIGNED(32, unsigned char, y_buf[22*32]); + /* This is an intermediate buffer currently used in sub-pixel motion search + * to keep a copy of the reference area. This buffer can be used for other + * purpose. + */ + DECLARE_ALIGNED(32, unsigned char, y_buf[22 * 32]); #endif #if CONFIG_RUNTIME_CPU_DETECT - struct VP8_COMMON_RTCD *rtcd; + struct VP8_COMMON_RTCD *rtcd; #endif - int mb_index; // Index of the MB in the SB (0..3) + int mb_index; // Index of the MB in the SB (0..3) } MACROBLOCKD; @@ -364,20 +351,17 @@ typedef struct MacroBlockD extern void vp8_build_block_doffsets(MACROBLOCKD *x); extern void vp8_setup_block_dptrs(MACROBLOCKD *x); -static void update_blockd_bmi(MACROBLOCKD *xd) -{ - int i; - int is_4x4; - is_4x4 = (xd->mode_info_context->mbmi.mode == SPLITMV) || - (xd->mode_info_context->mbmi.mode == I8X8_PRED) || - (xd->mode_info_context->mbmi.mode == B_PRED); - - if (is_4x4) - { - for (i = 0; i < 16; i++) - { - xd->block[i].bmi = xd->mode_info_context->bmi[i]; - } +static void update_blockd_bmi(MACROBLOCKD *xd) { + int i; + int is_4x4; + is_4x4 = (xd->mode_info_context->mbmi.mode == SPLITMV) || + (xd->mode_info_context->mbmi.mode == I8X8_PRED) || + (xd->mode_info_context->mbmi.mode == B_PRED); + + if (is_4x4) { + for (i = 0; i < 16; i++) { + xd->block[i].bmi = xd->mode_info_context->bmi[i]; } + } } #endif /* __INC_BLOCKD_H */ |