av1_encoder : sharpness affect

This patch changes the effect of the sharpness parameter to the encoder.
It no longer affects the thresholds in the loop filter.  Now it acts this
way:
sharpness
  0 => acts as before.
  1 => stops performing eob and skip block optimization
1-7 => changes rdmult in trellis to favor lower distortion

The effect is images / video include more detail at the same bitrate
but sometimes also more artifacts.

+ when using variance based aq : lower segment ids
also favor lower distortion

Change-Id: Ibfc95bfea3ac1312df01c954f98036bb98b58ff9
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index 5a5b3be..69c8eda 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -115,7 +115,7 @@
 
   (void)fast_mode;
   return av1_optimize_txb_new(cpi, mb, plane, blk_row, blk_col, block, tx_size,
-                              &txb_ctx, rate_cost);
+                              &txb_ctx, rate_cost, cpi->oxcf.sharpness);
 }
 
 typedef enum QUANT_FUNC {
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index d35f7cc..1aadeb1 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -1423,7 +1423,7 @@
     int dc_sign_ctx, int64_t rdmult, int shift, const int16_t *dequant,
     const int16_t *scan, const LV_MAP_EOB_COST *txb_eob_costs,
     const LV_MAP_COEFF_COST *txb_costs, const tran_low_t *tcoeff,
-    tran_low_t *qcoeff, tran_low_t *dqcoeff, uint8_t *levels) {
+    tran_low_t *qcoeff, tran_low_t *dqcoeff, uint8_t *levels, int sharpness) {
   const int dqv = dequant[si != 0];
   assert(si != *eob - 1);
   const int ci = scan[si];
@@ -1498,7 +1498,7 @@
       dist = dist_low;
     }
 
-    if (rd_new_eob < rd) {
+    if (sharpness == 0 && rd_new_eob < rd) {
       for (int ni = 0; ni < *nz_num; ++ni) {
         int last_ci = nz_ci[ni];
         // levels[get_padded_idx(last_ci, bwl)] = 0;
@@ -1534,10 +1534,11 @@
 static INLINE void update_skip(int *accu_rate, int64_t accu_dist, int *eob,
                                int nz_num, int *nz_ci, int64_t rdmult,
                                int skip_cost, int non_skip_cost,
-                               tran_low_t *qcoeff, tran_low_t *dqcoeff) {
+                               tran_low_t *qcoeff, tran_low_t *dqcoeff,
+                               int sharpness) {
   const int64_t rd = RDCOST(rdmult, *accu_rate + non_skip_cost, accu_dist);
   const int64_t rd_new_eob = RDCOST(rdmult, skip_cost, 0);
-  if (rd_new_eob < rd) {
+  if (sharpness == 0 && rd_new_eob < rd) {
     for (int i = 0; i < nz_num; ++i) {
       const int ci = nz_ci[i];
       qcoeff[ci] = 0;
@@ -1552,7 +1553,7 @@
 
 int av1_optimize_txb_new(const struct AV1_COMP *cpi, MACROBLOCK *x, int plane,
                          int blk_row, int blk_col, int block, TX_SIZE tx_size,
-                         TXB_CTX *txb_ctx, int *rate_cost) {
+                         TXB_CTX *txb_ctx, int *rate_cost, int sharpness) {
   const AV1_COMMON *cm = &cpi->common;
   MACROBLOCKD *xd = &x->e_mbd;
   const PLANE_TYPE plane_type = get_plane_type(plane);
@@ -1583,10 +1584,13 @@
   const int64_t rdmult =
       ((x->rdmult * plane_rd_mult[is_inter][plane_type] << (2 * (xd->bd - 8))) +
        2) >>
-      2;
+      (sharpness + (cpi->oxcf.aq_mode == VARIANCE_AQ && mbmi->segment_id < 4
+                        ? 7 - mbmi->segment_id
+                        : 2));
 
   uint8_t levels_buf[TX_PAD_2D];
   uint8_t *const levels = set_levels(levels_buf, width);
+
   av1_txb_init_levels(qcoeff, width, height, levels);
 
   // TODO(angirbird): check iqmatrix
@@ -1633,7 +1637,7 @@
                        tx_size, tx_class_literal, bwl, height,             \
                        txb_ctx->dc_sign_ctx, rdmult, shift, dequant, scan, \
                        txb_eob_costs, txb_costs, tcoeff, qcoeff, dqcoeff,  \
-                       levels);                                            \
+                       levels, sharpness);                                 \
     }                                                                      \
     break;
   switch (tx_class) {
@@ -1646,7 +1650,7 @@
 
   if (si == -1 && nz_num <= max_nz_num) {
     update_skip(&accu_rate, accu_dist, &eob, nz_num, nz_ci, rdmult, skip_cost,
-                non_skip_cost, qcoeff, dqcoeff);
+                non_skip_cost, qcoeff, dqcoeff, sharpness);
   }
 
 #define UPDATE_COEFF_SIMPLE_CASE(tx_class_literal)                             \
diff --git a/av1/encoder/encodetxb.h b/av1/encoder/encodetxb.h
index 8eba04d..62a6017 100644
--- a/av1/encoder/encodetxb.h
+++ b/av1/encoder/encodetxb.h
@@ -79,7 +79,7 @@
 void hbt_destroy();
 int av1_optimize_txb_new(const AV1_COMP *cpi, MACROBLOCK *x, int plane,
                          int blk_row, int blk_col, int block, TX_SIZE tx_size,
-                         TXB_CTX *txb_ctx, int *rate_cost);
+                         TXB_CTX *txb_ctx, int *rate_cost, int sharpness);
 #ifdef __cplusplus
 }
 #endif
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c
index 66f42fa..5f802a7 100644
--- a/av1/encoder/picklpf.c
+++ b/av1/encoder/picklpf.c
@@ -194,7 +194,7 @@
   struct loopfilter *const lf = &cm->lf;
   (void)sd;
 
-  lf->sharpness_level = cm->frame_type == KEY_FRAME ? 0 : cpi->oxcf.sharpness;
+  lf->sharpness_level = 0;
 
   if (method == LPF_PICK_MINIMAL_LPF) {
     lf->filter_level[0] = 0;