diff options
Diffstat (limited to 'libavcodec/mpegaudioenc.c')
-rw-r--r-- | libavcodec/mpegaudioenc.c | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/libavcodec/mpegaudioenc.c b/libavcodec/mpegaudioenc.c index a940c0d689..133c9dcc1d 100644 --- a/libavcodec/mpegaudioenc.c +++ b/libavcodec/mpegaudioenc.c @@ -2,20 +2,20 @@ * The simplest mpeg audio layer 2 encoder * Copyright (c) 2000, 2001 Fabrice Bellard * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -33,6 +33,9 @@ #define FRAC_BITS 15 /* fractional bits for sb_samples and dct */ #define WFRAC_BITS 14 /* fractional bits for window */ +/* define it to use floats in quantization (I don't like floats !) */ +#define USE_FLOATS + #include "mpegaudio.h" #include "mpegaudiodsp.h" #include "mpegaudiodata.h" @@ -64,7 +67,12 @@ typedef struct MpegAudioContext { int16_t filter_bank[512]; int scale_factor_table[64]; unsigned char scale_diff_table[128]; +#ifdef USE_FLOATS float scale_factor_inv_table[64]; +#else + int8_t scale_factor_shift[64]; + unsigned short scale_factor_mult[64]; +#endif unsigned short total_quant_bits[17]; /* total number of bits per allocation group */ } MpegAudioContext; @@ -149,11 +157,17 @@ static av_cold int MPA_encode_init(AVCodecContext *avctx) } for(i=0;i<64;i++) { - v = (int)(pow(2.0, (3 - i) / 3.0) * (1 << 20)); + v = (int)(exp2((3 - i) / 3.0) * (1 << 20)); if (v <= 0) v = 1; s->scale_factor_table[i] = v; - s->scale_factor_inv_table[i] = pow(2.0, -(3 - i) / 3.0) / (float)(1 << 20); +#ifdef USE_FLOATS + s->scale_factor_inv_table[i] = exp2(-(3 - i) / 3.0) / (float)(1 << 20); +#else +#define P 15 + s->scale_factor_shift[i] = 21 - P - (i / 3); + s->scale_factor_mult[i] = (1 << P) * exp2((i % 3) / 3.0); +#endif } for(i=0;i<128;i++) { v = i - 64; @@ -397,7 +411,7 @@ static void compute_scale_factors(MpegAudioContext *s, av_dlog(NULL, "%2d:%d in=%x %x %d\n", j, i, vmax, s->scale_factor_table[index], index); /* store the scale factor */ - assert(index >=0 && index <= 63); + av_assert2(index >=0 && index <= 63); sf[i] = index; } @@ -459,7 +473,7 @@ static void compute_scale_factors(MpegAudioContext *s, sf[1] = sf[2] = sf[0]; break; default: - assert(0); //cannot happen + av_assert2(0); //cannot happen code = 0; /* kill warning */ } @@ -579,7 +593,7 @@ static void compute_bit_allocation(MpegAudioContext *s, } } *padding = max_frame_size - current_frame_size; - assert(*padding >= 0); + av_assert0(*padding >= 0); } /* @@ -668,14 +682,35 @@ static void encode_frame(MpegAudioContext *s, qindex = s->alloc_table[j+b]; steps = ff_mpa_quant_steps[qindex]; for(m=0;m<3;m++) { - float a; sample = s->sb_samples[ch][k][l + m][i]; /* divide by scale factor */ - a = (float)sample * s->scale_factor_inv_table[s->scale_factors[ch][i][k]]; - q[m] = (int)((a + 1.0) * steps * 0.5); +#ifdef USE_FLOATS + { + float a; + a = (float)sample * s->scale_factor_inv_table[s->scale_factors[ch][i][k]]; + q[m] = (int)((a + 1.0) * steps * 0.5); + } +#else + { + int q1, e, shift, mult; + e = s->scale_factors[ch][i][k]; + shift = s->scale_factor_shift[e]; + mult = s->scale_factor_mult[e]; + + /* normalize to P bits */ + if (shift < 0) + q1 = sample << (-shift); + else + q1 = sample >> shift; + q1 = (q1 * mult) >> P; + q[m] = ((q1 + (1 << P)) * steps) >> (P + 1); + if (q[m] < 0) + q[m] = 0; + } +#endif if (q[m] >= steps) q[m] = steps - 1; - assert(q[m] >= 0 && q[m] < steps); + av_assert2(q[m] >= 0 && q[m] < steps); } bits = ff_mpa_quant_bits[qindex]; if (bits < 0) { @@ -725,10 +760,8 @@ static int MPA_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, } compute_bit_allocation(s, smr, bit_alloc, &padding); - if ((ret = ff_alloc_packet(avpkt, MPA_MAX_CODED_FRAME_SIZE))) { - av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); + if ((ret = ff_alloc_packet2(avctx, avpkt, MPA_MAX_CODED_FRAME_SIZE)) < 0) return ret; - } init_put_bits(&s->pb, avpkt->data, avpkt->size); |