From 14892fda00d9d9c0b1bb9e222b078563691f47bd Mon Sep 17 00:00:00 2001 From: Ari Lemmetti Date: Sun, 10 Dec 2017 01:23:48 +0200 Subject: [PATCH] Replace simple coefficient cost estimation with CABAC. Substantial improvement. Approximation proved to be too inaccurate while not giving actually that much speedup. --- src/rdo.c | 29 +---------------------------- src/rdo.h | 11 ++++++----- src/search.c | 6 +++--- src/transform.c | 4 ++-- 4 files changed, 12 insertions(+), 38 deletions(-) diff --git a/src/rdo.c b/src/rdo.c index 75af9d34..31e1fdd8 100644 --- a/src/rdo.c +++ b/src/rdo.c @@ -41,8 +41,6 @@ #define LOG2_SCAN_SET_SIZE 4 #define SBH_THRESHOLD 4 -static const double COEFF_SUM_MULTIPLIER = 1.9; - const uint32_t kvz_g_go_rice_range[5] = { 7, 14, 26, 46, 78 }; const uint32_t kvz_g_go_rice_prefix_len[5] = { 8, 7, 6, 5, 4 }; @@ -154,7 +152,7 @@ struct sh_rates_t { * * \returns bits needed to code input coefficients */ -static INLINE uint32_t get_coeff_cabac_cost( +uint32_t kvz_get_coeff_cabac_cost( const encoder_state_t * const state, const coeff_t *coeff, int32_t width, @@ -195,31 +193,6 @@ static INLINE uint32_t get_coeff_cabac_cost( return (23 - cabac_copy.bits_left) + (cabac_copy.num_buffered_bytes << 3); } - -/** - * \brief Estimate bitcost for coding coefficients. - * - * \param coeff coefficient array - * \param width coeff block width - * \param type data type (0 == luma) - * - * \returns number of bits needed to code coefficients - */ -uint32_t kvz_get_coeff_cost(const encoder_state_t * const state, - const coeff_t *coeff, - int32_t width, - int32_t type, - int8_t scan_mode) -{ - if (state->encoder_control->cfg.rdo > 0) { - return get_coeff_cabac_cost(state, coeff, width, type, scan_mode); - - } else { - return COEFF_SUM_MULTIPLIER * kvz_coeff_abs_sum(coeff, width * width) + 0.5; - } -} - - #define COEF_REMAIN_BIN_REDUCTION 3 /** Calculates the cost for specific absolute transform level * \param abs_level scaled quantized level diff --git a/src/rdo.h b/src/rdo.h index 283466bf..8a8e0022 100644 --- a/src/rdo.h +++ b/src/rdo.h @@ -39,11 +39,12 @@ extern const uint32_t kvz_g_go_rice_prefix_len[5]; void kvz_rdoq(encoder_state_t *state, coeff_t *coef, coeff_t *dest_coeff, int32_t width, int32_t height, int8_t type, int8_t scan_mode, int8_t block_type, int8_t tr_depth); -uint32_t kvz_get_coeff_cost(const encoder_state_t *state, - const coeff_t *coeff, - int32_t width, - int32_t type, - int8_t scan_mode); +uint32_t kvz_get_coeff_cabac_cost( + const encoder_state_t * const state, + const coeff_t *coeff, + int32_t width, + int32_t type, + int8_t scan_mode); int32_t kvz_get_ic_rate(encoder_state_t *state, uint32_t abs_level, uint16_t ctx_num_one, uint16_t ctx_num_abs, uint16_t abs_go_rice, uint32_t c1_idx, uint32_t c2_idx, int8_t type); diff --git a/src/search.c b/src/search.c index ca484dd0..a0d51523 100644 --- a/src/search.c +++ b/src/search.c @@ -262,7 +262,7 @@ double kvz_cu_rd_cost_luma(const encoder_state_t *const state, int8_t luma_scan_mode = kvz_get_scan_order(pred_cu->type, pred_cu->intra.mode, depth); const coeff_t *coeffs = &lcu->coeff.y[xy_to_zorder(LCU_WIDTH, x_px, y_px)]; - coeff_bits += kvz_get_coeff_cost(state, coeffs, width, 0, luma_scan_mode); + coeff_bits += kvz_get_coeff_cabac_cost(state, coeffs, width, 0, luma_scan_mode); } double bits = tr_tree_bits + coeff_bits; @@ -331,8 +331,8 @@ double kvz_cu_rd_cost_chroma(const encoder_state_t *const state, int8_t scan_order = kvz_get_scan_order(pred_cu->type, pred_cu->intra.mode_chroma, depth); const int index = xy_to_zorder(LCU_WIDTH_C, lcu_px.x, lcu_px.y); - coeff_bits += kvz_get_coeff_cost(state, &lcu->coeff.u[index], width, 2, scan_order); - coeff_bits += kvz_get_coeff_cost(state, &lcu->coeff.v[index], width, 2, scan_order); + coeff_bits += kvz_get_coeff_cabac_cost(state, &lcu->coeff.u[index], width, 2, scan_order); + coeff_bits += kvz_get_coeff_cabac_cost(state, &lcu->coeff.v[index], width, 2, scan_order); } double bits = tr_tree_bits + coeff_bits; diff --git a/src/transform.c b/src/transform.c index 7c5a9b0c..2abca708 100644 --- a/src/transform.c +++ b/src/transform.c @@ -238,14 +238,14 @@ int kvz_quantize_residual_trskip( 0, in_stride, 4, ref_in, pred_in, noskip.rec, noskip.coeff); noskip.cost = kvz_pixels_calc_ssd(ref_in, noskip.rec, in_stride, 4, 4); - noskip.cost += kvz_get_coeff_cost(state, noskip.coeff, 4, 0, scan_order) * bit_cost; + noskip.cost += kvz_get_coeff_cabac_cost(state, noskip.coeff, 4, 0, scan_order) * bit_cost; skip.has_coeffs = kvz_quantize_residual( state, cur_cu, width, color, scan_order, 1, in_stride, 4, ref_in, pred_in, skip.rec, skip.coeff); skip.cost = kvz_pixels_calc_ssd(ref_in, skip.rec, in_stride, 4, 4); - skip.cost += kvz_get_coeff_cost(state, skip.coeff, 4, 0, scan_order) * bit_cost; + skip.cost += kvz_get_coeff_cabac_cost(state, skip.coeff, 4, 0, scan_order) * bit_cost; if (noskip.cost <= skip.cost) { *trskip_out = 0;