#include "avcodec.h"
#include "bitstream.h"
#include "crc.h"
+#include "dsputil.h"
#include "golomb.h"
#include "lls.h"
FlacFrame frame;
CompressionOptions options;
AVCodecContext *avctx;
+ DSPContext dsp;
} FlacEncodeContext;
static const int flac_samplerates[16] = {
return blocksize;
}
-static int flac_encode_init(AVCodecContext *avctx)
+static av_cold int flac_encode_init(AVCodecContext *avctx)
{
int freq = avctx->sample_rate;
int channels = avctx->channels;
s->avctx = avctx;
+ dsputil_init(&s->dsp, avctx);
+
if(avctx->sample_fmt != SAMPLE_FMT_S16) {
return -1;
}
uint32_t all_bits;
part = (1 << porder);
- all_bits = 0;
+ all_bits = 4 * part;
cnt = (n >> porder) - pred_order;
for(i=0; i<part; i++) {
- if(i == 1) cnt = (n >> porder);
k = find_optimal_param(sums[i], cnt);
rc->params[i] = k;
all_bits += rice_encode_count(sums[i], cnt, k);
+ cnt = n >> porder;
}
- all_bits += (4 * part);
rc->porder = porder;
double w;
double c;
+ assert(!(len&1)); //the optimization in r11881 does not support odd len
+ //if someone wants odd len extend the change in r11881
+
n2 = (len >> 1);
c = 2.0 / (len - 1.0);
+
+ w_data+=n2;
+ data+=n2;
for(i=0; i<n2; i++) {
- w = c - i - 1.0;
+ w = c - n2 + i;
w = 1.0 - (w * w);
- w_data[i] = data[i] * w;
- w_data[len-1-i] = data[len-1-i] * w;
+ w_data[-i-1] = data[-i-1] * w;
+ w_data[+i ] = data[+i ] * w;
}
}
* Calculates autocorrelation data from audio samples
* A Welch window function is applied before calculation.
*/
-static void compute_autocorr(const int32_t *data, int len, int lag,
- double *autoc)
+void ff_flac_compute_autocorr(const int32_t *data, int len, int lag,
+ double *autoc)
{
int i, j;
double tmp[len + lag + 1];
/**
* Calculate LPC coefficients for multiple orders
*/
-static int lpc_calc_coefs(const int32_t *samples, int blocksize, int max_order,
+static int lpc_calc_coefs(FlacEncodeContext *s,
+ const int32_t *samples, int blocksize, int max_order,
int precision, int32_t coefs[][MAX_LPC_ORDER],
int *shift, int use_lpc, int omethod)
{
assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER);
if(use_lpc == 1){
- compute_autocorr(samples, blocksize, max_order, autoc);
+ s->dsp.flac_compute_autocorr(samples, blocksize, max_order, autoc);
compute_lpc_coefs(autoc, max_order, lpc, ref);
}else{
LLSModel m[2];
- double var[MAX_LPC_ORDER+1], eval, weight;
+ double var[MAX_LPC_ORDER+1], weight;
for(pass=0; pass<use_lpc-1; pass++){
av_init_lls(&m[pass&1], max_order);
var[j]= samples[i-j];
if(pass){
+ double eval, inv, rinv;
eval= av_evaluate_lls(&m[(pass-1)&1], var+1, max_order-1);
eval= (512>>pass) + fabs(eval - var[0]);
+ inv = 1/eval;
+ rinv = sqrt(inv);
for(j=0; j<=max_order; j++)
- var[j]/= sqrt(eval);
- weight += 1/eval;
+ var[j] *= rinv;
+ weight += inv;
}else
weight++;
for(i=order; i<n; i++)
res[i]= smp[i] - smp[i-1];
}else if(order==2){
- for(i=order; i<n; i++)
- res[i]= smp[i] - 2*smp[i-1] + smp[i-2];
+ int a = smp[order-1] - smp[order-2];
+ for(i=order; i<n; i+=2) {
+ int b = smp[i] - smp[i-1];
+ res[i]= b - a;
+ a = smp[i+1] - smp[i];
+ res[i+1]= a - b;
+ }
}else if(order==3){
- for(i=order; i<n; i++)
- res[i]= smp[i] - 3*smp[i-1] + 3*smp[i-2] - smp[i-3];
+ int a = smp[order-1] - smp[order-2];
+ int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
+ for(i=order; i<n; i+=2) {
+ int b = smp[i] - smp[i-1];
+ int d = b - a;
+ res[i]= d - c;
+ a = smp[i+1] - smp[i];
+ c = a - b;
+ res[i+1]= c - d;
+ }
}else{
- for(i=order; i<n; i++)
- res[i]= smp[i] - 4*smp[i-1] + 6*smp[i-2] - 4*smp[i-3] + smp[i-4];
+ int a = smp[order-1] - smp[order-2];
+ int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
+ int e = smp[order-1] - 3*smp[order-2] + 3*smp[order-3] - smp[order-4];
+ for(i=order; i<n; i+=2) {
+ int b = smp[i] - smp[i-1];
+ int d = b - a;
+ int f = d - c;
+ res[i]= f - e;
+ a = smp[i+1] - smp[i];
+ c = a - b;
+ e = c - d;
+ res[i+1]= e - f;
+ }
}
}
#define LPC1(x) {\
- int s = smp[i-(x)+1];\
- p1 += c*s;\
- c = coefs[(x)-2];\
+ int c = coefs[(x)-1];\
p0 += c*s;\
+ s = smp[i-(x)+1];\
+ p1 += c*s;\
}
static av_always_inline void encode_residual_lpc_unrolled(
{
int i;
for(i=order; i<n; i+=2) {
- int c = coefs[order-1];
- int p0 = c * smp[i-order];
- int p1 = 0;
+ int s = smp[i-order];
+ int p0 = 0, p1 = 0;
if(big) {
switch(order) {
case 32: LPC1(32)
LPC1( 4)
LPC1( 3)
LPC1( 2)
+ LPC1( 1)
}
} else {
switch(order) {
case 4: LPC1( 4)
case 3: LPC1( 3)
case 2: LPC1( 2)
+ case 1: LPC1( 1)
}
}
- p1 += c * smp[i];
res[i ] = smp[i ] - (p0 >> shift);
res[i+1] = smp[i+1] - (p1 >> shift);
}
#ifdef CONFIG_SMALL
for(i=order; i<n; i+=2) {
int j;
- int32_t c = coefs[0];
- int32_t p0 = 0, p1 = c*smp[i];
- for(j=1; j<order; j++) {
- int32_t s = smp[i-j];
- p0 += c*s;
- c = coefs[j];
+ int s = smp[i];
+ int p0 = 0, p1 = 0;
+ for(j=0; j<order; j++) {
+ int c = coefs[j];
p1 += c*s;
+ s = smp[i-j-1];
+ p0 += c*s;
}
- p0 += c*smp[i-order];
- res[i+0] = smp[i+0] - (p0 >> shift);
+ res[i ] = smp[i ] - (p0 >> shift);
res[i+1] = smp[i+1] - (p1 >> shift);
}
#else
}
/* LPC */
- opt_order = lpc_calc_coefs(smp, n, max_order, precision, coefs, shift, ctx->options.use_lpc, omethod);
+ opt_order = lpc_calc_coefs(ctx, smp, n, max_order, precision, coefs, shift, ctx->options.use_lpc, omethod);
if(omethod == ORDER_METHOD_2LEVEL ||
omethod == ORDER_METHOD_4LEVEL ||
put_bits(&s->pb, 16, s->sr_code[1]);
}
flush_put_bits(&s->pb);
- crc = av_crc(av_crc07, 0, s->pb.buf, put_bits_count(&s->pb)>>3);
+ crc = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0,
+ s->pb.buf, put_bits_count(&s->pb)>>3);
put_bits(&s->pb, 8, crc);
}
{
int crc;
flush_put_bits(&s->pb);
- crc = bswap_16(av_crc(av_crc8005, 0, s->pb.buf, put_bits_count(&s->pb)>>3));
+ crc = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0,
+ s->pb.buf, put_bits_count(&s->pb)>>3));
put_bits(&s->pb, 16, crc);
flush_put_bits(&s->pb);
}
return out_bytes;
}
-static int flac_encode_close(AVCodecContext *avctx)
+static av_cold int flac_encode_close(AVCodecContext *avctx)
{
av_freep(&avctx->extradata);
avctx->extradata_size = 0;