/src/ffmpeg/libavcodec/ac3enc_float.c
Line | Count | Source |
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 | | * floating-point AC-3 encoder. |
27 | | */ |
28 | | |
29 | 0 | #define AC3ENC_FLOAT 1 |
30 | | #include "audiodsp.h" |
31 | | #include "ac3enc.h" |
32 | | #include "codec_internal.h" |
33 | | #include "eac3enc.h" |
34 | | #include "kbdwin.h" |
35 | | |
36 | | |
37 | | /* |
38 | | * Scale MDCT coefficients from float to 24-bit fixed-point. |
39 | | */ |
40 | | static void scale_coefficients(AC3EncodeContext *s) |
41 | 0 | { |
42 | 0 | int chan_size = AC3_MAX_COEFS * s->num_blocks; |
43 | 0 | int cpl = s->cpl_on; |
44 | 0 | s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + (chan_size * !cpl), |
45 | 0 | s->mdct_coef_buffer + (chan_size * !cpl), |
46 | 0 | chan_size * (s->channels + cpl)); |
47 | 0 | } |
48 | | |
49 | | |
50 | | /* |
51 | | * Clip MDCT coefficients to allowable range. |
52 | | */ |
53 | | static void clip_coefficients(AudioDSPContext *adsp, float *coef, |
54 | | unsigned int len) |
55 | 0 | { |
56 | 0 | adsp->vector_clipf(coef, coef, len, COEF_MIN, COEF_MAX); |
57 | 0 | } |
58 | | |
59 | | |
60 | | /* |
61 | | * Calculate a single coupling coordinate. |
62 | | */ |
63 | | static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl) |
64 | 0 | { |
65 | 0 | float coord = 0.125; |
66 | 0 | if (energy_cpl > 0) |
67 | 0 | coord *= sqrtf(energy_ch / energy_cpl); |
68 | 0 | return FFMIN(coord, COEF_MAX); |
69 | 0 | } |
70 | | |
71 | | static void sum_square_butterfly(AC3EncodeContext *s, float sum[4], |
72 | | const float *coef0, const float *coef1, |
73 | | int len) |
74 | 0 | { |
75 | 0 | s->ac3dsp.sum_square_butterfly_float(sum, coef0, coef1, len); |
76 | 0 | } |
77 | | |
78 | | #include "ac3enc_template.c" |
79 | | |
80 | | /** |
81 | | * Initialize MDCT tables. |
82 | | * |
83 | | * @param s AC-3 encoder private context |
84 | | * @return 0 on success, negative error code on failure |
85 | | */ |
86 | | static av_cold int ac3_float_mdct_init(AC3EncodeContext *s) |
87 | 0 | { |
88 | 0 | const float scale = -2.0 / AC3_WINDOW_SIZE; |
89 | |
|
90 | 0 | ff_kbd_window_init(s->mdct_window_float, 5.0, AC3_BLOCK_SIZE); |
91 | |
|
92 | 0 | return av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_MDCT, 0, |
93 | 0 | AC3_BLOCK_SIZE, &scale, 0); |
94 | 0 | } |
95 | | |
96 | | |
97 | | av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx) |
98 | 0 | { |
99 | 0 | AC3EncodeContext *s = avctx->priv_data; |
100 | 0 | int ret; |
101 | |
|
102 | 0 | s->encode_frame = encode_frame; |
103 | 0 | s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); |
104 | 0 | if (!s->fdsp) |
105 | 0 | return AVERROR(ENOMEM); |
106 | | |
107 | 0 | ret = ac3_float_mdct_init(s); |
108 | 0 | if (ret < 0) |
109 | 0 | return ret; |
110 | | |
111 | 0 | return ff_ac3_encode_init(avctx); |
112 | 0 | } |
113 | | |
114 | | const FFCodec ff_ac3_encoder = { |
115 | | .p.name = "ac3", |
116 | | CODEC_LONG_NAME("ATSC A/52A (AC-3)"), |
117 | | .p.type = AVMEDIA_TYPE_AUDIO, |
118 | | .p.id = AV_CODEC_ID_AC3, |
119 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
120 | | .priv_data_size = sizeof(AC3EncodeContext), |
121 | | .init = ff_ac3_float_encode_init, |
122 | | FF_CODEC_ENCODE_CB(ff_ac3_encode_frame), |
123 | | .close = ff_ac3_encode_close, |
124 | | CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_FLTP), |
125 | | .p.priv_class = &ff_ac3enc_class, |
126 | | CODEC_SAMPLERATES_ARRAY(ff_ac3_sample_rate_tab), |
127 | | CODEC_CH_LAYOUTS_ARRAY(ff_ac3_ch_layouts), |
128 | | .defaults = ff_ac3_enc_defaults, |
129 | | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, |
130 | | }; |