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 };