diff options
Diffstat (limited to 'vp8/common/pred_common.c')
-rw-r--r-- | vp8/common/pred_common.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/vp8/common/pred_common.c b/vp8/common/pred_common.c index 2d46496f1..b7d52a54f 100644 --- a/vp8/common/pred_common.c +++ b/vp8/common/pred_common.c @@ -62,6 +62,38 @@ unsigned char get_pred_context(VP8_COMMON *const cm, (m - cm->mode_info_stride)->mbmi.mb_skip_coeff; break; +#if CONFIG_SWITCHABLE_INTERP + case PRED_SWITCHABLE_INTERP: + { + int left_in_image = (m - 1)->mbmi.mb_in_image; + int above_in_image = (m - cm->mode_info_stride)->mbmi.mb_in_image; + int left_mode = (m - 1)->mbmi.mode; + int above_mode = (m - cm->mode_info_stride)->mbmi.mode; + int left_interp, above_interp; + if (left_in_image && left_mode >= NEARESTMV && left_mode <= SPLITMV) + left_interp = vp8_switchable_interp_map[(m - 1)->mbmi.interp_filter]; + else + left_interp = VP8_SWITCHABLE_FILTERS; + if (above_in_image && above_mode >= NEARESTMV && above_mode <= SPLITMV) + above_interp = vp8_switchable_interp_map[ + (m - cm->mode_info_stride)->mbmi.interp_filter]; + else + above_interp = VP8_SWITCHABLE_FILTERS; + + if (left_interp == above_interp) + pred_context = left_interp; + else if (left_interp == VP8_SWITCHABLE_FILTERS && + above_interp != VP8_SWITCHABLE_FILTERS) + pred_context = above_interp; + else if (left_interp != VP8_SWITCHABLE_FILTERS && + above_interp == VP8_SWITCHABLE_FILTERS) + pred_context = left_interp; + else + pred_context = VP8_SWITCHABLE_FILTERS; + } + break; +#endif + default: // TODO *** add error trap code. pred_context = 0; @@ -111,6 +143,53 @@ vp8_prob get_pred_prob(VP8_COMMON *const cm, return pred_probability; } +// This function returns a context probability ptr for coding a given +// prediction signal +vp8_prob *get_pred_probs(VP8_COMMON *const cm, + MACROBLOCKD *const xd, + PRED_ID pred_id) { + vp8_prob *pred_probability; + int pred_context; + + // Get the appropriate prediction context + pred_context = get_pred_context(cm, xd, pred_id); + + switch (pred_id) { + case PRED_SEG_ID: + pred_probability = &cm->segment_pred_probs[pred_context]; + break; + + case PRED_REF: + pred_probability = &cm->ref_pred_probs[pred_context]; + break; + + case PRED_COMP: + // In keeping with convention elsewhre the probability returned is + // the probability of a "0" outcome which in this case means the + // probability of comp pred off. + pred_probability = &cm->prob_comppred[pred_context]; + break; + +#if CONFIG_NEWENTROPY + case PRED_MBSKIP: + pred_probability = &cm->mbskip_pred_probs[pred_context]; + break; +#endif + +#if CONFIG_SWITCHABLE_INTERP + case PRED_SWITCHABLE_INTERP: + pred_probability = &cm->fc.switchable_interp_prob[pred_context][0]; + break; +#endif + default: + // TODO *** add error trap code. + pred_probability = NULL; + break; + } + + return pred_probability; +} + // This function returns the status of the given prediction signal. // I.e. is the predicted value for the given signal correct. unsigned char get_pred_flag(MACROBLOCKD *const xd, |