Index: source/libvpx/vp9/common/vp9_pred_common.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_pred_common.c (revision 240950) |
+++ source/libvpx/vp9/common/vp9_pred_common.c (working copy) |
@@ -25,50 +25,37 @@ |
} |
// Returns a context number for the given MB prediction signal |
-unsigned char vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
+int vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { |
// Note: |
// The mode info data structure has a one element border above and to the |
// left of the entries correpsonding to real macroblocks. |
// The prediction flags in these dummy entries are initialised to 0. |
- // left |
- const int left_mv_pred = left_in_image ? is_inter_block(&left_mi->mbmi) |
- : 0; |
- const int left_interp = left_in_image && left_mv_pred |
- ? left_mi->mbmi.interp_filter |
- : SWITCHABLE_FILTERS; |
+ const MODE_INFO *const left_mi = get_left_mi(xd); |
+ const int has_left = left_mi != NULL ? is_inter_block(&left_mi->mbmi) : 0; |
+ const int left_type = has_left ? left_mi->mbmi.interp_filter |
+ : SWITCHABLE_FILTERS; |
- // above |
- const int above_mv_pred = above_in_image ? is_inter_block(&above_mi->mbmi) |
- : 0; |
- const int above_interp = above_in_image && above_mv_pred |
- ? above_mi->mbmi.interp_filter |
- : SWITCHABLE_FILTERS; |
- |
- if (left_interp == above_interp) |
- return left_interp; |
- else if (left_interp == SWITCHABLE_FILTERS && |
- above_interp != SWITCHABLE_FILTERS) |
- return above_interp; |
- else if (left_interp != SWITCHABLE_FILTERS && |
- above_interp == SWITCHABLE_FILTERS) |
- return left_interp; |
+ const MODE_INFO *const above_mi = get_above_mi(xd); |
+ const int has_above = above_mi != NULL ? is_inter_block(&above_mi->mbmi) : 0; |
+ const int above_type = has_above ? above_mi->mbmi.interp_filter |
+ : SWITCHABLE_FILTERS; |
+ if (left_type == above_type) |
+ return left_type; |
+ else if (left_type == SWITCHABLE_FILTERS && above_type != SWITCHABLE_FILTERS) |
+ return above_type; |
+ else if (left_type != SWITCHABLE_FILTERS && above_type == SWITCHABLE_FILTERS) |
+ return left_type; |
else |
return SWITCHABLE_FILTERS; |
} |
// Returns a context number for the given MB prediction signal |
-unsigned char vp9_get_pred_context_intra_inter(const MACROBLOCKD *xd) { |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const MB_MODE_INFO *const above_mbmi = get_above_mbmi(above_mi); |
- const MB_MODE_INFO *const left_mbmi = get_left_mbmi(left_mi); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
- const int above_intra = above_in_image ? !is_inter_block(above_mbmi) : 1; |
- const int left_intra = left_in_image ? !is_inter_block(left_mbmi) : 1; |
+int vp9_get_intra_inter_context(const MACROBLOCKD *xd) { |
+ const MB_MODE_INFO *const above_mbmi = get_above_mbmi(get_above_mi(xd)); |
+ const MB_MODE_INFO *const left_mbmi = get_left_mbmi(get_left_mi(xd)); |
+ const int has_above = above_mbmi != NULL; |
+ const int has_left = left_mbmi != NULL; |
+ const int above_intra = has_above ? !is_inter_block(above_mbmi) : 1; |
+ const int left_intra = has_left ? !is_inter_block(left_mbmi) : 1; |
// The mode info data structure has a one element border above and to the |
// left of the entries corresponding to real macroblocks. |
@@ -77,62 +64,60 @@ |
// 1 - intra/inter, inter/intra |
// 2 - intra/--, --/intra |
// 3 - intra/intra |
- if (above_in_image && left_in_image) // both edges available |
+ if (has_above && has_left) // both edges available |
return left_intra && above_intra ? 3 |
: left_intra || above_intra; |
- else if (above_in_image || left_in_image) // one edge available |
- return 2 * (above_in_image ? above_intra : left_intra); |
+ else if (has_above || has_left) // one edge available |
+ return 2 * (has_above ? above_intra : left_intra); |
else |
return 0; |
} |
-// Returns a context number for the given MB prediction signal |
-unsigned char vp9_get_pred_context_comp_inter_inter(const VP9_COMMON *cm, |
- const MACROBLOCKD *xd) { |
- int pred_context; |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const MB_MODE_INFO *const above_mbmi = get_above_mbmi(above_mi); |
- const MB_MODE_INFO *const left_mbmi = get_left_mbmi(left_mi); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
+ |
+int vp9_get_reference_mode_context(const VP9_COMMON *cm, |
+ const MACROBLOCKD *xd) { |
+ int ctx; |
+ const MB_MODE_INFO *const above_mbmi = get_above_mbmi(get_above_mi(xd)); |
+ const MB_MODE_INFO *const left_mbmi = get_left_mbmi(get_left_mi(xd)); |
+ const int has_above = above_mbmi != NULL; |
+ const int has_left = left_mbmi != NULL; |
// Note: |
// The mode info data structure has a one element border above and to the |
// left of the entries correpsonding to real macroblocks. |
// The prediction flags in these dummy entries are initialised to 0. |
- if (above_in_image && left_in_image) { // both edges available |
+ if (has_above && has_left) { // both edges available |
if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) |
// neither edge uses comp pred (0/1) |
- pred_context = (above_mbmi->ref_frame[0] == cm->comp_fixed_ref) ^ |
- (left_mbmi->ref_frame[0] == cm->comp_fixed_ref); |
+ ctx = (above_mbmi->ref_frame[0] == cm->comp_fixed_ref) ^ |
+ (left_mbmi->ref_frame[0] == cm->comp_fixed_ref); |
else if (!has_second_ref(above_mbmi)) |
// one of two edges uses comp pred (2/3) |
- pred_context = 2 + (above_mbmi->ref_frame[0] == cm->comp_fixed_ref || |
- !is_inter_block(above_mbmi)); |
+ ctx = 2 + (above_mbmi->ref_frame[0] == cm->comp_fixed_ref || |
+ !is_inter_block(above_mbmi)); |
else if (!has_second_ref(left_mbmi)) |
// one of two edges uses comp pred (2/3) |
- pred_context = 2 + (left_mbmi->ref_frame[0] == cm->comp_fixed_ref || |
- !is_inter_block(left_mbmi)); |
+ ctx = 2 + (left_mbmi->ref_frame[0] == cm->comp_fixed_ref || |
+ !is_inter_block(left_mbmi)); |
else // both edges use comp pred (4) |
- pred_context = 4; |
- } else if (above_in_image || left_in_image) { // one edge available |
- const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; |
+ ctx = 4; |
+ } else if (has_above || has_left) { // one edge available |
+ const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
if (!has_second_ref(edge_mbmi)) |
// edge does not use comp pred (0/1) |
- pred_context = edge_mbmi->ref_frame[0] == cm->comp_fixed_ref; |
+ ctx = edge_mbmi->ref_frame[0] == cm->comp_fixed_ref; |
else |
// edge uses comp pred (3) |
- pred_context = 3; |
+ ctx = 3; |
} else { // no edges available (1) |
- pred_context = 1; |
+ ctx = 1; |
} |
- assert(pred_context >= 0 && pred_context < COMP_INTER_CONTEXTS); |
- return pred_context; |
+ assert(ctx >= 0 && ctx < COMP_INTER_CONTEXTS); |
+ return ctx; |
} |
// Returns a context number for the given MB prediction signal |
-unsigned char vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm, |
- const MACROBLOCKD *xd) { |
+int vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm, |
+ const MACROBLOCKD *xd) { |
int pred_context; |
const MODE_INFO *const above_mi = get_above_mi(xd); |
const MODE_INFO *const left_mi = get_left_mi(xd); |
@@ -212,21 +197,20 @@ |
return pred_context; |
} |
-unsigned char vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) { |
+ |
+int vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) { |
int pred_context; |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const MB_MODE_INFO *const above_mbmi = get_above_mbmi(above_mi); |
- const MB_MODE_INFO *const left_mbmi = get_left_mbmi(left_mi); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
- const int above_intra = above_in_image ? !is_inter_block(above_mbmi) : 1; |
- const int left_intra = left_in_image ? !is_inter_block(left_mbmi) : 1; |
+ const MB_MODE_INFO *const above_mbmi = get_above_mbmi(get_above_mi(xd)); |
+ const MB_MODE_INFO *const left_mbmi = get_left_mbmi(get_left_mi(xd)); |
+ const int has_above = above_mbmi != NULL; |
+ const int has_left = left_mbmi != NULL; |
+ const int above_intra = has_above ? !is_inter_block(above_mbmi) : 1; |
+ const int left_intra = has_left ? !is_inter_block(left_mbmi) : 1; |
// Note: |
// The mode info data structure has a one element border above and to the |
// left of the entries correpsonding to real macroblocks. |
// The prediction flags in these dummy entries are initialised to 0. |
- if (above_in_image && left_in_image) { // both edges available |
+ if (has_above && has_left) { // both edges available |
if (above_intra && left_intra) { // intra/intra |
pred_context = 2; |
} else if (above_intra || left_intra) { // intra/inter or inter/intra |
@@ -259,8 +243,8 @@ |
pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME; |
} |
} |
- } else if (above_in_image || left_in_image) { // one edge available |
- const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; |
+ } else if (has_above || has_left) { // one edge available |
+ const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
if (!is_inter_block(edge_mbmi)) { // intra |
pred_context = 2; |
} else { // inter |
@@ -278,22 +262,20 @@ |
return pred_context; |
} |
-unsigned char vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) { |
+int vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) { |
int pred_context; |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const MB_MODE_INFO *const above_mbmi = get_above_mbmi(above_mi); |
- const MB_MODE_INFO *const left_mbmi = get_left_mbmi(left_mi); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
- const int above_intra = above_in_image ? !is_inter_block(above_mbmi) : 1; |
- const int left_intra = left_in_image ? !is_inter_block(left_mbmi) : 1; |
+ const MB_MODE_INFO *const above_mbmi = get_above_mbmi(get_above_mi(xd)); |
+ const MB_MODE_INFO *const left_mbmi = get_left_mbmi(get_left_mi(xd)); |
+ const int has_above = above_mbmi != NULL; |
+ const int has_left = left_mbmi != NULL; |
+ const int above_intra = has_above ? !is_inter_block(above_mbmi) : 1; |
+ const int left_intra = has_left ? !is_inter_block(left_mbmi) : 1; |
// Note: |
// The mode info data structure has a one element border above and to the |
// left of the entries correpsonding to real macroblocks. |
// The prediction flags in these dummy entries are initialised to 0. |
- if (above_in_image && left_in_image) { // both edges available |
+ if (has_above && has_left) { // both edges available |
if (above_intra && left_intra) { // intra/intra |
pred_context = 2; |
} else if (above_intra || left_intra) { // intra/inter or inter/intra |
@@ -347,8 +329,8 @@ |
pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME); |
} |
} |
- } else if (above_in_image || left_in_image) { // one edge available |
- const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; |
+ } else if (has_above || has_left) { // one edge available |
+ const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
if (!is_inter_block(edge_mbmi) || |
(edge_mbmi->ref_frame[0] == LAST_FRAME && !has_second_ref(edge_mbmi))) |
@@ -368,43 +350,30 @@ |
// The mode info data structure has a one element border above and to the |
// left of the entries corresponding to real blocks. |
// The prediction flags in these dummy entries are initialized to 0. |
-unsigned char vp9_get_pred_context_tx_size(const MACROBLOCKD *xd) { |
- const MODE_INFO *const above_mi = get_above_mi(xd); |
- const MODE_INFO *const left_mi = get_left_mi(xd); |
- const MB_MODE_INFO *const above_mbmi = get_above_mbmi(above_mi); |
- const MB_MODE_INFO *const left_mbmi = get_left_mbmi(left_mi); |
- const int above_in_image = above_mi != NULL; |
- const int left_in_image = left_mi != NULL; |
+int vp9_get_tx_size_context(const MACROBLOCKD *xd) { |
const int max_tx_size = max_txsize_lookup[xd->mi_8x8[0]->mbmi.sb_type]; |
- int above_context = max_tx_size; |
- int left_context = max_tx_size; |
+ const MB_MODE_INFO *const above_mbmi = get_above_mbmi(get_above_mi(xd)); |
+ const MB_MODE_INFO *const left_mbmi = get_left_mbmi(get_left_mi(xd)); |
+ const int has_above = above_mbmi != NULL; |
+ const int has_left = left_mbmi != NULL; |
+ int above_ctx = (has_above && !above_mbmi->skip_coeff) ? above_mbmi->tx_size |
+ : max_tx_size; |
+ int left_ctx = (has_left && !left_mbmi->skip_coeff) ? left_mbmi->tx_size |
+ : max_tx_size; |
+ if (!has_left) |
+ left_ctx = above_ctx; |
- if (above_in_image) |
- above_context = above_mbmi->skip_coeff ? max_tx_size |
- : above_mbmi->tx_size; |
+ if (!has_above) |
+ above_ctx = left_ctx; |
- if (left_in_image) |
- left_context = left_mbmi->skip_coeff ? max_tx_size |
- : left_mbmi->tx_size; |
- |
- if (!left_in_image) |
- left_context = above_context; |
- |
- if (!above_in_image) |
- above_context = left_context; |
- |
- return above_context + left_context > max_tx_size; |
+ return (above_ctx + left_ctx) > max_tx_size; |
} |
-void vp9_set_pred_flag_seg_id(MACROBLOCKD *xd, uint8_t pred_flag) { |
- xd->mi_8x8[0]->mbmi.seg_id_predicted = pred_flag; |
-} |
- |
int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids, |
BLOCK_SIZE bsize, int mi_row, int mi_col) { |
const int mi_offset = mi_row * cm->mi_cols + mi_col; |
- const int bw = 1 << mi_width_log2(bsize); |
- const int bh = 1 << mi_height_log2(bsize); |
+ const int bw = num_8x8_blocks_wide_lookup[bsize]; |
+ const int bh = num_8x8_blocks_high_lookup[bsize]; |
const int xmis = MIN(cm->mi_cols - mi_col, bw); |
const int ymis = MIN(cm->mi_rows - mi_row, bh); |
int x, y, segment_id = INT_MAX; |