Mercurial > mplayer.hg
annotate libmpcodecs/ae_toolame.c @ 36838:7df9dd22f234
Don't set win32 as audio driver if none has been given.
Select from the list of audio drivers instead.
Having win32 as selected item in the combo box although
this isn't used by MPlayer by default is confusing as well.
Besides that, there seem to be issues with this driver
when changing from or to it during playback.
author | ib |
---|---|
date | Tue, 25 Feb 2014 13:16:35 +0000 |
parents | 389d43c448b3 |
children |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
15234 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <inttypes.h> | |
15238 | 22 #include <unistd.h> |
15234 | 23 #include <string.h> |
35903 | 24 #include <strings.h> |
15240 | 25 #include <sys/types.h> |
31436 | 26 #include <toolame.h> |
27 | |
13425 | 28 #include "m_option.h" |
17012 | 29 #include "mp_msg.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
30 #include "libmpdemux/aviheader.h" |
17012 | 31 #include "libaf/af_format.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
32 #include "libmpdemux/ms_hdr.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
33 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
34 #include "libmpdemux/muxer.h" |
13425 | 35 #include "ae_toolame.h" |
17012 | 36 #include "libmpdemux/mp3_hdr.h" |
13425 | 37 |
38 | |
31436 | 39 typedef struct { |
40 toolame_options *toolame_ctx; | |
41 int channels, srate, bitrate; | |
42 int vbr; | |
43 int16_t left_pcm[1152], right_pcm[1152]; | |
44 } mpae_toolame_ctx; | |
45 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
46 static int |
13425 | 47 param_bitrate = 192, |
48 param_psy = 3, | |
15265 | 49 param_maxvbr = 0, |
13425 | 50 param_errprot = 0, |
51 param_debug = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
52 |
15362
4ff00aa141ef
updated psycho model range; made a parameter file-static in ae_toolame.c
nicodvb
parents:
15281
diff
changeset
|
53 static float param_vbr = 0; |
13425 | 54 static char *param_mode = "stereo"; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
55 |
30955
4e59a7aebadb
Mark encoder-related m_option_t struct arrays as const.
diego
parents:
30743
diff
changeset
|
56 const m_option_t toolameopts_conf[] = { |
13425 | 57 {"br", ¶m_bitrate, CONF_TYPE_INT, 0, 0, 0, NULL}, |
58 {"mode", ¶m_mode, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
15362
4ff00aa141ef
updated psycho model range; made a parameter file-static in ae_toolame.c
nicodvb
parents:
15281
diff
changeset
|
59 {"psy", ¶m_psy, CONF_TYPE_INT, CONF_RANGE, -1, 4, NULL}, |
15281 | 60 {"vbr", ¶m_vbr, CONF_TYPE_FLOAT, CONF_RANGE, -50, 50, NULL}, |
13425 | 61 {"maxvbr", ¶m_maxvbr, CONF_TYPE_INT, 0, 0, 0, NULL}, |
62 {"errprot", ¶m_errprot, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL}, | |
63 {"debug", ¶m_debug, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, | |
64 {NULL, NULL, 0, 0, 0, 0, NULL} | |
65 }; | |
66 | |
67 | |
15234 | 68 static int bind_toolame(audio_encoder_t *encoder, muxer_stream_t *mux_a) |
69 { | |
15265 | 70 mpae_toolame_ctx *ctx = (mpae_toolame_ctx *) encoder->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
71 |
32121 | 72 mux_a->wf = malloc(sizeof(*mux_a->wf)+256); |
15234 | 73 mux_a->wf->wFormatTag = 0x50; |
74 mux_a->wf->nChannels = encoder->params.channels; | |
75 mux_a->wf->nSamplesPerSec = encoder->params.sample_rate; | |
76 mux_a->wf->nAvgBytesPerSec = 125 * encoder->params.bitrate; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
77 |
15265 | 78 if(ctx->vbr || ((mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame) % mux_a->wf->nSamplesPerSec)) |
15234 | 79 { |
80 mux_a->h.dwScale = encoder->params.samples_per_frame; | |
81 mux_a->h.dwRate = encoder->params.sample_rate; | |
82 mux_a->h.dwSampleSize = 0; // Blocksize not constant | |
15265 | 83 } |
84 else | |
15234 | 85 { |
15265 | 86 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame)/ mux_a->wf->nSamplesPerSec; /* for cbr */ |
87 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec; | |
15234 | 88 mux_a->h.dwSampleSize = mux_a->h.dwScale; |
89 } | |
90 mux_a->wf->nBlockAlign = mux_a->h.dwScale; | |
91 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000; | |
92 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
93 |
15265 | 94 mux_a->wf->cbSize = 0; //12; |
15234 | 95 mux_a->wf->wBitsPerSample = 0; /* does not apply */ |
96 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1; | |
97 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2; | |
98 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign; | |
99 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1; | |
100 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
101 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
102 // Fix allocation |
32121 | 103 mux_a->wf = realloc(mux_a->wf, sizeof(*mux_a->wf)+mux_a->wf->cbSize); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
104 |
15234 | 105 encoder->input_format = AF_FORMAT_S16_NE; |
106 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize; | |
107 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2; | |
108 | |
109 return 1; | |
110 } | |
111 | |
112 static int encode_toolame(audio_encoder_t *encoder, uint8_t *dest, void *src, int len, int max_size) | |
113 { | |
114 mpae_toolame_ctx *ctx = (mpae_toolame_ctx *)encoder->priv; | |
15265 | 115 int ret_size = 0, r2, i, nsamples; |
15234 | 116 int16_t *buffer; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
117 |
15234 | 118 nsamples = len / (2*encoder->params.channels); |
119 buffer = (uint16_t *) src; | |
120 for(i = 0; i < nsamples; i++) | |
121 { | |
122 ctx->left_pcm[i] = buffer[ctx->channels * i]; | |
123 ctx->right_pcm[i] = buffer[(ctx->channels * i) + (ctx->channels - 1)]; | |
124 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
125 |
15234 | 126 toolame_encode_buffer(ctx->toolame_ctx, ctx->left_pcm, ctx->right_pcm, nsamples, dest, max_size, &ret_size); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
127 r2 = mp_decode_mp3_header(dest); |
16482 | 128 mp_msg(MSGT_MENCODER, MSGL_DBG2, "\nSIZE: %d, max: %d, r2: %d\n", ret_size, max_size, r2); |
15265 | 129 if(r2 > 0) |
130 ret_size = r2; | |
15234 | 131 return ret_size; |
132 } | |
133 | |
30743
b08fb4b8cfab
Make close_toolame() static, only used in ae_toolame.c.
cehoyos
parents:
30702
diff
changeset
|
134 static int close_toolame(audio_encoder_t *encoder) |
15234 | 135 { |
136 free(encoder->priv); | |
137 return 1; | |
138 } | |
139 | |
140 static int get_frame_size(audio_encoder_t *encoder) | |
141 { | |
142 int sz; | |
143 if(encoder->stream->buffer_len < 4) | |
144 return 0; | |
145 sz = mp_decode_mp3_header(encoder->stream->buffer); | |
146 if(sz <= 0) | |
147 return 0; | |
148 return sz; | |
149 } | |
150 | |
151 | |
152 int mpae_init_toolame(audio_encoder_t *encoder) | |
13425 | 153 { |
154 int mode; | |
155 mpae_toolame_ctx *ctx = NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
156 |
15234 | 157 if(encoder->params.channels == 1) |
13425 | 158 { |
159 mp_msg(MSGT_MENCODER, MSGL_INFO, "ae_toolame, 1 audio channel, forcing mono mode\n"); | |
160 mode = MPG_MD_MONO; | |
161 } | |
15234 | 162 else if(encoder->params.channels == 2) |
13425 | 163 { |
164 if(! strcasecmp(param_mode, "dual")) | |
165 mode = MPG_MD_DUAL_CHANNEL; | |
166 else if(! strcasecmp(param_mode, "jstereo")) | |
167 mode = MPG_MD_JOINT_STEREO; | |
168 else if(! strcasecmp(param_mode, "stereo")) | |
169 mode = MPG_MD_STEREO; | |
170 else | |
171 { | |
172 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, unknown mode %s, exiting\n", param_mode); | |
173 } | |
174 } | |
175 else | |
176 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, Toolame can't encode > 2 channels, exiting\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
177 |
30702 | 178 ctx = calloc(1, sizeof(mpae_toolame_ctx)); |
13425 | 179 if(ctx == NULL) |
180 { | |
181 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_toolame_ctx)); | |
15234 | 182 return 0; |
13425 | 183 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
184 |
13425 | 185 ctx->toolame_ctx = toolame_init(); |
186 if(ctx->toolame_ctx == NULL) | |
187 { | |
188 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't initial parameters from libtoolame, exiting\n"); | |
189 free(ctx); | |
15234 | 190 return 0; |
13425 | 191 } |
15265 | 192 ctx->vbr = 0; |
15234 | 193 ctx->channels = encoder->params.channels; |
194 ctx->srate = encoder->params.sample_rate; | |
13425 | 195 |
196 if(toolame_setMode(ctx->toolame_ctx, mode) != 0) | |
15234 | 197 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
198 |
13425 | 199 if(toolame_setPsymodel(ctx->toolame_ctx, param_psy) != 0) |
15234 | 200 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
201 |
15234 | 202 if(toolame_setSampleFreq(ctx->toolame_ctx, encoder->params.sample_rate) != 0) |
203 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
204 |
13425 | 205 if(toolame_setBitrate(ctx->toolame_ctx, param_bitrate) != 0) |
15234 | 206 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
207 |
13425 | 208 if(param_errprot) |
209 if(toolame_setErrorProtection(ctx->toolame_ctx, TRUE) != 0) | |
15234 | 210 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
211 |
15281 | 212 if(param_vbr != 0) |
13425 | 213 { |
214 if(toolame_setVBR(ctx->toolame_ctx, TRUE) != 0) | |
15234 | 215 return 0; |
15265 | 216 if(toolame_setVBRLevel(ctx->toolame_ctx, param_vbr) != 0) |
15234 | 217 return 0; |
13425 | 218 if(toolame_setPadding(ctx->toolame_ctx, FALSE) != 0) |
15234 | 219 return 0; |
15265 | 220 if(param_maxvbr) |
221 { | |
222 if(toolame_setVBRUpperBitrate(ctx->toolame_ctx, param_maxvbr) != 0) | |
223 return 0; | |
224 } | |
225 ctx->vbr = 1; | |
13425 | 226 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
227 |
13425 | 228 if(toolame_setVerbosity(ctx->toolame_ctx, param_debug) != 0) |
15234 | 229 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
230 |
13425 | 231 if(toolame_init_params(ctx->toolame_ctx) != 0) |
15234 | 232 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
233 |
13425 | 234 ctx->bitrate = param_bitrate; |
15234 | 235 encoder->params.bitrate = ctx->bitrate; |
236 encoder->params.samples_per_frame = 1152; | |
237 encoder->priv = ctx; | |
238 encoder->decode_buffer_size = 1152 * 2 * encoder->params.channels; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
239 |
15234 | 240 encoder->bind = bind_toolame; |
241 encoder->get_frame_size = get_frame_size; | |
242 encoder->encode = encode_toolame; | |
243 encoder->close = close_toolame; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
244 |
15234 | 245 return 1; |
13425 | 246 } |