ffmpeg / libavcodec / ac3enc_fixed.c @ 79997def
History  View  Annotate  Download (3.33 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 
* fixedpoint AC3 encoder.

27 
*/

28  
29 
#define CONFIG_FFT_FLOAT 0 
30 
#undef CONFIG_AC3ENC_FLOAT

31 
#include "ac3enc.c" 
32  
33  
34 
/**

35 
* Finalize MDCT and free allocated memory.

36 
*/

37 
static av_cold void mdct_end(AC3MDCTContext *mdct) 
38 
{ 
39 
ff_fft_end(&mdct>fft); 
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 
int ret = ff_mdct_init(&mdct>fft, nbits, 0, 1.0); 
51 
mdct>window = ff_ac3_window; 
52 
return ret;

53 
} 
54  
55  
56 
/**

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

58 
*/

59 
static void apply_window(DSPContext *dsp, int16_t *output, const int16_t *input, 
60 
const int16_t *window, unsigned int len) 
61 
{ 
62 
dsp>apply_window_int16(output, input, window, len); 
63 
} 
64  
65  
66 
/**

67 
* Calculate the log2() of the maximum absolute value in an array.

68 
* @param tab input array

69 
* @param n number of values in the array

70 
* @return log2(max(abs(tab[])))

71 
*/

72 
static int log2_tab(AC3EncodeContext *s, int16_t *src, int len) 
73 
{ 
74 
int v = s>ac3dsp.ac3_max_msb_abs_int16(src, len);

75 
return av_log2(v);

76 
} 
77  
78  
79 
/**

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

81 
* This assumes signed 16bit input samples.

82 
*

83 
* @return exponent shift

84 
*/

85 
static int normalize_samples(AC3EncodeContext *s) 
86 
{ 
87 
int v = 14  log2_tab(s, s>windowed_samples, AC3_WINDOW_SIZE); 
88 
if (v > 0) 
89 
s>ac3dsp.ac3_lshift_int16(s>windowed_samples, AC3_WINDOW_SIZE, v); 
90 
/* +6 to rightshift from 31bit to 25bit */

91 
return v + 6; 
92 
} 
93  
94  
95 
/**

96 
* Scale MDCT coefficients to 25bit signed fixedpoint.

97 
*/

98 
static void scale_coefficients(AC3EncodeContext *s) 
99 
{ 
100 
int blk, ch;

101  
102 
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { 
103 
AC3Block *block = &s>blocks[blk]; 
104 
for (ch = 0; ch < s>channels; ch++) { 
105 
s>ac3dsp.ac3_rshift_int32(block>mdct_coef[ch], AC3_MAX_COEFS, 
106 
block>coeff_shift[ch]); 
107 
} 
108 
} 
109 
} 
110  
111  
112 
AVCodec ff_ac3_fixed_encoder = { 
113 
"ac3_fixed",

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_S16,AV_SAMPLE_FMT_NONE}, 
122 
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC3)"),

123 
.priv_class = &ac3enc_class, 
124 
.channel_layouts = ac3_channel_layouts, 
125 
}; 