| 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;
|
|
|