From df59845d04a3c43e3caea5d9838d08b9b17ba572 Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Fri, 28 Apr 2006 00:13:34 +0000 Subject: [PATCH] fix calculation bugs in encode_subframe_(): max_qlp_coeff_precision when qlp_coeff_prec_search; account for qlp coeff overhead in guessing the best lpc order; default to hann instead of rectangular window on assertion failure --- src/libFLAC/stream_encoder.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/libFLAC/stream_encoder.c b/src/libFLAC/stream_encoder.c index 2bfe5d0..21ea026 100644 --- a/src/libFLAC/stream_encoder.c +++ b/src/libFLAC/stream_encoder.c @@ -1985,7 +1985,7 @@ FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_size) default: FLAC__ASSERT(0); /* double protection */ - FLAC__window_rectangle(encoder->private_->window[i], new_size); + FLAC__window_hann(encoder->private_->window[i], new_size); break; } } @@ -2519,7 +2519,17 @@ FLAC__bool process_subframe_( min_lpc_order = 1; } else { - unsigned guess_lpc_order = FLAC__lpc_compute_best_order(lpc_error, max_lpc_order, frame_header->blocksize, subframe_bps); + const unsigned guess_lpc_order = + FLAC__lpc_compute_best_order( + lpc_error, + max_lpc_order, + frame_header->blocksize, + subframe_bps + ( + encoder->protected_->do_qlp_coeff_prec_search? + FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ + encoder->protected_->qlp_coeff_precision + ) + ); min_lpc_order = max_lpc_order = guess_lpc_order; } for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { @@ -2529,16 +2539,18 @@ FLAC__bool process_subframe_( rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { - #ifdef DEBUG_VERBOSE +#ifdef DEBUG_VERBOSE fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1); - #endif +#endif rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1; } if(encoder->protected_->do_qlp_coeff_prec_search) { min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; - /* ensure a 32-bit datapath throughout for 16bps or less */ - if(subframe_bps <= 16) + /* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ + if(subframe_bps <= 17) { max_qlp_coeff_precision = min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); + max_qlp_coeff_precision = max(max_qlp_coeff_precision, min_qlp_coeff_precision); + } else max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; } -- 2.7.4