porder patch by (Justin Ruggles jruggle a t earthlink d ot net)

Originally committed as revision 5593 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Justin Ruggles 19 years ago committed by Michael Niedermayer
parent a8d88e03d2
commit 1e5707b7b8
  1. 36
      libavcodec/flacenc.c

@ -537,11 +537,21 @@ static uint32_t calc_rice_params(RiceContext *rc, int pmin, int pmax,
return bits[opt_porder]; return bits[opt_porder];
} }
static int get_max_p_order(int max_porder, int n, int order)
{
int porder = FFMIN(max_porder, av_log2(n^(n-1)));
if(order > 0)
porder = FFMIN(porder, av_log2(n/order));
return porder;
}
static uint32_t calc_rice_params_fixed(RiceContext *rc, int pmin, int pmax, static uint32_t calc_rice_params_fixed(RiceContext *rc, int pmin, int pmax,
int32_t *data, int n, int pred_order, int32_t *data, int n, int pred_order,
int bps) int bps)
{ {
uint32_t bits; uint32_t bits;
pmin = get_max_p_order(pmin, n, pred_order);
pmax = get_max_p_order(pmax, n, pred_order);
bits = pred_order*bps + 6; bits = pred_order*bps + 6;
bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order); bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order);
return bits; return bits;
@ -552,6 +562,8 @@ static uint32_t calc_rice_params_lpc(RiceContext *rc, int pmin, int pmax,
int bps, int precision) int bps, int precision)
{ {
uint32_t bits; uint32_t bits;
pmin = get_max_p_order(pmin, n, pred_order);
pmax = get_max_p_order(pmax, n, pred_order);
bits = pred_order*bps + 4 + 5 + pred_order*precision + 6; bits = pred_order*bps + 4 + 5 + pred_order*precision + 6;
bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order); bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order);
return bits; return bits;
@ -784,24 +796,11 @@ static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n,
} }
} }
static int get_max_p_order(int max_porder, int n, int order)
{
int porder, max_parts;
for(porder = max_porder; porder > 0; porder--) {
max_parts = (1 << porder);
if(!(n % max_parts) && (n > max_parts*order)) {
break;
}
}
return porder;
}
static int encode_residual(FlacEncodeContext *ctx, int ch) static int encode_residual(FlacEncodeContext *ctx, int ch)
{ {
int i, n; int i, n;
int min_order, max_order, opt_order, precision; int min_order, max_order, opt_order, precision;
int porder, min_porder, max_porder; int min_porder, max_porder;
FlacFrame *frame; FlacFrame *frame;
FlacSubframe *sub; FlacSubframe *sub;
int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER]; int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
@ -845,8 +844,7 @@ static int encode_residual(FlacEncodeContext *ctx, int ch)
bits[0] = UINT32_MAX; bits[0] = UINT32_MAX;
for(i=min_order; i<=max_order; i++) { for(i=min_order; i<=max_order; i++) {
encode_residual_fixed(res, smp, n, i); encode_residual_fixed(res, smp, n, i);
porder = get_max_p_order(max_porder, n, i); bits[i] = calc_rice_params_fixed(&sub->rc, min_porder, max_porder, res,
bits[i] = calc_rice_params_fixed(&sub->rc, min_porder, porder, res,
n, i, sub->obits); n, i, sub->obits);
if(bits[i] < bits[opt_order]) { if(bits[i] < bits[opt_order]) {
opt_order = i; opt_order = i;
@ -857,8 +855,7 @@ static int encode_residual(FlacEncodeContext *ctx, int ch)
sub->type_code = sub->type | sub->order; sub->type_code = sub->type | sub->order;
if(sub->order != max_order) { if(sub->order != max_order) {
encode_residual_fixed(res, smp, n, sub->order); encode_residual_fixed(res, smp, n, sub->order);
porder = get_max_p_order(max_porder, n, sub->order); return calc_rice_params_fixed(&sub->rc, min_porder, max_porder, res, n,
return calc_rice_params_fixed(&sub->rc, min_porder, porder, res, n,
sub->order, sub->obits); sub->order, sub->obits);
} }
return bits[sub->order]; return bits[sub->order];
@ -872,9 +869,8 @@ static int encode_residual(FlacEncodeContext *ctx, int ch)
for(i=0; i<sub->order; i++) { for(i=0; i<sub->order; i++) {
sub->coefs[i] = coefs[sub->order-1][i]; sub->coefs[i] = coefs[sub->order-1][i];
} }
porder = get_max_p_order(max_porder, n, sub->order);
encode_residual_lpc(res, smp, n, sub->order, sub->coefs, sub->shift); encode_residual_lpc(res, smp, n, sub->order, sub->coefs, sub->shift);
return calc_rice_params_lpc(&sub->rc, 0, porder, res, n, sub->order, return calc_rice_params_lpc(&sub->rc, min_porder, max_porder, res, n, sub->order,
sub->obits, precision); sub->obits, precision);
} }

Loading…
Cancel
Save