Skip non-reference position chroma uv intra mode coding
Skip coding the intra mode for chroma component for sub8x8 blocks
that are not in the reference position.
Change-Id: Ic3daab2668ab41c3b743664faf195e34124ead33
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 7830ba9..0779c7a 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1362,6 +1362,7 @@
}
static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
+ const int mi_row, const int mi_col,
#if CONFIG_SUPERTX
int supertx_enabled,
#endif
@@ -1421,8 +1422,6 @@
#endif // CONFIG_SUPERTX
#if CONFIG_DELTA_Q
if (cm->delta_q_present_flag) {
- int mi_row = (-xd->mb_to_top_edge) >> (MI_SIZE_LOG2 + 3);
- int mi_col = (-xd->mb_to_left_edge) >> (MI_SIZE_LOG2 + 3);
int super_block_upper_left =
((mi_row & MAX_MIB_MASK) == 0) && ((mi_col & MAX_MIB_MASK) == 0);
if ((bsize != BLOCK_64X64 || skip == 0) && super_block_upper_left) {
@@ -1506,7 +1505,12 @@
aom_write_symbol(w, av1_intra_mode_ind[mbmi->uv_mode],
ec_ctx->uv_mode_cdf[mode], INTRA_MODES);
#else
+#if CONFIG_CB4X4
+ if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col))
+ write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]);
+#else
write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]);
+#endif // CONFIG_CB4X4
#endif
#if CONFIG_EXT_INTRA
write_intra_angle_info(cm, xd, w);
@@ -1766,11 +1770,13 @@
}
#if CONFIG_DELTA_Q
-static void write_mb_modes_kf(AV1_COMMON *cm, MACROBLOCKD *xd,
- MODE_INFO **mi_8x8, aom_writer *w) {
+static void write_mb_modes_kf(AV1_COMMON *cm, MACROBLOCKD *xd, const int mi_row,
+ const int mi_col, MODE_INFO **mi_8x8,
+ aom_writer *w) {
int skip;
#else
static void write_mb_modes_kf(AV1_COMMON *cm, const MACROBLOCKD *xd,
+ const int mi_row, const int mi_col,
MODE_INFO **mi_8x8, aom_writer *w) {
#endif
const struct segmentation *const seg = &cm->seg;
@@ -1797,8 +1803,6 @@
#if CONFIG_DELTA_Q
skip = write_skip(cm, xd, mbmi->segment_id, mi, w);
if (cm->delta_q_present_flag) {
- int mi_row = (-xd->mb_to_top_edge) >> 6;
- int mi_col = (-xd->mb_to_left_edge) >> 6;
int super_block_upper_left = ((mi_row & 7) == 0) && ((mi_col & 7) == 0);
if ((bsize != BLOCK_64X64 || skip == 0) && super_block_upper_left) {
int reduced_delta_qindex =
@@ -1856,7 +1860,12 @@
aom_write_symbol(w, av1_intra_mode_ind[mbmi->uv_mode],
ec_ctx->uv_mode_cdf[mbmi->mode], INTRA_MODES);
#else
+#if CONFIG_CB4X4
+ if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col))
+ write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mbmi->mode]);
+#else
write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mbmi->mode]);
+#endif // CONFIG_CB4X4
#endif
#if CONFIG_EXT_INTRA
write_intra_angle_info(cm, xd, w);
@@ -1972,7 +1981,7 @@
#endif
if (frame_is_intra_only(cm)) {
- write_mb_modes_kf(cm, xd, xd->mi, w);
+ write_mb_modes_kf(cm, xd, mi_row, mi_col, xd->mi, w);
} else {
#if CONFIG_VAR_TX
xd->above_txfm_context = cm->above_txfm_context + mi_col;
@@ -2009,7 +2018,7 @@
m->mbmi.ref_frame[0], m->mbmi.ref_frame[1]);
}
#endif // 0
- pack_inter_mode_mvs(cpi, m,
+ pack_inter_mode_mvs(cpi, m, mi_row, mi_col,
#if CONFIG_SUPERTX
supertx_enabled,
#endif