Mercurial > mplayer.hg
annotate libmpcodecs/ae_twolame.c @ 35811:2ce01f3d3b37
Switch from OpenGL.h to gl.h
The former seems to miss some needed defines
from OSX 10.8 on, and gl.h seems to work
without issues at the very least down to 10.5
author | reimar |
---|---|
date | Sun, 27 Jan 2013 15:33:31 +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 |
15359 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <inttypes.h> | |
22 #include <unistd.h> | |
23 #include <string.h> | |
24 #include <sys/types.h> | |
31437 | 25 #include <twolame.h> |
26 | |
15359 | 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" |
15359 | 34 #include "ae_twolame.h" |
17012 | 35 #include "libmpdemux/mp3_hdr.h" |
15359 | 36 |
37 | |
31437 | 38 typedef struct { |
39 twolame_options *twolame_ctx; | |
40 int vbr; | |
41 } mpae_twolame_ctx; | |
42 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
43 static int |
15359 | 44 param_bitrate = 192, |
45 param_psy = 3, | |
46 param_maxvbr = 0, | |
47 param_errprot = 0, | |
48 param_debug = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
49 |
15359 | 50 static float param_vbr = 0; |
51 static char *param_mode = "stereo"; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
52 |
30955
4e59a7aebadb
Mark encoder-related m_option_t struct arrays as const.
diego
parents:
30741
diff
changeset
|
53 const m_option_t twolameopts_conf[] = { |
15359 | 54 {"br", ¶m_bitrate, CONF_TYPE_INT, 0, 0, 0, NULL}, |
55 {"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:
15359
diff
changeset
|
56 {"psy", ¶m_psy, CONF_TYPE_INT, CONF_RANGE, -1, 4, NULL}, |
15359 | 57 {"vbr", ¶m_vbr, CONF_TYPE_FLOAT, CONF_RANGE, -50, 50, NULL}, |
58 {"maxvbr", ¶m_maxvbr, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
59 {"errprot", ¶m_errprot, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL}, | |
60 {"debug", ¶m_debug, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, | |
61 {NULL, NULL, 0, 0, 0, 0, NULL} | |
62 }; | |
63 | |
64 | |
65 static int bind_twolame(audio_encoder_t *encoder, muxer_stream_t *mux_a) | |
66 { | |
27843 | 67 mpae_twolame_ctx *ctx = encoder->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
68 |
32121 | 69 mux_a->wf = malloc(sizeof(*mux_a->wf)+256); |
15359 | 70 mux_a->wf->wFormatTag = 0x50; |
71 mux_a->wf->nChannels = encoder->params.channels; | |
72 mux_a->wf->nSamplesPerSec = encoder->params.sample_rate; | |
73 mux_a->wf->nAvgBytesPerSec = encoder->params.bitrate / 8; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
74 |
15359 | 75 if(ctx->vbr || ((mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame) % mux_a->wf->nSamplesPerSec)) |
76 { | |
77 mux_a->h.dwScale = encoder->params.samples_per_frame; | |
78 mux_a->h.dwRate = encoder->params.sample_rate; | |
79 mux_a->h.dwSampleSize = 0; // Blocksize not constant | |
80 } | |
81 else | |
82 { | |
83 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * encoder->params.samples_per_frame)/ mux_a->wf->nSamplesPerSec; /* for cbr */ | |
84 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec; | |
85 mux_a->h.dwSampleSize = mux_a->h.dwScale; | |
86 } | |
87 mux_a->wf->nBlockAlign = mux_a->h.dwScale; | |
88 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000; | |
89 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
90 |
15359 | 91 mux_a->wf->cbSize = 0; //12; |
92 mux_a->wf->wBitsPerSample = 0; /* does not apply */ | |
93 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1; | |
94 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2; | |
95 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign; | |
96 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1; | |
97 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
98 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
99 // Fix allocation |
32121 | 100 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:
27843
diff
changeset
|
101 |
15359 | 102 encoder->input_format = AF_FORMAT_S16_NE; |
103 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize; | |
104 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2; | |
105 | |
106 return 1; | |
107 } | |
108 | |
109 static int encode_twolame(audio_encoder_t *encoder, uint8_t *dest, void *src, int len, int max_size) | |
110 { | |
27843 | 111 mpae_twolame_ctx *ctx = encoder->priv; |
15359 | 112 int ret_size = 0, r2; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
113 |
15359 | 114 len /= (2*encoder->params.channels); |
115 ret_size = twolame_encode_buffer_interleaved(ctx->twolame_ctx, src, len, dest, max_size); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
116 r2 = mp_decode_mp3_header(dest); |
16482 | 117 mp_msg(MSGT_MENCODER, MSGL_DBG2, "\nSIZE: %d, max: %d, r2: %d\n", ret_size, max_size, r2); |
15359 | 118 if(r2 > 0) |
119 ret_size = r2; | |
120 return ret_size; | |
121 } | |
122 | |
30741
3cf4f49c2e87
Make close_twolame() static, only used in ae_twolame.c.
cehoyos
parents:
30633
diff
changeset
|
123 static int close_twolame(audio_encoder_t *encoder) |
15359 | 124 { |
125 free(encoder->priv); | |
126 return 1; | |
127 } | |
128 | |
129 static int get_frame_size(audio_encoder_t *encoder) | |
130 { | |
131 int sz; | |
132 if(encoder->stream->buffer_len < 4) | |
133 return 0; | |
134 sz = mp_decode_mp3_header(encoder->stream->buffer); | |
135 if(sz <= 0) | |
136 return 0; | |
137 return sz; | |
138 } | |
139 | |
140 | |
141 int mpae_init_twolame(audio_encoder_t *encoder) | |
142 { | |
143 int mode; | |
144 mpae_twolame_ctx *ctx = NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
145 |
15359 | 146 if(encoder->params.channels == 1) |
147 { | |
148 mp_msg(MSGT_MENCODER, MSGL_INFO, "ae_twolame, 1 audio channel, forcing mono mode\n"); | |
149 mode = TWOLAME_MONO; | |
150 } | |
151 else if(encoder->params.channels == 2) | |
152 { | |
153 if(! strcasecmp(param_mode, "dual")) | |
154 mode = TWOLAME_DUAL_CHANNEL; | |
155 else if(! strcasecmp(param_mode, "jstereo")) | |
156 mode = TWOLAME_JOINT_STEREO; | |
157 else if(! strcasecmp(param_mode, "stereo")) | |
158 mode = TWOLAME_STEREO; | |
159 else | |
160 { | |
161 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_twolame, unknown mode %s, exiting\n", param_mode); | |
162 } | |
163 } | |
164 else | |
165 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_twolame, Twolame can't encode > 2 channels, exiting\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
166 |
27843 | 167 ctx = calloc(1, sizeof(mpae_twolame_ctx)); |
15359 | 168 if(ctx == NULL) |
169 { | |
170 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_twolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_twolame_ctx)); | |
171 return 0; | |
172 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
173 |
15359 | 174 ctx->twolame_ctx = twolame_init(); |
175 if(ctx->twolame_ctx == NULL) | |
176 { | |
177 mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_twolame, couldn't initial parameters from libtwolame, exiting\n"); | |
178 free(ctx); | |
179 return 0; | |
180 } | |
181 ctx->vbr = 0; | |
182 | |
183 if(twolame_set_num_channels(ctx->twolame_ctx, encoder->params.channels) != 0) | |
184 return 0; | |
185 if(twolame_set_mode(ctx->twolame_ctx, mode) != 0) | |
186 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
187 |
15359 | 188 if(twolame_set_in_samplerate(ctx->twolame_ctx, encoder->params.sample_rate) != 0) |
189 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
190 |
15359 | 191 if(twolame_set_out_samplerate(ctx->twolame_ctx, encoder->params.sample_rate) != 0) |
192 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
193 |
15359 | 194 if(encoder->params.sample_rate < 32000) |
195 twolame_set_version(ctx->twolame_ctx, TWOLAME_MPEG2); | |
196 else | |
197 twolame_set_version(ctx->twolame_ctx, TWOLAME_MPEG1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
198 |
15359 | 199 if(twolame_set_psymodel(ctx->twolame_ctx, param_psy) != 0) |
200 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
201 |
15359 | 202 if(twolame_set_bitrate(ctx->twolame_ctx, param_bitrate) != 0) |
203 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
204 |
15359 | 205 if(param_errprot) |
206 if(twolame_set_error_protection(ctx->twolame_ctx, TRUE) != 0) | |
207 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
208 |
15359 | 209 if(param_vbr != 0) |
210 { | |
211 if(twolame_set_VBR(ctx->twolame_ctx, TRUE) != 0) | |
212 return 0; | |
213 if(twolame_set_VBR_q(ctx->twolame_ctx, param_vbr) != 0) | |
214 return 0; | |
215 if(twolame_set_padding(ctx->twolame_ctx, FALSE) != 0) | |
216 return 0; | |
217 if(param_maxvbr) | |
218 { | |
219 if(twolame_set_VBR_max_bitrate_kbps(ctx->twolame_ctx, param_maxvbr) != 0) | |
220 return 0; | |
221 } | |
222 ctx->vbr = 1; | |
223 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
224 |
15359 | 225 if(twolame_set_verbosity(ctx->twolame_ctx, param_debug) != 0) |
226 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
227 |
15359 | 228 if(twolame_init_params(ctx->twolame_ctx) != 0) |
229 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
230 |
15359 | 231 encoder->params.bitrate = param_bitrate * 1000; |
232 encoder->params.samples_per_frame = 1152; | |
233 encoder->priv = ctx; | |
234 encoder->decode_buffer_size = 1152 * 2 * encoder->params.channels; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
235 |
15359 | 236 encoder->bind = bind_twolame; |
237 encoder->get_frame_size = get_frame_size; | |
238 encoder->encode = encode_twolame; | |
239 encoder->close = close_twolame; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27843
diff
changeset
|
240 |
15359 | 241 return 1; |
242 } |