annotate libmpcodecs/ae_lame.c @ 27975:806c541d03dd

Do not draw in window if our image has not yet been adjusted to the new window size. Fixes some cases of borders not being black in fullscreen when fullscreen image is scaled down.
author reimar
date Sun, 23 Nov 2008 20:39:15 +0000
parents 40057010b1fa
children 1f4b3aaefcd8
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
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 26754
diff changeset
36 #ifdef CONFIG_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},
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 26754
diff changeset
60 #ifdef CONFIG_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 bind_lame(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73 {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
74 mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MP3AudioSelected);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 mux_a->h.dwSampleSize=0; // VBR
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
76 mux_a->h.dwRate=encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 mux_a->h.dwScale=encoder->params.samples_per_frame; // samples/frame
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,MSGTR_MP3WaveFormatSizeNot30,sizeof(MPEGLAYER3WAVEFORMAT));
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
79 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 mux_a->wf->wFormatTag=0x55; // MP3
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 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
82 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83 if(! lame_param_vbr)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
84 mux_a->wf->nAvgBytesPerSec=lame_param_br * 125;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME!
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 mux_a->wf->nBlockAlign=encoder->params.samples_per_frame; // required for l3codeca.acm + WMP 6.4
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 mux_a->wf->wBitsPerSample=0; //16;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89 // from NaNdub: (requires for l3codeca.acm)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 mux_a->wf->cbSize=12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=encoder->params.samples_per_frame; // ???
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96
19397
0074c9c77a0e Set encoder's input format to "native endiannes", instead of little endian.
gpoirier
parents: 17932
diff changeset
97 encoder->input_format = AF_FORMAT_S16_NE;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98 encoder->min_buffer_size = 4608;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 encoder->max_buffer_size = mux_a->h.dwRate * mux_a->wf->nChannels * 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 #define min(a, b) ((a) <= (b) ? (a) : (b))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
105
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108 int sz;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109 if(encoder->stream->buffer_len < 4)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111 sz = mp_decode_mp3_header(encoder->stream->buffer);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
112 if(sz <= 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
113 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
114 return sz;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
115 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117 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
118 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
119 int n = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
120 if(encoder->params.channels == 1)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
121 n = lame_encode_buffer(lame, (short *)src, (short *)src, len/2, dest, max_size);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
122 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
123 n = lame_encode_buffer_interleaved(lame,(short *)src, len/4, dest, max_size);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
124
26754
63630c09e237 cosmetics: Remove pointless parentheses from return calls.
diego
parents: 25503
diff changeset
125 return n < 0 ? 0 : n;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
126 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
127
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
128
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
129 static int close_lame(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
130 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
131 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
132 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
133
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
134 static void fixup(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
135 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
136 // fixup CBR mp3 audio header:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
137 if(!lame_param_vbr) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
138 encoder->stream->h.dwSampleSize=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
139 ((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize=
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
140 (encoder->stream->size+(encoder->stream->h.dwLength>>1))/encoder->stream->h.dwLength;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
141 encoder->stream->h.dwLength=encoder->stream->size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
142 encoder->stream->h.dwRate=encoder->stream->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
143 encoder->stream->h.dwScale=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
144 encoder->stream->wf->nBlockAlign=1;
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
145 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_CBRAudioByterate,
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
146 encoder->stream->h.dwRate,((MPEGLAYER3WAVEFORMAT*)(encoder->stream->wf))->nBlockSize);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
147 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
148 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
149
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
150 int mpae_init_lame(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
151 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
152 encoder->params.bitrate = lame_param_br * 125;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
153 encoder->params.samples_per_frame = encoder->params.sample_rate < 32000 ? 576 : 1152;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
154 encoder->decode_buffer_size = 2304;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
155
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
156 lame=lame_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
157 lame_set_bWriteVbrTag(lame,0);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
158 lame_set_in_samplerate(lame,encoder->params.sample_rate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
159 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
160 lame_set_num_channels(lame,encoder->params.channels);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
161 lame_set_out_samplerate(lame,encoder->params.sample_rate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 lame_set_quality(lame,lame_param_algqual); // 0 = best q
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163 if(lame_param_free_format) lame_set_free_format(lame,1);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 if(lame_param_vbr){ // VBR:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 lame_set_VBR(lame,lame_param_vbr); // vbr mode
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
166 lame_set_VBR_q(lame,lame_param_quality); // 0 = best vbr q 5=~128k
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
167 if(lame_param_br>0) lame_set_VBR_mean_bitrate_kbps(lame,lame_param_br);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 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
169 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
170 } else { // CBR:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
171 if(lame_param_br>0) lame_set_brate(lame,lame_param_br);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
172 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
173 if(lame_param_mode>=0) lame_set_mode(lame,lame_param_mode); // j-st
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
174 if(lame_param_ratio>0) lame_set_compression_ratio(lame,lame_param_ratio);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
175 if(lame_param_scale>0) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
176 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_SettingAudioInputGain, lame_param_scale);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
177 lame_set_scale(lame,lame_param_scale);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
178 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
179 if(lame_param_lowpassfreq>=-1) lame_set_lowpassfreq(lame,lame_param_lowpassfreq);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 if(lame_param_highpassfreq>=-1) lame_set_highpassfreq(lame,lame_param_highpassfreq);
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 26754
diff changeset
181 #ifdef CONFIG_MP3LAME_PRESET
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 if(lame_param_preset != NULL) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
183 mp_msg(MSGT_MENCODER, MSGL_V, MSGTR_LamePresetEquals,lame_param_preset);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
184 if(lame_presets_set(lame,lame_param_fast, (lame_param_vbr==0), lame_param_preset) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
185 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
186 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
187 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
188 if(lame_init_params(lame) == -1) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
189 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LameCantInit);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
190 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
191 }
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17012
diff changeset
192 if( mp_msg_test(MSGT_MENCODER,MSGL_V) ) {
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 lame_print_config(lame);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
194 lame_print_internals(lame);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 encoder->bind = bind_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 encoder->encode = encode_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 encoder->fixup = fixup;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 encoder->close = close_lame;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 26754
diff changeset
205 #ifdef CONFIG_MP3LAME_PRESET
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
206 /* lame_presets_set
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
207 taken out of presets_set in lame-3.93.1/frontend/parse.c and modified */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
208 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name )
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
209 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 int mono = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
211
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
212 if (strcmp(preset_name, "help") == 0) {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
213 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
214 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LamePresetsLongInfo);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
215 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
216 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
217
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218 //aliases for compatibility with old presets
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 if (strcmp(preset_name, "phone") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221 preset_name = "16";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224 if ( (strcmp(preset_name, "phon+") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 (strcmp(preset_name, "lw") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226 (strcmp(preset_name, "mw-eu") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
227 (strcmp(preset_name, "sw") == 0)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
228 preset_name = "24";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
229 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
230 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
231 if (strcmp(preset_name, "mw-us") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
232 preset_name = "40";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
233 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
234 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
235 if (strcmp(preset_name, "voice") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
236 preset_name = "56";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
237 mono = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
238 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
239 if (strcmp(preset_name, "fm") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
240 preset_name = "112";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
241 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
242 if ( (strcmp(preset_name, "radio") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
243 (strcmp(preset_name, "tape") == 0)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
244 preset_name = "112";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
245 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
246 if (strcmp(preset_name, "hifi") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
247 preset_name = "160";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
248 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
249 if (strcmp(preset_name, "cd") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
250 preset_name = "192";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
251 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
252 if (strcmp(preset_name, "studio") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
253 preset_name = "256";
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
254 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
255
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 26754
diff changeset
256 #ifdef CONFIG_MP3LAME_PRESET_MEDIUM
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
257 if (strcmp(preset_name, "medium") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
258 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
259 lame_set_preset(gfp, MEDIUM_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
260 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
261 lame_set_preset(gfp, MEDIUM);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
262
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
263 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
264 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
265 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
266
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
267 if (strcmp(preset_name, "standard") == 0) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
268 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
269 lame_set_preset(gfp, STANDARD_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
270 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
271 lame_set_preset(gfp, STANDARD);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
272
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
273 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
274 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
275
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
276 else if (strcmp(preset_name, "extreme") == 0){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
277 if (fast > 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
278 lame_set_preset(gfp, EXTREME_FAST);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
279 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
280 lame_set_preset(gfp, EXTREME);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
281
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
282 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
283 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
284
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
285 else if (((strcmp(preset_name, "insane") == 0) ||
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
286 (strcmp(preset_name, "320" ) == 0)) && (fast < 1)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
287
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
288 lame_set_preset(gfp, INSANE);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
289
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
290 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
291 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
292
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
293 // Generic ABR Preset
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
294 if (((atoi(preset_name)) > 0) && (fast < 1)) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
295 if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
296 lame_set_preset(gfp, atoi(preset_name));
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
297
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
298 if (cbr == 1 )
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
299 lame_set_VBR(gfp, vbr_off);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
300
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
301 if (mono == 1 ) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
302 lame_set_mode(gfp, MONO);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
303 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
304
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
305 return 0;
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 else {
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
309 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
310 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidBitrateForLamePreset);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
311 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
312 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
313 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
314
21621
28ade900407d Fix FIXME mp_msg levels and targets
reimar
parents: 19397
diff changeset
315 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
316 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_InvalidLamePresetOptions);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
317 return -1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
318 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
319 #endif