ac3enc_fixed.c
Go to the documentation of this file.
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  */
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  */
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  */
89 {
91  v = 14 - av_log2(v);
92  if (v > 0)
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  */
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++) {
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 
148 {
149  AC3EncodeContext *s = avctx->priv_data;
150  s->fixed_point = 1;
151  return ff_ac3_encode_init(avctx);
152 }
153 
154 
156  .name = "ac3_fixed",
157  .type = AVMEDIA_TYPE_AUDIO,
158  .id = AV_CODEC_ID_AC3,
159  .priv_data_size = sizeof(AC3EncodeContext),
161  .encode2 = ff_ac3_fixed_encode_frame,
163  .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
165  .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
166  .priv_class = &ac3enc_class,
167  .channel_layouts = ff_ac3_channel_layouts,
168  .defaults = ac3_defaults,
169 };
float v
const char * s
Definition: avisynth_c.h:668
struct AC3EncodeContext AC3EncodeContext
AC-3 encoder private context.
av_default_item_name
#define AC3_MAX_COEFS
Definition: ac3.h:34
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
Definition: ac3enc_fixed.c:147
#define AC3_WINDOW_SIZE
Definition: ac3.h:38
#define COEF_MIN
Definition: ac3enc.h:64
#define blk(i)
Definition: sha.c:169
DSPContext dsp
Definition: ac3enc.h:162
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
#define av_cold
Definition: attributes.h:78
av_cold int AC3_NAME() mdct_init(AC3EncodeContext *s)
Initialize MDCT tables.
Definition: ac3enc_fixed.c:65
av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
Finalize encoding and free any memory allocated by the encoder.
Definition: ac3enc.c:2015
AC3DSPContext ac3dsp
AC-3 optimized functions.
Definition: ac3enc.h:164
av_cold void AC3_NAME() mdct_end(AC3EncodeContext *s)
Finalize MDCT and free allocated memory.
Definition: ac3enc_fixed.c:53
int64_t CoefSumType
Definition: ac3enc.h:69
CoefType ** mdct_coef
MDCT coefficients.
Definition: ac3enc.h:129
const uint64_t ff_ac3_channel_layouts[19]
List of supported channel layouts.
Definition: ac3enc.c:79
int channels
total number of channels (nchans)
Definition: ac3enc.h:188
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AC3_NAME(x)
Definition: ac3enc.h:62
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an input
const char * name
Name of the codec implementation.
int fixed_point
indicates if fixed-point encoder is being used
Definition: ac3enc.h:170
overlapping window(triangular window to avoid too much overlapping) ovidx
#define ff_mdct_init
Definition: fft.h:147
int(* ac3_max_msb_abs_int16)(const int16_t *src, int len)
Calculate the maximum MSB of the absolute value of each element in an array of int16_t.
Definition: ac3dsp.h:54
void(* apply_window_int16)(int16_t *output, const int16_t *input, const int16_t *window, unsigned int len)
Apply symmetric window in 16-bit fixed-point.
Definition: dsputil.h:294
void(* ac3_lshift_int16)(int16_t *src, unsigned int len, unsigned int shift)
Left-shift each value in an array of int16_t by a specified amount.
Definition: ac3dsp.h:65
Data for a single audio block.
Definition: ac3enc.h:128
void(* ac3_rshift_int32)(int32_t *src, unsigned int len, unsigned int shift)
Right-shift each value in an array of int32_t by a specified amount.
Definition: ac3dsp.h:76
#define FFMIN(a, b)
Definition: common.h:58
ret
Definition: avfilter.c:821
int32_t
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static void scale_coefficients(AC3EncodeContext *s)
Definition: ac3enc_fixed.c:102
void(* sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
Definition: ac3dsp.h:129
void(* vector_clip_int32)(int32_t *dst, const int32_t *src, int32_t min, int32_t max, unsigned int len)
Clip each element in an array of int32_t to a given minimum and maximum value.
Definition: dsputil.h:310
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
Definition: ac3enc_fixed.c:134
static av_const unsigned int ff_sqrt(unsigned int a)
Definition: mathops.h:198
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
Describe the class of an AVClass context structure.
Definition: log.h:50
int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static const AVCodecDefault ac3_defaults[]
AC-3 encoder private context.
Definition: ac3enc.h:157
AC3Block blocks[AC3_MAX_BLOCKS]
per-block info
Definition: ac3enc.h:168
SampleType * windowed_samples
Definition: ac3enc.h:230
static void apply_window(void *dsp, int16_t *output, const int16_t *input, const int16_t *window, unsigned int len)
Definition: ac3enc_fixed.c:76
int num_blocks
number of blocks per frame
Definition: ac3enc.h:179
uint8_t coeff_shift[AC3_MAX_CHANNELS]
fixed-point coefficient shift values
Definition: ac3enc.h:139
static void clip_coefficients(DSPContext *dsp, int32_t *coef, unsigned int len)
Definition: ac3enc_fixed.c:125
#define COEF_MAX
Definition: ac3enc.h:65
AC-3 encoder float/fixed template.
common internal api header.
AVCodec ff_ac3_fixed_encoder
Definition: ac3enc_fixed.c:155
#define ff_mdct_end
Definition: fft.h:148
const int16_t ff_ac3_window[AC3_WINDOW_SIZE/2]
static const AVClass ac3enc_class
Definition: ac3enc_fixed.c:38
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
static const AVOption ac3_options[]
AVCodecContext * avctx
parent AVCodecContext
Definition: ac3enc.h:160
int len
#define av_log2
Definition: intmath.h:89
signed 16 bits, planar
Definition: samplefmt.h:58
static int normalize_samples(AC3EncodeContext *s)
Definition: ac3enc_fixed.c:88
AC-3 encoder & E-AC-3 encoder common header.
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:700
static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
Definition: ac3enc_fixed.c:115
int32_t CoefType
Definition: ac3enc.h:68
E-AC-3 encoder.
DSPContext.
Definition: dsputil.h:127
av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
Definition: ac3enc.c:2419