mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2025-02-17 10:28:13 +00:00
lavc/lpc: Add min_shift parameter in LPC
The min_shift parameter is needed by the MLP encoder Signed-off-by: Jai Luthra <me@jailuthra.in> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
88bcdf109a
commit
0c023d181e
@ -38,6 +38,7 @@
|
|||||||
#define DEFAULT_MAX_PRED_ORDER 6
|
#define DEFAULT_MAX_PRED_ORDER 6
|
||||||
#define DEFAULT_MIN_PRED_ORDER 4
|
#define DEFAULT_MIN_PRED_ORDER 4
|
||||||
#define ALAC_MAX_LPC_PRECISION 9
|
#define ALAC_MAX_LPC_PRECISION 9
|
||||||
|
#define ALAC_MIN_LPC_SHIFT 0
|
||||||
#define ALAC_MAX_LPC_SHIFT 9
|
#define ALAC_MAX_LPC_SHIFT 9
|
||||||
|
|
||||||
#define ALAC_CHMODE_LEFT_RIGHT 0
|
#define ALAC_CHMODE_LEFT_RIGHT 0
|
||||||
@ -171,7 +172,8 @@ static void calc_predictor_params(AlacEncodeContext *s, int ch)
|
|||||||
s->max_prediction_order,
|
s->max_prediction_order,
|
||||||
ALAC_MAX_LPC_PRECISION, coefs, shift,
|
ALAC_MAX_LPC_PRECISION, coefs, shift,
|
||||||
FF_LPC_TYPE_LEVINSON, 0,
|
FF_LPC_TYPE_LEVINSON, 0,
|
||||||
ORDER_METHOD_EST, ALAC_MAX_LPC_SHIFT, 1);
|
ORDER_METHOD_EST, ALAC_MIN_LPC_SHIFT,
|
||||||
|
ALAC_MAX_LPC_SHIFT, 1);
|
||||||
|
|
||||||
s->lpc[ch].lpc_order = opt_order;
|
s->lpc[ch].lpc_order = opt_order;
|
||||||
s->lpc[ch].lpc_quant = shift[opt_order-1];
|
s->lpc[ch].lpc_quant = shift[opt_order-1];
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#define MAX_PARTITION_ORDER 8
|
#define MAX_PARTITION_ORDER 8
|
||||||
#define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER)
|
#define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER)
|
||||||
#define MAX_LPC_PRECISION 15
|
#define MAX_LPC_PRECISION 15
|
||||||
|
#define MIN_LPC_SHIFT 0
|
||||||
#define MAX_LPC_SHIFT 15
|
#define MAX_LPC_SHIFT 15
|
||||||
|
|
||||||
enum CodingMode {
|
enum CodingMode {
|
||||||
@ -884,7 +885,7 @@ static int encode_residual_ch(FlacEncodeContext *s, int ch)
|
|||||||
opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, smp, n, min_order, max_order,
|
opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, smp, n, min_order, max_order,
|
||||||
s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type,
|
s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type,
|
||||||
s->options.lpc_passes, omethod,
|
s->options.lpc_passes, omethod,
|
||||||
MAX_LPC_SHIFT, 0);
|
MIN_LPC_SHIFT, MAX_LPC_SHIFT, 0);
|
||||||
|
|
||||||
if (omethod == ORDER_METHOD_2LEVEL ||
|
if (omethod == ORDER_METHOD_2LEVEL ||
|
||||||
omethod == ORDER_METHOD_4LEVEL ||
|
omethod == ORDER_METHOD_4LEVEL ||
|
||||||
|
@ -93,7 +93,8 @@ static void lpc_compute_autocorr_c(const double *data, int len, int lag,
|
|||||||
* Quantize LPC coefficients
|
* Quantize LPC coefficients
|
||||||
*/
|
*/
|
||||||
static void quantize_lpc_coefs(double *lpc_in, int order, int precision,
|
static void quantize_lpc_coefs(double *lpc_in, int order, int precision,
|
||||||
int32_t *lpc_out, int *shift, int max_shift, int zero_shift)
|
int32_t *lpc_out, int *shift, int min_shift,
|
||||||
|
int max_shift, int zero_shift)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
double cmax, error;
|
double cmax, error;
|
||||||
@ -118,7 +119,7 @@ static void quantize_lpc_coefs(double *lpc_in, int order, int precision,
|
|||||||
|
|
||||||
/* calculate level shift which scales max coeff to available bits */
|
/* calculate level shift which scales max coeff to available bits */
|
||||||
sh = max_shift;
|
sh = max_shift;
|
||||||
while((cmax * (1 << sh) > qmax) && (sh > 0)) {
|
while((cmax * (1 << sh) > qmax) && (sh > min_shift)) {
|
||||||
sh--;
|
sh--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +202,7 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
|||||||
int max_order, int precision,
|
int max_order, int precision,
|
||||||
int32_t coefs[][MAX_LPC_ORDER], int *shift,
|
int32_t coefs[][MAX_LPC_ORDER], int *shift,
|
||||||
enum FFLPCType lpc_type, int lpc_passes,
|
enum FFLPCType lpc_type, int lpc_passes,
|
||||||
int omethod, int max_shift, int zero_shift)
|
int omethod, int min_shift, int max_shift, int zero_shift)
|
||||||
{
|
{
|
||||||
double autoc[MAX_LPC_ORDER+1];
|
double autoc[MAX_LPC_ORDER+1];
|
||||||
double ref[MAX_LPC_ORDER] = { 0 };
|
double ref[MAX_LPC_ORDER] = { 0 };
|
||||||
@ -284,10 +285,12 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
|||||||
if(omethod == ORDER_METHOD_EST) {
|
if(omethod == ORDER_METHOD_EST) {
|
||||||
opt_order = estimate_best_order(ref, min_order, max_order);
|
opt_order = estimate_best_order(ref, min_order, max_order);
|
||||||
i = opt_order-1;
|
i = opt_order-1;
|
||||||
quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i], max_shift, zero_shift);
|
quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i],
|
||||||
|
min_shift, max_shift, zero_shift);
|
||||||
} else {
|
} else {
|
||||||
for(i=min_order-1; i<max_order; i++) {
|
for(i=min_order-1; i<max_order; i++) {
|
||||||
quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i], max_shift, zero_shift);
|
quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i],
|
||||||
|
min_shift, max_shift, zero_shift);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
|||||||
int max_order, int precision,
|
int max_order, int precision,
|
||||||
int32_t coefs[][MAX_LPC_ORDER], int *shift,
|
int32_t coefs[][MAX_LPC_ORDER], int *shift,
|
||||||
enum FFLPCType lpc_type, int lpc_passes,
|
enum FFLPCType lpc_type, int lpc_passes,
|
||||||
int omethod, int max_shift, int zero_shift);
|
int omethod, int min_shift, int max_shift, int zero_shift);
|
||||||
|
|
||||||
int ff_lpc_calc_ref_coefs(LPCContext *s,
|
int ff_lpc_calc_ref_coefs(LPCContext *s,
|
||||||
const int32_t *samples, int order, double *ref);
|
const int32_t *samples, int order, double *ref);
|
||||||
|
@ -475,7 +475,7 @@ static int ra144_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
|||||||
|
|
||||||
ff_lpc_calc_coefs(&ractx->lpc_ctx, lpc_data, NBLOCKS * BLOCKSIZE, LPC_ORDER,
|
ff_lpc_calc_coefs(&ractx->lpc_ctx, lpc_data, NBLOCKS * BLOCKSIZE, LPC_ORDER,
|
||||||
LPC_ORDER, 16, lpc_coefs, shift, FF_LPC_TYPE_LEVINSON,
|
LPC_ORDER, 16, lpc_coefs, shift, FF_LPC_TYPE_LEVINSON,
|
||||||
0, ORDER_METHOD_EST, 12, 0);
|
0, ORDER_METHOD_EST, 0, 12, 0);
|
||||||
for (i = 0; i < LPC_ORDER; i++)
|
for (i = 0; i < LPC_ORDER; i++)
|
||||||
block_coefs[NBLOCKS - 1][i] = -(lpc_coefs[LPC_ORDER - 1][i] <<
|
block_coefs[NBLOCKS - 1][i] = -(lpc_coefs[LPC_ORDER - 1][i] <<
|
||||||
(12 - shift[LPC_ORDER - 1]));
|
(12 - shift[LPC_ORDER - 1]));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user