2 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
22 /* elementfactory information */
23 static GstElementDetails gst_lame_details =
25 "L.A.M.E. mp3 encoder",
26 "Codec/Audio/Encoder",
28 "High-quality free MP3 encoder",
30 "Erik Walthinsen <omega@cse.ogi.edu>",
34 GST_PAD_TEMPLATE_FACTORY (gst_lame_sink_factory,
41 "format", GST_PROPS_STRING ("int"),
42 "law", GST_PROPS_INT (0),
43 "endianness", GST_PROPS_INT (G_BYTE_ORDER),
44 "signed", GST_PROPS_BOOLEAN (TRUE),
45 "width", GST_PROPS_INT (16),
46 "depth", GST_PROPS_INT (16),
47 "rate", GST_PROPS_LIST (
49 GST_PROPS_INT (11025),
50 GST_PROPS_INT (12000),
51 GST_PROPS_INT (16000),
52 GST_PROPS_INT (22050),
53 GST_PROPS_INT (24000),
54 GST_PROPS_INT (32000),
55 GST_PROPS_INT (44100),
58 "channels", GST_PROPS_INT_RANGE (1, 2)
62 GST_PAD_TEMPLATE_FACTORY (gst_lame_src_factory,
73 /********** Define useful types for non-programmatic interfaces **********/
74 #define GST_TYPE_LAME_MODE (gst_lame_mode_get_type())
76 gst_lame_mode_get_type (void)
78 static GType lame_mode_type = 0;
79 static GEnumValue lame_modes[] = {
81 { 1, "1", "Joint-Stereo" },
82 { 2, "2", "Dual channel" },
87 if (!lame_mode_type) {
88 lame_mode_type = g_enum_register_static ("GstLameMode", lame_modes);
90 return lame_mode_type;
93 #define GST_TYPE_LAME_QUALITY (gst_lame_quality_get_type())
95 gst_lame_quality_get_type (void)
97 static GType lame_quality_type = 0;
98 static GEnumValue lame_quality[] = {
99 { 0, "0", "0 - Best" },
104 { 5, "5", "5 - Default" },
108 { 9, "9", "9 - Worst" },
111 if (!lame_quality_type) {
112 lame_quality_type = g_enum_register_static ("GstLameQuality", lame_quality);
114 return lame_quality_type;
117 #define GST_TYPE_LAME_PADDING (gst_lame_padding_get_type())
119 gst_lame_padding_get_type (void)
121 static GType lame_padding_type = 0;
122 static GEnumValue lame_padding[] = {
123 { 0, "0", "No Padding" },
124 { 1, "1", "Always Pad" },
125 { 2, "2", "Adjust Padding" },
128 if (!lame_padding_type) {
129 lame_padding_type = g_enum_register_static ("GstLamePadding", lame_padding);
131 return lame_padding_type;
134 /********** Standard stuff for signals and arguments **********/
135 /* GstLame signals and args */
144 ARG_COMPRESSION_RATIO,
151 ARG_ERROR_PROTECTION,
155 ARG_DISABLE_RESERVOIR,
157 ARG_VBR_MEAN_BITRATE,
170 ARG_ALLOW_DIFF_SHORT,
176 static void gst_lame_class_init (GstLameClass *klass);
177 static void gst_lame_init (GstLame *gst_lame);
179 static void gst_lame_set_property (GObject *object, guint prop_id,
180 const GValue *value, GParamSpec *pspec);
181 static void gst_lame_get_property (GObject *object, guint prop_id,
182 GValue *value, GParamSpec *pspec);
183 static void gst_lame_chain (GstPad *pad, GstBuffer *buf);
184 static gboolean gst_lame_setup (GstLame *lame);
185 static GstElementStateReturn gst_lame_change_state (GstElement *element);
187 static GstElementClass *parent_class = NULL;
188 /* static guint gst_lame_signals[LAST_SIGNAL] = { 0 }; */
191 gst_lame_get_type (void)
193 static GType gst_lame_type = 0;
195 if (!gst_lame_type) {
196 static const GTypeInfo gst_lame_info = {
197 sizeof (GstLameClass),
200 (GClassInitFunc) gst_lame_class_init,
205 (GInstanceInitFunc) gst_lame_init,
207 gst_lame_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLame", &gst_lame_info, 0);
209 return gst_lame_type;
213 gst_lame_class_init (GstLameClass *klass)
215 GObjectClass *gobject_class;
216 GstElementClass *gstelement_class;
218 gobject_class = (GObjectClass*)klass;
219 gstelement_class = (GstElementClass*)klass;
221 parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
223 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE,
224 g_param_spec_int("bitrate", "Bitrate (kb/s)", "Bitrate in kbit/sec",
225 8, 320, 128, G_PARAM_READWRITE));
226 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COMPRESSION_RATIO,
227 g_param_spec_float ("compression_ratio", "Compression Ratio",
228 "choose bitrate to achive selected compression ratio",
229 1.0, 200.0, 11.0, G_PARAM_READWRITE));
230 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY,
231 g_param_spec_enum ("quality", "Quality", "Encoding Quality",
232 GST_TYPE_LAME_QUALITY, 5, G_PARAM_READWRITE));
233 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODE,
234 g_param_spec_enum ("mode", "Mode", "Encoding mode",
235 GST_TYPE_LAME_MODE, 0, G_PARAM_READWRITE));
236 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FORCE_MS,
237 g_param_spec_boolean ("force_ms","Force ms","Force ms_stereo on all frames",
238 TRUE, G_PARAM_READWRITE));
239 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREE_FORMAT,
240 g_param_spec_boolean ("free_format","Free format","Produce a free format bitstream",
241 TRUE, G_PARAM_READWRITE));
242 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COPYRIGHT,
243 g_param_spec_boolean ("copyright","Copyright","Mark as copyright",
244 TRUE, G_PARAM_READWRITE));
245 g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_ORIGINAL,
246 g_param_spec_boolean("original", "Original", "Mark as non-original",
247 TRUE, G_PARAM_READWRITE));
248 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_PROTECTION,
249 g_param_spec_boolean ("error_protection","Error protection",
250 "Adds 16 bit checksum to every frame",
251 TRUE, G_PARAM_READWRITE));
252 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PADDING_TYPE,
253 g_param_spec_enum ("padding_type", "Padding type", "Padding type",
254 GST_TYPE_LAME_PADDING, 0, G_PARAM_READWRITE));
255 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EXTENSION,
256 g_param_spec_boolean ("extension", "Extension", "Extension",
257 TRUE, G_PARAM_READWRITE));
258 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STRICT_ISO,
259 g_param_spec_boolean ("strict_iso", "Strict ISO",
260 "Comply as much as possible to ISO MPEG spec",
261 TRUE, G_PARAM_READWRITE));
262 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DISABLE_RESERVOIR,
263 g_param_spec_boolean ("disable_reservoir", "Disable reservoir", "Disable the bit reservoir",
264 TRUE, G_PARAM_READWRITE));
265 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR,
266 g_param_spec_boolean ("vbr", "VBR", "Use variable bitrate",
267 TRUE, G_PARAM_READWRITE));
268 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_MEAN_BITRATE,
269 g_param_spec_int ("vbr_mean_bitrate", "VBR mean bitrate", "Specify mean bitrate",
270 0, G_MAXINT, 0, G_PARAM_READWRITE));
271 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_MIN_BITRATE,
272 g_param_spec_int ("vbr_min_bitrate", "VBR min bitrate", "Specify min bitrate",
273 0, G_MAXINT, 0, G_PARAM_READWRITE));
274 g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VBR_MAX_BITRATE,
275 g_param_spec_int ("vbr_max_bitrate", "VBR max bitrate", "Specify max bitrate",
276 0, G_MAXINT, 0, G_PARAM_READWRITE));
277 g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VBR_HARD_MIN,
278 g_param_spec_int ("vbr_hard_min", "VBR hard min", "Specify hard min bitrate",
279 0, G_MAXINT, 0, G_PARAM_READWRITE));
280 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWPASS_FREQ,
281 g_param_spec_int ("lowpass_freq", "Lowpass freq",
282 "frequency(kHz), lowpass filter cutoff above freq",
283 0, 50000, 0, G_PARAM_READWRITE));
284 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWPASS_WIDTH,
285 g_param_spec_int ("lowpass_width", "Lowpass width",
286 "frequency(kHz) - default 15% of lowpass freq",
287 0, G_MAXINT, 0, G_PARAM_READWRITE));
288 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HIGHPASS_FREQ,
289 g_param_spec_int ("highpass_freq", "Highpass freq",
290 "frequency(kHz), highpass filter cutoff below freq",
291 0, 50000, 0, G_PARAM_READWRITE));
292 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HIGHPASS_WIDTH,
293 g_param_spec_int ("highpass_width", "Highpass width",
294 "frequency(kHz) - default 15% of highpass freq",
295 0, G_MAXINT, 0, G_PARAM_READWRITE));
296 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_ONLY,
297 g_param_spec_boolean ("ath_only", "ATH only",
298 "Ignore GPSYCHO completely, use ATH only",
299 TRUE, G_PARAM_READWRITE));
300 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_SHORT,
301 g_param_spec_boolean ("ath_short", "ATH short",
302 "Ignore GPSYCHO for short blocks, use ATH only",
303 TRUE, G_PARAM_READWRITE));
304 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NO_ATH,
305 g_param_spec_boolean ("no_ath", "No ath", "turns ATH down to a flat noise floor",
306 TRUE, G_PARAM_READWRITE));
307 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_LOWER,
308 g_param_spec_int ("ath_lower", "ATH lower", "lowers ATH by x dB",
309 G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
310 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CWLIMIT,
311 g_param_spec_int ("cwlimit", "Cwlimit", "Compute tonality up to freq (in kHz) default 8.8717",
312 0, 50000, 0, G_PARAM_READWRITE));
313 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALLOW_DIFF_SHORT,
314 g_param_spec_boolean ("allow_diff_short", "Allow diff short", "Allow diff short",
315 TRUE, G_PARAM_READWRITE));
316 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NO_SHORT_BLOCKS,
317 g_param_spec_boolean ("no_short_blocks", "No short blocks", "Do not use short blocks",
318 TRUE, G_PARAM_READWRITE));
319 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EMPHASIS,
320 g_param_spec_boolean ("emphasis", "Emphasis", "Emphasis",
321 TRUE, G_PARAM_READWRITE));
323 gobject_class->set_property = gst_lame_set_property;
324 gobject_class->get_property = gst_lame_get_property;
326 gstelement_class->change_state = gst_lame_change_state;
329 static GstPadConnectReturn
330 gst_lame_sinkconnect (GstPad *pad, GstCaps *caps)
334 lame = GST_LAME (gst_pad_get_parent (pad));
336 if (!GST_CAPS_IS_FIXED (caps)) {
337 GST_DEBUG (GST_CAT_CAPS, "caps on lame pad %s:%s not fixed, delayed",
338 GST_DEBUG_PAD_NAME (pad));
339 return GST_PAD_CONNECT_DELAYED;
342 gst_caps_get_int (caps, "rate", &lame->samplerate);
343 gst_caps_get_int (caps, "channels", &lame->num_channels);
345 if (!gst_lame_setup (lame)) {
346 gst_element_error (GST_ELEMENT (lame),
347 "could not initialize encoder (wrong parameters?)");
348 return GST_PAD_CONNECT_REFUSED;
351 return GST_PAD_CONNECT_OK;
355 gst_lame_init (GstLame *lame)
357 GST_DEBUG_ENTER ("(\"%s\")", gst_element_get_name (GST_ELEMENT (lame)));
359 lame->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (gst_lame_sink_factory), "sink");
360 gst_element_add_pad (GST_ELEMENT (lame), lame->sinkpad);
361 gst_pad_set_chain_function (lame->sinkpad, gst_lame_chain);
362 gst_pad_set_connect_function (lame->sinkpad, gst_lame_sinkconnect);
364 lame->srcpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (gst_lame_src_factory), "src");
365 gst_element_add_pad (GST_ELEMENT (lame), lame->srcpad);
367 GST_FLAG_SET (lame, GST_ELEMENT_EVENT_AWARE);
369 GST_DEBUG (GST_CAT_PLUGIN_INFO, "setting up lame encoder");
370 lame->lgf = lame_init ();
372 lame->samplerate = 44100;
373 lame->num_channels = 2;
374 lame->initialized = FALSE;
376 lame->bitrate = lame_get_brate (lame->lgf);
377 lame->compression_ratio = lame_get_compression_ratio (lame->lgf);
378 lame->quality = lame_get_quality (lame->lgf);
379 lame->mode = lame_get_mode (lame->lgf);
380 lame->force_ms = lame_get_force_ms (lame->lgf);
381 lame->free_format = lame_get_free_format (lame->lgf);
382 lame->copyright = lame_get_copyright (lame->lgf);
383 lame->original = lame_get_original (lame->lgf);
384 lame->error_protection = lame_get_error_protection (lame->lgf);
385 lame->padding_type = lame_get_padding_type (lame->lgf);
386 lame->extension = lame_get_extension (lame->lgf);
387 lame->strict_iso = lame_get_strict_ISO (lame->lgf);
388 lame->disable_reservoir = lame_get_disable_reservoir (lame->lgf);
389 lame->vbr = lame_get_VBR_q (lame->lgf);
390 lame->vbr_mean_bitrate = lame_get_VBR_mean_bitrate_kbps (lame->lgf);
391 lame->vbr_min_bitrate = lame_get_VBR_min_bitrate_kbps (lame->lgf);
392 lame->vbr_max_bitrate = lame_get_VBR_max_bitrate_kbps (lame->lgf);
393 lame->vbr_hard_min = lame_get_VBR_hard_min (lame->lgf);
394 lame->lowpass_freq = lame_get_lowpassfreq (lame->lgf);
395 lame->lowpass_width = lame_get_lowpasswidth (lame->lgf);
396 lame->highpass_freq = lame_get_highpassfreq (lame->lgf);
397 lame->highpass_width = lame_get_highpasswidth (lame->lgf);
398 lame->ath_only = lame_get_ATHonly (lame->lgf);
399 lame->ath_short = lame_get_ATHshort (lame->lgf);
400 lame->no_ath = lame_get_noATH (lame->lgf);
401 /* lame->ath_type = lame_get_ATHtype (lame->lgf); */
402 lame->ath_lower = lame_get_ATHlower (lame->lgf);
403 lame->cwlimit = lame_get_cwlimit (lame->lgf);
404 lame->allow_diff_short = lame_get_allow_diff_short (lame->lgf);
405 lame->no_short_blocks = lame_get_no_short_blocks (lame->lgf);
406 lame->emphasis = lame_get_emphasis (lame->lgf);
408 GST_DEBUG (GST_CAT_PLUGIN_INFO, "done initializing lame element");
413 gst_lame_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
417 /* it's not null if we got it, but it might not be ours */
418 g_return_if_fail (GST_IS_LAME (object));
420 lame = GST_LAME (object);
424 lame->bitrate = g_value_get_int (value);
426 case ARG_COMPRESSION_RATIO:
427 lame->compression_ratio = g_value_get_float (value);
430 lame->quality = g_value_get_enum (value);
433 lame->mode = g_value_get_enum (value);
436 lame->force_ms = g_value_get_boolean (value);
438 case ARG_FREE_FORMAT:
439 lame->free_format = g_value_get_boolean (value);
442 lame->copyright = g_value_get_boolean (value);
445 lame->original = g_value_get_boolean (value);
447 case ARG_ERROR_PROTECTION:
448 lame->error_protection = g_value_get_boolean (value);
450 case ARG_PADDING_TYPE:
451 lame->padding_type = g_value_get_int (value);
454 lame->extension = g_value_get_boolean (value);
457 lame->strict_iso = g_value_get_boolean (value);
459 case ARG_DISABLE_RESERVOIR:
460 lame->disable_reservoir = g_value_get_boolean (value);
463 lame->vbr = g_value_get_boolean (value);
465 case ARG_VBR_MEAN_BITRATE:
466 lame->vbr_mean_bitrate = g_value_get_int (value);
468 case ARG_VBR_MIN_BITRATE:
469 lame->vbr_min_bitrate = g_value_get_int (value);
471 case ARG_VBR_MAX_BITRATE:
472 lame->vbr_max_bitrate = g_value_get_int (value);
474 case ARG_VBR_HARD_MIN:
475 lame->vbr_hard_min = g_value_get_int (value);
477 case ARG_LOWPASS_FREQ:
478 lame->lowpass_freq = g_value_get_int (value);
480 case ARG_LOWPASS_WIDTH:
481 lame->lowpass_width = g_value_get_int (value);
483 case ARG_HIGHPASS_FREQ:
484 lame->highpass_freq = g_value_get_int (value);
486 case ARG_HIGHPASS_WIDTH:
487 lame->highpass_width = g_value_get_int (value);
490 lame->ath_only = g_value_get_boolean (value);
493 lame->ath_short = g_value_get_boolean (value);
496 lame->no_ath = g_value_get_boolean (value);
499 lame->ath_lower = g_value_get_int (value);
502 lame->cwlimit = g_value_get_int (value);
504 case ARG_ALLOW_DIFF_SHORT:
505 lame->allow_diff_short = g_value_get_boolean (value);
507 case ARG_NO_SHORT_BLOCKS:
508 lame->no_short_blocks = g_value_get_boolean (value);
511 lame->emphasis = g_value_get_boolean (value);
520 gst_lame_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
524 /* it's not null if we got it, but it might not be ours */
525 g_return_if_fail (GST_IS_LAME (object));
527 lame = GST_LAME (object);
531 g_value_set_int (value, lame->bitrate);
533 case ARG_COMPRESSION_RATIO:
534 g_value_set_float (value, lame->compression_ratio);
537 g_value_set_enum (value, lame->quality);
540 g_value_set_enum (value, lame->mode);
543 g_value_set_boolean (value, lame->force_ms);
545 case ARG_FREE_FORMAT:
546 g_value_set_boolean (value, lame->free_format);
549 g_value_set_boolean (value, lame->copyright);
552 g_value_set_boolean (value, lame->original);
554 case ARG_ERROR_PROTECTION:
555 g_value_set_boolean (value, lame->error_protection);
557 case ARG_PADDING_TYPE:
558 g_value_set_enum (value, lame->padding_type);
561 g_value_set_boolean (value, lame->extension);
564 g_value_set_boolean (value, lame->strict_iso);
566 case ARG_DISABLE_RESERVOIR:
567 g_value_set_boolean (value, lame->disable_reservoir);
570 g_value_set_boolean (value, lame->vbr);
572 case ARG_VBR_MEAN_BITRATE:
573 g_value_set_int (value, lame->vbr_mean_bitrate);
575 case ARG_VBR_MIN_BITRATE:
576 g_value_set_int (value, lame->vbr_min_bitrate);
578 case ARG_VBR_MAX_BITRATE:
579 g_value_set_int (value, lame->vbr_max_bitrate);
581 case ARG_VBR_HARD_MIN:
582 g_value_set_int (value, lame->vbr_hard_min);
584 case ARG_LOWPASS_FREQ:
585 g_value_set_int (value, lame->lowpass_freq);
587 case ARG_LOWPASS_WIDTH:
588 g_value_set_int (value, lame->lowpass_width);
590 case ARG_HIGHPASS_FREQ:
591 g_value_set_int (value, lame->highpass_freq);
593 case ARG_HIGHPASS_WIDTH:
594 g_value_set_int (value, lame->highpass_width);
597 g_value_set_boolean (value, lame->ath_only);
600 g_value_set_boolean (value, lame->ath_short);
603 g_value_set_boolean (value, lame->no_ath);
606 g_value_set_int (value, lame->ath_lower);
609 g_value_set_int (value, lame->cwlimit);
611 case ARG_ALLOW_DIFF_SHORT:
612 g_value_set_boolean (value, lame->allow_diff_short);
614 case ARG_NO_SHORT_BLOCKS:
615 g_value_set_boolean (value, lame->no_short_blocks);
618 g_value_set_boolean (value, lame->emphasis);
621 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
627 gst_lame_chain (GstPad *pad, GstBuffer *buf)
631 gchar *mp3_data = NULL;
632 gint mp3_buffer_size, mp3_size = 0;
633 gboolean eos = FALSE;
635 lame = GST_LAME (gst_pad_get_parent (pad));
637 GST_DEBUG (GST_CAT_PLUGIN_INFO, "entered chain");
639 if (GST_IS_EVENT (buf)) {
640 switch (GST_EVENT_TYPE (buf)) {
643 case GST_EVENT_FLUSH:
644 mp3_buffer_size = 7200;
645 mp3_data = g_malloc (mp3_buffer_size);
647 mp3_size = lame_encode_flush_nogap (lame->lgf, mp3_data, mp3_buffer_size);
648 gst_event_unref (GST_EVENT (buf));
651 gst_pad_event_default (pad, GST_EVENT (buf));
656 if (!lame->initialized) {
657 gst_buffer_unref (buf);
658 gst_element_error (GST_ELEMENT (lame), "encoder not initialized (input is not audio?)");
662 /* allocate space for output */
663 mp3_buffer_size = ((GST_BUFFER_SIZE(buf) / (2+lame->num_channels)) * 1.25) + 7200;
664 mp3_data = g_malloc (mp3_buffer_size);
666 if (lame->num_channels == 2) {
667 mp3_size = lame_encode_buffer_interleaved (lame->lgf,
668 (short int *) (GST_BUFFER_DATA (buf)),
669 GST_BUFFER_SIZE (buf) / 4,
670 mp3_data, mp3_buffer_size);
673 mp3_size = lame_encode_buffer (lame->lgf,
674 (short int *) (GST_BUFFER_DATA (buf)),
675 (short int *) (GST_BUFFER_DATA (buf)),
676 GST_BUFFER_SIZE (buf) / 2,
677 mp3_data, mp3_buffer_size);
680 GST_DEBUG (GST_CAT_PLUGIN_INFO,
681 "encoded %d bytes of audio to %d bytes of mp3",
682 GST_BUFFER_SIZE (buf), mp3_size);
684 gst_buffer_unref (buf);
688 outbuf = gst_buffer_new ();
689 GST_BUFFER_DATA (outbuf) = mp3_data;
690 GST_BUFFER_SIZE (outbuf) = mp3_size;
692 gst_pad_push (lame->srcpad,outbuf);
699 gst_pad_push (lame->srcpad, GST_BUFFER (gst_event_new (GST_EVENT_EOS)));
700 gst_element_set_eos (GST_ELEMENT (lame));
704 /* transition to the READY state by configuring the gst_lame encoder */
706 gst_lame_setup (GstLame *lame)
708 GST_DEBUG_ENTER ("(\"%s\")", gst_element_get_name (GST_ELEMENT (lame)));
710 /* check if we're already initialized; if we are, we might want to check
711 * if this initialization is compatible with the previous one */
713 if (lame->initialized)
714 g_warning ("already initialized");
716 /* copy the parameters over */
717 lame_set_in_samplerate (lame->lgf, lame->samplerate);
719 /* force mono encoding if we only have one channel */
720 if (lame->num_channels == 1)
723 lame_set_brate (lame->lgf, lame->bitrate);
724 lame_set_compression_ratio (lame->lgf, lame->compression_ratio);
725 lame_set_quality (lame->lgf, lame->quality);
726 lame_set_mode (lame->lgf, lame->mode);
727 lame_set_force_ms (lame->lgf, lame->force_ms);
728 lame_set_free_format (lame->lgf, lame->free_format);
729 lame_set_copyright (lame->lgf, lame->copyright);
730 lame_set_original (lame->lgf, lame->original);
731 lame_set_error_protection (lame->lgf, lame->error_protection);
732 lame_set_padding_type (lame->lgf, lame->padding_type);
733 lame_set_extension (lame->lgf, lame->extension);
734 lame_set_strict_ISO (lame->lgf, lame->strict_iso);
735 lame_set_disable_reservoir (lame->lgf, lame->disable_reservoir);
736 lame_set_VBR_q (lame->lgf, lame->vbr);
737 lame_set_VBR_mean_bitrate_kbps (lame->lgf, lame->vbr_mean_bitrate);
738 lame_set_VBR_min_bitrate_kbps (lame->lgf, lame->vbr_min_bitrate);
739 lame_set_VBR_max_bitrate_kbps (lame->lgf, lame->vbr_max_bitrate);
740 lame_set_VBR_hard_min (lame->lgf, lame->vbr_hard_min);
741 lame_set_lowpassfreq (lame->lgf, lame->lowpass_freq);
742 lame_set_lowpasswidth (lame->lgf, lame->lowpass_width);
743 lame_set_highpassfreq (lame->lgf, lame->highpass_freq);
744 lame_set_highpasswidth (lame->lgf, lame->highpass_width);
745 lame_set_ATHonly (lame->lgf, lame->ath_only);
746 lame_set_ATHshort (lame->lgf, lame->ath_short);
747 lame_set_noATH (lame->lgf, lame->no_ath);
748 lame_set_ATHlower (lame->lgf, lame->ath_lower);
749 lame_set_cwlimit (lame->lgf, lame->cwlimit);
750 lame_set_allow_diff_short (lame->lgf, lame->allow_diff_short);
751 lame_set_no_short_blocks (lame->lgf, lame->no_short_blocks);
752 lame_set_emphasis (lame->lgf, lame->emphasis);
754 /* initialize the lame encoder */
755 if (lame_init_params (lame->lgf) < 0) {
756 lame->initialized = FALSE;
759 lame->initialized = TRUE;
760 /* FIXME: it would be nice to print out the mode here */
761 GST_INFO (GST_CAT_PLUGIN_INFO,
762 "lame encoder initialized (%d kbit/s, %d Hz, %d channels)",
763 lame->bitrate, lame->samplerate, lame->num_channels);
766 GST_DEBUG_LEAVE ("");
768 return lame->initialized;
771 static GstElementStateReturn
772 gst_lame_change_state (GstElement *element)
776 g_return_val_if_fail (GST_IS_LAME (element), GST_STATE_FAILURE);
778 lame = GST_LAME (element);
780 GST_DEBUG (0,"state pending %d", GST_STATE_PENDING (element));
782 switch (GST_STATE_TRANSITION (element)) {
783 case GST_STATE_READY_TO_NULL:
784 if (lame->initialized) {
785 lame_close (lame->lgf);
786 lame->initialized = FALSE;
793 /* if we haven't failed already, give the parent class a chance to ;-) */
794 if (GST_ELEMENT_CLASS (parent_class)->change_state)
795 return GST_ELEMENT_CLASS (parent_class)->change_state (element);
797 return GST_STATE_SUCCESS;
801 plugin_init (GModule *module, GstPlugin *plugin)
803 GstElementFactory *factory;
805 /* create an elementfactory for the gst_lame element */
806 factory = gst_element_factory_new ("lame", GST_TYPE_LAME,
808 g_return_val_if_fail (factory != NULL, FALSE);
810 /* register the source's padtemplate */
811 gst_element_factory_add_pad_template (factory,
812 GST_PAD_TEMPLATE_GET (gst_lame_src_factory));
814 /* register the sink's padtemplate */
815 gst_element_factory_add_pad_template (factory,
816 GST_PAD_TEMPLATE_GET (gst_lame_sink_factory));
818 /* and add the gst_lame element factory to the plugin */
819 gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
824 GstPluginDesc plugin_desc = {