X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fflacenc.c;h=c6751aad8e1f44b29556e83e5cd4c93aaab6952f;hb=ee4675373988bccc96a39f48ffad200926778ad2;hp=e2627a8f9ef7c7894e8fd532f8796a4e040b6748;hpb=a309dce75fb08f9c7b4a248afab97d5ac105b9b3;p=ffmpeg diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index e2627a8f9ef..c6751aad8e1 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -19,12 +19,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/crc.h" +#include "libavutil/lls.h" #include "avcodec.h" #include "bitstream.h" -#include "crc.h" #include "dsputil.h" #include "golomb.h" -#include "lls.h" #define FLAC_MAX_CH 8 #define FLAC_MIN_BLOCKSIZE 16 @@ -102,7 +102,6 @@ typedef struct FlacEncodeContext { int ch_code; int samplerate; int sr_code[2]; - int blocksize; int max_framesize; uint32_t frame_count; FlacFrame frame; @@ -136,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); @@ -169,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; @@ -351,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) { @@ -367,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); @@ -409,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; @@ -417,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; @@ -474,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; @@ -594,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>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++; @@ -841,42 +838,45 @@ static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n, res[i]= smp[i] - smp[i-1]; }else if(order==2){ int a = smp[order-1] - smp[order-2]; - for(i=order; i> shift); res[i+1] = smp[i+1] - (p1 >> shift); } @@ -949,16 +949,15 @@ static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n, #ifdef CONFIG_SMALL for(i=order; i> shift); + res[i ] = smp[i ] - (p0 >> shift); res[i+1] = smp[i+1] - (p1 >> shift); } #else @@ -1237,13 +1236,6 @@ static void channel_decorrelation(FlacEncodeContext *ctx) } } -static void put_sbits(PutBitContext *pb, int bits, int32_t val) -{ - assert(bits >= 0 && bits <= 31); - - put_bits(pb, bits, val & ((1<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); } @@ -1421,7 +1414,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); } @@ -1436,7 +1430,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); @@ -1474,7 +1467,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; @@ -1492,4 +1485,6 @@ AVCodec flac_encoder = { flac_encode_close, NULL, .capabilities = CODEC_CAP_SMALL_LAST_FRAME, + .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), };