summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2013-08-20 10:06:14 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-08-20 10:06:14 -0700
commit5baf510f74ca2fe82ea5aa547b1330d4c5059581 (patch)
tree07dbc9639740940bb25c3c3e80f6017cb4829f6e
parent039b0c4c9ed685df11bfa9193426d01a55c7ead3 (diff)
parentd8286dd56d4aaca538c0b68c7612aa2485bb20da (diff)
downloadlibvpx-5baf510f74ca2fe82ea5aa547b1330d4c5059581.tar
libvpx-5baf510f74ca2fe82ea5aa547b1330d4c5059581.tar.gz
libvpx-5baf510f74ca2fe82ea5aa547b1330d4c5059581.tar.bz2
libvpx-5baf510f74ca2fe82ea5aa547b1330d4c5059581.zip
Merge "Adding has_second_ref function."
-rw-r--r--vp9/common/vp9_blockd.h6
-rw-r--r--vp9/common/vp9_pred_common.c69
2 files changed, 40 insertions, 35 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h
index cff68218c..f39a64267 100644
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -161,10 +161,14 @@ typedef struct {
union b_mode_info bmi[4];
} MODE_INFO;
-static int is_inter_block(const MB_MODE_INFO *mbmi) {
+static INLINE int is_inter_block(const MB_MODE_INFO *mbmi) {
return mbmi->ref_frame[0] > INTRA_FRAME;
}
+static INLINE int has_second_ref(const MB_MODE_INFO *mbmi) {
+ return mbmi->ref_frame[1] > INTRA_FRAME;
+}
+
enum mv_precision {
MV_PRECISION_Q3,
MV_PRECISION_Q4
diff --git a/vp9/common/vp9_pred_common.c b/vp9/common/vp9_pred_common.c
index 829bf45a6..942da88a5 100644
--- a/vp9/common/vp9_pred_common.c
+++ b/vp9/common/vp9_pred_common.c
@@ -216,52 +216,53 @@ unsigned char vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) {
// 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_intra && left_intra) {
+ if (above_intra && left_intra) { // intra/intra
pred_context = 2;
- } else if (above_intra || left_intra) {
+ } else if (above_intra || left_intra) { // intra/inter or inter/intra
const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi;
-
- if (edge_mbmi->ref_frame[1] <= INTRA_FRAME)
+ if (!has_second_ref(edge_mbmi))
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_mbmi->ref_frame[1] <= INTRA_FRAME &&
- left_mbmi->ref_frame[1] <= INTRA_FRAME) {
- pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) +
- 2 * (left_mbmi->ref_frame[0] == LAST_FRAME);
- } else if (above_mbmi->ref_frame[1] > INTRA_FRAME &&
- left_mbmi->ref_frame[1] > INTRA_FRAME) {
- pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME ||
- above_mbmi->ref_frame[1] == LAST_FRAME ||
- left_mbmi->ref_frame[0] == LAST_FRAME ||
- left_mbmi->ref_frame[1] == LAST_FRAME);
- } else {
- MV_REFERENCE_FRAME rfs = above_mbmi->ref_frame[1] <= INTRA_FRAME ?
- above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
- MV_REFERENCE_FRAME crf1 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
- above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
- MV_REFERENCE_FRAME crf2 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
- above_mbmi->ref_frame[1] : left_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 { // inter/inter
+ if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) {
+ pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) +
+ 2 * (left_mbmi->ref_frame[0] == LAST_FRAME);
+ } else if (has_second_ref(above_mbmi) && has_second_ref(left_mbmi)) {
+ pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME ||
+ above_mbmi->ref_frame[1] == LAST_FRAME ||
+ left_mbmi->ref_frame[0] == LAST_FRAME ||
+ left_mbmi->ref_frame[1] == LAST_FRAME);
+ } else {
+ const MV_REFERENCE_FRAME rfs = !has_second_ref(above_mbmi) ?
+ above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
+ const MV_REFERENCE_FRAME crf1 = has_second_ref(above_mbmi) ?
+ above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
+ const MV_REFERENCE_FRAME crf2 = has_second_ref(above_mbmi) ?
+ above_mbmi->ref_frame[1] : left_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 MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
-
- if (edge_mbmi->ref_frame[0] == INTRA_FRAME)
+ if (!is_inter_block(edge_mbmi)) { // intra
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)
+ } else { // inter
+ if (!has_second_ref(edge_mbmi))
+ 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
pred_context = 2;
}
+
assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
return pred_context;
}