Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /* |
2 | * The simplest AC-3 encoder |
||
3 | * Copyright (c) 2000 Fabrice Bellard |
||
4 | * Copyright (c) 2006-2010 Justin Ruggles |
||
5 | * Copyright (c) 2006-2010 Prakash Punnoor |
||
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 | };><>=>=>> |