X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fflacenc.c;h=17e414345f3dba1677642a804ebcb7d6b5a5c7a3;hb=454064ad1eb39ffbea4906dbe2e246e18a5d5d67;hp=e2357affebb1ac5c38b47ebf1ec7187c05f14133;hpb=0d2caa37c53bb8b479840572cb4dede2e2b30e8e;p=ffmpeg diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index e2357affebb..17e414345f3 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -22,6 +22,7 @@ #include "avcodec.h" #include "bitstream.h" #include "crc.h" +#include "dsputil.h" #include "golomb.h" #include "lls.h" @@ -101,12 +102,12 @@ typedef struct FlacEncodeContext { int ch_code; int samplerate; int sr_code[2]; - int blocksize; int max_framesize; uint32_t frame_count; FlacFrame frame; CompressionOptions options; AVCodecContext *avctx; + DSPContext dsp; } FlacEncodeContext; static const int flac_samplerates[16] = { @@ -134,8 +135,8 @@ static void write_streaminfo(FlacEncodeContext *s, uint8_t *header) init_put_bits(&pb, header, FLAC_STREAMINFO_SIZE); /* streaminfo metadata block */ - put_bits(&pb, 16, s->blocksize); - put_bits(&pb, 16, s->blocksize); + put_bits(&pb, 16, s->avctx->frame_size); + put_bits(&pb, 16, s->avctx->frame_size); put_bits(&pb, 24, 0); put_bits(&pb, 24, s->max_framesize); put_bits(&pb, 20, s->samplerate); @@ -167,7 +168,7 @@ static int select_blocksize(int samplerate, int block_time_ms) 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; @@ -177,6 +178,8 @@ static int flac_encode_init(AVCodecContext *avctx) s->avctx = avctx; + dsputil_init(&s->dsp, avctx); + if(avctx->sample_fmt != SAMPLE_FMT_S16) { return -1; } @@ -347,12 +350,10 @@ static int flac_encode_init(AVCodecContext *avctx) avctx->frame_size); return -1; } - s->blocksize = avctx->frame_size; } else { - s->blocksize = select_blocksize(s->samplerate, s->options.block_time_ms); - avctx->frame_size = s->blocksize; + s->avctx->frame_size = select_blocksize(s->samplerate, s->options.block_time_ms); } - av_log(avctx, AV_LOG_DEBUG, " block size: %d\n", s->blocksize); + av_log(avctx, AV_LOG_DEBUG, " block size: %d\n", s->avctx->frame_size); /* set LPC precision */ if(avctx->lpc_coeff_precision > 0) { @@ -363,25 +364,17 @@ static int flac_encode_init(AVCodecContext *avctx) } s->options.lpc_coeff_precision = avctx->lpc_coeff_precision; } else { - /* select LPC precision based on block size */ - if( s->blocksize <= 192) s->options.lpc_coeff_precision = 7; - else if(s->blocksize <= 384) s->options.lpc_coeff_precision = 8; - else if(s->blocksize <= 576) s->options.lpc_coeff_precision = 9; - else if(s->blocksize <= 1152) s->options.lpc_coeff_precision = 10; - else if(s->blocksize <= 2304) s->options.lpc_coeff_precision = 11; - else if(s->blocksize <= 4608) s->options.lpc_coeff_precision = 12; - else if(s->blocksize <= 8192) s->options.lpc_coeff_precision = 13; - else if(s->blocksize <= 16384) s->options.lpc_coeff_precision = 14; - else s->options.lpc_coeff_precision = 15; + /* default LPC precision */ + s->options.lpc_coeff_precision = 15; } av_log(avctx, AV_LOG_DEBUG, " lpc precision: %d\n", s->options.lpc_coeff_precision); /* set maximum encoded frame size in verbatim mode */ if(s->channels == 2) { - s->max_framesize = 14 + ((s->blocksize * 33 + 7) >> 3); + s->max_framesize = 14 + ((s->avctx->frame_size * 33 + 7) >> 3); } else { - s->max_framesize = 14 + (s->blocksize * s->channels * 2); + s->max_framesize = 14 + (s->avctx->frame_size * s->channels * 2); } streaminfo = av_malloc(FLAC_STREAMINFO_SIZE); @@ -405,7 +398,7 @@ static void init_frame(FlacEncodeContext *s) frame = &s->frame; for(i=0; i<16; i++) { - if(s->blocksize == flac_blocksizes[i]) { + if(s->avctx->frame_size == flac_blocksizes[i]) { frame->blocksize = flac_blocksizes[i]; frame->bs_code[0] = i; frame->bs_code[1] = 0; @@ -413,7 +406,7 @@ static void init_frame(FlacEncodeContext *s) } } if(i == 16) { - frame->blocksize = s->blocksize; + frame->blocksize = s->avctx->frame_size; if(frame->blocksize <= 256) { frame->bs_code[0] = 6; frame->bs_code[1] = frame->blocksize-1; @@ -447,20 +440,19 @@ static void copy_samples(FlacEncodeContext *s, int16_t *samples) #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k))) +/** + * Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0 + */ static int find_optimal_param(uint32_t sum, int n) { - int k, k_opt; - uint32_t nbits[MAX_RICE_PARAM+1]; - - k_opt = 0; - nbits[0] = UINT32_MAX; - for(k=0; k<=MAX_RICE_PARAM; k++) { - nbits[k] = rice_encode_count(sum, n, k); - if(nbits[k] < nbits[k_opt]) { - k_opt = k; - } - } - return k_opt; + int k; + uint32_t sum2; + + if(sum <= n>>1) + return 0; + sum2 = sum-(n>>1); + k = av_log2(n<256 ? FASTDIV(sum2,n) : sum2/n); + return FFMIN(k, MAX_RICE_PARAM); } static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder, @@ -471,16 +463,15 @@ static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder, uint32_t all_bits; part = (1 << porder); - all_bits = 0; + all_bits = 4 * part; cnt = (n >> porder) - pred_order; for(i=0; i> 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; @@ -499,10 +490,11 @@ static void calc_sums(int pmin, int pmax, uint32_t *data, int n, int pred_order, res = &data[pred_order]; res_end = &data[n >> pmax]; for(i=0; i> pmax; } /* sums for lower levels */ @@ -590,13 +582,19 @@ static void apply_welch_window(const int32_t *data, int len, double *w_data) 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= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER); if(use_lpc == 1){ - compute_autocorr(samples, blocksize, max_order+1, 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>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++; @@ -823,38 +837,142 @@ static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n, for(i=order; i> shift); + res[i+1] = smp[i+1] - (p1 >> shift); } } static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n, int order, const int32_t *coefs, int shift) { - int i, j; - + int i; for(i=0; i> shift); + res[i ] = smp[i ] - (p0 >> shift); res[i+1] = smp[i+1] - (p1 >> shift); } +#else + switch(order) { + case 1: encode_residual_lpc_unrolled(res, smp, n, 1, coefs, shift, 0); break; + case 2: encode_residual_lpc_unrolled(res, smp, n, 2, coefs, shift, 0); break; + case 3: encode_residual_lpc_unrolled(res, smp, n, 3, coefs, shift, 0); break; + case 4: encode_residual_lpc_unrolled(res, smp, n, 4, coefs, shift, 0); break; + case 5: encode_residual_lpc_unrolled(res, smp, n, 5, coefs, shift, 0); break; + case 6: encode_residual_lpc_unrolled(res, smp, n, 6, coefs, shift, 0); break; + case 7: encode_residual_lpc_unrolled(res, smp, n, 7, coefs, shift, 0); break; + case 8: encode_residual_lpc_unrolled(res, smp, n, 8, coefs, shift, 0); break; + default: encode_residual_lpc_unrolled(res, smp, n, order, coefs, shift, 1); break; + } +#endif } static int encode_residual(FlacEncodeContext *ctx, int ch) @@ -924,7 +1042,7 @@ static int encode_residual(FlacEncodeContext *ctx, int ch) } /* 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 || @@ -1160,7 +1278,8 @@ static void output_frame_header(FlacEncodeContext *s) 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); } @@ -1302,7 +1421,8 @@ static void output_frame_footer(FlacEncodeContext *s) { 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); } @@ -1317,7 +1437,6 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, s = avctx->priv_data; - s->blocksize = avctx->frame_size; init_frame(s); copy_samples(s, samples); @@ -1355,7 +1474,7 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, 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;