Fix filter_intra RDO deficiencies
1) Renable filter_intra in lossless coding
2) Omit the rate of filter_intra flag when palette is picked
BUG=aomedia:1473
Change-Id: I6c371c15e0a373854fc50934d3baee85ae6cdb63
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 06be036e..536f819 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -791,6 +791,12 @@
return TX_INVALID;
}
+static INLINE int av1_filter_intra_allowed(const MB_MODE_INFO *mbmi) {
+ return mbmi->mode == DC_PRED &&
+ mbmi->palette_mode_info.palette_size[0] == 0 &&
+ av1_filter_intra_allowed_txsize(mbmi->tx_size);
+}
+
// Converts block_index for given transform size to index of the block in raster
// order.
static INLINE int av1_block_index_to_raster_order(TX_SIZE tx_size,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 008128a..a5d0842 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -610,8 +610,7 @@
FILTER_INTRA_MODE_INFO *filter_intra_mode_info =
&mbmi->filter_intra_mode_info;
- if (mbmi->mode == DC_PRED && mbmi->palette_mode_info.palette_size[0] == 0 &&
- av1_filter_intra_allowed_txsize(mbmi->tx_size)) {
+ if (av1_filter_intra_allowed(mbmi)) {
filter_intra_mode_info->use_filter_intra = aom_read_symbol(
r, xd->tile_ctx->filter_intra_cdfs[mbmi->tx_size], 2, ACCT_STR);
if (filter_intra_mode_info->use_filter_intra) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 5265287..836f19e 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -622,8 +622,7 @@
static void write_filter_intra_mode_info(const MACROBLOCKD *xd,
const MB_MODE_INFO *const mbmi,
aom_writer *w) {
- if (mbmi->mode == DC_PRED && mbmi->palette_mode_info.palette_size[0] == 0 &&
- av1_filter_intra_allowed_txsize(mbmi->tx_size)) {
+ if (av1_filter_intra_allowed(mbmi)) {
aom_write_symbol(w, mbmi->filter_intra_mode_info.use_filter_intra,
xd->tile_ctx->filter_intra_cdfs[mbmi->tx_size], 2);
if (mbmi->filter_intra_mode_info.use_filter_intra) {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 867dbb28..4ee6e02 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2536,7 +2536,7 @@
total_rate += palette_mode_cost;
}
}
- if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_txsize(mbmi->tx_size)) {
+ if (av1_filter_intra_allowed(mbmi)) {
total_rate += x->filter_intra_cost[mbmi->tx_size][use_filter_intra];
if (use_filter_intra) {
total_rate += x->filter_intra_mode_cost[mbmi->filter_intra_mode_info
@@ -3372,7 +3372,7 @@
ctx->blk_skip[0]);
}
- if (beat_best_rd && !xd->lossless[mbmi->segment_id]) {
+ if (beat_best_rd) {
if (rd_pick_filter_intra_sby(cpi, x, rate, rate_tokenonly, distortion,
skippable, bsize, bmode_costs[DC_PRED],
&best_rd, &best_model_rd, ctx)) {
@@ -9039,7 +9039,7 @@
memcpy(best_blk_skip, x->blk_skip[0],
sizeof(best_blk_skip[0]) * ctx->num_4x4_blk);
- if (mbmi->mode == DC_PRED && !xd->lossless[mbmi->segment_id]) {
+ if (mbmi->mode == DC_PRED) {
RD_STATS rd_stats_y_fi;
int filter_intra_selected_flag = 0;
TX_SIZE best_tx_size = mbmi->tx_size;