summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJames Bankoski <jimbankoski@google.com>2018-08-14 16:01:05 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-08-14 16:01:05 +0000
commit7b925825a1668ab26b80c163d1b507e607a5254d (patch)
treeae8003e2d3760b92b8fb6bcf8e62a34e26d5b90b /vp9/encoder
parent56735e5532e86968a094802b89e895c5575d1d4e (diff)
parent944ede0285215f6dbdc4d47a1c896e7f7e3e212c (diff)
downloadlibvpx-7b925825a1668ab26b80c163d1b507e607a5254d.tar
libvpx-7b925825a1668ab26b80c163d1b507e607a5254d.tar.gz
libvpx-7b925825a1668ab26b80c163d1b507e607a5254d.tar.bz2
libvpx-7b925825a1668ab26b80c163d1b507e607a5254d.zip
Merge "Make Sharpness parameter affect visual sharpness"
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_block.h6
-rw-r--r--vp9/encoder/vp9_encodeframe.c2
-rw-r--r--vp9/encoder/vp9_encodemb.c48
-rw-r--r--vp9/encoder/vp9_encoder.c1
-rw-r--r--vp9/encoder/vp9_picklpf.c2
-rw-r--r--vp9/encoder/vp9_quantize.c13
-rw-r--r--vp9/encoder/vp9_rdopt.c3
7 files changed, 56 insertions, 19 deletions
diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h
index 36cf227cb..31cf2b5a8 100644
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -116,6 +116,12 @@ struct macroblock {
int *nmvsadcost_hp[2];
int **mvsadcost;
+ // sharpness is used to disable skip mode and change rd_mult
+ int sharpness;
+
+ // aq mode is used to adjust rd based on segment.
+ int adjust_rdmult_by_segment;
+
// These define limits to motion vector components to prevent them
// from extending outside the UMV borders
MvLimits mv_limits;
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 8aa8660d8..a450ae752 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -5478,6 +5478,8 @@ static void encode_frame_internal(VP9_COMP *cpi) {
x->optimize = sf->optimize_coefficients == 1 && cpi->oxcf.pass != 1;
#endif
if (xd->lossless) x->optimize = 0;
+ x->sharpness = cpi->oxcf.sharpness;
+ x->adjust_rdmult_by_segment = (cpi->oxcf.aq_mode == VARIANCE_AQ);
cm->tx_mode = select_tx_mode(cpi, xd);
diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c
index bc2765728..a68a0926a 100644
--- a/vp9/encoder/vp9_encodemb.c
+++ b/vp9/encoder/vp9_encodemb.c
@@ -77,13 +77,19 @@ int vp9_optimize_b(MACROBLOCK *mb, int plane, int block, TX_SIZE tx_size,
const scan_order *const so = get_scan(xd, tx_size, plane_type, block);
const int16_t *const scan = so->scan;
const int16_t *const nb = so->neighbors;
+ const MODE_INFO *mbmi = xd->mi[0];
+ const int sharpness = mb->sharpness;
+ const int64_t rdadj = (int64_t)mb->rdmult * plane_rd_mult[ref][plane_type];
const int64_t rdmult =
- ((int64_t)mb->rdmult * plane_rd_mult[ref][plane_type]) >> 1;
+ (sharpness == 0 ? rdadj >> 1
+ : (rdadj * (8 - sharpness + mbmi->segment_id)) >> 4);
+
const int64_t rddiv = mb->rddiv;
int64_t rd_cost0, rd_cost1;
int64_t rate0, rate1;
int16_t t0, t1;
int i, final_eob;
+ int count_high_values_after_eob = 0;
#if CONFIG_VP9_HIGHBITDEPTH
const uint16_t *cat6_high_cost = vp9_get_high_cost_table(xd->bd);
#else
@@ -263,6 +269,7 @@ int vp9_optimize_b(MACROBLOCK *mb, int plane, int block, TX_SIZE tx_size,
assert(distortion0 <= distortion_for_zero);
token_cache[rc] = vp9_pt_energy_class[t0];
}
+ if (sharpness > 0 && abs(qcoeff[rc]) > 1) count_high_values_after_eob++;
assert(accu_error >= 0);
x_prev = qcoeff[rc]; // Update based on selected quantized value.
@@ -273,6 +280,7 @@ int vp9_optimize_b(MACROBLOCK *mb, int plane, int block, TX_SIZE tx_size,
if (best_eob_cost_cur < best_block_rd_cost) {
best_block_rd_cost = best_eob_cost_cur;
final_eob = i + 1;
+ count_high_values_after_eob = 0;
if (use_x1) {
before_best_eob_qc = x1;
before_best_eob_dqc = dqc1;
@@ -284,19 +292,31 @@ int vp9_optimize_b(MACROBLOCK *mb, int plane, int block, TX_SIZE tx_size,
}
}
}
- assert(final_eob <= eob);
- if (final_eob > 0) {
- int rc;
- assert(before_best_eob_qc != 0);
- i = final_eob - 1;
- rc = scan[i];
- qcoeff[rc] = before_best_eob_qc;
- dqcoeff[rc] = before_best_eob_dqc;
- }
- for (i = final_eob; i < eob; i++) {
- int rc = scan[i];
- qcoeff[rc] = 0;
- dqcoeff[rc] = 0;
+ if (count_high_values_after_eob > 0) {
+ final_eob = eob - 1;
+ for (; final_eob >= 0; final_eob--) {
+ const int rc = scan[final_eob];
+ const int x = qcoeff[rc];
+ if (x) {
+ break;
+ }
+ }
+ final_eob++;
+ } else {
+ assert(final_eob <= eob);
+ if (final_eob > 0) {
+ int rc;
+ assert(before_best_eob_qc != 0);
+ i = final_eob - 1;
+ rc = scan[i];
+ qcoeff[rc] = before_best_eob_qc;
+ dqcoeff[rc] = before_best_eob_dqc;
+ }
+ for (i = final_eob; i < eob; i++) {
+ int rc = scan[i];
+ qcoeff[rc] = 0;
+ dqcoeff[rc] = 0;
+ }
}
mb->plane[plane].eobs[block] = final_eob;
return final_eob;
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 56dca855c..df4fe7fd3 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -1876,6 +1876,7 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
int last_w = cpi->oxcf.width;
int last_h = cpi->oxcf.height;
+ vp9_init_quantizer(cpi);
if (cm->profile != oxcf->profile) cm->profile = oxcf->profile;
cm->bit_depth = oxcf->bit_depth;
cm->color_space = oxcf->color_space;
diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c
index 4e9649065..f3c11700f 100644
--- a/vp9/encoder/vp9_picklpf.c
+++ b/vp9/encoder/vp9_picklpf.c
@@ -150,7 +150,7 @@ void vp9_pick_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi,
VP9_COMMON *const cm = &cpi->common;
struct loopfilter *const lf = &cm->lf;
- 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) {
lf->filter_level = 0;
diff --git a/vp9/encoder/vp9_quantize.c b/vp9/encoder/vp9_quantize.c
index 276022a56..75f3a8ba7 100644
--- a/vp9/encoder/vp9_quantize.c
+++ b/vp9/encoder/vp9_quantize.c
@@ -220,13 +220,20 @@ void vp9_init_quantizer(VP9_COMP *cpi) {
int i, q, quant;
for (q = 0; q < QINDEX_RANGE; q++) {
- const int qzbin_factor = get_qzbin_factor(q, cm->bit_depth);
- const int qrounding_factor = q == 0 ? 64 : 48;
+ int qzbin_factor = get_qzbin_factor(q, cm->bit_depth);
+ int qrounding_factor = q == 0 ? 64 : 48;
+ const int sharpness_adjustment = 16 * (7 - cpi->oxcf.sharpness) / 7;
+
+ if (cpi->oxcf.sharpness > 0 && q > 0) {
+ qzbin_factor = 64 + sharpness_adjustment;
+ qrounding_factor = 64 - sharpness_adjustment;
+ }
for (i = 0; i < 2; ++i) {
int qrounding_factor_fp = i == 0 ? 48 : 42;
if (q == 0) qrounding_factor_fp = 64;
-
+ if (cpi->oxcf.sharpness > 0)
+ qrounding_factor_fp = 64 - sharpness_adjustment;
// y
quant = i == 0 ? vp9_dc_quant(q, cm->y_dc_delta_q, cm->bit_depth)
: vp9_ac_quant(q, 0, cm->bit_depth);
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 282cf2f52..cfde5fd70 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -763,7 +763,8 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
rd = VPXMIN(rd1, rd2);
if (plane == 0) {
x->zcoeff_blk[tx_size][block] =
- !x->plane[plane].eobs[block] || (rd1 > rd2 && !xd->lossless);
+ !x->plane[plane].eobs[block] ||
+ (x->sharpness == 0 && rd1 > rd2 && !xd->lossless);
x->sum_y_eobs[tx_size] += x->plane[plane].eobs[block];
}