#endif // CONFIG_MULTI_REF
#if CONFIG_NEW_QUANT
-#define QUANT_PROFILES 2
+#define QUANT_PROFILES 3
+#define Q_CTX_BASED_PROFILES 1
#if QUANT_PROFILES > 1
-static INLINE int switchable_dq_profile_used(BLOCK_SIZE bsize) {
- return bsize >= BLOCK_16X16;
-}
+
#define Q_THRESHOLD_MIN 0
#define Q_THRESHOLD_MAX 1000
+
+static INLINE int switchable_dq_profile_used(int q_ctx, BLOCK_SIZE bsize) {
+ return ((bsize >= BLOCK_32X32) * q_ctx);
+}
#endif // QUANT_PROFILES > 1
#endif // CONFIG_NEW_QUANT
#endif // CONFIG_PALETTE
#if CONFIG_NEW_QUANT
int dq_off_index;
+ int send_dq_bit;
#endif // CONFIG_NEW_QUANT
} MB_MODE_INFO;
assert(0 && "Invalid transform size.");
break;
}
-
return combine_entropy_contexts(above_ec, left_ec);
}
};
#endif // CONFIG_COPY_MODE
-#if CONFIG_NEW_QUANT
+#if CONFIG_NEW_QUANT && !Q_CTX_BASED_PROFILES
#if QUANT_PROFILES == 2
const vp9_tree_index vp9_dq_profile_tree[TREE_SIZE(QUANT_PROFILES)] = {
-0, -1
240, 128
};
#endif // QUANT_PROFILES != 2 and QUANT_PROFILES != 3
-#endif // CONFIG_NEW_QUANT
+#endif // CONFIG_NEW_QUANT && !Q_CTX_BASED_PROFILES
#if CONFIG_TX64X64
void tx_counts_to_branch_counts_64x64(const unsigned int *tx_count_64x64p,
#if CONFIG_WEDGE_PARTITION
vp9_copy(fc->wedge_interinter_prob, default_wedge_interinter_prob);
#endif // CONFIG_WEDGE_PARTITION
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
vp9_copy(fc->dq_profile_prob, default_dq_profile_prob);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
const vp9_tree_index vp9_switchable_interp_tree
counts->uv_palette_enabled[i]);
#endif // CONFIG_PALETTE
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
adapt_probs(vp9_dq_profile_tree, pre_fc->dq_profile_prob,
counts->dq_profile, fc->dq_profile_prob);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
static void set_default_lf_deltas(struct loopfilter *lf) {
#if CONFIG_GLOBAL_MOTION
vp9_prob global_motion_types_prob[GLOBAL_MOTION_TYPES - 1];
#endif // CONFIG_GLOBAL_MOTION
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
vp9_prob dq_profile_prob[QUANT_PROFILES - 1];
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
} FRAME_CONTEXT;
typedef struct {
#if CONFIG_GLOBAL_MOTION
unsigned int global_motion_types[GLOBAL_MOTION_TYPES];
#endif // CONFIG_GLOBAL_MOTION
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
unsigned int dq_profile[QUANT_PROFILES];
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
} FRAME_COUNTS;
extern const vp9_prob vp9_kf_uv_mode_prob[INTRA_MODES][INTRA_MODES - 1];
[TREE_SIZE(INTER_COMPOUND_MODES)];
#endif // CONFIG_NEW_INTER
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
extern const vp9_tree_index vp9_dq_profile_tree[TREE_SIZE(QUANT_PROFILES)];
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
void vp9_setup_past_independence(struct VP9Common *cm);
#if CONFIG_ROW_TILE
static const uint8_t vp9_nuq_knots[QUANT_PROFILES][COEF_BANDS][NUQ_KNOTS] = {
{
- {86, 122, 128}, // dc, band 0
- {86, 122, 128}, // band 1
- {86, 122, 128}, // band 2
- {88, 122, 128}, // band 3
- {88, 122, 128}, // band 4
- {88, 122, 128}, // band 5
+ {86, 122, 134}, // dc, band 0
+ {78, 122, 134}, // band 1
+ {78, 122, 134}, // band 2
+ {84, 122, 133}, // band 3
+ {88, 122, 134}, // band 4
+ {88, 122, 134}, // band 5
#if CONFIG_TX_SKIP
{86, 122, 128}, // band 6
#endif // CONFIG_TX_SKIP
},
#if QUANT_PROFILES > 1
{
- {86, 122, 128}, // dc, band 0
- {86, 122, 128}, // band 1
- {86, 122, 128}, // band 2
- {88, 122, 128}, // band 3
- {88, 122, 128}, // band 4
- {88, 122, 128}, // band 5
+ {86, 122, 134}, // dc, band 0
+ {78, 122, 134}, // band 1
+ {78, 122, 134}, // band 2
+ {84, 122, 134}, // band 3
+ {88, 122, 134}, // band 4
+ {88, 122, 134}, // band 5
#if CONFIG_TX_SKIP
{86, 122, 128}, // band 6
#endif // CONFIG_TX_SKIP
},
#if QUANT_PROFILES > 2
{
- {86, 122, 128}, // dc, band 0
- {86, 122, 128}, // band 1
- {86, 122, 128}, // band 2
- {88, 122, 128}, // band 3
- {88, 122, 128}, // band 4
- {88, 122, 128}, // band 5
+ {86, 122, 134}, // dc, band 0
+ {78, 122, 135}, // band 1
+ {78, 122, 134}, // band 2
+ {84, 122, 133}, // band 3
+ {88, 122, 134}, // band 4
+ {88, 122, 134}, // band 5
#if CONFIG_TX_SKIP
{86, 122, 128}, // band 6
#endif // CONFIG_TX_SKIP
0
#endif // CONFIG_TX_SKIP
};
+
+#if QUANT_PROFILES == 1
+static const uint8_t vp9_nuq_doff[QUANT_PROFILES][COEF_BANDS] = {
+ { 8, 15, 16, 22, 23, 24, // dq_off_index = 0
+#if CONFIG_TX_SKIP
+ 8
+#endif // CONFIG_TX_SKIP
+ }
+};
+#elif QUANT_PROFILES == 2
static const uint8_t vp9_nuq_doff[QUANT_PROFILES][COEF_BANDS] = {
{ 8, 15, 16, 22, 23, 24, // dq_off_index = 0
#if CONFIG_TX_SKIP
8
#endif // CONFIG_TX_SKIP
},
-#if QUANT_PROFILES > 1
- { 6, 12, 13, 16, 17, 18, // dq_off_index = 1
+ { 13, 20, 21, 27, 28, 29, // dq_off_index = 1
#if CONFIG_TX_SKIP
8
#endif // CONFIG_TX_SKIP
},
-#if QUANT_PROFILES > 2
- { 10, 18, 19, 23, 25, 26, // dq_off_index = 2
+};
+#else // QUANT_PROFILES == 3
+static const uint8_t vp9_nuq_doff[QUANT_PROFILES][COEF_BANDS] = {
+ { 6, 14, 15, 22, 23, 27, // dq_off_index = 0
+#if CONFIG_TX_SKIP
+ 8
+#endif // CONFIG_TX_SKIP
+ },
+ { 6, 15, 17, 22, 23, 23, // dq_off_index = 1
+#if CONFIG_TX_SKIP
+ 8
+#endif // CONFIG_TX_SKIP
+ },
+ { 6, 14, 16, 22, 23, 27, // dq_off_index = 2
#if CONFIG_TX_SKIP
8
#endif // CONFIG_TX_SKIP
}
-#endif // QUANT_PROFILES > 2
-#endif // QUANT_PROFILES > 1
};
+#endif
// Allow different quantization profiles in different q ranges,
// to enable entropy-constraints in scalar quantization.
vp9_diff_update_prob(r, &fc->switchable_interp_prob[j][i]);
}
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
static void read_dq_profile_probs(FRAME_CONTEXT *fc, vp9_reader *r) {
int i;
for (i = 0; i < QUANT_PROFILES - 1; ++i)
vp9_diff_update_prob(r, &fc->dq_profile_prob[i]);
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
static void read_inter_mode_probs(FRAME_CONTEXT *fc, vp9_reader *r) {
int i, j;
BLOCK_SIZE bsize, int mi_row, int mi_col,
#if CONFIG_EXT_TX
int txfm,
-#endif
+#endif // CONFIG_EXT_TX
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
int dq_off_index,
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
int skip) {
const int bw = num_8x8_blocks_wide_lookup[bsize];
const int bh = num_8x8_blocks_high_lookup[bsize];
xd->mi[y * cm->mi_stride + x].mbmi.skip = skip;
#if CONFIG_EXT_TX
xd->mi[y * cm->mi_stride + x].mbmi.ext_txfrm = txfm;
-#endif
+#endif // CONFIG_EXT_TX
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
xd->mi[y * cm->mi_stride + x].mbmi.dq_off_index = dq_off_index;
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
}
}
}
}
#endif // CONFIG_EXT_TX
- /*
- printf("D[%d/%d, %d %d] sb_type %d skip %d}\n", cm->current_video_frame, cm->show_frame,
- mi_row, mi_col, bsize, skip);
- */
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(bsize) && !skip &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, bsize), bsize) &&
+ !skip &&
!vp9_segfeature_active(
&cm->seg, xd->mi[0].mbmi.segment_id, SEG_LVL_SKIP)) {
dq_off_index = vp9_read_dq_profile(cm, r);
} else {
dq_off_index = 0;
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
#endif // CONFIG_SUPERTX
if (subsize < BLOCK_8X8) {
read_inter_compound_mode_probs(fc, &r);
#endif // CONFIG_NEW_INTER
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
read_dq_profile_probs(fc, &r);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->interp_filter == SWITCHABLE)
read_switchable_interp_probs(fc, &r);
}
#endif // CONFIG_NEW_INTER
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
int vp9_read_dq_profile(VP9_COMMON *cm, vp9_reader *r) {
const int dq_profile = vp9_read_tree(r, vp9_dq_profile_tree,
cm->fc.dq_profile_prob);
}
return dq_profile;
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
static PREDICTION_MODE read_inter_mode(VP9_COMMON *cm, vp9_reader *r,
int ctx) {
#endif // CONFIG_SR_MODE
#endif // CONFIG_PALETTE
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN && cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) &&
!mbmi->skip &&
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
mbmi->dq_off_index = vp9_read_dq_profile(cm, r);
} else {
mbmi->dq_off_index = 0;
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 2) {
+ mbmi->dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 1) {
+ mbmi->dq_off_index = 2;
+#endif // QUANT_PROFILES > 2
+ } else {
+ mbmi->dq_off_index = 0;
+ }
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
mbmi->ref_frame[0] = INTRA_FRAME;
mbmi->ref_frame[1] = NONE;
mbmi->mode = NEARESTMV;
mbmi->skip = skip_backup;
mbmi->copy_mode = copy_mode_backup;
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (!(cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) &&
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)))
mbmi->dq_off_index = 0;
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) == 2) {
+ mbmi->dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd,
+ mbmi->sb_type),
+ mbmi->sb_type) == 1) {
+ mbmi->dq_off_index = 2;
+#endif // QUANT_PROFILES > 2
+ } else {
+ mbmi->dq_off_index = 0;
+ }
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
}
#endif // CONFIG_COPY_MODE
#endif // CONFIG_SR_MODE
#endif // CONFIG_PALETTE
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) &&
#if CONFIG_SUPERTX
!supertx_enabled &&
#endif
} else {
mbmi->dq_off_index = 0;
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) == 2) {
+ mbmi->dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd,
+ mbmi->sb_type),
+ mbmi->sb_type) == 1) {
+ mbmi->dq_off_index = 2;
+ #endif // QUANT_PROFILES > 2
+ } else {
+ mbmi->dq_off_index = 0;
+ }
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
#if CONFIG_EXT_TX
if (inter_block &&
#endif
#endif
int mi_row, int mi_col, vp9_reader *r);
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
int vp9_read_dq_profile(VP9_COMMON *cm, vp9_reader *r);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#ifdef __cplusplus
} // extern "C"
#if CONFIG_GLOBAL_MOTION
static struct vp9_token global_motion_types_encodings[GLOBAL_MOTION_TYPES];
#endif // CONFIG_GLOBAL_MOTION
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
static struct vp9_token dq_profile_encodings[QUANT_PROFILES];
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_SUPERTX
static int vp9_check_supertx(VP9_COMMON *cm, int mi_row, int mi_col,
vp9_tokens_from_tree(global_motion_types_encodings,
vp9_global_motion_types_tree);
#endif // CONFIG_GLOBAL_MOTION
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
vp9_tokens_from_tree(dq_profile_encodings, vp9_dq_profile_tree);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
static void write_intra_mode(vp9_writer *w, PREDICTION_MODE mode,
vp9_cond_prob_diff_update(w, &cm->fc.skip_probs[k], cm->counts.skip[k]);
}
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
static void write_dq_profile(const VP9_COMMON *cm, int dq_profile,
vp9_writer *w) {
vp9_write_token(w, vp9_dq_profile_tree, cm->fc.dq_profile_prob,
cm->fc.dq_profile_prob,
cm->counts.dq_profile, QUANT_PROFILES, w);
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_SR_MODE
#if SR_USE_MULTI_F
write_selected_tx_size(cm, xd, mbmi->tx_size, bsize, w);
}
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN && cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ mbmi->send_dq_bit &&
#if CONFIG_SUPERTX
!supertx_enabled &&
#endif // CONFIG_SUPERTX
#if CONFIG_COPY_MODE
if (mbmi->copy_mode == NOREF)
#endif // CONFIG_COPY_MODE
+
write_dq_profile(cm, mbmi->dq_off_index, w);
} else {
assert(mbmi->dq_off_index == 0);
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_EXT_TX
if (is_inter &&
write_selected_tx_size(cm, xd, mbmi->tx_size, bsize, w);
}
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN && cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ mbmi->send_dq_bit &&
!mbmi->skip &&
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
write_dq_profile(cm, mbmi->dq_off_index, w);
} else {
assert(mbmi->dq_off_index == 0);
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_TX_SKIP
if (bsize >= BLOCK_8X8) {
&ext_tx_encodings[xd->mi[0].mbmi.ext_txfrm]);
#endif // CONFIG_WAVELETS
#endif // CONFIG_EXT_TX
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (!xd->mi[0].mbmi.skip &&
cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(bsize) &&
+ xd->mi[0].mbmi.send_dq_bit &&
!vp9_segfeature_active(
&cm->seg, xd->mi[0].mbmi.segment_id, SEG_LVL_SKIP)) {
write_dq_profile(cm, xd->mi[0].mbmi.dq_off_index, w);
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
}
#endif // CONFIG_SUPERTX
update_inter_compound_mode_probs(cm, &header_bc);
#endif // CONFIG_NEW_INTER
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
update_dq_profile_probs(cm, &header_bc);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->interp_filter == SWITCHABLE)
update_switchable_interp_probs(cm, &header_bc);
cm->counts.supertx
[partition_supertx_context_lookup[partition]][supertx_size][1]++;
cm->counts.supertx_size[supertx_size]++;
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(bsize) &&
!xd->mi[0].mbmi.skip &&
+ xd->mi[0].mbmi.send_dq_bit &&
!vp9_segfeature_active(&cm->seg, xd->mi[0].mbmi.segment_id,
SEG_LVL_SKIP)) {
++cm->counts.dq_profile[xd->mi[0].mbmi.dq_off_index];
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_EXT_TX
#if CONFIG_WAVELETS
if (!xd->mi[0].mbmi.skip)
#endif
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
dq_index,
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
supertx_size, pc_tree);
}
}
#endif
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
dq_index,
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
supertx_size, pc_tree);
}
}
#endif
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
&dq_index,
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
pc_tree);
tmp_rate += vp9_cost_bit(
vp9_encode_sb(x, MAX(bsize, BLOCK_8X8));
vp9_tokenize_sb(cpi, t, !output_enabled, MAX(bsize, BLOCK_8X8));
}
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
// This is not strictly required, but is a good practice.
// If you remove this, the assert in vp9_bitstream.c needs to be removed also.
if (mbmi->skip)
mbmi->dq_off_index = 0;
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_INTRABC
if (frame_is_intra_only(cm) && output_enabled && bsize >= BLOCK_8X8) {
++cm->counts.ext_tx[mbmi->tx_size][mbmi->ext_txfrm];
}
#endif // CONFIG_EXT_TX
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ mbmi->send_dq_bit &&
#if CONFIG_COPY_MODE
(frame_is_intra_only(cm) || mbmi->copy_mode == NOREF) &&
#endif // CONFIG_COPY_MODE
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
++cm->counts.dq_profile[mbmi->dq_off_index];
}
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
#if CONFIG_TX_SKIP
if (bsize >= BLOCK_8X8) {
int q_idx = vp9_get_qindex(&cm->seg, mbmi->segment_id, cm->base_qindex);
#endif // CONFIG_EXT_TX
#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
*dq_index = 0;
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 &&
}
#endif // CONFIG_SUPERTX
#endif
vp9_highbd_quantize_fp_nuq(coeff, 16, x->skip_block,
p->quant_fp, pd->dequant,
- (const cumbins_type_nuq *)p->cumbins_nuq,
+ (const cumbins_type_nuq *)
+ p->cumbins_nuq[dq],
(const dequant_val_type_nuq *)
pd->dequant_val_nuq[dq],
qcoeff, dqcoeff, eob,
[PALETTE_COLORS];
#endif // CONFIG_PALETTE
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
int dq_profile_costs[QUANT_PROFILES];
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
PICK_MODE_CONTEXT *leaf_tree;
PC_TREE *pc_tree;
vp9_cost_tokens(cpi->palette_uv_color_costs[i][j],
fc->palette_uv_color_prob[i][j], vp9_palette_color_tree);
#endif // CONFIG_PALETTE
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
vp9_cost_tokens(cpi->dq_profile_costs, fc->dq_profile_prob,
vp9_dq_profile_tree);
-#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
}
static void fill_token_costs(vp9_coeff_cost *c,
}
#if CONFIG_NEW_QUANT
mic->mbmi.dq_off_index = 0;
-#if QUANT_PROFILES > 1
+ mic->mbmi.send_dq_bit = 0;
+#if QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cpi->common.base_qindex > Q_THRESHOLD_MIN &&
cpi->common.base_qindex < Q_THRESHOLD_MAX &&
- !xd->lossless && switchable_dq_profile_used(bsize)) {
+ !xd->lossless &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize)) {
int64_t local_tx_cache[TX_MODES];
int i;
int best_dq = -1;
+ mic->mbmi.send_dq_bit = 1;
for (i = 0; i < QUANT_PROFILES; i++) {
mic->mbmi.dq_off_index = i;
super_block_yrd(cpi, x, &this_rate_tokenonly, &this_distortion,
*rate_tokenonly = this_rate_tokenonly;
*distortion = this_distortion;
}
-#endif // QUANT_PROFILES > 1
+#endif // QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+
+#if QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 2) {
+ mic->mbmi.dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 1) {
+ mic->mbmi.dq_off_index = 2;
+#endif // QUANT_PROFILES > 2
+ } else {
+ mic->mbmi.dq_off_index = 0;
+ }
+#endif // QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+
#endif // CONFIG_NEW_QUANT
#if CONFIG_TX_SKIP
#if CONFIG_NEW_QUANT
mbmi->dq_off_index = 0;
-#if QUANT_PROFILES > 1
+ mbmi->send_dq_bit = 0;
+#if QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
// Choose the best dq_index
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- !xd->lossless && switchable_dq_profile_used(bsize)) {
+ !xd->lossless &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, bsize), bsize)) {
int64_t rdcost_dq;
int rate_y_dq;
int64_t distortion_y_dq;
int dummy;
int64_t best_rdcost_dq = INT64_MAX;
int best_dq = -1;
+ mbmi->send_dq_bit = 1;
for (i = 0; i < QUANT_PROFILES; i++) {
mbmi->dq_off_index = i;
super_block_yrd(cpi, x, &rate_y_dq, &distortion_y_dq, &dummy, psse,
}
mbmi->dq_off_index = best_dq;
}
-#endif // QUANT_PROFILES > 1
+#endif // QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+
+#if QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 2) {
+ mbmi->dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 1) {
+ mbmi->dq_off_index = 2;
+#endif // QUANT_PROFILES > 2
+ } else {
+ mbmi->dq_off_index = 0;
+ }
+#endif // QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+
#endif // CONFIG_NEW_QUANT
// Y cost and distortion
#if CONFIG_NEW_QUANT
mbmi->dq_off_index = 0;
-#if QUANT_PROFILES > 1
+ mbmi->send_dq_bit = 0;
+#if QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- !xd->lossless && switchable_dq_profile_used(bsize)) {
+ !xd->lossless &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize)) {
int64_t rdcost_dq;
int rate_y_dq;
int64_t distortion_y_dq;
int dummy;
int64_t best_rdcost_dq = INT64_MAX;
int best_dq = -1;
+ mbmi->send_dq_bit = 1;
for (i = 0; i < QUANT_PROFILES; i++) {
mbmi->dq_off_index = i;
super_block_yrd(cpi, x, &rate_y_dq, &distortion_y_dq, &dummy,
}
mbmi->dq_off_index = best_dq;
}
-#endif // QUANT_PROFILES > 1
+#endif // QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+
+#if QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 2) {
+ mbmi->dq_off_index = 1;
+#if QUANT_PROFILES > 2
+ } else if (switchable_dq_profile_used(get_entropy_context_sb(xd, bsize),
+ bsize) == 1) {
+ mbmi->dq_off_index = 2;
+#endif // QUANT_PROFILES > 2
+ } else {
+ mbmi->dq_off_index = 0;
+ }
+#endif // QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+
#endif // CONFIG_NEW_QUANT
} else {
mbmi->tx_skip[0] = 0;
mbmi->tx_skip[1] = 0;
#endif // CONFIG_TX_SKIP
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (!(cm->base_qindex > Q_THRESHOLD_MIN &&
cm->base_qindex < Q_THRESHOLD_MAX &&
- switchable_dq_profile_used(mbmi->sb_type) &&
+ switchable_dq_profile_used(get_entropy_context_sb(xd, mbmi->sb_type),
+ mbmi->sb_type) &&
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)))
mbmi->dq_off_index = 0;
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
+ mbmi->dq_off_index = 0;
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && Q_CTX_BASED_PROFILES
x->skip = 0;
set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]);
for (i = 0; i < MAX_MB_PLANE; i++) {
rate2 += rate_copy_mode;
this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
-#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1
+#if CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (this_skip2 && mbmi->dq_off_index > 0)
mbmi->dq_off_index = 0;
-#endif
+#endif // CONFIG_NEW_QUANT && QUANT_PROFILES > 1 && !Q_CTX_BASED_PROFILES
if (this_rd < best_rd) {
rd_cost->rate = rate2;