ffmpeg / libavcodec / ac3enc_float.c @ e6e98234
History  View  Annotate  Download (3.2 KB)
1 
/*


2 
* The simplest AC3 encoder

3 
* Copyright (c) 2000 Fabrice Bellard

4 
* Copyright (c) 20062010 Justin Ruggles <justin.ruggles@gmail.com>

5 
* Copyright (c) 20062010 Prakash Punnoor <prakash@punnoor.de>

6 
*

7 
* This file is part of Libav.

8 
*

9 
* Libav 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 
* Libav 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 Libav; if not, write to the Free Software

21 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA

22 
*/

23  
24 
/**

25 
* @file

26 
* floatingpoint AC3 encoder.

27 
*/

28  
29 
#define CONFIG_AC3ENC_FLOAT 1 
30 
#include "ac3enc.c" 
31 
#include "kbdwin.h" 
32  
33  
34 
/**

35 
* Finalize MDCT and free allocated memory.

36 
*/

37 
static av_cold void mdct_end(AC3MDCTContext *mdct) 
38 
{ 
39 
ff_mdct_end(&mdct>fft); 
40 
av_freep(&mdct>window); 
41 
} 
42  
43  
44 
/**

45 
* Initialize MDCT tables.

46 
* @param nbits log2(MDCT size)

47 
*/

48 
static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, 
49 
int nbits)

50 
{ 
51 
float *window;

52 
int i, n, n2;

53  
54 
n = 1 << nbits;

55 
n2 = n >> 1;

56  
57 
window = av_malloc(n * sizeof(*window));

58 
if (!window) {

59 
av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");

60 
return AVERROR(ENOMEM);

61 
} 
62 
ff_kbd_window_init(window, 5.0, n2); 
63 
for (i = 0; i < n2; i++) 
64 
window[n1i] = window[i];

65 
mdct>window = window; 
66  
67 
return ff_mdct_init(&mdct>fft, nbits, 0, 2.0 / n); 
68 
} 
69  
70  
71 
/**

72 
* Calculate a 512point MDCT

73 
* @param out 256 output frequency coefficients

74 
* @param in 512 windowed input audio samples

75 
*/

76 
static void mdct512(AC3MDCTContext *mdct, float *out, float *in) 
77 
{ 
78 
mdct>fft.mdct_calc(&mdct>fft, out, in); 
79 
} 
80  
81  
82 
/**

83 
* Apply KBD window to input samples prior to MDCT.

84 
*/

85 
static void apply_window(DSPContext *dsp, float *output, const float *input, 
86 
const float *window, unsigned int len) 
87 
{ 
88 
dsp>vector_fmul(output, input, window, len); 
89 
} 
90  
91  
92 
/**

93 
* Normalize the input samples to use the maximum available precision.

94 
*/

95 
static int normalize_samples(AC3EncodeContext *s) 
96 
{ 
97 
/* Normalization is not needed for floatingpoint samples, so just return 0 */

98 
return 0; 
99 
} 
100  
101  
102 
/**

103 
* Scale MDCT coefficients from float to 24bit fixedpoint.

104 
*/

105 
static void scale_coefficients(AC3EncodeContext *s) 
106 
{ 
107 
s>ac3dsp.float_to_fixed24(s>fixed_coef_buffer, s>mdct_coef_buffer, 
108 
AC3_MAX_COEFS * AC3_MAX_BLOCKS * s>channels); 
109 
} 
110  
111  
112 
AVCodec ff_ac3_encoder = { 
113 
"ac3",

114 
AVMEDIA_TYPE_AUDIO, 
115 
CODEC_ID_AC3, 
116 
sizeof(AC3EncodeContext),

117 
ac3_encode_init, 
118 
ac3_encode_frame, 
119 
ac3_encode_close, 
120 
NULL,

121 
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, 
122 
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC3)"),

123 
.channel_layouts = ac3_channel_layouts, 
124 
}; 