summaryrefslogtreecommitdiff
path: root/vp9/common
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/common')
-rw-r--r--vp9/common/vp9_blockd.h10
-rw-r--r--vp9/common/vp9_entropymode.c164
-rw-r--r--vp9/common/vp9_entropymode.h22
-rw-r--r--vp9/common/vp9_onyxc_int.h23
-rw-r--r--vp9/common/vp9_pred_common.c43
-rw-r--r--vp9/common/vp9_pred_common.h1
6 files changed, 183 insertions, 80 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h
index 52b736b84..238060168 100644
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -124,12 +124,10 @@ typedef enum {
#define TX_SIZE_PROBS 6 // (TX_SIZE_MAX_SB * (TX_SIZE_MAX_SB - 1) / 2)
-#if TX_SIZE_PROBS == 6
-#define get_tx_probs_offset(b) ((b) < BLOCK_SIZE_MB16X16 ? 0 : \
- (b) < BLOCK_SIZE_SB32X32 ? 1 : 3)
-#else
-#define get_tx_probs_offset(b) 0
-#endif
+#define get_tx_probs(c, b) ((b) < BLOCK_SIZE_MB16X16 ? \
+ (c)->fc.tx_probs_8x8p : \
+ (b) < BLOCK_SIZE_SB32X32 ? \
+ (c)->fc.tx_probs_16x16p : (c)->fc.tx_probs_32x32p)
/* For keyframes, intra block modes are predicted by the (already decoded)
modes for the Y blocks to the left and above us; for interframes, there
diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c
index bf57e7ecc..7a87cfe7c 100644
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -149,53 +149,56 @@ static const vp9_prob default_single_ref_p[REF_CONTEXTS][2] = {
{ 235, 248 },
};
-void tx_counts_to_branch_counts(unsigned int *tx_count_32x32p,
- unsigned int *tx_count_16x16p,
- unsigned int *tx_count_8x8p,
- unsigned int (*ct)[2]) {
-#if TX_SIZE_PROBS == 6
- ct[0][0] = tx_count_8x8p[TX_4X4];
- ct[0][1] = tx_count_8x8p[TX_8X8];
- ct[1][0] = tx_count_16x16p[TX_4X4];
- ct[1][1] = tx_count_16x16p[TX_8X8] + tx_count_16x16p[TX_16X16];
- ct[2][0] = tx_count_16x16p[TX_8X8];
- ct[2][1] = tx_count_16x16p[TX_16X16];
- ct[3][0] = tx_count_32x32p[TX_4X4];
- ct[3][1] = tx_count_32x32p[TX_8X8] + tx_count_32x32p[TX_16X16] +
- tx_count_32x32p[TX_32X32];
- ct[4][0] = tx_count_32x32p[TX_8X8];
- ct[4][1] = tx_count_32x32p[TX_16X16] + tx_count_32x32p[TX_32X32];
- ct[5][0] = tx_count_32x32p[TX_16X16];
- ct[5][1] = tx_count_32x32p[TX_32X32];
-#else
- ct[0][0] = tx_count_32x32p[TX_4X4] +
- tx_count_16x16p[TX_4X4] +
- tx_count_8x8p[TX_4X4];
- ct[0][1] = tx_count_32x32p[TX_8X8] +
- tx_count_32x32p[TX_16X16] +
- tx_count_32x32p[TX_32X32] +
- tx_count_16x16p[TX_8X8] +
- tx_count_16x16p[TX_16X16] +
- tx_count_8x8p[TX_8X8];
- ct[1][0] = tx_count_32x32p[TX_8X8] +
- tx_count_16x16p[TX_8X8];
- ct[1][1] = tx_count_32x32p[TX_16X16] +
- tx_count_32x32p[TX_32X32] +
- tx_count_16x16p[TX_16X16];
- ct[2][0] = tx_count_32x32p[TX_16X16];
- ct[2][1] = tx_count_32x32p[TX_32X32];
-#endif
+const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_MAX_SB]
+ [TX_SIZE_MAX_SB - 1] = {
+ { 16, 64, 96, },
+ { 32, 64, 96, },
+ { 32, 64, 96, },
+ { 32, 64, 96, },
+};
+const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_MAX_SB - 1]
+ [TX_SIZE_MAX_SB - 2] = {
+ { 32, 96, },
+ { 64, 96, },
+ { 64, 96, },
+};
+const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_MAX_SB - 2]
+ [TX_SIZE_MAX_SB - 3] = {
+ { 96, },
+ { 96, },
+};
+
+void tx_counts_to_branch_counts_32x32(unsigned int *tx_count_32x32p,
+ unsigned int (*ct_32x32p)[2]) {
+ ct_32x32p[0][0] = tx_count_32x32p[TX_4X4];
+ ct_32x32p[0][1] = tx_count_32x32p[TX_8X8] +
+ tx_count_32x32p[TX_16X16] +
+ tx_count_32x32p[TX_32X32];
+ ct_32x32p[1][0] = tx_count_32x32p[TX_8X8];
+ ct_32x32p[1][1] = tx_count_32x32p[TX_16X16] +
+ tx_count_32x32p[TX_32X32];
+ ct_32x32p[2][0] = tx_count_32x32p[TX_16X16];
+ ct_32x32p[2][1] = tx_count_32x32p[TX_32X32];
}
-#if TX_SIZE_PROBS == 6
-const vp9_prob vp9_default_tx_probs[TX_SIZE_PROBS] = {
- 96, 96, 96, 96, 96, 96
-};
-#else
-const vp9_prob vp9_default_tx_probs[TX_SIZE_PROBS] = {
- 96, 96, 96
+void tx_counts_to_branch_counts_16x16(unsigned int *tx_count_16x16p,
+ unsigned int (*ct_16x16p)[2]) {
+ ct_16x16p[0][0] = tx_count_16x16p[TX_4X4];
+ ct_16x16p[0][1] = tx_count_16x16p[TX_8X8] +
+ tx_count_16x16p[TX_16X16];
+ ct_16x16p[1][0] = tx_count_16x16p[TX_8X8];
+ ct_16x16p[1][1] = tx_count_16x16p[TX_16X16];
+}
+
+void tx_counts_to_branch_counts_8x8(unsigned int *tx_count_8x8p,
+ unsigned int (*ct_8x8p)[2]) {
+ ct_8x8p[0][0] = tx_count_8x8p[TX_4X4];
+ ct_8x8p[0][1] = tx_count_8x8p[TX_8X8];
+}
+
+const vp9_prob vp9_default_mbskip_probs[MBSKIP_CONTEXTS] = {
+ 192, 128, 64
};
-#endif
void vp9_init_mbmode_probs(VP9_COMMON *x) {
vpx_memcpy(x->fc.uv_mode_prob, default_if_uv_probs,
@@ -219,8 +222,14 @@ void vp9_init_mbmode_probs(VP9_COMMON *x) {
sizeof(default_comp_ref_p));
vpx_memcpy(x->fc.single_ref_prob, default_single_ref_p,
sizeof(default_single_ref_p));
- vpx_memcpy(x->fc.tx_probs, vp9_default_tx_probs,
- sizeof(vp9_default_tx_probs));
+ vpx_memcpy(x->fc.tx_probs_32x32p, vp9_default_tx_probs_32x32p,
+ sizeof(vp9_default_tx_probs_32x32p));
+ vpx_memcpy(x->fc.tx_probs_16x16p, vp9_default_tx_probs_16x16p,
+ sizeof(vp9_default_tx_probs_16x16p));
+ vpx_memcpy(x->fc.tx_probs_8x8p, vp9_default_tx_probs_8x8p,
+ sizeof(vp9_default_tx_probs_8x8p));
+ vpx_memcpy(x->fc.mbskip_probs, vp9_default_mbskip_probs,
+ sizeof(vp9_default_mbskip_probs));
}
#if VP9_SWITCHABLE_FILTERS == 3
@@ -321,7 +330,7 @@ void vp9_adapt_mode_context(VP9_COMMON *pc) {
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
-static int update_mode_ct(int pre_prob, int prob,
+static int update_mode_ct(vp9_prob pre_prob, vp9_prob prob,
unsigned int branch_ct[2]) {
int factor, count = branch_ct[0] + branch_ct[1];
count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
@@ -344,7 +353,7 @@ static void update_mode_probs(int n_modes,
dst_probs[t] = update_mode_ct(pre_probs[t], probs[t], branch_ct[t]);
}
-static int update_mode_ct2(int pre_prob, unsigned int branch_ct[2]) {
+static int update_mode_ct2(vp9_prob pre_prob, unsigned int branch_ct[2]) {
return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
branch_ct[1]), branch_ct);
}
@@ -425,19 +434,56 @@ void vp9_adapt_mode_probs(VP9_COMMON *cm) {
}
}
if (cm->txfm_mode == TX_MODE_SELECT) {
- unsigned int branch_ct[TX_SIZE_PROBS][2];
- tx_counts_to_branch_counts(cm->fc.tx_count_32x32p,
- cm->fc.tx_count_16x16p,
- cm->fc.tx_count_8x8p, branch_ct);
- for (i = 0; i < TX_SIZE_PROBS; ++i) {
- int factor;
- int count = branch_ct[i][0] + branch_ct[i][1];
- vp9_prob prob = get_binary_prob(branch_ct[i][0], branch_ct[i][1]);
- count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
- factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
- cm->fc.tx_probs[i] = weighted_prob(cm->fc.pre_tx_probs[i], prob, factor);
+ int j;
+ unsigned int branch_ct_8x8p[TX_SIZE_MAX_SB - 3][2];
+ unsigned int branch_ct_16x16p[TX_SIZE_MAX_SB - 2][2];
+ unsigned int branch_ct_32x32p[TX_SIZE_MAX_SB - 1][2];
+ for (i = 0; i < TX_SIZE_MAX_SB - 2; ++i) {
+ tx_counts_to_branch_counts_8x8(cm->fc.tx_count_8x8p[i],
+ branch_ct_8x8p);
+ for (j = 0; j < TX_SIZE_MAX_SB - 3; ++j) {
+ int factor;
+ int count = branch_ct_8x8p[j][0] + branch_ct_8x8p[j][1];
+ vp9_prob prob = get_binary_prob(branch_ct_8x8p[j][0],
+ branch_ct_8x8p[j][1]);
+ count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
+ factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
+ cm->fc.tx_probs_8x8p[i][j] = weighted_prob(
+ cm->fc.pre_tx_probs_8x8p[i][j], prob, factor);
+ }
+ }
+ for (i = 0; i < TX_SIZE_MAX_SB - 1; ++i) {
+ tx_counts_to_branch_counts_16x16(cm->fc.tx_count_16x16p[i],
+ branch_ct_16x16p);
+ for (j = 0; j < TX_SIZE_MAX_SB - 2; ++j) {
+ int factor;
+ int count = branch_ct_16x16p[j][0] + branch_ct_16x16p[j][1];
+ vp9_prob prob = get_binary_prob(branch_ct_16x16p[j][0],
+ branch_ct_16x16p[j][1]);
+ count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
+ factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
+ cm->fc.tx_probs_16x16p[i][j] = weighted_prob(
+ cm->fc.pre_tx_probs_16x16p[i][j], prob, factor);
+ }
+ }
+ for (i = 0; i < TX_SIZE_MAX_SB; ++i) {
+ tx_counts_to_branch_counts_32x32(cm->fc.tx_count_32x32p[i],
+ branch_ct_32x32p);
+ for (j = 0; j < TX_SIZE_MAX_SB - 1; ++j) {
+ int factor;
+ int count = branch_ct_32x32p[j][0] + branch_ct_32x32p[j][1];
+ vp9_prob prob = get_binary_prob(branch_ct_32x32p[j][0],
+ branch_ct_32x32p[j][1]);
+ count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
+ factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
+ cm->fc.tx_probs_32x32p[i][j] = weighted_prob(
+ cm->fc.pre_tx_probs_32x32p[i][j], prob, factor);
+ }
}
}
+ for (i = 0; i < MBSKIP_CONTEXTS; ++i)
+ fc->mbskip_probs[i] = update_mode_ct2(fc->pre_mbskip_probs[i],
+ fc->mbskip_count[i]);
}
static void set_default_lf_deltas(MACROBLOCKD *xd) {
diff --git a/vp9/common/vp9_entropymode.h b/vp9/common/vp9_entropymode.h
index ce13a4cb1..3e8d566a4 100644
--- a/vp9/common/vp9_entropymode.h
+++ b/vp9/common/vp9_entropymode.h
@@ -16,6 +16,8 @@
#define SUBMVREF_COUNT 5
+// #define MODE_STATS
+
extern int vp9_mv_cont(const int_mv *l, const int_mv *a);
@@ -75,11 +77,17 @@ extern struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
extern const vp9_prob vp9_switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1]
[VP9_SWITCHABLE_FILTERS - 1];
-extern const vp9_prob vp9_default_tx_probs[TX_SIZE_PROBS];
-
-extern void tx_counts_to_branch_counts(unsigned int *tx_count_32x32p,
- unsigned int *tx_count_16x16p,
- unsigned int *tx_count_8x8p,
- unsigned int (*ct)[2]);
-
+extern const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_MAX_SB]
+ [TX_SIZE_MAX_SB - 1];
+extern const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_MAX_SB - 1]
+ [TX_SIZE_MAX_SB - 2];
+extern const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_MAX_SB - 2]
+ [TX_SIZE_MAX_SB - 3];
+
+extern void tx_counts_to_branch_counts_32x32(unsigned int *tx_count_32x32p,
+ unsigned int (*ct_32x32p)[2]);
+extern void tx_counts_to_branch_counts_16x16(unsigned int *tx_count_16x16p,
+ unsigned int (*ct_16x16p)[2]);
+extern void tx_counts_to_branch_counts_8x8(unsigned int *tx_count_8x8p,
+ unsigned int (*ct_8x8p)[2]);
#endif // VP9_COMMON_VP9_ENTROPYMODE_H_
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index cd0e5279e..d91483d31 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -89,11 +89,20 @@ typedef struct frame_contexts {
unsigned int comp_inter_count[COMP_INTER_CONTEXTS][2];
unsigned int single_ref_count[REF_CONTEXTS][2][2];
unsigned int comp_ref_count[REF_CONTEXTS][2];
- vp9_prob tx_probs[TX_SIZE_PROBS];
- vp9_prob pre_tx_probs[TX_SIZE_PROBS];
- unsigned int tx_count_32x32p[TX_SIZE_MAX_SB];
- unsigned int tx_count_16x16p[TX_SIZE_MAX_SB - 1];
- unsigned int tx_count_8x8p[TX_SIZE_MAX_SB - 2];
+
+ vp9_prob tx_probs_32x32p[TX_SIZE_MAX_SB][TX_SIZE_MAX_SB - 1];
+ vp9_prob tx_probs_16x16p[TX_SIZE_MAX_SB - 1][TX_SIZE_MAX_SB - 2];
+ vp9_prob tx_probs_8x8p[TX_SIZE_MAX_SB - 2][TX_SIZE_MAX_SB - 3];
+ vp9_prob pre_tx_probs_32x32p[TX_SIZE_MAX_SB][TX_SIZE_MAX_SB - 1];
+ vp9_prob pre_tx_probs_16x16p[TX_SIZE_MAX_SB - 1][TX_SIZE_MAX_SB - 2];
+ vp9_prob pre_tx_probs_8x8p[TX_SIZE_MAX_SB - 2][TX_SIZE_MAX_SB - 3];
+ unsigned int tx_count_32x32p[TX_SIZE_MAX_SB][TX_SIZE_MAX_SB];
+ unsigned int tx_count_16x16p[TX_SIZE_MAX_SB - 1][TX_SIZE_MAX_SB - 1];
+ unsigned int tx_count_8x8p[TX_SIZE_MAX_SB - 2][TX_SIZE_MAX_SB - 2];
+
+ vp9_prob mbskip_probs[MBSKIP_CONTEXTS];
+ vp9_prob pre_mbskip_probs[MBSKIP_CONTEXTS];
+ unsigned int mbskip_count[MBSKIP_CONTEXTS][2];
} FRAME_CONTEXT;
typedef enum {
@@ -165,6 +174,8 @@ typedef struct VP9Common {
int intra_only;
// Flag signaling that the frame context should be reset to default values.
+ // 0 or 1 implies don't reset, 2 reset just the context specified in the
+ // frame header, 3 reset all contexts.
int reset_frame_context;
int frame_flags;
@@ -244,8 +255,6 @@ typedef struct VP9Common {
MV_REFERENCE_FRAME comp_var_ref[2];
COMPPREDMODE_TYPE comp_pred_mode;
- vp9_prob mbskip_pred_probs[MBSKIP_CONTEXTS];
-
FRAME_CONTEXT fc; /* this frame entropy */
FRAME_CONTEXT frame_contexts[NUM_FRAME_CONTEXTS];
unsigned int frame_context_idx; /* Context to use/update */
diff --git a/vp9/common/vp9_pred_common.c b/vp9/common/vp9_pred_common.c
index 73c7278b0..16ba53e2f 100644
--- a/vp9/common/vp9_pred_common.c
+++ b/vp9/common/vp9_pred_common.c
@@ -348,6 +348,37 @@ unsigned char vp9_get_pred_context(const VP9_COMMON *const cm,
break;
}
+ case PRED_TX_SIZE: {
+ int above_context = TX_16X16, left_context = TX_16X16;
+ 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;
+ if (xd->up_available) {
+ above_context = (above_mi->mbmi.mb_skip_coeff ?
+ max_tx_size : above_mi->mbmi.txfm_size);
+ }
+ if (xd->left_available) {
+ left_context = (left_mi->mbmi.mb_skip_coeff ?
+ max_tx_size : left_mi->mbmi.txfm_size);
+ }
+ if (!xd->left_available) {
+ left_context = above_context;
+ }
+ if (!xd->up_available) {
+ above_context = left_context;
+ }
+ pred_context = (above_context + left_context + 1) >> 1;
+ if (pred_context > max_tx_size)
+ pred_context = max_tx_size;
+ break;
+ }
+
default:
assert(0);
pred_context = 0; // *** add error trap code.
@@ -368,7 +399,7 @@ vp9_prob vp9_get_pred_prob(const VP9_COMMON *const cm,
case PRED_SEG_ID:
return cm->segment_pred_probs[pred_context];
case PRED_MBSKIP:
- return cm->mbskip_pred_probs[pred_context];
+ return cm->fc.mbskip_probs[pred_context];
case PRED_INTRA_INTER:
return cm->fc.intra_inter_prob[pred_context];
case PRED_COMP_INTER_INTER:
@@ -390,11 +421,21 @@ vp9_prob vp9_get_pred_prob(const VP9_COMMON *const cm,
const vp9_prob *vp9_get_pred_probs(const VP9_COMMON *const cm,
const MACROBLOCKD *const 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.
diff --git a/vp9/common/vp9_pred_common.h b/vp9/common/vp9_pred_common.h
index 6d5299702..b728724b7 100644
--- a/vp9/common/vp9_pred_common.h
+++ b/vp9/common/vp9_pred_common.h
@@ -24,6 +24,7 @@ typedef enum {
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 *const cm,