summaryrefslogtreecommitdiff
path: root/vp9/common
diff options
context:
space:
mode:
authorJim Bankoski <jimbankoski@google.com>2013-07-09 19:55:07 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-07-09 20:10:16 -0700
commitfb027a765800b4f725181ef03442346bfaaf78ce (patch)
tree56ff02d4ae50a60f3ef04b52de9413ac833515ff /vp9/common
parent059f2929e9aa8a46e7eadb4fa35eb56c1fc8393e (diff)
downloadlibvpx-fb027a765800b4f725181ef03442346bfaaf78ce.tar
libvpx-fb027a765800b4f725181ef03442346bfaaf78ce.tar.gz
libvpx-fb027a765800b4f725181ef03442346bfaaf78ce.tar.bz2
libvpx-fb027a765800b4f725181ef03442346bfaaf78ce.zip
removing case statements around prediction entropy coding
Removes SEG_ID Removes MBSKIP Removes SWITCHABLE_INTERP Removes INTRA_INTER Removes COMP_INTER_INTER Removes COMP_REF_P Removes SINGLE_REF_P1 Removes SINGLE_REF_P2 Removes TX_SIZE Change-Id: Ie4520ae1f65c8cac312432c0616cc80dea5bf34b
Diffstat (limited to 'vp9/common')
-rw-r--r--vp9/common/vp9_pred_common.c799
-rw-r--r--vp9/common/vp9_pred_common.h145
2 files changed, 513 insertions, 431 deletions
diff --git a/vp9/common/vp9_pred_common.c b/vp9/common/vp9_pred_common.c
index e7c91200d..9517cfe77 100644
--- a/vp9/common/vp9_pred_common.c
+++ b/vp9/common/vp9_pred_common.c
@@ -16,11 +16,67 @@
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_treecoder.h"
-// TBD prediction functions for various bitstream signals
+void vp9_set_pred_flag_seg_id(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
+ unsigned char pred_flag) {
+ const int mis = xd->mode_info_stride;
+ const int bh = 1 << mi_height_log2(bsize);
+ const int bw = 1 << mi_width_log2(bsize);
+#define sub(a, b) (b) < 0 ? (a) + (b) : (a)
+ const int x_mis = sub(bw, xd->mb_to_right_edge >> (3 + LOG2_MI_SIZE));
+ const int y_mis = sub(bh, xd->mb_to_bottom_edge >> (3 + LOG2_MI_SIZE));
+#undef sub
+ int x, y;
+
+ for (y = 0; y < y_mis; y++)
+ for (x = 0; x < x_mis; x++)
+ xd->mode_info_context[y * mis + x].mbmi.seg_id_predicted = pred_flag;
+}
+// Returns a context number for the given MB prediction signal
+unsigned char vp9_get_pred_context_switchable_interp(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO * const mi = xd->mode_info_context;
+ const MODE_INFO * const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO * const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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 = is_inter_mode(left_mi->mbmi.mode);
+ const int left_interp =
+ left_in_image && left_mv_pred ?
+ vp9_switchable_interp_map[left_mi->mbmi.interp_filter] :
+ VP9_SWITCHABLE_FILTERS;
+
+ // above
+ const int above_mv_pred = is_inter_mode(above_mi->mbmi.mode);
+ const int above_interp =
+ above_in_image && above_mv_pred ?
+ vp9_switchable_interp_map[above_mi->mbmi.interp_filter] :
+ VP9_SWITCHABLE_FILTERS;
+
+ assert(left_interp != -1);
+ assert(above_interp != -1);
+
+ if (left_interp == above_interp)
+ pred_context = left_interp;
+ else if (left_interp == VP9_SWITCHABLE_FILTERS
+ && above_interp != VP9_SWITCHABLE_FILTERS)
+ pred_context = above_interp;
+ else if (left_interp != VP9_SWITCHABLE_FILTERS
+ && above_interp == VP9_SWITCHABLE_FILTERS)
+ pred_context = left_interp;
+ else
+ pred_context = VP9_SWITCHABLE_FILTERS;
+ return pred_context;
+}
// Returns a context number for the given MB prediction signal
-unsigned char vp9_get_pred_context(const VP9_COMMON *cm, const MACROBLOCKD *xd,
- PRED_ID pred_id) {
+unsigned char vp9_get_pred_context_intra_inter(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
int pred_context;
const MODE_INFO *const mi = xd->mode_info_context;
const MODE_INFO *const above_mi = mi - cm->mode_info_stride;
@@ -31,431 +87,381 @@ unsigned char vp9_get_pred_context(const VP9_COMMON *cm, const MACROBLOCKD *xd,
// 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.
- switch (pred_id) {
- case PRED_SEG_ID:
- pred_context = above_mi->mbmi.seg_id_predicted;
- if (xd->left_available)
- pred_context += left_mi->mbmi.seg_id_predicted;
- break;
-
- case PRED_MBSKIP:
- pred_context = above_mi->mbmi.mb_skip_coeff;
- if (xd->left_available)
- pred_context += left_mi->mbmi.mb_skip_coeff;
- break;
-
- case PRED_SWITCHABLE_INTERP: {
- // left
- const int left_mv_pred = is_inter_mode(left_mi->mbmi.mode);
- const int left_interp = left_in_image && left_mv_pred ?
- vp9_switchable_interp_map[left_mi->mbmi.interp_filter] :
- VP9_SWITCHABLE_FILTERS;
-
- // above
- const int above_mv_pred = is_inter_mode(above_mi->mbmi.mode);
- const int above_interp = above_in_image && above_mv_pred ?
- vp9_switchable_interp_map[above_mi->mbmi.interp_filter] :
- VP9_SWITCHABLE_FILTERS;
-
- assert(left_interp != -1);
- assert(above_interp != -1);
-
- if (left_interp == above_interp)
- pred_context = left_interp;
- else if (left_interp == VP9_SWITCHABLE_FILTERS &&
- above_interp != VP9_SWITCHABLE_FILTERS)
- pred_context = above_interp;
- else if (left_interp != VP9_SWITCHABLE_FILTERS &&
- above_interp == VP9_SWITCHABLE_FILTERS)
- pred_context = left_interp;
- else
- pred_context = VP9_SWITCHABLE_FILTERS;
-
- break;
+ if (above_in_image && left_in_image) { // both edges available
+ if (left_mi->mbmi.ref_frame[0] == INTRA_FRAME &&
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/intra (3)
+ pred_context = 3;
+ } else { // intra/inter (1) or inter/inter (0)
+ pred_context = left_mi->mbmi.ref_frame[0] == INTRA_FRAME ||
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME;
}
+ } else if (above_in_image || left_in_image) { // one edge available
+ const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
- case PRED_INTRA_INTER: {
- if (above_in_image && left_in_image) { // both edges available
- if (left_mi->mbmi.ref_frame[0] == INTRA_FRAME &&
- above_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/intra (3)
- pred_context = 3;
- } else { // intra/inter (1) or inter/inter (0)
- pred_context = left_mi->mbmi.ref_frame[0] == INTRA_FRAME ||
- above_mi->mbmi.ref_frame[0] == INTRA_FRAME;
- }
- } else if (above_in_image || left_in_image) { // one edge available
- const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+ // inter: 0, intra: 2
+ pred_context = 2 * (edge->mbmi.ref_frame[0] == INTRA_FRAME);
+ } else {
+ pred_context = 0;
+ }
+ assert(pred_context >= 0 && pred_context < INTRA_INTER_CONTEXTS);
+ return pred_context;
+}
+// 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 mi = xd->mode_info_context;
+ const MODE_INFO *const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO *const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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 (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME &&
+ left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ // neither edge uses comp pred (0/1)
+ pred_context = ((above_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref) ^
+ (left_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref));
+ } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ // one of two edges uses comp pred (2/3)
+ pred_context = 2 +
+ (above_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref ||
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME);
+ } else if (left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ // one of two edges uses comp pred (2/3)
+ pred_context = 2 +
+ (left_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref ||
+ left_mi->mbmi.ref_frame[0] == INTRA_FRAME);
+ } else { // both edges use comp pred (4)
+ pred_context = 4;
+ }
+ } else if (above_in_image || left_in_image) { // one edge available
+ const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+
+ if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ // edge does not use comp pred (0/1)
+ pred_context = edge->mbmi.ref_frame[0] == cm->comp_fixed_ref;
+ } else { // edge uses comp pred (3)
+ pred_context = 3;
+ }
+ } else { // no edges available (1)
+ pred_context = 1;
+ }
+ assert(pred_context >= 0 && pred_context < COMP_INTER_CONTEXTS);
+ return pred_context;
+}
- // inter: 0, intra: 2
- pred_context = 2 * (edge->mbmi.ref_frame[0] == INTRA_FRAME);
- } else {
- pred_context = 0;
+// 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 pred_context;
+ const MODE_INFO *const mi = xd->mode_info_context;
+ const MODE_INFO *const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO *const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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.
+ const int fix_ref_idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
+ const int var_ref_idx = !fix_ref_idx;
+
+ if (above_in_image && left_in_image) { // both edges available
+ if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ && left_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/intra (2)
+ pred_context = 2;
+ } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ || left_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/inter
+ const MODE_INFO *edge =
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME ? left_mi : above_mi;
+
+ if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) { // single pred (1/3)
+ pred_context = 1 + 2 * edge->mbmi.ref_frame[0] != cm->comp_var_ref[1];
+ } else { // comp pred (1/3)
+ pred_context = 1 + 2 * edge->mbmi.ref_frame[var_ref_idx]
+ != cm->comp_var_ref[1];
}
- assert(pred_context >= 0 && pred_context < INTRA_INTER_CONTEXTS);
- break;
- }
+ } else { // inter/inter
+ int l_sg = left_mi->mbmi.ref_frame[1] <= INTRA_FRAME;
+ int a_sg = above_mi->mbmi.ref_frame[1] <= INTRA_FRAME;
+ MV_REFERENCE_FRAME vrfa =
+ a_sg ?
+ above_mi->mbmi.ref_frame[0] :
+ above_mi->mbmi.ref_frame[var_ref_idx];
+ MV_REFERENCE_FRAME vrfl =
+ l_sg ?
+ left_mi->mbmi.ref_frame[0] : left_mi->mbmi.ref_frame[var_ref_idx];
- case PRED_COMP_INTER_INTER: {
- if (above_in_image && left_in_image) { // both edges available
- if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME &&
- left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
- // neither edge uses comp pred (0/1)
- pred_context = ((above_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref) ^
- (left_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref));
- } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
- // one of two edges uses comp pred (2/3)
- pred_context = 2 +
- (above_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref ||
- above_mi->mbmi.ref_frame[0] == INTRA_FRAME);
- } else if (left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
- // one of two edges uses comp pred (2/3)
- pred_context = 2 +
- (left_mi->mbmi.ref_frame[0] == cm->comp_fixed_ref ||
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME);
- } else { // both edges use comp pred (4)
+ if (vrfa == vrfl && cm->comp_var_ref[1] == vrfa) {
+ pred_context = 0;
+ } else if (l_sg && a_sg) { // single/single
+ if ((vrfa == cm->comp_fixed_ref && vrfl == cm->comp_var_ref[0])
+ || (vrfl == cm->comp_fixed_ref && vrfa == cm->comp_var_ref[0])) {
pred_context = 4;
- }
- } else if (above_in_image || left_in_image) { // one edge available
- const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
-
- if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
- // edge does not use comp pred (0/1)
- pred_context = edge->mbmi.ref_frame[0] == cm->comp_fixed_ref;
- } else { // edge uses comp pred (3)
+ } else if (vrfa == vrfl) {
pred_context = 3;
+ } else {
+ pred_context = 1;
}
- } else { // no edges available (1)
- pred_context = 1;
- }
- assert(pred_context >= 0 && pred_context < COMP_INTER_CONTEXTS);
- break;
- }
-
- case PRED_COMP_REF_P: {
- const int fix_ref_idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
- const int var_ref_idx = !fix_ref_idx;
-
- if (above_in_image && left_in_image) { // both edges available
- if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME &&
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/intra (2)
- pred_context = 2;
- } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME ||
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) { // intra/inter
- const MODE_INFO *edge = above_mi->mbmi.ref_frame[0] == INTRA_FRAME ?
- left_mi : above_mi;
-
- if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) { // single pred (1/3)
- pred_context = 1 +
- 2 * edge->mbmi.ref_frame[0] != cm->comp_var_ref[1];
- } else { // comp pred (1/3)
- pred_context = 1 +
- 2 * edge->mbmi.ref_frame[var_ref_idx] != cm->comp_var_ref[1];
- }
- } else { // inter/inter
- int l_sg = left_mi->mbmi.ref_frame[1] <= INTRA_FRAME;
- int a_sg = above_mi->mbmi.ref_frame[1] <= INTRA_FRAME;
- MV_REFERENCE_FRAME vrfa = a_sg ? above_mi->mbmi.ref_frame[0] :
- above_mi->mbmi.ref_frame[var_ref_idx];
- MV_REFERENCE_FRAME vrfl = l_sg ? left_mi->mbmi.ref_frame[0] :
- left_mi->mbmi.ref_frame[var_ref_idx];
-
- if (vrfa == vrfl && cm->comp_var_ref[1] == vrfa) {
- pred_context = 0;
- } else if (l_sg && a_sg) { // single/single
- if ((vrfa == cm->comp_fixed_ref && vrfl == cm->comp_var_ref[0]) ||
- (vrfl == cm->comp_fixed_ref && vrfa == cm->comp_var_ref[0])) {
- pred_context = 4;
- } else if (vrfa == vrfl) {
- pred_context = 3;
- } else {
- pred_context = 1;
- }
- } else if (l_sg || a_sg) { // single/comp
- MV_REFERENCE_FRAME vrfc = l_sg ? vrfa : vrfl;
- MV_REFERENCE_FRAME rfs = a_sg ? vrfa : vrfl;
-
- if (vrfc == cm->comp_var_ref[1] && rfs != cm->comp_var_ref[1]) {
- pred_context = 1;
- } else if (rfs == cm->comp_var_ref[1] &&
- vrfc != cm->comp_var_ref[1]) {
- pred_context = 2;
- } else {
- pred_context = 4;
- }
- } else if (vrfa == vrfl) { // comp/comp
- pred_context = 4;
- } else {
- pred_context = 2;
- }
- }
- } else if (above_in_image || left_in_image) { // one edge available
- const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+ } else if (l_sg || a_sg) { // single/comp
+ MV_REFERENCE_FRAME vrfc = l_sg ? vrfa : vrfl;
+ MV_REFERENCE_FRAME rfs = a_sg ? vrfa : vrfl;
- if (edge->mbmi.ref_frame[0] == INTRA_FRAME) {
+ if (vrfc == cm->comp_var_ref[1] && rfs != cm->comp_var_ref[1]) {
+ pred_context = 1;
+ } else if (rfs == cm->comp_var_ref[1] && vrfc != cm->comp_var_ref[1]) {
pred_context = 2;
- } else if (edge->mbmi.ref_frame[1] > INTRA_FRAME) {
- pred_context =
- 4 * edge->mbmi.ref_frame[var_ref_idx] != cm->comp_var_ref[1];
} else {
- pred_context = 3 * edge->mbmi.ref_frame[0] != cm->comp_var_ref[1];
+ pred_context = 4;
}
- } else { // no edges available (2)
+ } else if (vrfa == vrfl) { // comp/comp
+ pred_context = 4;
+ } else {
pred_context = 2;
}
- assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
- break;
}
+ } else if (above_in_image || left_in_image) { // one edge available
+ const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+
+ if (edge->mbmi.ref_frame[0] == INTRA_FRAME) {
+ pred_context = 2;
+ } else if (edge->mbmi.ref_frame[1] > INTRA_FRAME) {
+ pred_context = 4 * edge->mbmi.ref_frame[var_ref_idx]
+ != cm->comp_var_ref[1];
+ } else {
+ pred_context = 3 * edge->mbmi.ref_frame[0] != cm->comp_var_ref[1];
+ }
+ } else { // no edges available (2)
+ pred_context = 2;
+ }
+ assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
- case PRED_SINGLE_REF_P1: {
- if (above_in_image && left_in_image) { // both edges available
- if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME &&
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
- pred_context = 2;
- } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME ||
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
- const MODE_INFO *edge = above_mi->mbmi.ref_frame[0] == INTRA_FRAME ?
- left_mi : above_mi;
-
- if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
- pred_context = 4 * (edge->mbmi.ref_frame[0] == LAST_FRAME);
- } else {
- pred_context = 1 + (edge->mbmi.ref_frame[0] == LAST_FRAME ||
- edge->mbmi.ref_frame[1] == LAST_FRAME);
- }
- } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME &&
- left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
- pred_context = 2 * (above_mi->mbmi.ref_frame[0] == LAST_FRAME) +
- 2 * (left_mi->mbmi.ref_frame[0] == LAST_FRAME);
- } else if (above_mi->mbmi.ref_frame[1] > INTRA_FRAME &&
- left_mi->mbmi.ref_frame[1] > INTRA_FRAME) {
- pred_context = 1 + (above_mi->mbmi.ref_frame[0] == LAST_FRAME ||
- above_mi->mbmi.ref_frame[1] == LAST_FRAME ||
- left_mi->mbmi.ref_frame[0] == LAST_FRAME ||
- left_mi->mbmi.ref_frame[1] == LAST_FRAME);
- } else {
- MV_REFERENCE_FRAME rfs = above_mi->mbmi.ref_frame[1] <= INTRA_FRAME ?
+ return pred_context;
+}
+unsigned char vp9_get_pred_context_single_ref_p1(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO *const mi = xd->mode_info_context;
+ const MODE_INFO *const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO *const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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 (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ && left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
+ pred_context = 2;
+ } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ || left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
+ const MODE_INFO *edge =
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME ? left_mi : above_mi;
+
+ if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ pred_context = 4 * (edge->mbmi.ref_frame[0] == LAST_FRAME);
+ } else {
+ pred_context = 1
+ + (edge->mbmi.ref_frame[0] == LAST_FRAME
+ || edge->mbmi.ref_frame[1] == LAST_FRAME);
+ }
+ } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME
+ && left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ pred_context = 2 * (above_mi->mbmi.ref_frame[0] == LAST_FRAME)
+ + 2 * (left_mi->mbmi.ref_frame[0] == LAST_FRAME);
+ } else if (above_mi->mbmi.ref_frame[1] > INTRA_FRAME
+ && left_mi->mbmi.ref_frame[1] > INTRA_FRAME) {
+ pred_context = 1
+ + (above_mi->mbmi.ref_frame[0] == LAST_FRAME
+ || above_mi->mbmi.ref_frame[1] == LAST_FRAME
+ || left_mi->mbmi.ref_frame[0] == LAST_FRAME
+ || left_mi->mbmi.ref_frame[1] == LAST_FRAME);
+ } else {
+ MV_REFERENCE_FRAME rfs =
+ above_mi->mbmi.ref_frame[1] <= INTRA_FRAME ?
above_mi->mbmi.ref_frame[0] : left_mi->mbmi.ref_frame[0];
- MV_REFERENCE_FRAME crf1 = above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
+ MV_REFERENCE_FRAME crf1 =
+ above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
above_mi->mbmi.ref_frame[0] : left_mi->mbmi.ref_frame[0];
- MV_REFERENCE_FRAME crf2 = above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
+ MV_REFERENCE_FRAME crf2 =
+ above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
above_mi->mbmi.ref_frame[1] : left_mi->mbmi.ref_frame[1];
- if (rfs == LAST_FRAME) {
- pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME);
- } else {
- pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME;
- }
- }
- } else if (above_in_image || left_in_image) { // one edge available
- const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+ if (rfs == LAST_FRAME) {
+ pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME);
+ } else {
+ pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME;
+ }
+ }
+ } else if (above_in_image || left_in_image) { // one edge available
+ const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+
+ if (edge->mbmi.ref_frame[0] == INTRA_FRAME) {
+ pred_context = 2;
+ } else if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ pred_context = 4 * (edge->mbmi.ref_frame[0] == LAST_FRAME);
+ } else {
+ pred_context = 1
+ + (edge->mbmi.ref_frame[0] == LAST_FRAME
+ || edge->mbmi.ref_frame[1] == LAST_FRAME);
+ }
+ } else { // no edges available (2)
+ pred_context = 2;
+ }
+ assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
+ return pred_context;
+}
- if (edge->mbmi.ref_frame[0] == INTRA_FRAME) {
- pred_context = 2;
- } else if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
- pred_context = 4 * (edge->mbmi.ref_frame[0] == LAST_FRAME);
+unsigned char vp9_get_pred_context_single_ref_p2(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO *const mi = xd->mode_info_context;
+ const MODE_INFO *const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO *const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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 (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ && left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
+ pred_context = 2;
+ } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME
+ || left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
+ const MODE_INFO *edge =
+ above_mi->mbmi.ref_frame[0] == INTRA_FRAME ? left_mi : above_mi;
+
+ if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ if (edge->mbmi.ref_frame[0] == LAST_FRAME) {
+ pred_context = 3;
} else {
- pred_context = 1 + (edge->mbmi.ref_frame[0] == LAST_FRAME ||
- edge->mbmi.ref_frame[1] == LAST_FRAME);
+ pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
}
- } else { // no edges available (2)
+ } else {
+ pred_context = 1
+ + 2
+ * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME
+ || edge->mbmi.ref_frame[1] == GOLDEN_FRAME);
+ }
+ } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME
+ && left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ if (above_mi->mbmi.ref_frame[0] == LAST_FRAME
+ && left_mi->mbmi.ref_frame[0] == LAST_FRAME) {
+ pred_context = 3;
+ } else if (above_mi->mbmi.ref_frame[0] == LAST_FRAME
+ || left_mi->mbmi.ref_frame[0] == LAST_FRAME) {
+ const MODE_INFO *edge =
+ above_mi->mbmi.ref_frame[0] == LAST_FRAME ? left_mi : above_mi;
+
+ pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
+ } else {
+ pred_context = 2 * (above_mi->mbmi.ref_frame[0] == GOLDEN_FRAME)
+ + 2 * (left_mi->mbmi.ref_frame[0] == GOLDEN_FRAME);
+ }
+ } else if (above_mi->mbmi.ref_frame[1] > INTRA_FRAME
+ && left_mi->mbmi.ref_frame[1] > INTRA_FRAME) {
+ if (above_mi->mbmi.ref_frame[0] == left_mi->mbmi.ref_frame[0]
+ && above_mi->mbmi.ref_frame[1] == left_mi->mbmi.ref_frame[1]) {
+ pred_context = 3
+ * (above_mi->mbmi.ref_frame[0] == GOLDEN_FRAME
+ || above_mi->mbmi.ref_frame[1] == GOLDEN_FRAME
+ || left_mi->mbmi.ref_frame[0] == GOLDEN_FRAME
+ || left_mi->mbmi.ref_frame[1] == GOLDEN_FRAME);
+ } else {
pred_context = 2;
}
- assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
- break;
- }
-
- case PRED_SINGLE_REF_P2: {
- if (above_in_image && left_in_image) { // both edges available
- if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME &&
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
- pred_context = 2;
- } else if (above_mi->mbmi.ref_frame[0] == INTRA_FRAME ||
- left_mi->mbmi.ref_frame[0] == INTRA_FRAME) {
- const MODE_INFO *edge = above_mi->mbmi.ref_frame[0] == INTRA_FRAME ?
- left_mi : above_mi;
-
- if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
- if (edge->mbmi.ref_frame[0] == LAST_FRAME) {
- pred_context = 3;
- } else {
- pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
- }
- } else {
- pred_context = 1 + 2 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME ||
- edge->mbmi.ref_frame[1] == GOLDEN_FRAME);
- }
- } else if (above_mi->mbmi.ref_frame[1] <= INTRA_FRAME &&
- left_mi->mbmi.ref_frame[1] <= INTRA_FRAME) {
- if (above_mi->mbmi.ref_frame[0] == LAST_FRAME &&
- left_mi->mbmi.ref_frame[0] == LAST_FRAME) {
- pred_context = 3;
- } else if (above_mi->mbmi.ref_frame[0] == LAST_FRAME ||
- left_mi->mbmi.ref_frame[0] == LAST_FRAME) {
- const MODE_INFO *edge = above_mi->mbmi.ref_frame[0] == LAST_FRAME ?
- left_mi : above_mi;
-
- pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
- } else {
- pred_context = 2 * (above_mi->mbmi.ref_frame[0] == GOLDEN_FRAME) +
- 2 * (left_mi->mbmi.ref_frame[0] == GOLDEN_FRAME);
- }
- } else if (above_mi->mbmi.ref_frame[1] > INTRA_FRAME &&
- left_mi->mbmi.ref_frame[1] > INTRA_FRAME) {
- if (above_mi->mbmi.ref_frame[0] == left_mi->mbmi.ref_frame[0] &&
- above_mi->mbmi.ref_frame[1] == left_mi->mbmi.ref_frame[1]) {
- pred_context = 3 * (above_mi->mbmi.ref_frame[0] == GOLDEN_FRAME ||
- above_mi->mbmi.ref_frame[1] == GOLDEN_FRAME ||
- left_mi->mbmi.ref_frame[0] == GOLDEN_FRAME ||
- left_mi->mbmi.ref_frame[1] == GOLDEN_FRAME);
- } else {
- pred_context = 2;
- }
- } else {
- MV_REFERENCE_FRAME rfs = above_mi->mbmi.ref_frame[1] <= INTRA_FRAME ?
+ } else {
+ MV_REFERENCE_FRAME rfs =
+ above_mi->mbmi.ref_frame[1] <= INTRA_FRAME ?
above_mi->mbmi.ref_frame[0] : left_mi->mbmi.ref_frame[0];
- MV_REFERENCE_FRAME crf1 = above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
+ MV_REFERENCE_FRAME crf1 =
+ above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
above_mi->mbmi.ref_frame[0] : left_mi->mbmi.ref_frame[0];
- MV_REFERENCE_FRAME crf2 = above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
+ MV_REFERENCE_FRAME crf2 =
+ above_mi->mbmi.ref_frame[1] > INTRA_FRAME ?
above_mi->mbmi.ref_frame[1] : left_mi->mbmi.ref_frame[1];
- if (rfs == GOLDEN_FRAME) {
- pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
- } else if (rfs == ALTREF_FRAME) {
- pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME;
- } else {
- pred_context =
- 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
- }
- }
- } else if (above_in_image || left_in_image) { // one edge available
- const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
-
- if (edge->mbmi.ref_frame[0] == INTRA_FRAME ||
- (edge->mbmi.ref_frame[0] == LAST_FRAME &&
- edge->mbmi.ref_frame[1] <= INTRA_FRAME)) {
- pred_context = 2;
- } else if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
- pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
- } else {
- pred_context = 3 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME ||
- edge->mbmi.ref_frame[1] == GOLDEN_FRAME);
- }
- } else { // no edges available (2)
- pred_context = 2;
+ if (rfs == GOLDEN_FRAME) {
+ pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
+ } else if (rfs == ALTREF_FRAME) {
+ pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME;
+ } else {
+ pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
}
- assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
- break;
}
-
- case PRED_TX_SIZE: {
- int above_context, left_context;
- int max_tx_size;
- if (mi->mbmi.sb_type < BLOCK_SIZE_SB8X8)
- max_tx_size = TX_4X4;
- else if (mi->mbmi.sb_type < BLOCK_SIZE_MB16X16)
- max_tx_size = TX_8X8;
- else if (mi->mbmi.sb_type < BLOCK_SIZE_SB32X32)
- max_tx_size = TX_16X16;
- else
- max_tx_size = TX_32X32;
- above_context = left_context = max_tx_size;
- if (above_in_image) {
- above_context = (above_mi->mbmi.mb_skip_coeff ?
- max_tx_size : above_mi->mbmi.txfm_size);
- }
- if (left_in_image) {
- left_context = (left_mi->mbmi.mb_skip_coeff ?
- max_tx_size : left_mi->mbmi.txfm_size);
- }
- if (!left_in_image) {
- left_context = above_context;
- }
- if (!above_in_image) {
- above_context = left_context;
- }
- pred_context = (above_context + left_context > max_tx_size);
- break;
+ } else if (above_in_image || left_in_image) { // one edge available
+ const MODE_INFO *edge = above_in_image ? above_mi : left_mi;
+
+ if (edge->mbmi.ref_frame[0] == INTRA_FRAME
+ || (edge->mbmi.ref_frame[0] == LAST_FRAME
+ && edge->mbmi.ref_frame[1] <= INTRA_FRAME)) {
+ pred_context = 2;
+ } else if (edge->mbmi.ref_frame[1] <= INTRA_FRAME) {
+ pred_context = 4 * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME);
+ } else {
+ pred_context = 3
+ * (edge->mbmi.ref_frame[0] == GOLDEN_FRAME
+ || edge->mbmi.ref_frame[1] == GOLDEN_FRAME);
}
-
- default:
- assert(0);
- pred_context = 0; // *** add error trap code.
- break;
+ } else { // no edges available (2)
+ pred_context = 2;
}
-
+ assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
return pred_context;
}
-
-// This function returns a context probability for coding a given
-// prediction signal
-vp9_prob vp9_get_pred_prob(const VP9_COMMON *cm, const MACROBLOCKD *xd,
- PRED_ID pred_id) {
- const int pred_context = vp9_get_pred_context(cm, xd, pred_id);
-
- switch (pred_id) {
- case PRED_SEG_ID:
- return cm->segment_pred_probs[pred_context];
- case PRED_MBSKIP:
- return cm->fc.mbskip_probs[pred_context];
- case PRED_INTRA_INTER:
- return cm->fc.intra_inter_prob[pred_context];
- case PRED_COMP_INTER_INTER:
- return cm->fc.comp_inter_prob[pred_context];
- case PRED_COMP_REF_P:
- return cm->fc.comp_ref_prob[pred_context];
- case PRED_SINGLE_REF_P1:
- return cm->fc.single_ref_prob[pred_context][0];
- case PRED_SINGLE_REF_P2:
- return cm->fc.single_ref_prob[pred_context][1];
- default:
- assert(0);
- return 128; // *** add error trap code.
+// Returns a context number for the given MB prediction signal
+unsigned char vp9_get_pred_context_tx_size(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO * const mi = xd->mode_info_context;
+ const MODE_INFO * const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO * const left_mi = mi - 1;
+ const int left_in_image = xd->left_available && left_mi->mbmi.mb_in_image;
+ const int above_in_image = xd->up_available && above_mi->mbmi.mb_in_image;
+ // 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.
+ int above_context, left_context;
+ int max_tx_size;
+ if (mi->mbmi.sb_type < BLOCK_SIZE_SB8X8)
+ max_tx_size = TX_4X4;
+ else if (mi->mbmi.sb_type < BLOCK_SIZE_MB16X16)
+ max_tx_size = TX_8X8;
+ else if (mi->mbmi.sb_type < BLOCK_SIZE_SB32X32)
+ max_tx_size = TX_16X16;
+ else
+ max_tx_size = TX_32X32;
+ above_context = left_context = max_tx_size;
+ if (above_in_image) {
+ above_context = (
+ above_mi->mbmi.mb_skip_coeff ? max_tx_size : above_mi->mbmi.txfm_size);
}
-}
-
-// This function returns a context probability ptr for coding a given
-// prediction signal
-const vp9_prob *vp9_get_pred_probs(const VP9_COMMON *cm, const MACROBLOCKD * xd,
- PRED_ID pred_id) {
- const MODE_INFO *const mi = xd->mode_info_context;
- const int pred_context = vp9_get_pred_context(cm, xd, pred_id);
-
- switch (pred_id) {
- case PRED_SWITCHABLE_INTERP:
- return &cm->fc.switchable_interp_prob[pred_context][0];
-
- case PRED_TX_SIZE:
- if (mi->mbmi.sb_type < BLOCK_SIZE_MB16X16)
- return cm->fc.tx_probs_8x8p[pred_context];
- else if (mi->mbmi.sb_type < BLOCK_SIZE_SB32X32)
- return cm->fc.tx_probs_16x16p[pred_context];
- else
- return cm->fc.tx_probs_32x32p[pred_context];
-
- default:
- assert(0);
- return NULL; // *** add error trap code.
+ if (left_in_image) {
+ left_context = (
+ left_mi->mbmi.mb_skip_coeff ? max_tx_size : left_mi->mbmi.txfm_size);
}
-}
-
-// This function returns the status of the given prediction signal.
-// I.e. is the predicted value for the given signal correct.
-unsigned char vp9_get_pred_flag(const MACROBLOCKD *const xd,
- PRED_ID pred_id) {
- switch (pred_id) {
- case PRED_SEG_ID:
- return xd->mode_info_context->mbmi.seg_id_predicted;
- case PRED_MBSKIP:
- return xd->mode_info_context->mbmi.mb_skip_coeff;
- default:
- assert(0);
- return 0; // *** add error trap code.
+ if (!left_in_image) {
+ left_context = above_context;
}
+ if (!above_in_image) {
+ above_context = left_context;
+ }
+ pred_context = (above_context + left_context > max_tx_size);
+
+ return pred_context;
}
// This function sets the status of the given prediction signal.
// I.e. is the predicted value for the given signal correct.
-void vp9_set_pred_flag(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize, PRED_ID pred_id,
+void vp9_set_pred_flag_mbskip(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
unsigned char pred_flag) {
const int mis = xd->mode_info_stride;
const int bh = 1 << mi_height_log2(bsize);
@@ -466,24 +472,9 @@ void vp9_set_pred_flag(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize, PRED_ID pred_id,
#undef sub
int x, y;
- switch (pred_id) {
- case PRED_SEG_ID:
- for (y = 0; y < y_mis; y++)
- for (x = 0; x < x_mis; x++)
- xd->mode_info_context[y * mis + x].mbmi.seg_id_predicted = pred_flag;
- break;
-
- case PRED_MBSKIP:
- for (y = 0; y < y_mis; y++)
- for (x = 0; x < x_mis; x++)
- xd->mode_info_context[y * mis + x].mbmi.mb_skip_coeff = pred_flag;
- break;
-
- default:
- assert(0);
- // *** add error trap code.
- break;
- }
+ for (y = 0; y < y_mis; y++)
+ for (x = 0; x < x_mis; x++)
+ xd->mode_info_context[y * mis + x].mbmi.mb_skip_coeff = pred_flag;
}
int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids,
diff --git a/vp9/common/vp9_pred_common.h b/vp9/common/vp9_pred_common.h
index 0954ff215..3ec1ff780 100644
--- a/vp9/common/vp9_pred_common.h
+++ b/vp9/common/vp9_pred_common.h
@@ -14,34 +14,125 @@
#include "vp9/common/vp9_blockd.h"
#include "vp9/common/vp9_onyxc_int.h"
-// Predicted items
-typedef enum {
- PRED_SEG_ID = 0, // Segment identifier
- PRED_MBSKIP = 1,
- PRED_SWITCHABLE_INTERP = 2,
- PRED_INTRA_INTER = 3,
- PRED_COMP_INTER_INTER = 4,
- PRED_SINGLE_REF_P1 = 5,
- PRED_SINGLE_REF_P2 = 6,
- PRED_COMP_REF_P = 7,
- PRED_TX_SIZE = 8
-} PRED_ID;
-
-unsigned char vp9_get_pred_context(const VP9_COMMON *cm, const MACROBLOCKD *xd,
- PRED_ID pred_id);
-
-vp9_prob vp9_get_pred_prob(const VP9_COMMON *cm, const MACROBLOCKD *xd,
- PRED_ID pred_id);
-
-const vp9_prob *vp9_get_pred_probs(const VP9_COMMON *cm, const MACROBLOCKD *xd,
- PRED_ID pred_id);
-
-unsigned char vp9_get_pred_flag(const MACROBLOCKD *xd, PRED_ID pred_id);
-
-void vp9_set_pred_flag(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize, PRED_ID pred_id,
- unsigned char pred_flag);
-
int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids,
BLOCK_SIZE_TYPE bsize, int mi_row, int mi_col);
+
+static INLINE unsigned char vp9_get_pred_context_seg_id(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO * const mi = xd->mode_info_context;
+ const MODE_INFO * const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO * const left_mi = mi - 1;
+ pred_context = above_mi->mbmi.seg_id_predicted;
+ if (xd->left_available)
+ pred_context += left_mi->mbmi.seg_id_predicted;
+ return pred_context;
+}
+static INLINE vp9_prob vp9_get_pred_prob_seg_id(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_seg_id(cm, xd);
+ return cm->segment_pred_probs[pred_context];
+}
+static INLINE unsigned char vp9_get_pred_flag_seg_id(
+ const MACROBLOCKD * const xd) {
+ return xd->mode_info_context->mbmi.seg_id_predicted;
+}
+
+void vp9_set_pred_flag_seg_id(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
+ unsigned char pred_flag);
+
+static INLINE unsigned char vp9_get_pred_context_mbskip(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ int pred_context;
+ const MODE_INFO * const mi = xd->mode_info_context;
+ const MODE_INFO * const above_mi = mi - cm->mode_info_stride;
+ const MODE_INFO * const left_mi = mi - 1;
+ pred_context = above_mi->mbmi.mb_skip_coeff;
+ if (xd->left_available)
+ pred_context += left_mi->mbmi.mb_skip_coeff;
+ return pred_context;
+}
+static INLINE vp9_prob vp9_get_pred_prob_mbskip(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_mbskip(cm, xd);
+ return cm->fc.mbskip_probs[pred_context];
+}
+static INLINE unsigned char vp9_get_pred_flag_mbskip(
+ const MACROBLOCKD * const xd) {
+ return xd->mode_info_context->mbmi.mb_skip_coeff;
+}
+void vp9_set_pred_flag_mbskip(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
+ unsigned char pred_flag);
+
+unsigned char vp9_get_pred_context_switchable_interp(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+static INLINE const vp9_prob *vp9_get_pred_probs_switchable_interp(
+ const VP9_COMMON *cm, const MACROBLOCKD * xd) {
+ const int pred_context = vp9_get_pred_context_switchable_interp(cm, xd);
+ return &cm->fc.switchable_interp_prob[pred_context][0];
+}
+
+unsigned char vp9_get_pred_context_intra_inter(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+static INLINE vp9_prob vp9_get_pred_prob_intra_inter(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_intra_inter(cm, xd);
+
+ return cm->fc.intra_inter_prob[pred_context];
+}
+
+unsigned char vp9_get_pred_context_comp_inter_inter(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+
+static INLINE vp9_prob vp9_get_pred_prob_comp_inter_inter(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_comp_inter_inter(cm, xd);
+ return cm->fc.comp_inter_prob[pred_context];
+}
+
+unsigned char vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+static INLINE vp9_prob vp9_get_pred_prob_comp_ref_p(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_comp_ref_p(cm, xd);
+ return cm->fc.comp_ref_prob[pred_context];
+}
+
+unsigned char vp9_get_pred_context_single_ref_p1(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+static INLINE vp9_prob vp9_get_pred_prob_single_ref_p1(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_single_ref_p1(cm, xd);
+ return cm->fc.single_ref_prob[pred_context][0];
+}
+
+unsigned char vp9_get_pred_context_single_ref_p2(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+static INLINE vp9_prob vp9_get_pred_prob_single_ref_p2(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd) {
+ const int pred_context = vp9_get_pred_context_single_ref_p2(cm, xd);
+ return cm->fc.single_ref_prob[pred_context][1];
+}
+
+unsigned char vp9_get_pred_context_tx_size(const VP9_COMMON *cm,
+ const MACROBLOCKD *xd);
+
+static INLINE const vp9_prob *vp9_get_pred_probs_tx_size(const VP9_COMMON *cm,
+ const MACROBLOCKD * xd) {
+ const MODE_INFO *const mi = xd->mode_info_context;
+ const int pred_context = vp9_get_pred_context_tx_size(cm, xd);
+ if (mi->mbmi.sb_type < BLOCK_SIZE_MB16X16)
+ return cm->fc.tx_probs_8x8p[pred_context];
+ else if (mi->mbmi.sb_type < BLOCK_SIZE_SB32X32)
+ return cm->fc.tx_probs_16x16p[pred_context];
+ else
+ return cm->fc.tx_probs_32x32p[pred_context];
+}
+
#endif // VP9_COMMON_VP9_PRED_COMMON_H_