Mercurial > mplayer.hg
annotate libmpcodecs/ae_toolame.c @ 35334:3397976a029b
stream ftp: readline: Always initialize output parameter buf
Only exception if passed parameter max is less than or equal
to zero. That cannot happen with the current code.
Additionally change readresp function to always copy the first
response line if the parameter rsp is non-NULL. This fixes some
error reporting that used uninitialized stack arrays.
author | al |
---|---|
date | Tue, 20 Nov 2012 22:16:29 +0000 |
parents | d332ea379205 |
children | 389d43c448b3 |
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> |
15240 | 24 #include <sys/types.h> |
31436 | 25 #include <toolame.h> |
26 | |
13425 | 27 #include "m_option.h" |
17012 | 28 #include "mp_msg.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
29 #include "libmpdemux/aviheader.h" |
17012 | 30 #include "libaf/af_format.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
31 #include "libmpdemux/ms_hdr.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
32 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
33 #include "libmpdemux/muxer.h" |
13425 | 34 #include "ae_toolame.h" |
17012 | 35 #include "libmpdemux/mp3_hdr.h" |
13425 | 36 |
37 | |
31436 | 38 typedef struct { |
39 toolame_options *toolame_ctx; | |
40 int channels, srate, bitrate; | |
41 int vbr; | |
42 int16_t left_pcm[1152], right_pcm[1152]; | |
43 } mpae_toolame_ctx; | |
44 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
45 static int |
13425 | 46 param_bitrate = 192, |
47 param_psy = 3, | |
15265 | 48 param_maxvbr = 0, |
13425 | 49 param_errprot = 0, |
50 param_debug = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
51 |
15362
4ff00aa141ef
updated psycho model range; made a parameter file-static in ae_toolame.c
nicodvb
parents:
15281
diff
changeset
|
52 static float param_vbr = 0; |
13425 | 53 static char *param_mode = "stereo"; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
54 |
30955
4e59a7aebadb
Mark encoder-related m_option_t struct arrays as const.
diego
parents:
30743
diff
changeset
|
55 const m_option_t toolameopts_conf[] = { |
13425 | 56 {"br", ¶m_bitrate, CONF_TYPE_INT, 0, 0, 0, NULL}, |
57 {"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
|
58 {"psy", ¶m_psy, CONF_TYPE_INT, CONF_RANGE, -1, 4, NULL}, |
15281 | 59 {"vbr", ¶m_vbr, CONF_TYPE_FLOAT, CONF_RANGE, -50, 50, NULL}, |
13425 | 60 {"maxvbr", ¶m_maxvbr, CONF_TYPE_INT, 0, 0, 0, NULL}, |
61 {"errprot", ¶m_errprot, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL}, | |
62 {"debug", ¶m_debug, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, | |
63 {NULL, NULL, 0, 0, 0, 0, NULL} | |
64 }; | |
65 | |
66 | |
15234 | 67 static int bind_toolame(audio_encoder_t *encoder, muxer_stream_t *mux_a) |
68 { | |
15265 | 69 mpae_toolame_ctx *ctx = (mpae_toolame_ctx *) encoder->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
70 |
32121 | 71 mux_a->wf = malloc(sizeof(*mux_a->wf)+256); |
15234 | 72 mux_a->wf->wFormatTag = 0x50; |
73 mux_a->wf->nChannels = encoder->params.channels; | |
74 mux_a->wf->nSamplesPerSec = encoder->params.sample_rate; | |
75 mux_a->wf->nAvgBytesPerSec = 125 * encoder->params.bitrate; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
76 |
15265 | 77 if(ctx->vbr || ((mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame) % mux_a->wf->nSamplesPerSec)) |
15234 | 78 { |
79 mux_a->h.dwScale = encoder->params.samples_per_frame; | |
80 mux_a->h.dwRate = encoder->params.sample_rate; | |
81 mux_a->h.dwSampleSize = 0; // Blocksize not constant | |
15265 | 82 } |
83 else | |
15234 | 84 { |
15265 | 85 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame)/ mux_a->wf->nSamplesPerSec; /* for cbr */ |
86 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec; | |
15234 | 87 mux_a->h.dwSampleSize = mux_a->h.dwScale; |
88 } | |
89 mux_a->wf->nBlockAlign = mux_a->h.dwScale; | |
90 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000; | |
91 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
|
92 |
15265 | 93 mux_a->wf->cbSize = 0; //12; |
15234 | 94 mux_a->wf->wBitsPerSample = 0; /* does not apply */ |
95 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1; | |
96 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2; | |
97 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign; | |
98 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1; | |
99 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
100 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
101 // Fix allocation |
32121 | 102 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
|
103 |
15234 | 104 encoder->input_format = AF_FORMAT_S16_NE; |
105 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize; | |
106 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2; | |
107 | |
108 return 1; | |
109 } | |
110 | |
111 static int encode_toolame(audio_encoder_t *encoder, uint8_t *dest, void *src, int len, int max_size) | |
112 { | |
113 mpae_toolame_ctx *ctx = (mpae_toolame_ctx *)encoder->priv; | |
15265 | 114 int ret_size = 0, r2, i, nsamples; |
15234 | 115 int16_t *buffer; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
116 |
15234 | 117 nsamples = len / (2*encoder->params.channels); |
118 buffer = (uint16_t *) src; | |
119 for(i = 0; i < nsamples; i++) | |
120 { | |
121 ctx->left_pcm[i] = buffer[ctx->channels * i]; | |
122 ctx->right_pcm[i] = buffer[(ctx->channels * i) + (ctx->channels - 1)]; | |
123 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
124 |
15234 | 125 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
|
126 r2 = mp_decode_mp3_header(dest); |
16482 | 127 mp_msg(MSGT_MENCODER, MSGL_DBG2, "\nSIZE: %d, max: %d, r2: %d\n", ret_size, max_size, r2); |
15265 | 128 if(r2 > 0) |
129 ret_size = r2; | |
15234 | 130 return ret_size; |
131 } | |
132 | |
30743
b08fb4b8cfab
Make close_toolame() static, only used in ae_toolame.c.
cehoyos
parents:
30702
diff
changeset
|
133 static int close_toolame(audio_encoder_t *encoder) |
15234 | 134 { |
135 free(encoder->priv); | |
136 return 1; | |
137 } | |
138 | |
139 static int get_frame_size(audio_encoder_t *encoder) | |
140 { | |
141 int sz; | |
142 if(encoder->stream->buffer_len < 4) | |
143 return 0; | |
144 sz = mp_decode_mp3_header(encoder->stream->buffer); | |
145 if(sz <= 0) | |
146 return 0; | |
147 return sz; | |
148 } | |
149 | |
150 | |
151 int mpae_init_toolame(audio_encoder_t *encoder) | |
13425 | 152 { |
153 int mode; | |
154 mpae_toolame_ctx *ctx = NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
155 |
15234 | 156 if(encoder->params.channels == 1) |
13425 | 157 { |
158 mp_msg(MSGT_MENCODER, MSGL_INFO, "ae_toolame, 1 audio channel, forcing mono mode\n"); | |
159 mode = MPG_MD_MONO; | |
160 } | |
15234 | 161 else if(encoder->params.channels == 2) |
13425 | 162 { |
163 if(! strcasecmp(param_mode, "dual")) | |
164 mode = MPG_MD_DUAL_CHANNEL; | |
165 else if(! strcasecmp(param_mode, "jstereo")) | |
166 mode = MPG_MD_JOINT_STEREO; | |
167 else if(! strcasecmp(param_mode, "stereo")) | |
168 mode = MPG_MD_STEREO; | |
169 else | |
170 { | |
171 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, unknown mode %s, exiting\n", param_mode); | |
172 } | |
173 } | |
174 else | |
175 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
|
176 |
30702 | 177 ctx = calloc(1, sizeof(mpae_toolame_ctx)); |
13425 | 178 if(ctx == NULL) |
179 { | |
180 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_toolame_ctx)); | |
15234 | 181 return 0; |
13425 | 182 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
183 |
13425 | 184 ctx->toolame_ctx = toolame_init(); |
185 if(ctx->toolame_ctx == NULL) | |
186 { | |
187 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't initial parameters from libtoolame, exiting\n"); | |
188 free(ctx); | |
15234 | 189 return 0; |
13425 | 190 } |
15265 | 191 ctx->vbr = 0; |
15234 | 192 ctx->channels = encoder->params.channels; |
193 ctx->srate = encoder->params.sample_rate; | |
13425 | 194 |
195 if(toolame_setMode(ctx->toolame_ctx, mode) != 0) | |
15234 | 196 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
197 |
13425 | 198 if(toolame_setPsymodel(ctx->toolame_ctx, param_psy) != 0) |
15234 | 199 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
200 |
15234 | 201 if(toolame_setSampleFreq(ctx->toolame_ctx, encoder->params.sample_rate) != 0) |
202 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
203 |
13425 | 204 if(toolame_setBitrate(ctx->toolame_ctx, param_bitrate) != 0) |
15234 | 205 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
206 |
13425 | 207 if(param_errprot) |
208 if(toolame_setErrorProtection(ctx->toolame_ctx, TRUE) != 0) | |
15234 | 209 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
210 |
15281 | 211 if(param_vbr != 0) |
13425 | 212 { |
213 if(toolame_setVBR(ctx->toolame_ctx, TRUE) != 0) | |
15234 | 214 return 0; |
15265 | 215 if(toolame_setVBRLevel(ctx->toolame_ctx, param_vbr) != 0) |
15234 | 216 return 0; |
13425 | 217 if(toolame_setPadding(ctx->toolame_ctx, FALSE) != 0) |
15234 | 218 return 0; |
15265 | 219 if(param_maxvbr) |
220 { | |
221 if(toolame_setVBRUpperBitrate(ctx->toolame_ctx, param_maxvbr) != 0) | |
222 return 0; | |
223 } | |
224 ctx->vbr = 1; | |
13425 | 225 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
226 |
13425 | 227 if(toolame_setVerbosity(ctx->toolame_ctx, param_debug) != 0) |
15234 | 228 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
229 |
13425 | 230 if(toolame_init_params(ctx->toolame_ctx) != 0) |
15234 | 231 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
232 |
13425 | 233 ctx->bitrate = param_bitrate; |
15234 | 234 encoder->params.bitrate = ctx->bitrate; |
235 encoder->params.samples_per_frame = 1152; | |
236 encoder->priv = ctx; | |
237 encoder->decode_buffer_size = 1152 * 2 * encoder->params.channels; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
238 |
15234 | 239 encoder->bind = bind_toolame; |
240 encoder->get_frame_size = get_frame_size; | |
241 encoder->encode = encode_toolame; | |
242 encoder->close = close_toolame; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22601
diff
changeset
|
243 |
15234 | 244 return 1; |
13425 | 245 } |