00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00038 #include "libavutil/mathematics.h"
00039 #include "nellymoser.h"
00040 #include "avcodec.h"
00041 #include "audio_frame_queue.h"
00042 #include "dsputil.h"
00043 #include "fft.h"
00044 #include "internal.h"
00045 #include "sinewin.h"
00046 
00047 #define BITSTREAM_WRITER_LE
00048 #include "put_bits.h"
00049 
00050 #define POW_TABLE_SIZE (1<<11)
00051 #define POW_TABLE_OFFSET 3
00052 #define OPT_SIZE ((1<<15) + 3000)
00053 
00054 typedef struct NellyMoserEncodeContext {
00055     AVCodecContext  *avctx;
00056     int             last_frame;
00057     DSPContext      dsp;
00058     FFTContext      mdct_ctx;
00059     AudioFrameQueue afq;
00060     DECLARE_ALIGNED(32, float, mdct_out)[NELLY_SAMPLES];
00061     DECLARE_ALIGNED(32, float, in_buff)[NELLY_SAMPLES];
00062     DECLARE_ALIGNED(32, float, buf)[3 * NELLY_BUF_LEN];     
00063     float           (*opt )[NELLY_BANDS];
00064     uint8_t         (*path)[NELLY_BANDS];
00065 } NellyMoserEncodeContext;
00066 
00067 static float pow_table[POW_TABLE_SIZE];     
00068 
00069 static const uint8_t sf_lut[96] = {
00070      0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  4,  4,
00071      5,  5,  5,  6,  7,  7,  8,  8,  9, 10, 11, 11, 12, 13, 13, 14,
00072     15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26,
00073     27, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40,
00074     41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53,
00075     54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62,
00076 };
00077 
00078 static const uint8_t sf_delta_lut[78] = {
00079      0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  4,  4,
00080      4,  5,  5,  5,  6,  6,  7,  7,  8,  8,  9, 10, 10, 11, 11, 12,
00081     13, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23,
00082     23, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28,
00083     28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30,
00084 };
00085 
00086 static const uint8_t quant_lut[230] = {
00087      0,
00088 
00089      0,  1,  2,
00090 
00091      0,  1,  2,  3,  4,  5,  6,
00092 
00093      0,  1,  1,  2,  2,  3,  3,  4,  5,  6,  7,  8,  9, 10, 11, 11,
00094     12, 13, 13, 13, 14,
00095 
00096      0,  1,  1,  2,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  8,
00097      8,  9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
00098     22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29,
00099     30,
00100 
00101      0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,  3,  3,
00102      4,  4,  4,  5,  5,  5,  6,  6,  7,  7,  7,  8,  8,  9,  9,  9,
00103     10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15,
00104     15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20,
00105     21, 21, 22, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32,
00106     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 44, 45, 45,
00107     46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52,
00108     53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57,
00109     58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61,
00110     61, 61, 61, 61, 62,
00111 };
00112 
00113 static const float quant_lut_mul[7] = { 0.0,  0.0,  2.0,  2.0,  5.0, 12.0,  36.6 };
00114 static const float quant_lut_add[7] = { 0.0,  0.0,  2.0,  7.0, 21.0, 56.0, 157.0 };
00115 static const uint8_t quant_lut_offset[8] = { 0, 0, 1, 4, 11, 32, 81, 230 };
00116 
00117 static void apply_mdct(NellyMoserEncodeContext *s)
00118 {
00119     float *in0 = s->buf;
00120     float *in1 = s->buf + NELLY_BUF_LEN;
00121     float *in2 = s->buf + 2 * NELLY_BUF_LEN;
00122 
00123     s->dsp.vector_fmul        (s->in_buff,                 in0, ff_sine_128, NELLY_BUF_LEN);
00124     s->dsp.vector_fmul_reverse(s->in_buff + NELLY_BUF_LEN, in1, ff_sine_128, NELLY_BUF_LEN);
00125     s->mdct_ctx.mdct_calc(&s->mdct_ctx, s->mdct_out, s->in_buff);
00126 
00127     s->dsp.vector_fmul        (s->in_buff,                 in1, ff_sine_128, NELLY_BUF_LEN);
00128     s->dsp.vector_fmul_reverse(s->in_buff + NELLY_BUF_LEN, in2, ff_sine_128, NELLY_BUF_LEN);
00129     s->mdct_ctx.mdct_calc(&s->mdct_ctx, s->mdct_out + NELLY_BUF_LEN, s->in_buff);
00130 }
00131 
00132 static av_cold int encode_end(AVCodecContext *avctx)
00133 {
00134     NellyMoserEncodeContext *s = avctx->priv_data;
00135 
00136     ff_mdct_end(&s->mdct_ctx);
00137 
00138     if (s->avctx->trellis) {
00139         av_free(s->opt);
00140         av_free(s->path);
00141     }
00142     ff_af_queue_close(&s->afq);
00143 #if FF_API_OLD_ENCODE_AUDIO
00144     av_freep(&avctx->coded_frame);
00145 #endif
00146 
00147     return 0;
00148 }
00149 
00150 static av_cold int encode_init(AVCodecContext *avctx)
00151 {
00152     NellyMoserEncodeContext *s = avctx->priv_data;
00153     int i, ret;
00154 
00155     if (avctx->channels != 1) {
00156         av_log(avctx, AV_LOG_ERROR, "Nellymoser supports only 1 channel\n");
00157         return AVERROR(EINVAL);
00158     }
00159 
00160     if (avctx->sample_rate != 8000 && avctx->sample_rate != 16000 &&
00161         avctx->sample_rate != 11025 &&
00162         avctx->sample_rate != 22050 && avctx->sample_rate != 44100 &&
00163         avctx->strict_std_compliance >= FF_COMPLIANCE_NORMAL) {
00164         av_log(avctx, AV_LOG_ERROR, "Nellymoser works only with 8000, 16000, 11025, 22050 and 44100 sample rate\n");
00165         return AVERROR(EINVAL);
00166     }
00167 
00168     avctx->frame_size = NELLY_SAMPLES;
00169     avctx->delay      = NELLY_BUF_LEN;
00170     ff_af_queue_init(avctx, &s->afq);
00171     s->avctx = avctx;
00172     if ((ret = ff_mdct_init(&s->mdct_ctx, 8, 0, 32768.0)) < 0)
00173         goto error;
00174     ff_dsputil_init(&s->dsp, avctx);
00175 
00176     
00177     ff_init_ff_sine_windows(7);
00178     for (i = 0; i < POW_TABLE_SIZE; i++)
00179         pow_table[i] = -pow(2, -i / 2048.0 - 3.0 + POW_TABLE_OFFSET);
00180 
00181     if (s->avctx->trellis) {
00182         s->opt  = av_malloc(NELLY_BANDS * OPT_SIZE * sizeof(float  ));
00183         s->path = av_malloc(NELLY_BANDS * OPT_SIZE * sizeof(uint8_t));
00184         if (!s->opt || !s->path) {
00185             ret = AVERROR(ENOMEM);
00186             goto error;
00187         }
00188     }
00189 
00190 #if FF_API_OLD_ENCODE_AUDIO
00191     avctx->coded_frame = avcodec_alloc_frame();
00192     if (!avctx->coded_frame) {
00193         ret = AVERROR(ENOMEM);
00194         goto error;
00195     }
00196 #endif
00197 
00198     return 0;
00199 error:
00200     encode_end(avctx);
00201     return ret;
00202 }
00203 
00204 #define find_best(val, table, LUT, LUT_add, LUT_size) \
00205     best_idx = \
00206         LUT[av_clip ((lrintf(val) >> 8) + LUT_add, 0, LUT_size - 1)]; \
00207     if (fabs(val - table[best_idx]) > fabs(val - table[best_idx + 1])) \
00208         best_idx++;
00209 
00210 static void get_exponent_greedy(NellyMoserEncodeContext *s, float *cand, int *idx_table)
00211 {
00212     int band, best_idx, power_idx = 0;
00213     float power_candidate;
00214 
00215     
00216     find_best(cand[0], ff_nelly_init_table, sf_lut, -20, 96);
00217     idx_table[0] = best_idx;
00218     power_idx = ff_nelly_init_table[best_idx];
00219 
00220     for (band = 1; band < NELLY_BANDS; band++) {
00221         power_candidate = cand[band] - power_idx;
00222         find_best(power_candidate, ff_nelly_delta_table, sf_delta_lut, 37, 78);
00223         idx_table[band] = best_idx;
00224         power_idx += ff_nelly_delta_table[best_idx];
00225     }
00226 }
00227 
00228 static inline float distance(float x, float y, int band)
00229 {
00230     
00231     float tmp = x - y;
00232     return tmp * tmp;
00233 }
00234 
00235 static void get_exponent_dynamic(NellyMoserEncodeContext *s, float *cand, int *idx_table)
00236 {
00237     int i, j, band, best_idx;
00238     float power_candidate, best_val;
00239 
00240     float  (*opt )[NELLY_BANDS] = s->opt ;
00241     uint8_t(*path)[NELLY_BANDS] = s->path;
00242 
00243     for (i = 0; i < NELLY_BANDS * OPT_SIZE; i++) {
00244         opt[0][i] = INFINITY;
00245     }
00246 
00247     for (i = 0; i < 64; i++) {
00248         opt[0][ff_nelly_init_table[i]] = distance(cand[0], ff_nelly_init_table[i], 0);
00249         path[0][ff_nelly_init_table[i]] = i;
00250     }
00251 
00252     for (band = 1; band < NELLY_BANDS; band++) {
00253         int q, c = 0;
00254         float tmp;
00255         int idx_min, idx_max, idx;
00256         power_candidate = cand[band];
00257         for (q = 1000; !c && q < OPT_SIZE; q <<= 2) {
00258             idx_min = FFMAX(0, cand[band] - q);
00259             idx_max = FFMIN(OPT_SIZE, cand[band - 1] + q);
00260             for (i = FFMAX(0, cand[band - 1] - q); i < FFMIN(OPT_SIZE, cand[band - 1] + q); i++) {
00261                 if ( isinf(opt[band - 1][i]) )
00262                     continue;
00263                 for (j = 0; j < 32; j++) {
00264                     idx = i + ff_nelly_delta_table[j];
00265                     if (idx > idx_max)
00266                         break;
00267                     if (idx >= idx_min) {
00268                         tmp = opt[band - 1][i] + distance(idx, power_candidate, band);
00269                         if (opt[band][idx] > tmp) {
00270                             opt[band][idx] = tmp;
00271                             path[band][idx] = j;
00272                             c = 1;
00273                         }
00274                     }
00275                 }
00276             }
00277         }
00278         assert(c); 
00279     }
00280 
00281     best_val = INFINITY;
00282     best_idx = -1;
00283     band = NELLY_BANDS - 1;
00284     for (i = 0; i < OPT_SIZE; i++) {
00285         if (best_val > opt[band][i]) {
00286             best_val = opt[band][i];
00287             best_idx = i;
00288         }
00289     }
00290     for (band = NELLY_BANDS - 1; band >= 0; band--) {
00291         idx_table[band] = path[band][best_idx];
00292         if (band) {
00293             best_idx -= ff_nelly_delta_table[path[band][best_idx]];
00294         }
00295     }
00296 }
00297 
00304 static void encode_block(NellyMoserEncodeContext *s, unsigned char *output, int output_size)
00305 {
00306     PutBitContext pb;
00307     int i, j, band, block, best_idx, power_idx = 0;
00308     float power_val, coeff, coeff_sum;
00309     float pows[NELLY_FILL_LEN];
00310     int bits[NELLY_BUF_LEN], idx_table[NELLY_BANDS];
00311     float cand[NELLY_BANDS];
00312 
00313     apply_mdct(s);
00314 
00315     init_put_bits(&pb, output, output_size * 8);
00316 
00317     i = 0;
00318     for (band = 0; band < NELLY_BANDS; band++) {
00319         coeff_sum = 0;
00320         for (j = 0; j < ff_nelly_band_sizes_table[band]; i++, j++) {
00321             coeff_sum += s->mdct_out[i                ] * s->mdct_out[i                ]
00322                        + s->mdct_out[i + NELLY_BUF_LEN] * s->mdct_out[i + NELLY_BUF_LEN];
00323         }
00324         cand[band] =
00325             log(FFMAX(1.0, coeff_sum / (ff_nelly_band_sizes_table[band] << 7))) * 1024.0 / M_LN2;
00326     }
00327 
00328     if (s->avctx->trellis) {
00329         get_exponent_dynamic(s, cand, idx_table);
00330     } else {
00331         get_exponent_greedy(s, cand, idx_table);
00332     }
00333 
00334     i = 0;
00335     for (band = 0; band < NELLY_BANDS; band++) {
00336         if (band) {
00337             power_idx += ff_nelly_delta_table[idx_table[band]];
00338             put_bits(&pb, 5, idx_table[band]);
00339         } else {
00340             power_idx = ff_nelly_init_table[idx_table[0]];
00341             put_bits(&pb, 6, idx_table[0]);
00342         }
00343         power_val = pow_table[power_idx & 0x7FF] / (1 << ((power_idx >> 11) + POW_TABLE_OFFSET));
00344         for (j = 0; j < ff_nelly_band_sizes_table[band]; i++, j++) {
00345             s->mdct_out[i] *= power_val;
00346             s->mdct_out[i + NELLY_BUF_LEN] *= power_val;
00347             pows[i] = power_idx;
00348         }
00349     }
00350 
00351     ff_nelly_get_sample_bits(pows, bits);
00352 
00353     for (block = 0; block < 2; block++) {
00354         for (i = 0; i < NELLY_FILL_LEN; i++) {
00355             if (bits[i] > 0) {
00356                 const float *table = ff_nelly_dequantization_table + (1 << bits[i]) - 1;
00357                 coeff = s->mdct_out[block * NELLY_BUF_LEN + i];
00358                 best_idx =
00359                     quant_lut[av_clip (
00360                             coeff * quant_lut_mul[bits[i]] + quant_lut_add[bits[i]],
00361                             quant_lut_offset[bits[i]],
00362                             quant_lut_offset[bits[i]+1] - 1
00363                             )];
00364                 if (fabs(coeff - table[best_idx]) > fabs(coeff - table[best_idx + 1]))
00365                     best_idx++;
00366 
00367                 put_bits(&pb, bits[i], best_idx);
00368             }
00369         }
00370         if (!block)
00371             put_bits(&pb, NELLY_HEADER_BITS + NELLY_DETAIL_BITS - put_bits_count(&pb), 0);
00372     }
00373 
00374     flush_put_bits(&pb);
00375     memset(put_bits_ptr(&pb), 0, output + output_size - put_bits_ptr(&pb));
00376 }
00377 
00378 static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
00379                         const AVFrame *frame, int *got_packet_ptr)
00380 {
00381     NellyMoserEncodeContext *s = avctx->priv_data;
00382     int ret;
00383 
00384     if (s->last_frame)
00385         return 0;
00386 
00387     memcpy(s->buf, s->buf + NELLY_SAMPLES, NELLY_BUF_LEN * sizeof(*s->buf));
00388     if (frame) {
00389         memcpy(s->buf + NELLY_BUF_LEN, frame->data[0],
00390                frame->nb_samples * sizeof(*s->buf));
00391         if (frame->nb_samples < NELLY_SAMPLES) {
00392             memset(s->buf + NELLY_BUF_LEN + frame->nb_samples, 0,
00393                    (NELLY_SAMPLES - frame->nb_samples) * sizeof(*s->buf));
00394             if (frame->nb_samples >= NELLY_BUF_LEN)
00395                 s->last_frame = 1;
00396         }
00397         if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
00398             return ret;
00399     } else {
00400         memset(s->buf + NELLY_BUF_LEN, 0, NELLY_SAMPLES * sizeof(*s->buf));
00401         s->last_frame = 1;
00402     }
00403 
00404     if ((ret = ff_alloc_packet2(avctx, avpkt, NELLY_BLOCK_LEN)))
00405         return ret;
00406     encode_block(s, avpkt->data, avpkt->size);
00407 
00408     
00409     ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
00410                        &avpkt->duration);
00411 
00412     *got_packet_ptr = 1;
00413     return 0;
00414 }
00415 
00416 AVCodec ff_nellymoser_encoder = {
00417     .name           = "nellymoser",
00418     .type           = AVMEDIA_TYPE_AUDIO,
00419     .id             = CODEC_ID_NELLYMOSER,
00420     .priv_data_size = sizeof(NellyMoserEncodeContext),
00421     .init           = encode_init,
00422     .encode2        = encode_frame,
00423     .close          = encode_end,
00424     .capabilities   = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
00425     .long_name      = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
00426     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT,
00427                                                      AV_SAMPLE_FMT_NONE },
00428 };