Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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 CONFIG_FFT_FLOAT 0
  30. #undef CONFIG_AC3ENC_FLOAT
  31. #include "internal.h"
  32. #include "ac3enc.h"
  33. #include "eac3enc.h"
  34.  
  35. #define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
  36. #include "ac3enc_opts_template.c"
  37.  
  38. static const AVClass ac3enc_class = {
  39.     .class_name = "Fixed-Point AC-3 Encoder",
  40.     .item_name  = av_default_item_name,
  41.     .option     = ac3_options,
  42.     .version    = LIBAVUTIL_VERSION_INT,
  43. };
  44.  
  45. #include "ac3enc_template.c"
  46.  
  47.  
  48. /**
  49.  * Finalize MDCT and free allocated memory.
  50.  *
  51.  * @param s  AC-3 encoder private context
  52.  */
  53. av_cold void AC3_NAME(mdct_end)(AC3EncodeContext *s)
  54. {
  55.     ff_mdct_end(&s->mdct);
  56. }
  57.  
  58.  
  59. /**
  60.  * Initialize MDCT tables.
  61.  *
  62.  * @param s  AC-3 encoder private context
  63.  * @return   0 on success, negative error code on failure
  64.  */
  65. av_cold int AC3_NAME(mdct_init)(AC3EncodeContext *s)
  66. {
  67.     int ret = ff_mdct_init(&s->mdct, 9, 0, -1.0);
  68.     s->mdct_window = ff_ac3_window;
  69.     return ret;
  70. }
  71.  
  72.  
  73. /*
  74.  * Apply KBD window to input samples prior to MDCT.
  75.  */
  76. static void apply_window(void *dsp, int16_t *output, const int16_t *input,
  77.                          const int16_t *window, unsigned int len)
  78. {
  79.     DSPContext *dsp0 = dsp;
  80.     dsp0->apply_window_int16(output, input, window, len);
  81. }
  82.  
  83.  
  84. /*
  85.  * Normalize the input samples to use the maximum available precision.
  86.  * This assumes signed 16-bit input samples.
  87.  */
  88. static int normalize_samples(AC3EncodeContext *s)
  89. {
  90.     int v = s->ac3dsp.ac3_max_msb_abs_int16(s->windowed_samples, AC3_WINDOW_SIZE);
  91.     v = 14 - av_log2(v);
  92.     if (v > 0)
  93.         s->ac3dsp.ac3_lshift_int16(s->windowed_samples, AC3_WINDOW_SIZE, v);
  94.     /* +6 to right-shift from 31-bit to 25-bit */
  95.     return v + 6;
  96. }
  97.  
  98.  
  99. /*
  100.  * Scale MDCT coefficients to 25-bit signed fixed-point.
  101.  */
  102. static void scale_coefficients(AC3EncodeContext *s)
  103. {
  104.     int blk, ch;
  105.  
  106.     for (blk = 0; blk < s->num_blocks; blk++) {
  107.         AC3Block *block = &s->blocks[blk];
  108.         for (ch = 1; ch <= s->channels; ch++) {
  109.             s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS,
  110.                                        block->coeff_shift[ch]);
  111.         }
  112.     }
  113. }
  114.  
  115. static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4],
  116.                                  const int32_t *coef0, const int32_t *coef1,
  117.                                  int len)
  118. {
  119.     s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len);
  120. }
  121.  
  122. /*
  123.  * Clip MDCT coefficients to allowable range.
  124.  */
  125. static void clip_coefficients(DSPContext *dsp, int32_t *coef, unsigned int len)
  126. {
  127.     dsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
  128. }
  129.  
  130.  
  131. /*
  132.  * Calculate a single coupling coordinate.
  133.  */
  134. static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
  135. {
  136.     if (energy_cpl <= COEF_MAX) {
  137.         return 1048576;
  138.     } else {
  139.         uint64_t coord   = energy_ch / (energy_cpl >> 24);
  140.         uint32_t coord32 = FFMIN(coord, 1073741824);
  141.         coord32          = ff_sqrt(coord32) << 9;
  142.         return FFMIN(coord32, COEF_MAX);
  143.     }
  144. }
  145.  
  146.  
  147. static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
  148. {
  149.     AC3EncodeContext *s = avctx->priv_data;
  150.     s->fixed_point = 1;
  151.     return ff_ac3_encode_init(avctx);
  152. }
  153.  
  154.  
  155. AVCodec ff_ac3_fixed_encoder = {
  156.     .name            = "ac3_fixed",
  157.     .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
  158.     .type            = AVMEDIA_TYPE_AUDIO,
  159.     .id              = AV_CODEC_ID_AC3,
  160.     .priv_data_size  = sizeof(AC3EncodeContext),
  161.     .init            = ac3_fixed_encode_init,
  162.     .encode2         = ff_ac3_fixed_encode_frame,
  163.     .close           = ff_ac3_encode_close,
  164.     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
  165.                                                       AV_SAMPLE_FMT_NONE },
  166.     .priv_class      = &ac3enc_class,
  167.     .channel_layouts = ff_ac3_channel_layouts,
  168.     .defaults        = ac3_defaults,
  169. };
  170.