diff options
Diffstat (limited to 'vp9/common')
-rw-r--r-- | vp9/common/vp9_blockd.h | 10 | ||||
-rw-r--r-- | vp9/common/vp9_entropymode.c | 164 | ||||
-rw-r--r-- | vp9/common/vp9_entropymode.h | 22 | ||||
-rw-r--r-- | vp9/common/vp9_onyxc_int.h | 23 | ||||
-rw-r--r-- | vp9/common/vp9_pred_common.c | 43 | ||||
-rw-r--r-- | vp9/common/vp9_pred_common.h | 1 |
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, |