1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-24 13:56:33 +02:00

avcodec/mlpenc: cleanup filtering

This commit is contained in:
Paul B Mahol 2023-10-18 20:28:04 +02:00
parent c1053e2e35
commit be2bbfe71d

View File

@ -439,7 +439,7 @@ static void default_decoding_params(MLPEncodeContext *ctx, DecodingParams *dp)
param_presence_flags |= PARAM_OUTSHIFT; param_presence_flags |= PARAM_OUTSHIFT;
param_presence_flags |= PARAM_QUANTSTEP; param_presence_flags |= PARAM_QUANTSTEP;
param_presence_flags |= PARAM_FIR; param_presence_flags |= PARAM_FIR;
/*param_presence_flags |= PARAM_IIR; */ param_presence_flags |= PARAM_IIR;
param_presence_flags |= PARAM_HUFFOFFSET; param_presence_flags |= PARAM_HUFFOFFSET;
param_presence_flags |= PARAM_PRESENT; param_presence_flags |= PARAM_PRESENT;
@ -1251,7 +1251,7 @@ static void determine_quant_step_size(MLPEncodeContext *ctx)
* coefficients, and if it's possible to right-shift their values without * coefficients, and if it's possible to right-shift their values without
* losing any precision. * losing any precision.
*/ */
static void code_filter_coeffs(MLPEncodeContext *ctx, FilterParams *fp, int32_t *fcoeff) static void code_filter_coeffs(MLPEncodeContext *ctx, FilterParams *fp, const int32_t *fcoeff)
{ {
uint32_t coeff_mask = 0; uint32_t coeff_mask = 0;
int bits = 0, shift; int bits = 0, shift;
@ -1272,24 +1272,20 @@ static void code_filter_coeffs(MLPEncodeContext *ctx, FilterParams *fp, int32_t
/** Determines the best filter parameters for the given data and writes the /** Determines the best filter parameters for the given data and writes the
* necessary information to the context. * necessary information to the context.
* TODO Add IIR filter predictor!
*/ */
static void set_filter_params(MLPEncodeContext *ctx, static void set_filter(MLPEncodeContext *ctx,
unsigned int channel, unsigned int filter, int channel, int clear_filter)
int clear_filter)
{ {
ChannelParams *cp = &ctx->b[1].channel_params[channel]; ChannelParams *cp = &ctx->b[1].channel_params[channel];
FilterParams *fp = &cp->filter_params[filter]; FilterParams *fp = &cp->filter_params[FIR];
if (clear_filter) { if (clear_filter) {
fp->order = 0; fp->order = 0;
} else if (filter == IIR) { } else {
fp->order = 0;
} else if (filter == FIR) {
const int max_order = MAX_FIR_ORDER; const int max_order = MAX_FIR_ORDER;
int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER]; int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
int32_t *lpc_samples = ctx->lpc_sample_buffer; int32_t *lpc_samples = ctx->lpc_sample_buffer;
int32_t *fcoeff = cp->coeff[filter]; int32_t *fcoeff = cp->coeff[FIR];
int shift[MAX_LPC_ORDER]; int shift[MAX_LPC_ORDER];
int order; int order;
@ -1328,10 +1324,8 @@ static void determine_filters(MLPEncodeContext *ctx)
{ {
RestartHeader *rh = ctx->cur_restart_header; RestartHeader *rh = ctx->cur_restart_header;
for (int channel = rh->min_channel; channel <= rh->max_channel; channel++) { for (int ch = rh->min_channel; ch <= rh->max_channel; ch++)
for (int filter = 0; filter < NUM_FILTERS; filter++) set_filter(ctx, ch, 0);
set_filter_params(ctx, channel, filter, 0);
}
} }
static int estimate_coeff(MLPEncodeContext *ctx, static int estimate_coeff(MLPEncodeContext *ctx,
@ -1769,13 +1763,12 @@ static void apply_filters(MLPEncodeContext *ctx)
{ {
RestartHeader *rh = ctx->cur_restart_header; RestartHeader *rh = ctx->cur_restart_header;
for (int channel = rh->min_channel; channel <= rh->max_channel; channel++) { for (int ch = rh->min_channel; ch <= rh->max_channel; ch++) {
if (apply_filter(ctx, channel) < 0) { if (apply_filter(ctx, ch) < 0) {
/* Filter is horribly wrong. /* Filter is horribly wrong.
* Clear filter params and update state. */ * Clear filter parameters and update state. */
set_filter_params(ctx, channel, FIR, 1); set_filter(ctx, ch, 1);
set_filter_params(ctx, channel, IIR, 1); apply_filter(ctx, ch);
apply_filter(ctx, channel);
} }
} }
} }