ffmpeg / libavcodec / ac3enc_float.c @ 6fd96d1a
History  View  Annotate  Download (2.92 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 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 021101301 USA

22 
*/

23  
24 
/**

25 
* @file

26 
* floatingpoint AC3 encoder.

27 
*/

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

34 
* Finalize MDCT and free allocated memory.

35 
*/

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

44 
* Initialize MDCT tables.

45 
* @param nbits log2(MDCT size)

46 
*/

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

49 
{ 
50 
float *window;

51 
int n, n2;

52  
53 
n = 1 << nbits;

54 
n2 = n >> 1;

55  
56 
window = av_malloc(n2 * sizeof(*window));

57 
if (!window) {

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

59 
return AVERROR(ENOMEM);

60 
} 
61 
ff_kbd_window_init(window, 5.0, n2); 
62 
mdct>window = window; 
63  
64 
return ff_mdct_init(&mdct>fft, nbits, 0, 2.0 / n); 
65 
} 
66  
67  
68 
/**

69 
* Calculate a 512point MDCT

70 
* @param out 256 output frequency coefficients

71 
* @param in 512 windowed input audio samples

72 
*/

73 
static void mdct512(AC3MDCTContext *mdct, float *out, float *in) 
74 
{ 
75 
ff_mdct_calc(&mdct>fft, out, in); 
76 
} 
77  
78  
79 
/**

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

81 
*/

82 
static void apply_window(float *output, const float *input, 
83 
const float *window, int n) 
84 
{ 
85 
int i;

86 
int n2 = n >> 1; 
87  
88 
for (i = 0; i < n2; i++) { 
89 
output[i] = input[i] * window[i]; 
90 
output[ni1] = input[ni1] * window[i]; 
91 
} 
92 
} 
93  
94  
95 
/**

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

97 
*/

98 
static int normalize_samples(AC3EncodeContext *s) 
99 
{ 
100 
/* Normalization is not needed for floatingpoint samples, so just return 0 */

101 
return 0; 
102 
} 
103  
104  
105 
AVCodec ac3_encoder = { 
106 
"ac3",

107 
AVMEDIA_TYPE_AUDIO, 
108 
CODEC_ID_AC3, 
109 
sizeof(AC3EncodeContext),

110 
ac3_encode_init, 
111 
ac3_encode_frame, 
112 
ac3_encode_close, 
113 
NULL,

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

116 
.channel_layouts = ac3_channel_layouts, 
117 
}; 