Mercurial > mplayer.hg
annotate libmpcodecs/ae_lame.c @ 23011:365eef1fc4f0
Disable caching of rotated glyphs.
The following commits will add perspective distortion to the glyphs rotated
with \frx and \fry. Somewhere along the way correct caching of such glyphs
will become impossible, but in the end everything will be fine.
author | eugeni |
---|---|
date | Fri, 20 Apr 2007 22:49:48 +0000 |
parents | ed8f90096c65 |
children | 7c5417ab16d4 |
rev | line source |
---|---|
15234 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <inttypes.h> | |
15238 | 4 #include <unistd.h> |
15234 | 5 #include <string.h> |
15240 | 6 #include <sys/types.h> |
15234 | 7 #include "m_option.h" |
17012 | 8 #include "mp_msg.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
9 #include "libmpdemux/aviheader.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
10 #include "libmpdemux/ms_hdr.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
11 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
12 #include "libmpdemux/muxer.h" |
17012 | 13 #include "help_mp.h" |
15234 | 14 #include "ae_pcm.h" |
17012 | 15 #include "libaf/af_format.h" |
16 #include "libmpdemux/mp3_hdr.h" | |
15234 | 17 |
18 #undef CDECL | |
19 #include <lame/lame.h> | |
20 | |
21 lame_global_flags *lame; | |
22 static int lame_param_quality=0; // best | |
23 static int lame_param_algqual=5; // same as old default | |
24 static int lame_param_vbr=vbr_default; | |
25 static int lame_param_mode=-1; // unset | |
26 static int lame_param_padding=-1; // unset | |
27 static int lame_param_br=-1; // unset | |
28 static int lame_param_ratio=-1; // unset | |
29 static float lame_param_scale=-1; // unset | |
30 static int lame_param_lowpassfreq = 0; //auto | |
31 static int lame_param_highpassfreq = 0; //auto | |
32 static int lame_param_free_format = 0; //disabled | |
33 static int lame_param_br_min = 0; //not specified | |
34 static int lame_param_br_max = 0; //not specified | |
35 | |
16802
a356a606bd66
replace mp3lame version detection by required features detection
aurel
parents:
15240
diff
changeset
|
36 #ifdef HAVE_MP3LAME_PRESET |
15234 | 37 int lame_param_fast=0; // unset |
38 static char* lame_param_preset=NULL; // unset | |
39 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name ); | |
40 static void lame_presets_longinfo_dm ( FILE* msgfp ); | |
41 #endif | |
42 | |
43 | |
44 m_option_t lameopts_conf[]={ | |
45 {"q", &lame_param_quality, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL}, | |
46 {"aq", &lame_param_algqual, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL}, | |
47 {"vbr", &lame_param_vbr, CONF_TYPE_INT, CONF_RANGE, 0, vbr_max_indicator, NULL}, | |
48 {"cbr", &lame_param_vbr, CONF_TYPE_FLAG, 0, 0, 0, NULL}, | |
49 {"abr", &lame_param_vbr, CONF_TYPE_FLAG, 0, 0, vbr_abr, NULL}, | |
50 {"mode", &lame_param_mode, CONF_TYPE_INT, CONF_RANGE, 0, MAX_INDICATOR, NULL}, | |
51 {"padding", &lame_param_padding, CONF_TYPE_INT, CONF_RANGE, 0, PAD_MAX_INDICATOR, NULL}, | |
52 {"br", &lame_param_br, CONF_TYPE_INT, CONF_RANGE, 0, 1024, NULL}, | |
53 {"ratio", &lame_param_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
54 {"vol", &lame_param_scale, CONF_TYPE_FLOAT, CONF_RANGE, 0, 10, NULL}, | |
55 {"lowpassfreq",&lame_param_lowpassfreq, CONF_TYPE_INT, CONF_RANGE, -1, 48000,0}, | |
56 {"highpassfreq",&lame_param_highpassfreq, CONF_TYPE_INT, CONF_RANGE, -1, 48000,0}, | |
57 {"nofree", &lame_param_free_format, CONF_TYPE_FLAG, 0, 0, 0, NULL}, | |
58 {"free", &lame_param_free_format, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
59 {"br_min", &lame_param_br_min, CONF_TYPE_INT, CONF_RANGE, 0, 1024, NULL}, | |
60 {"br_max", &lame_param_br_max, CONF_TYPE_INT, CONF_RANGE, 0, 1024, NULL}, | |
16802
a356a606bd66
replace mp3lame version detection by required features detection
aurel
parents:
15240
diff
changeset
|
61 #ifdef HAVE_MP3LAME_PRESET |
15234 | 62 {"fast", &lame_param_fast, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
63 {"preset", &lame_param_preset, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
64 #else | |
65 {"fast", "MPlayer was built without -lameopts fast support (requires libmp3lame >=3.92).\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, | |
66 {"preset", "MPlayer was built without -lameopts preset support (requires libmp3lame >=3.92).\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, | |
67 #endif | |
68 {"help", MSGTR_MEncoderMP3LameHelp, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, | |
69 {NULL, NULL, 0, 0, 0, 0, NULL} | |
70 }; | |
71 | |
72 | |
73 static int pass; | |
74 | |
75 static int bind_lame(audio_encoder_t *encoder, muxer_stream_t *mux_a) | |
76 { | |
21621 | 77 mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MP3AudioSelected); |
15234 | 78 mux_a->h.dwSampleSize=0; // VBR |
79 mux_a->h.dwRate=encoder->params.sample_rate; | |
80 mux_a->h.dwScale=encoder->params.samples_per_frame; // samples/frame | |
81 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,MSGTR_MP3WaveFormatSizeNot30,sizeof(MPEGLAYER3WAVEFORMAT)); | |
82 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30 | |
83 mux_a->wf->wFormatTag=0x55; // MP3 | |
84 mux_a->wf->nChannels= (lame_param_mode<0) ? encoder->params.channels : ((lame_param_mode==3) ? 1 : 2); | |
85 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; | |
86 if(! lame_param_vbr) | |
87 mux_a->wf->nAvgBytesPerSec=lame_param_br * 125; | |
88 else | |
89 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME! | |
90 mux_a->wf->nBlockAlign=encoder->params.samples_per_frame; // required for l3codeca.acm + WMP 6.4 | |
91 mux_a->wf->wBitsPerSample=0; //16; | |
92 // from NaNdub: (requires for l3codeca.acm) | |
93 mux_a->wf->cbSize=12; | |
94 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1; | |
95 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2; | |
96 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=encoder->params.samples_per_frame; // ??? | |
97 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1; | |
98 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0; | |
99 | |
19397
0074c9c77a0e
Set encoder's input format to "native endiannes", instead of little endian.
gpoirier
parents:
17932
diff
changeset
|
100 encoder->input_format = AF_FORMAT_S16_NE; |
15234 | 101 encoder->min_buffer_size = 4608; |
102 encoder->max_buffer_size = mux_a->h.dwRate * mux_a->wf->nChannels * 2; | |
103 | |
104 return 1; | |
105 } | |
106 | |
107 #define min(a, b) ((a) <= (b) ? (a) : (b)) | |
108 | |
109 static int get_frame_size(audio_encoder_t *encoder) | |
110 { | |
111 int sz; | |
112 if(encoder->stream->buffer_len < 4) | |
113 return 0; | |
114 sz = mp_decode_mp3_header(encoder->stream->buffer); | |
115 if(sz <= 0) | |
116 return 0; | |
117 return sz; | |
118 } | |
119 | |
120 static int encode_lame(audio_encoder_t *encoder, uint8_t *dest, void *src, int len, int max_size) | |
121 { | |
122 int n = 0; | |
123 if(encoder->params.channels == 1) | |
124 n = lame_encode_buffer(lame, (short *)src, (short *)src, len/2, dest, max_size); | |
125 else | |
126 n = lame_encode_buffer_interleaved(lame,(short *)src, len/4, dest, max_size); | |
127 | |
128 return (n < 0 ? 0 : n); | |
129 } | |
130 | |
131 | |
132 static int close_lame(audio_encoder_t *encoder) | |
133 { | |
134 return 1; | |
135 } | |
136 | |
137 static void fixup(audio_encoder_t *encoder) | |
138 { | |
139 // fixup CBR mp3 audio header: | |
140 if(!lame_param_vbr) { | |
141 encoder->stream->h.dwSampleSize=1; | |
142 ((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize= | |
143 (encoder->stream->size+(encoder->stream->h.dwLength>>1))/encoder->stream->h.dwLength; | |
144 encoder->stream->h.dwLength=encoder->stream->size; | |
145 encoder->stream->h.dwRate=encoder->stream->wf->nAvgBytesPerSec; | |
146 encoder->stream->h.dwScale=1; | |
147 encoder->stream->wf->nBlockAlign=1; | |
21621 | 148 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_CBRAudioByterate, |
15234 | 149 encoder->stream->h.dwRate,((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize); |
150 } | |
151 } | |
152 | |
153 int mpae_init_lame(audio_encoder_t *encoder) | |
154 { | |
155 encoder->params.bitrate = lame_param_br * 125; | |
156 encoder->params.samples_per_frame = encoder->params.sample_rate < 32000 ? 576 : 1152; | |
157 encoder->decode_buffer_size = 2304; | |
158 | |
159 lame=lame_init(); | |
160 lame_set_bWriteVbrTag(lame,0); | |
161 lame_set_in_samplerate(lame,encoder->params.sample_rate); | |
162 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame | |
163 lame_set_num_channels(lame,encoder->params.channels); | |
164 lame_set_out_samplerate(lame,encoder->params.sample_rate); | |
165 lame_set_quality(lame,lame_param_algqual); // 0 = best q | |
166 if(lame_param_free_format) lame_set_free_format(lame,1); | |
167 if(lame_param_vbr){ // VBR: | |
168 lame_set_VBR(lame,lame_param_vbr); // vbr mode | |
169 lame_set_VBR_q(lame,lame_param_quality); // 0 = best vbr q 5=~128k | |
170 if(lame_param_br>0) lame_set_VBR_mean_bitrate_kbps(lame,lame_param_br); | |
171 if(lame_param_br_min>0) lame_set_VBR_min_bitrate_kbps(lame,lame_param_br_min); | |
172 if(lame_param_br_max>0) lame_set_VBR_max_bitrate_kbps(lame,lame_param_br_max); | |
173 } else { // CBR: | |
174 if(lame_param_br>0) lame_set_brate(lame,lame_param_br); | |
175 } | |
176 if(lame_param_mode>=0) lame_set_mode(lame,lame_param_mode); // j-st | |
177 if(lame_param_ratio>0) lame_set_compression_ratio(lame,lame_param_ratio); | |
178 if(lame_param_scale>0) { | |
21621 | 179 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_SettingAudioInputGain, lame_param_scale); |
15234 | 180 lame_set_scale(lame,lame_param_scale); |
181 } | |
182 if(lame_param_lowpassfreq>=-1) lame_set_lowpassfreq(lame,lame_param_lowpassfreq); | |
183 if(lame_param_highpassfreq>=-1) lame_set_highpassfreq(lame,lame_param_highpassfreq); | |
16802
a356a606bd66
replace mp3lame version detection by required features detection
aurel
parents:
15240
diff
changeset
|
184 #ifdef HAVE_MP3LAME_PRESET |
15234 | 185 if(lame_param_preset != NULL) { |
21621 | 186 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_LamePresetEquals,lame_param_preset); |
15234 | 187 if(lame_presets_set(lame,lame_param_fast, (lame_param_vbr==0), lame_param_preset) < 0) |
188 return 0; | |
189 } | |
190 #endif | |
191 if(lame_init_params(lame) == -1) { | |
192 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameCantInit); | |
193 return 0; | |
194 } | |
17932 | 195 if( mp_msg_test(MSGT_MENCODER,MSGL_V) ) { |
15234 | 196 lame_print_config(lame); |
197 lame_print_internals(lame); | |
198 } | |
199 | |
200 encoder->bind = bind_lame; | |
201 encoder->get_frame_size = get_frame_size; | |
202 encoder->encode = encode_lame; | |
203 encoder->fixup = fixup; | |
204 encoder->close = close_lame; | |
205 return 1; | |
206 } | |
207 | |
16802
a356a606bd66
replace mp3lame version detection by required features detection
aurel
parents:
15240
diff
changeset
|
208 #ifdef HAVE_MP3LAME_PRESET |
15234 | 209 /* lame_presets_set |
210 taken out of presets_set in lame-3.93.1/frontend/parse.c and modified */ | |
211 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name ) | |
212 { | |
213 int mono = 0; | |
214 | |
215 if (strcmp(preset_name, "help") == 0) { | |
21621 | 216 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameVersion, get_lame_version(), get_lame_url()); |
21622
5cd2a0041019
Simplify: get rid of useless lame_presets_longinfo_dm function.
reimar
parents:
21621
diff
changeset
|
217 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LamePresetsLongInfo); |
15234 | 218 return -1; |
219 } | |
220 | |
221 //aliases for compatibility with old presets | |
222 | |
223 if (strcmp(preset_name, "phone") == 0) { | |
224 preset_name = "16"; | |
225 mono = 1; | |
226 } | |
227 if ( (strcmp(preset_name, "phon+") == 0) || | |
228 (strcmp(preset_name, "lw") == 0) || | |
229 (strcmp(preset_name, "mw-eu") == 0) || | |
230 (strcmp(preset_name, "sw") == 0)) { | |
231 preset_name = "24"; | |
232 mono = 1; | |
233 } | |
234 if (strcmp(preset_name, "mw-us") == 0) { | |
235 preset_name = "40"; | |
236 mono = 1; | |
237 } | |
238 if (strcmp(preset_name, "voice") == 0) { | |
239 preset_name = "56"; | |
240 mono = 1; | |
241 } | |
242 if (strcmp(preset_name, "fm") == 0) { | |
243 preset_name = "112"; | |
244 } | |
245 if ( (strcmp(preset_name, "radio") == 0) || | |
246 (strcmp(preset_name, "tape") == 0)) { | |
247 preset_name = "112"; | |
248 } | |
249 if (strcmp(preset_name, "hifi") == 0) { | |
250 preset_name = "160"; | |
251 } | |
252 if (strcmp(preset_name, "cd") == 0) { | |
253 preset_name = "192"; | |
254 } | |
255 if (strcmp(preset_name, "studio") == 0) { | |
256 preset_name = "256"; | |
257 } | |
258 | |
16802
a356a606bd66
replace mp3lame version detection by required features detection
aurel
parents:
15240
diff
changeset
|
259 #ifdef HAVE_MP3LAME_PRESET_MEDIUM |
15234 | 260 if (strcmp(preset_name, "medium") == 0) { |
261 if (fast > 0) | |
262 lame_set_preset(gfp, MEDIUM_FAST); | |
263 else | |
264 lame_set_preset(gfp, MEDIUM); | |
265 | |
266 return 0; | |
267 } | |
268 #endif | |
269 | |
270 if (strcmp(preset_name, "standard") == 0) { | |
271 if (fast > 0) | |
272 lame_set_preset(gfp, STANDARD_FAST); | |
273 else | |
274 lame_set_preset(gfp, STANDARD); | |
275 | |
276 return 0; | |
277 } | |
278 | |
279 else if (strcmp(preset_name, "extreme") == 0){ | |
280 if (fast > 0) | |
281 lame_set_preset(gfp, EXTREME_FAST); | |
282 else | |
283 lame_set_preset(gfp, EXTREME); | |
284 | |
285 return 0; | |
286 } | |
287 | |
288 else if (((strcmp(preset_name, "insane") == 0) || | |
289 (strcmp(preset_name, "320" ) == 0)) && (fast < 1)) { | |
290 | |
291 lame_set_preset(gfp, INSANE); | |
292 | |
293 return 0; | |
294 } | |
295 | |
296 // Generic ABR Preset | |
297 if (((atoi(preset_name)) > 0) && (fast < 1)) { | |
298 if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320){ | |
299 lame_set_preset(gfp, atoi(preset_name)); | |
300 | |
301 if (cbr == 1 ) | |
302 lame_set_VBR(gfp, vbr_off); | |
303 | |
304 if (mono == 1 ) { | |
305 lame_set_mode(gfp, MONO); | |
306 } | |
307 | |
308 return 0; | |
309 | |
310 } | |
311 else { | |
21621 | 312 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameVersion, get_lame_version(), get_lame_url()); |
313 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidBitrateForLamePreset); | |
15234 | 314 return -1; |
315 } | |
316 } | |
317 | |
21621 | 318 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameVersion, get_lame_version(), get_lame_url()); |
319 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidLamePresetOptions); | |
15234 | 320 return -1; |
321 } | |
322 #endif |