annotate libmpcodecs/ae_lame.c @ 22997:fd0fda0c6555

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