Improve compute_residual_from_qlp_coefficients datapath selection
This bases the selection of the datapath on the actual predictor coefficients instead of on the predictor coefficient precision
This commit is contained in:
parent
dd4a263406
commit
6b2fc739ed
@ -96,6 +96,9 @@ void FLAC__lpc_compute_autocorrelation_intrin_neon_lag_14(const FLAC__real data[
|
|||||||
#endif
|
#endif
|
||||||
#endif /* FLAC__NO_ASM */
|
#endif /* FLAC__NO_ASM */
|
||||||
|
|
||||||
|
uint32_t FLAC__lpc_max_prediction_before_shift_bps(uint32_t subframe_bps, const FLAC__int32 qlp_coeff[], uint32_t order);
|
||||||
|
uint32_t FLAC__lpc_max_residual_bps(uint32_t subframe_bps, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FLAC__lpc_compute_lp_coefficients()
|
* FLAC__lpc_compute_lp_coefficients()
|
||||||
* --------------------------------------------------------------------
|
* --------------------------------------------------------------------
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "FLAC/assert.h"
|
#include "FLAC/assert.h"
|
||||||
#include "FLAC/format.h"
|
#include "FLAC/format.h"
|
||||||
@ -259,6 +260,31 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t FLAC__lpc_max_prediction_before_shift_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order)
|
||||||
|
{
|
||||||
|
/* This used to be subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order)
|
||||||
|
* but that treats both the samples as well as the predictor as unknown. The
|
||||||
|
* predictor is known however, so taking the log2 of the sum of the absolute values
|
||||||
|
* of all coefficients is a more accurate representation of the predictor */
|
||||||
|
FLAC__int32 abs_sum_of_qlp_coeff = 0;
|
||||||
|
for(uint32_t i = 0; i < order; i++)
|
||||||
|
abs_sum_of_qlp_coeff += abs(qlp_coeff[i]);
|
||||||
|
if(abs_sum_of_qlp_coeff == 0)
|
||||||
|
abs_sum_of_qlp_coeff = 1;
|
||||||
|
return subframe_bps + FLAC__bitmath_silog2(abs_sum_of_qlp_coeff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t FLAC__lpc_max_residual_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization)
|
||||||
|
{
|
||||||
|
FLAC__int32 predictor_sum_bps = FLAC__lpc_max_prediction_before_shift_bps(subframe_bps, qlp_coeff, order) - lp_quantization;
|
||||||
|
if((int)subframe_bps > predictor_sum_bps)
|
||||||
|
return subframe_bps + 1;
|
||||||
|
else
|
||||||
|
return predictor_sum_bps + 1;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
// silence MSVC warnings about __restrict modifier
|
// silence MSVC warnings about __restrict modifier
|
||||||
#pragma warning ( disable : 4028 )
|
#pragma warning ( disable : 4028 )
|
||||||
|
@ -2797,7 +2797,8 @@ FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, uint32_t channel, ui
|
|||||||
/* decode the subframe */
|
/* decode the subframe */
|
||||||
if(do_full_decode) {
|
if(do_full_decode) {
|
||||||
memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order);
|
memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order);
|
||||||
if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32)
|
if(FLAC__lpc_max_residual_bps(bps, subframe->qlp_coeff, order, subframe->quantization_level) <= 32 &&
|
||||||
|
FLAC__lpc_max_prediction_before_shift_bps(bps, subframe->qlp_coeff, order) <= 32)
|
||||||
FLAC__lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
|
FLAC__lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
|
||||||
else
|
else
|
||||||
FLAC__lpc_restore_signal_wide(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
|
FLAC__lpc_restore_signal_wide(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
|
||||||
|
@ -3865,7 +3865,7 @@ uint32_t evaluate_lpc_subframe_(
|
|||||||
if(ret != 0)
|
if(ret != 0)
|
||||||
return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */
|
return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */
|
||||||
|
|
||||||
if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32)
|
if(FLAC__lpc_max_prediction_before_shift_bps(subframe_bps, qlp_coeff, order) <= 32)
|
||||||
if(subframe_bps <= 16 && qlp_coeff_precision <= 16)
|
if(subframe_bps <= 16 && qlp_coeff_precision <= 16)
|
||||||
encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
|
encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user