mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Use the same coeff cost calculation for all rd modes.
- It's not worth it to have these faster approximations for coefficient cost.
This commit is contained in:
parent
870171e6ad
commit
81ad583e08
14
src/rdo.c
14
src/rdo.c
|
@ -212,19 +212,7 @@ uint32_t rdo_cost_intra(encoder_state * const encoder_state, pixel *pred, pixel
|
||||||
ssd += diff*diff;
|
ssd += diff*diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
double coeff_bits = 0;
|
double coeff_bits = get_coeff_cost(encoder_state, temp_coeff, width, 0, luma_scan_mode);
|
||||||
// Simple RDO
|
|
||||||
if(encoder->rdo == 1) {
|
|
||||||
// SSD between reconstruction and original + sum of coeffs
|
|
||||||
int coeff_abs = 0;
|
|
||||||
for (i = 0; i < width*width; i++) {
|
|
||||||
coeff_abs += abs((int)temp_coeff[i]);
|
|
||||||
}
|
|
||||||
coeff_bits += 1 + 1.5 * coeff_abs;
|
|
||||||
// Full RDO
|
|
||||||
} else if(encoder->rdo >= 2) {
|
|
||||||
coeff_bits = get_coeff_cost(encoder_state, temp_coeff, width, 0, luma_scan_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (uint32_t)(0.5 + ssd + coeff_bits * encoder_state->global->cur_lambda_cost);
|
return (uint32_t)(0.5 + ssd + coeff_bits * encoder_state->global->cur_lambda_cost);
|
||||||
}
|
}
|
||||||
|
|
|
@ -989,7 +989,7 @@ static double cu_rd_cost_luma(const encoder_state *const encoder_state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rdo >= 1) {
|
{
|
||||||
coefficient coeff_temp[32 * 32];
|
coefficient coeff_temp[32 * 32];
|
||||||
int8_t luma_scan_mode = get_scan_order(pred_cu->type, pred_cu->intra[PU_INDEX(x_px / 4, y_px / 4)].mode, depth);
|
int8_t luma_scan_mode = get_scan_order(pred_cu->type, pred_cu->intra[PU_INDEX(x_px / 4, y_px / 4)].mode, depth);
|
||||||
|
|
||||||
|
@ -1063,7 +1063,7 @@ static double cu_rd_cost_chroma(const encoder_state *const encoder_state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rdo >= 1) {
|
{
|
||||||
coefficient coeff_temp[16 * 16];
|
coefficient coeff_temp[16 * 16];
|
||||||
int8_t scan_order = get_scan_order(pred_cu->type, pred_cu->intra[0].mode_chroma, depth);
|
int8_t scan_order = get_scan_order(pred_cu->type, pred_cu->intra[0].mode_chroma, depth);
|
||||||
|
|
||||||
|
|
|
@ -460,32 +460,9 @@ int quantize_residual_trskip(
|
||||||
0, in_stride, 4,
|
0, in_stride, 4,
|
||||||
ref_in, pred_in, noskip.rec, noskip.coeff);
|
ref_in, pred_in, noskip.rec, noskip.coeff);
|
||||||
noskip.cost = pixels_calc_ssd(ref_in, noskip.rec, in_stride, 4, 4);
|
noskip.cost = pixels_calc_ssd(ref_in, noskip.rec, in_stride, 4, 4);
|
||||||
if (encoder_state->encoder_control->rdo == 1) {
|
noskip.cost += get_coeff_cost(encoder_state, noskip.coeff, 4, 0, scan_order) * bit_cost;
|
||||||
// Estimate bit cost of encoding the coeffs as ~(1.5 * abs_sum).
|
|
||||||
unsigned abs_coeffs = coefficients_calc_abs(noskip.coeff, 4, 4);
|
|
||||||
noskip.cost += (abs_coeffs + (abs_coeffs / 2)) * bit_cost;
|
|
||||||
} else if (encoder_state->encoder_control->rdo >= 2) {
|
|
||||||
noskip.cost += get_coeff_cost(encoder_state, noskip.coeff, 4, 0, scan_order) * bit_cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encoder_state->encoder_control->rdo == 0) {
|
skip.cost += get_coeff_cost(encoder_state, skip.coeff, 4, 0, scan_order) * bit_cost;
|
||||||
// Evaluating whether to use transform skip or not requires doing the
|
|
||||||
// transform. So if rdo is off, it's probably better to not use trskip.
|
|
||||||
skip.cost = UINT32_MAX;
|
|
||||||
} else {
|
|
||||||
skip.has_coeffs = quantize_residual(
|
|
||||||
encoder_state, cur_cu, width, color, scan_order,
|
|
||||||
1, in_stride, 4,
|
|
||||||
ref_in, pred_in, skip.rec, skip.coeff);
|
|
||||||
skip.cost = pixels_calc_ssd(ref_in, skip.rec, in_stride, 4, 4);
|
|
||||||
if (encoder_state->encoder_control->rdo == 1) {
|
|
||||||
// Estimate bit cost of encoding the coeffs as ~(1.5 * abs_sum + 1).
|
|
||||||
unsigned abs_coeffs = coefficients_calc_abs(skip.coeff, 4, 4);
|
|
||||||
skip.cost += (1 + abs_coeffs + (abs_coeffs / 2)) * bit_cost;
|
|
||||||
} else if (encoder_state->encoder_control->rdo >= 2) {
|
|
||||||
skip.cost += get_coeff_cost(encoder_state, skip.coeff, 4, 0, scan_order) * bit_cost;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (noskip.cost <= skip.cost) {
|
if (noskip.cost <= skip.cost) {
|
||||||
*trskip_out = 0;
|
*trskip_out = 0;
|
||||||
|
|
Loading…
Reference in a new issue