annotate libmpcodecs/ae_lame.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 7c5417ab16d4
children 9f8f66eca56e
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 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
41
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
43 m_option_t lameopts_conf[]={
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
44 {"q", &lame_param_quality, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
45 {"aq", &lame_param_algqual, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
46 {"vbr", &lame_param_vbr, CONF_TYPE_INT, CONF_RANGE, 0, vbr_max_indicator, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
47 {"cbr", &lame_param_vbr, CONF_TYPE_FLAG, 0, 0, 0, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
48 {"abr", &lame_param_vbr, CONF_TYPE_FLAG, 0, 0, vbr_abr, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
49 {"mode", &lame_param_mode, CONF_TYPE_INT, CONF_RANGE, 0, MAX_INDICATOR, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
50 {"padding", &lame_param_padding, CONF_TYPE_INT, CONF_RANGE, 0, PAD_MAX_INDICATOR, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51 {"br", &lame_param_br, CONF_TYPE_INT, CONF_RANGE, 0, 1024, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 {"ratio", &lame_param_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 {"vol", &lame_param_scale, CONF_TYPE_FLOAT, CONF_RANGE, 0, 10, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54 {"lowpassfreq",&lame_param_lowpassfreq, CONF_TYPE_INT, CONF_RANGE, -1, 48000,0},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
55 {"highpassfreq",&lame_param_highpassfreq, CONF_TYPE_INT, CONF_RANGE, -1, 48000,0},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
56 {"nofree", &lame_param_free_format, CONF_TYPE_FLAG, 0, 0, 0, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
57 {"free", &lame_param_free_format, CONF_TYPE_FLAG, 0, 0, 1, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
58 {"br_min", &lame_param_br_min, CONF_TYPE_INT, CONF_RANGE, 0, 1024, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
59 {"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
60 #ifdef HAVE_MP3LAME_PRESET
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
61 {"fast", &lame_param_fast, CONF_TYPE_FLAG, 0, 0, 1, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
62 {"preset", &lame_param_preset, CONF_TYPE_STRING, 0, 0, 0, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
63 #else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 {"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
65 {"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
66 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
67 {"help", MSGTR_MEncoderMP3LameHelp, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
68 {NULL, NULL, 0, 0, 0, 0, NULL}
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 };
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 static int pass;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
74 static int bind_lame(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
76 mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MP3AudioSelected);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 mux_a->h.dwSampleSize=0; // VBR
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 mux_a->h.dwRate=encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
79 mux_a->h.dwScale=encoder->params.samples_per_frame; // samples/frame
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,MSGTR_MP3WaveFormatSizeNot30,sizeof(MPEGLAYER3WAVEFORMAT));
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 mux_a->wf->wFormatTag=0x55; // MP3
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83 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
84 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 if(! lame_param_vbr)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86 mux_a->wf->nAvgBytesPerSec=lame_param_br * 125;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME!
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89 mux_a->wf->nBlockAlign=encoder->params.samples_per_frame; // required for l3codeca.acm + WMP 6.4
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 mux_a->wf->wBitsPerSample=0; //16;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 // from NaNdub: (requires for l3codeca.acm)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 mux_a->wf->cbSize=12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=encoder->params.samples_per_frame; // ???
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98
19397
0074c9c77a0e Set encoder's input format to "native endiannes", instead of little endian.
gpoirier
parents: 17932
diff changeset
99 encoder->input_format = AF_FORMAT_S16_NE;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100 encoder->min_buffer_size = 4608;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 encoder->max_buffer_size = mux_a->h.dwRate * mux_a->wf->nChannels * 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
105
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 #define min(a, b) ((a) <= (b) ? (a) : (b))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110 int sz;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111 if(encoder->stream->buffer_len < 4)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
112 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
113 sz = mp_decode_mp3_header(encoder->stream->buffer);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
114 if(sz <= 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
115 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116 return sz;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
118
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
119 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
120 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
121 int n = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
122 if(encoder->params.channels == 1)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
123 n = lame_encode_buffer(lame, (short *)src, (short *)src, len/2, dest, max_size);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
124 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
125 n = lame_encode_buffer_interleaved(lame,(short *)src, len/4, dest, max_size);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
126
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
127 return (n < 0 ? 0 : n);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
128 }
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 static int close_lame(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
132 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
133 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
134 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
135
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
136 static void fixup(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
137 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
138 // fixup CBR mp3 audio header:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
139 if(!lame_param_vbr) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
140 encoder->stream->h.dwSampleSize=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
141 ((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize=
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
142 (encoder->stream->size+(encoder->stream->h.dwLength>>1))/encoder->stream->h.dwLength;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
143 encoder->stream->h.dwLength=encoder->stream->size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
144 encoder->stream->h.dwRate=encoder->stream->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
145 encoder->stream->h.dwScale=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
146 encoder->stream->wf->nBlockAlign=1;
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
147 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_CBRAudioByterate,
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
148 encoder->stream->h.dwRate,((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
149 }
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 int mpae_init_lame(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
153 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
154 encoder->params.bitrate = lame_param_br * 125;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
155 encoder->params.samples_per_frame = encoder->params.sample_rate < 32000 ? 576 : 1152;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
156 encoder->decode_buffer_size = 2304;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
157
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
158 lame=lame_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
159 lame_set_bWriteVbrTag(lame,0);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
160 lame_set_in_samplerate(lame,encoder->params.sample_rate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
161 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 lame_set_num_channels(lame,encoder->params.channels);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163 lame_set_out_samplerate(lame,encoder->params.sample_rate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 lame_set_quality(lame,lame_param_algqual); // 0 = best q
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 if(lame_param_free_format) lame_set_free_format(lame,1);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
166 if(lame_param_vbr){ // VBR:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
167 lame_set_VBR(lame,lame_param_vbr); // vbr mode
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 lame_set_VBR_q(lame,lame_param_quality); // 0 = best vbr q 5=~128k
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
169 if(lame_param_br>0) lame_set_VBR_mean_bitrate_kbps(lame,lame_param_br);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
170 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
171 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
172 } else { // CBR:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
173 if(lame_param_br>0) lame_set_brate(lame,lame_param_br);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
174 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
175 if(lame_param_mode>=0) lame_set_mode(lame,lame_param_mode); // j-st
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
176 if(lame_param_ratio>0) lame_set_compression_ratio(lame,lame_param_ratio);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
177 if(lame_param_scale>0) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
178 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_SettingAudioInputGain, lame_param_scale);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
179 lame_set_scale(lame,lame_param_scale);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
181 if(lame_param_lowpassfreq>=-1) lame_set_lowpassfreq(lame,lame_param_lowpassfreq);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 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
183 #ifdef HAVE_MP3LAME_PRESET
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
184 if(lame_param_preset != NULL) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
185 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_LamePresetEquals,lame_param_preset);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
186 if(lame_presets_set(lame,lame_param_fast, (lame_param_vbr==0), lame_param_preset) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
187 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
188 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
189 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
190 if(lame_init_params(lame) == -1) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
191 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameCantInit);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 }
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17012
diff changeset
194 if( mp_msg_test(MSGT_MENCODER,MSGL_V) ) {
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195 lame_print_config(lame);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196 lame_print_internals(lame);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 encoder->bind = bind_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 encoder->encode = encode_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 encoder->fixup = fixup;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 encoder->close = close_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
205 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
206
16802
a356a606bd66 replace mp3lame version detection by required features detection
aurel
parents: 15240
diff changeset
207 #ifdef HAVE_MP3LAME_PRESET
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
208 /* lame_presets_set
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
209 taken out of presets_set in lame-3.93.1/frontend/parse.c and modified */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name )
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
211 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
212 int mono = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
213
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
214 if (strcmp(preset_name, "help") == 0) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
215 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
216 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LamePresetsLongInfo);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
217 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 //aliases for compatibility with old presets
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 if (strcmp(preset_name, "phone") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223 preset_name = "16";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226 if ( (strcmp(preset_name, "phon+") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
227 (strcmp(preset_name, "lw") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
228 (strcmp(preset_name, "mw-eu") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
229 (strcmp(preset_name, "sw") == 0)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
230 preset_name = "24";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
231 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
232 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
233 if (strcmp(preset_name, "mw-us") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
234 preset_name = "40";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
235 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
236 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
237 if (strcmp(preset_name, "voice") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
238 preset_name = "56";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
239 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
240 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
241 if (strcmp(preset_name, "fm") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
242 preset_name = "112";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
243 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
244 if ( (strcmp(preset_name, "radio") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
245 (strcmp(preset_name, "tape") == 0)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
246 preset_name = "112";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
247 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
248 if (strcmp(preset_name, "hifi") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
249 preset_name = "160";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
250 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
251 if (strcmp(preset_name, "cd") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
252 preset_name = "192";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
253 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
254 if (strcmp(preset_name, "studio") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
255 preset_name = "256";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
256 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
257
16802
a356a606bd66 replace mp3lame version detection by required features detection
aurel
parents: 15240
diff changeset
258 #ifdef HAVE_MP3LAME_PRESET_MEDIUM
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
259 if (strcmp(preset_name, "medium") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
260 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
261 lame_set_preset(gfp, MEDIUM_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
262 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
263 lame_set_preset(gfp, MEDIUM);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
264
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
265 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
266 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
267 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
268
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
269 if (strcmp(preset_name, "standard") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
270 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
271 lame_set_preset(gfp, STANDARD_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
272 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
273 lame_set_preset(gfp, STANDARD);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
274
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
275 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
276 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
277
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
278 else if (strcmp(preset_name, "extreme") == 0){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
279 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
280 lame_set_preset(gfp, EXTREME_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
281 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
282 lame_set_preset(gfp, EXTREME);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
283
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
284 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
285 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
286
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
287 else if (((strcmp(preset_name, "insane") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
288 (strcmp(preset_name, "320" ) == 0)) && (fast < 1)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
289
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
290 lame_set_preset(gfp, INSANE);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
291
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
292 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
293 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
294
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
295 // Generic ABR Preset
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
296 if (((atoi(preset_name)) > 0) && (fast < 1)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
297 if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
298 lame_set_preset(gfp, atoi(preset_name));
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
299
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
300 if (cbr == 1 )
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
301 lame_set_VBR(gfp, vbr_off);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
302
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
303 if (mono == 1 ) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
304 lame_set_mode(gfp, MONO);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
305 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
306
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
307 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
308
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
309 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
310 else {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
311 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
312 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidBitrateForLamePreset);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
313 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
314 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
315 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
316
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
317 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
318 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidLamePresetOptions);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
319 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
320 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
321 #endif