Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * The simplest AC-3 encoder
  3.  * Copyright (c) 2000 Fabrice Bellard
  4.  * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
  5.  * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
  6.  *
  7.  * This file is part of FFmpeg.
  8.  *
  9.  * FFmpeg is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU Lesser General Public
  11.  * License as published by the Free Software Foundation; either
  12.  * version 2.1 of the License, or (at your option) any later version.
  13.  *
  14.  * FFmpeg is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17.  * Lesser General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU Lesser General Public
  20.  * License along with FFmpeg; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22.  */
  23.  
  24. /**
  25.  * @file
  26.  * fixed-point AC-3 encoder.
  27.  */
  28.  
  29. #define FFT_FLOAT 0
  30. #undef CONFIG_AC3ENC_FLOAT
  31. #include "internal.h"
  32. #include "audiodsp.h"
  33. #include "ac3enc.h"
  34. #include "eac3enc.h"
  35.  
  36. #define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
  37. #include "ac3enc_opts_template.c"
  38.  
  39. static const AVClass ac3enc_class = {
  40.     .class_name = "Fixed-Point AC-3 Encoder",
  41.     .item_name  = av_default_item_name,
  42.     .option     = ac3_options,
  43.     .version    = LIBAVUTIL_VERSION_INT,
  44. };
  45.  
  46. #include "ac3enc_template.c"
  47.  
  48.  
  49. /**
  50.  * Finalize MDCT and free allocated memory.
  51.  *
  52.  * @param s  AC-3 encoder private context
  53.  */
  54. av_cold void AC3_NAME(mdct_end)(AC3EncodeContext *s)
  55. {
  56.     ff_mdct_end(&s->mdct);
  57. }
  58.  
  59.  
  60. /**
  61.  * Initialize MDCT tables.
  62.  *
  63.  * @param s  AC-3 encoder private context
  64.  * @return   0 on success, negative error code on failure
  65.  */
  66. av_cold int AC3_NAME(mdct_init)(AC3EncodeContext *s)
  67. {
  68.     int ret = ff_mdct_init(&s->mdct, 9, 0, -1.0);
  69.     s->mdct_window = ff_ac3_window;
  70.     return ret;
  71. }
  72.  
  73.  
  74. /*
  75.  * Normalize the input samples to use the maximum available precision.
  76.  * This assumes signed 16-bit input samples.
  77.  */
  78. static int normalize_samples(AC3EncodeContext *s)
  79. {
  80.     int v = s->ac3dsp.ac3_max_msb_abs_int16(s->windowed_samples, AC3_WINDOW_SIZE);
  81.     v = 14 - av_log2(v);
  82.     if (v > 0)
  83.         s->ac3dsp.ac3_lshift_int16(s->windowed_samples, AC3_WINDOW_SIZE, v);
  84.     /* +6 to right-shift from 31-bit to 25-bit */
  85.     return v + 6;
  86. }
  87.  
  88.  
  89. /*
  90.  * Scale MDCT coefficients to 25-bit signed fixed-point.
  91.  */
  92. static void scale_coefficients(AC3EncodeContext *s)
  93. {
  94.     int blk, ch;
  95.  
  96.     for (blk = 0; blk < s->num_blocks; blk++) {
  97.         AC3Block *block = &s->blocks[blk];
  98.         for (ch = 1; ch <= s->channels; ch++) {
  99.             s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS,
  100.                                        block->coeff_shift[ch]);
  101.         }
  102.     }
  103. }
  104.  
  105. static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4],
  106.                                  const int32_t *coef0, const int32_t *coef1,
  107.                                  int len)
  108. {
  109.     s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len);
  110. }
  111.  
  112. /*
  113.  * Clip MDCT coefficients to allowable range.
  114.  */
  115. static void clip_coefficients(AudioDSPContext *adsp, int32_t *coef,
  116.                               unsigned int len)
  117. {
  118.     adsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
  119. }
  120.  
  121.  
  122. /*
  123.  * Calculate a single coupling coordinate.
  124.  */
  125. static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
  126. {
  127.     if (energy_cpl <= COEF_MAX) {
  128.         return 1048576;
  129.     } else {
  130.         uint64_t coord   = energy_ch / (energy_cpl >> 24);
  131.         uint32_t coord32 = FFMIN(coord, 1073741824);
  132.         coord32          = ff_sqrt(coord32) << 9;
  133.         return FFMIN(coord32, COEF_MAX);
  134.     }
  135. }
  136.  
  137.  
  138. static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
  139. {
  140.     AC3EncodeContext *s = avctx->priv_data;
  141.     s->fixed_point = 1;
  142.     return ff_ac3_encode_init(avctx);
  143. }
  144.  
  145.  
  146. AVCodec ff_ac3_fixed_encoder = {
  147.     .name            = "ac3_fixed",
  148.     .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
  149.     .type            = AVMEDIA_TYPE_AUDIO,
  150.     .id              = AV_CODEC_ID_AC3,
  151.     .priv_data_size  = sizeof(AC3EncodeContext),
  152.     .init            = ac3_fixed_encode_init,
  153.     .encode2         = ff_ac3_fixed_encode_frame,
  154.     .close           = ff_ac3_encode_close,
  155.     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
  156.                                                       AV_SAMPLE_FMT_NONE },
  157.     .priv_class      = &ac3enc_class,
  158.     .channel_layouts = ff_ac3_channel_layouts,
  159.     .defaults        = ac3_defaults,
  160. };
  161.