]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/gst-plugins-ugly0-10.git/blob - ext/lame/gstlame.c
ext/lame/gstlame.c: Don't leak the allowed caps.
[glsdk/gst-plugins-ugly0-10.git] / ext / lame / gstlame.c
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  * Copyright (C) <2004> Wim Taymans <wim@fluendo.com>
4  * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
22 /**
23  * SECTION:element-lame
24  * @short_description: an encoder that encodes audio to MPEG-1 layer 3 (mp3)
25  * @see_also: mad, vorbisenc
26  *
27  * <refsect2>
28  * <para>
29  * This element encodes raw integer audio into an MPEG-1 layer 3 (MP3) stream.
30  * Note that <ulink url="http://en.wikipedia.org/wiki/MP3">MP3</ulink> is not
31  * a free format, there are licensing and patent issues to take into
32  * consideration. See <ulink url="http://www.vorbis.com/">Ogg/Vorbis</ulink>
33  * for a royalty free (and often higher quality) alternative.
34  * </para>
35  * <title>Output sample rate</title>
36  * <para>
37  * If no fixed output sample rate is negotiated on the element's src pad,
38  * the element will choose an optimal sample rate to resample to internally.
39  * For example, a 16-bit 44.1 KHz mono audio stream encoded at 48 kbit will
40  * get resampled to 32 KHz.  Use filter caps on the src pad to force a
41  * particular sample rate.
42  * </para>
43  * <title>Writing metadata (tags)</title>
44  * <para>
45  * Whilst the lame encoder element does claim to implement the GstTagSetter
46  * interface, it does so only for backwards compatibility reasons. Tag writing
47  * has been removed from lame. Use external elements like id3v2mux or apev2mux
48  * to add tags to your MP3 streams. The same goes for XING headers: use the
49  * xingmux element to add XING headers to your VBR mp3 file.
50  * </para>
51  * <title>Example pipelines</title>
52  * <para>
53  * Encode a test sine signal to MP3.
54  * </para>
55  * <programlisting>
56  * gst-launch -v audiotestsrc wave=sine num-buffers=100 ! audioconvert ! lame ! filesink location=sine.mp3
57  * </programlisting>
58  * <para>
59  * Record from a sound card using ALSA and encode to MP3
60  * </para>
61  * <programlisting>
62  * gst-launch -v alsasrc ! audioconvert ! lame bitrate=192 ! filesink location=alsasrc.mp3
63  * </programlisting>
64  * <para>
65  * Transcode from a .wav file to MP3 (the id3v2mux element is optional):
66  * </para>
67  * <programlisting>
68  * gst-launch -v filesrc location=music.wav ! decodebin ! audioconvert ! audioresample ! lame bitrate=192 ! id3v2mux ! filesink location=music.mp3
69  * </programlisting>
70  * <para>
71  * Encode Audio CD track 5 to MP3:
72  * </para>
73  * <programlisting>
74  * gst-launch -v cdda://5 ! audioconvert ! lame bitrate=192 ! filesink location=track5.mp3
75  * </programlisting>
76  * <para>
77  * Encode to a fixed sample rate:
78  * </para>
79  * <programlisting>
80  * gst-launch -v audiotestsrc num-buffers=10 ! audio/x-raw-int,rate=44100,channels=1 ! lame bitrate=48 mode=3 ! filesink location=test.mp3
81  * </programlisting>
82  * </refsect2>
83  *
84  * Last reviewed on 2007-07-24 (0.10.7)
85  */
87 #ifdef HAVE_CONFIG_H
88 #include "config.h"
89 #endif
91 #include "string.h"
92 #include "gstlame.h"
93 #include "gst/gst-i18n-plugin.h"
95 #ifdef lame_set_preset
96 #define GST_LAME_PRESET
97 #endif
99 GST_DEBUG_CATEGORY_STATIC (debug);
100 #define GST_CAT_DEFAULT debug
102 #define DEFAULT_MIN_VBR_BITRATE 112
103 #define DEFAULT_MAX_VBR_BITRATE 160
104 #define DEFAULT_MEAN_VBR_BITRATE 128
106 /* elementfactory information */
107 static GstElementDetails gst_lame_details = {
108   "L.A.M.E. mp3 encoder",
109   "Codec/Encoder/Audio",
110   "High-quality free MP3 encoder",
111   "Erik Walthinsen <omega@cse.ogi.edu>, " "Wim Taymans <wim@fluendo.com>",
112 };
114 /* LAME can do MPEG-1, MPEG-2, and MPEG-2.5, so it has 9 possible
115  * sample rates it supports */
116 static GstStaticPadTemplate gst_lame_sink_template =
117 GST_STATIC_PAD_TEMPLATE ("sink",
118     GST_PAD_SINK,
119     GST_PAD_ALWAYS,
120     GST_STATIC_CAPS ("audio/x-raw-int, "
121         "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
122         "signed = (boolean) true, "
123         "width = (int) 16, "
124         "depth = (int) 16, "
125         "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, "
126         "channels = (int) [ 1, 2 ]")
127     );
129 static GstStaticPadTemplate gst_lame_src_template =
130 GST_STATIC_PAD_TEMPLATE ("src",
131     GST_PAD_SRC,
132     GST_PAD_ALWAYS,
133     GST_STATIC_CAPS ("audio/mpeg, "
134         "mpegversion = (int) 1, "
135         "layer = (int) 3, "
136         "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, "
137         "channels = (int) [ 1, 2 ]")
138     );
140 /********** Define useful types for non-programmatic interfaces **********/
141 #define GST_TYPE_LAME_MODE (gst_lame_mode_get_type())
142 static GType
143 gst_lame_mode_get_type (void)
145   static GType lame_mode_type = 0;
146   static GEnumValue lame_modes[] = {
147     {0, "Stereo", "stereo"},
148     {1, "Joint Stereo", "joint"},
149     {2, "Dual Channel", "dual"},
150     {3, "Mono", "mono"},
151     {4, "Auto", "auto"},
152     {0, NULL, NULL}
153   };
155   if (!lame_mode_type) {
156     lame_mode_type = g_enum_register_static ("GstLameMode", lame_modes);
157   }
158   return lame_mode_type;
161 #define GST_TYPE_LAME_QUALITY (gst_lame_quality_get_type())
162 static GType
163 gst_lame_quality_get_type (void)
165   static GType lame_quality_type = 0;
166   static GEnumValue lame_quality[] = {
167     {0, "0 - Best", "0"},
168     {1, "1", "1"},
169     {2, "2", "2"},
170     {3, "3", "3"},
171     {4, "4", "4"},
172     {5, "5 - Default", "5"},
173     {6, "6", "6"},
174     {7, "7", "7"},
175     {8, "8", "8"},
176     {9, "9 - Worst", "9"},
177     {0, NULL, NULL}
178   };
180   if (!lame_quality_type) {
181     lame_quality_type = g_enum_register_static ("GstLameQuality", lame_quality);
182   }
183   return lame_quality_type;
186 #define GST_TYPE_LAME_PADDING (gst_lame_padding_get_type())
187 static GType
188 gst_lame_padding_get_type (void)
190   static GType lame_padding_type = 0;
191   static GEnumValue lame_padding[] = {
192     {0, "No Padding", "never"},
193     {1, "Always Pad", "always"},
194     {2, "Adjust Padding", "adjust"},
195     {0, NULL, NULL}
196   };
198   if (!lame_padding_type) {
199     lame_padding_type = g_enum_register_static ("GstLamePadding", lame_padding);
200   }
201   return lame_padding_type;
204 #define GST_TYPE_LAME_VBRMODE (gst_lame_vbrmode_get_type())
205 static GType
206 gst_lame_vbrmode_get_type (void)
208   static GType lame_vbrmode_type = 0;
209   static GEnumValue lame_vbrmode[] = {
210     {vbr_off, "No VBR (Constant Bitrate)", "none"},
211     {vbr_rh, "Lame's old VBR algorithm", "old"},
212     {vbr_abr, "VBR Average Bitrate", "abr"},
213     {vbr_mtrh, "Lame's new VBR algorithm", "new"},
214     {0, NULL, NULL}
215   };
217   if (!lame_vbrmode_type) {
218     lame_vbrmode_type = g_enum_register_static ("GstLameVbrmode", lame_vbrmode);
219   }
221   return lame_vbrmode_type;
224 #ifdef GSTLAME_PRESET
225 #define GST_TYPE_LAME_PRESET (gst_lame_preset_get_type())
226 static GType
227 gst_lame_preset_get_type (void)
229   static GType gst_lame_preset = 0;
230   static GEnumValue gst_lame_presets[] = {
231     {0, "None", "none"},
232     {MEDIUM, "Medium", "medium"},
233     {STANDARD, "Standard", "standard"},
234     {EXTREME, "Extreme", "extreme"},
235     {INSANE, "Insane", "insane"},
236     {0, NULL, NULL}
237   };
239   if (!gst_lame_preset) {
240     gst_lame_preset =
241         g_enum_register_static ("GstLamePreset", gst_lame_presets);
242   }
244   return gst_lame_preset;
246 #endif
248 /********** Standard stuff for signals and arguments **********/
250 enum
252   ARG_0,
253   ARG_BITRATE,
254   ARG_COMPRESSION_RATIO,
255   ARG_QUALITY,
256   ARG_MODE,
257   ARG_FORCE_MS,
258   ARG_FREE_FORMAT,
259   ARG_COPYRIGHT,
260   ARG_ORIGINAL,
261   ARG_ERROR_PROTECTION,
262   ARG_PADDING_TYPE,
263   ARG_EXTENSION,
264   ARG_STRICT_ISO,
265   ARG_DISABLE_RESERVOIR,
266   ARG_VBR,
267   ARG_VBR_MEAN_BITRATE,
268   ARG_VBR_MIN_BITRATE,
269   ARG_VBR_MAX_BITRATE,
270   ARG_VBR_HARD_MIN,
271   ARG_LOWPASS_FREQ,
272   ARG_LOWPASS_WIDTH,
273   ARG_HIGHPASS_FREQ,
274   ARG_HIGHPASS_WIDTH,
275   ARG_ATH_ONLY,
276   ARG_ATH_SHORT,
277   ARG_NO_ATH,
278   ARG_ATH_LOWER,
279   ARG_CWLIMIT,
280   ARG_ALLOW_DIFF_SHORT,
281   ARG_NO_SHORT_BLOCKS,
282   ARG_EMPHASIS,
283   ARG_VBR_QUALITY,
284 #ifdef GSTLAME_PRESET
285   ARG_XINGHEADER,               /* FIXME: remove in 0.11 */
286   ARG_PRESET
287 #else
288   ARG_XINGHEADER                /* FIXME: remove in 0.11 */
289 #endif
290 };
292 static void gst_lame_base_init (gpointer g_class);
293 static void gst_lame_class_init (GstLameClass * klass);
294 static void gst_lame_init (GstLame * gst_lame);
296 static void gst_lame_set_property (GObject * object, guint prop_id,
297     const GValue * value, GParamSpec * pspec);
298 static void gst_lame_get_property (GObject * object, guint prop_id,
299     GValue * value, GParamSpec * pspec);
300 static gboolean gst_lame_sink_event (GstPad * pad, GstEvent * event);
301 static GstFlowReturn gst_lame_chain (GstPad * pad, GstBuffer * buf);
302 static gboolean gst_lame_setup (GstLame * lame);
303 static GstStateChangeReturn gst_lame_change_state (GstElement * element,
304     GstStateChange transition);
306 static GstElementClass *parent_class = NULL;
308 GType
309 gst_lame_get_type (void)
311   static GType gst_lame_type = 0;
313   if (!gst_lame_type) {
314     static const GTypeInfo gst_lame_info = {
315       sizeof (GstLameClass),
316       gst_lame_base_init,
317       NULL,
318       (GClassInitFunc) gst_lame_class_init,
319       NULL,
320       NULL,
321       sizeof (GstLame),
322       0,
323       (GInstanceInitFunc) gst_lame_init,
324     };
326     /* FIXME: remove support for the GstTagSetter interface in 0.11 */
327     static const GInterfaceInfo tag_setter_info = {
328       NULL,
329       NULL,
330       NULL
331     };
333     gst_lame_type =
334         g_type_register_static (GST_TYPE_ELEMENT, "GstLame", &gst_lame_info, 0);
335     g_type_add_interface_static (gst_lame_type, GST_TYPE_TAG_SETTER,
336         &tag_setter_info);
338   }
339   return gst_lame_type;
342 static void
343 gst_lame_release_memory (GstLame * lame)
345   if (lame->lgf) {
346     lame_close (lame->lgf);
347     lame->lgf = NULL;
348   }
351 static void
352 gst_lame_finalize (GObject * obj)
354   gst_lame_release_memory (GST_LAME (obj));
356   G_OBJECT_CLASS (parent_class)->finalize (obj);
359 static void
360 gst_lame_base_init (gpointer g_class)
362   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
364   gst_element_class_add_pad_template (element_class,
365       gst_static_pad_template_get (&gst_lame_src_template));
366   gst_element_class_add_pad_template (element_class,
367       gst_static_pad_template_get (&gst_lame_sink_template));
368   gst_element_class_set_details (element_class, &gst_lame_details);
371 static void
372 gst_lame_class_init (GstLameClass * klass)
374   GObjectClass *gobject_class;
375   GstElementClass *gstelement_class;
377   gobject_class = (GObjectClass *) klass;
378   gstelement_class = (GstElementClass *) klass;
380   parent_class = g_type_class_peek_parent (klass);
382   gobject_class->set_property = gst_lame_set_property;
383   gobject_class->get_property = gst_lame_get_property;
384   gobject_class->finalize = gst_lame_finalize;
386   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE,
387       g_param_spec_int ("bitrate", "Bitrate (kb/s)",
388           "Bitrate in kbit/sec (8, 16, 24, 32, 40, 48, 56, 64, 80, 96, "
389           "112, 128, 160, 192, 224, 256 or 320)",
390           8, 320, 128, G_PARAM_READWRITE));
391   /* compression ratio set to 0.0 by default otherwise it overrides the bitrate setting */
392   g_object_class_install_property (G_OBJECT_CLASS (klass),
393       ARG_COMPRESSION_RATIO, g_param_spec_float ("compression_ratio",
394           "Compression Ratio",
395           "let lame choose bitrate to achieve selected compression ratio", 0.0,
396           200.0, 0.0, G_PARAM_READWRITE));
397   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY,
398       g_param_spec_enum ("quality", "Quality",
399           "Quality of algorithm used for encoding", GST_TYPE_LAME_QUALITY, 5,
400           G_PARAM_READWRITE));
401   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODE,
402       g_param_spec_enum ("mode", "Mode", "Encoding mode", GST_TYPE_LAME_MODE, 0,
403           G_PARAM_READWRITE));
404   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FORCE_MS,
405       g_param_spec_boolean ("force-ms", "Force ms",
406           "Force ms_stereo on all frames", TRUE, G_PARAM_READWRITE));
407   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREE_FORMAT,
408       g_param_spec_boolean ("free-format", "Free format",
409           "Produce a free format bitstream", TRUE, G_PARAM_READWRITE));
410   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COPYRIGHT,
411       g_param_spec_boolean ("copyright", "Copyright", "Mark as copyright", TRUE,
412           G_PARAM_READWRITE));
413   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ORIGINAL,
414       g_param_spec_boolean ("original", "Original", "Mark as non-original",
415           TRUE, G_PARAM_READWRITE));
416   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_PROTECTION,
417       g_param_spec_boolean ("error-protection", "Error protection",
418           "Adds 16 bit checksum to every frame", TRUE, G_PARAM_READWRITE));
419   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PADDING_TYPE,
420       g_param_spec_enum ("padding-type", "Padding type", "Padding type",
421           GST_TYPE_LAME_PADDING, 0, G_PARAM_READWRITE));
422   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EXTENSION,
423       g_param_spec_boolean ("extension", "Extension", "Extension", TRUE,
424           G_PARAM_READWRITE));
425   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STRICT_ISO,
426       g_param_spec_boolean ("strict-iso", "Strict ISO",
427           "Comply as much as possible to ISO MPEG spec", TRUE,
428           G_PARAM_READWRITE));
429   g_object_class_install_property (G_OBJECT_CLASS (klass),
430       ARG_DISABLE_RESERVOIR, g_param_spec_boolean ("disable-reservoir",
431           "Disable reservoir", "Disable the bit reservoir", TRUE,
432           G_PARAM_READWRITE));
433   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR,
434       g_param_spec_enum ("vbr", "VBR", "Specify bitrate mode",
435           GST_TYPE_LAME_VBRMODE, vbr_off, G_PARAM_READWRITE));
436   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_QUALITY,
437       g_param_spec_enum ("vbr-quality", "VBR Quality", "VBR Quality",
438           GST_TYPE_LAME_QUALITY, 5, G_PARAM_READWRITE));
439   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_MEAN_BITRATE,
440       g_param_spec_int ("vbr-mean-bitrate", "VBR mean bitrate",
441           "Specify mean VBR bitrate", 8, 320,
442           DEFAULT_MEAN_VBR_BITRATE, G_PARAM_READWRITE));
443   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_MIN_BITRATE,
444       g_param_spec_int ("vbr-min-bitrate", "VBR min bitrate",
445           "Specify minimum VBR bitrate (8, 16, 24, 32, 40, 48, 56, 64, 80, 96, "
446           "112, 128, 160, 192, 224, 256 or 320)",
447           8, 320, DEFAULT_MIN_VBR_BITRATE, G_PARAM_READWRITE));
448   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_MAX_BITRATE,
449       g_param_spec_int ("vbr-max-bitrate", "VBR max bitrate",
450           "Specify maximum VBR bitrate (8, 16, 24, 32, 40, 48, 56, 64, 80, 96, "
451           "112, 128, 160, 192, 224, 256 or 320)",
452           8, 320, DEFAULT_MAX_VBR_BITRATE, G_PARAM_READWRITE));
453   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VBR_HARD_MIN,
454       g_param_spec_int ("vbr-hard-min", "VBR hard min",
455           "Specify whether min VBR bitrate is a hard limit. Normally, "
456           "it can be violated for silence", 0, 1, 0, G_PARAM_READWRITE));
457   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWPASS_FREQ,
458       g_param_spec_int ("lowpass-freq", "Lowpass freq",
459           "frequency(kHz), lowpass filter cutoff above freq", 0, 50000, 0,
460           G_PARAM_READWRITE));
461   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWPASS_WIDTH,
462       g_param_spec_int ("lowpass-width", "Lowpass width",
463           "frequency(kHz) - default 15% of lowpass freq", 0, G_MAXINT, 0,
464           G_PARAM_READWRITE));
465   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HIGHPASS_FREQ,
466       g_param_spec_int ("highpass-freq", "Highpass freq",
467           "frequency(kHz), highpass filter cutoff below freq", 0, 50000, 0,
468           G_PARAM_READWRITE));
469   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HIGHPASS_WIDTH,
470       g_param_spec_int ("highpass-width", "Highpass width",
471           "frequency(kHz) - default 15% of highpass freq", 0, G_MAXINT, 0,
472           G_PARAM_READWRITE));
473   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_ONLY,
474       g_param_spec_boolean ("ath-only", "ATH only",
475           "Ignore GPSYCHO completely, use ATH only", TRUE, G_PARAM_READWRITE));
476   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_SHORT,
477       g_param_spec_boolean ("ath-short", "ATH short",
478           "Ignore GPSYCHO for short blocks, use ATH only", TRUE,
479           G_PARAM_READWRITE));
480   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NO_ATH,
481       g_param_spec_boolean ("no-ath", "No ath",
482           "turns ATH down to a flat noise floor", TRUE, G_PARAM_READWRITE));
483   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ATH_LOWER,
484       g_param_spec_int ("ath-lower", "ATH lower", "lowers ATH by x dB",
485           G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
486   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CWLIMIT,
487       g_param_spec_int ("cwlimit", "Cwlimit",
488           "Compute tonality up to freq (in kHz) default 8.8717", 0, 50000, 0,
489           G_PARAM_READWRITE));
490   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALLOW_DIFF_SHORT,
491       g_param_spec_boolean ("allow-diff-short", "Allow diff short",
492           "Allow diff short", TRUE, G_PARAM_READWRITE));
493   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NO_SHORT_BLOCKS,
494       g_param_spec_boolean ("no-short-blocks", "No short blocks",
495           "Do not use short blocks", TRUE, G_PARAM_READWRITE));
496   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EMPHASIS,
497       g_param_spec_boolean ("emphasis", "Emphasis", "Emphasis", TRUE,
498           G_PARAM_READWRITE));
499   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_XINGHEADER,
500       g_param_spec_boolean ("xingheader", "Output Xing Header",
501           "Output Xing Header (BROKEN, use xingmux instead)",
502           FALSE, G_PARAM_READWRITE));
503 #ifdef GSTLAME_PRESET
504   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PRESET,
505       g_param_spec_enum ("preset", "Lame Preset", "Lame Preset",
506           GST_TYPE_LAME_PRESET, 0, G_PARAM_READWRITE));
507 #endif
509   gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_lame_change_state);
512 static gboolean
513 gst_lame_src_setcaps (GstPad * pad, GstCaps * caps)
515   GST_DEBUG_OBJECT (pad, "caps: %" GST_PTR_FORMAT, caps);
516   return TRUE;
519 static gboolean
520 gst_lame_sink_setcaps (GstPad * pad, GstCaps * caps)
522   GstLame *lame;
523   gint out_samplerate;
524   GstStructure *structure;
525   GstCaps *othercaps;
527   lame = GST_LAME (GST_PAD_PARENT (pad));
528   structure = gst_caps_get_structure (caps, 0);
530   if (!gst_structure_get_int (structure, "rate", &lame->samplerate))
531     goto no_rate;
532   if (!gst_structure_get_int (structure, "channels", &lame->num_channels))
533     goto no_channels;
535   GST_DEBUG_OBJECT (lame, "setting up lame");
536   if (!gst_lame_setup (lame))
537     goto setup_failed;
540   out_samplerate = lame_get_out_samplerate (lame->lgf);
541   if (out_samplerate == 0)
542     goto zero_output_rate;
543   if (out_samplerate != lame->samplerate) {
544     GST_WARNING_OBJECT (lame,
545         "output samplerate %d is different from incoming samplerate %d",
546         out_samplerate, lame->samplerate);
547   }
549   othercaps =
550       gst_caps_new_simple ("audio/mpeg",
551       "mpegversion", G_TYPE_INT, 1,
552       "layer", G_TYPE_INT, 3,
553       "channels", G_TYPE_INT, lame->mode == MONO ? 1 : lame->num_channels,
554       "rate", G_TYPE_INT, out_samplerate, NULL);
556   /* and use these caps */
557   gst_pad_set_caps (lame->srcpad, othercaps);
558   gst_caps_unref (othercaps);
560   return TRUE;
562 no_rate:
563   {
564     GST_ERROR_OBJECT (lame, "input caps have no sample rate field");
565     return FALSE;
566   }
567 no_channels:
568   {
569     GST_ERROR_OBJECT (lame, "input caps have no channels field");
570     return FALSE;
571   }
572 zero_output_rate:
573   {
574     GST_ELEMENT_ERROR (lame, LIBRARY, SETTINGS, (NULL),
575         ("LAME decided on a zero sample rate"));
576     return FALSE;
577   }
578 setup_failed:
579   {
580     GST_ELEMENT_ERROR (lame, LIBRARY, SETTINGS,
581         (_("Failed to configure LAME encoder. Check your encoding parameters.")), NULL);
582     return FALSE;
583   }
586 static void
587 gst_lame_init (GstLame * lame)
589   GST_DEBUG_OBJECT (lame, "starting initialization");
591   lame->sinkpad =
592       gst_pad_new_from_static_template (&gst_lame_sink_template, "sink");
593   gst_pad_set_event_function (lame->sinkpad,
594       GST_DEBUG_FUNCPTR (gst_lame_sink_event));
595   gst_pad_set_chain_function (lame->sinkpad,
596       GST_DEBUG_FUNCPTR (gst_lame_chain));
597   gst_pad_set_setcaps_function (lame->sinkpad,
598       GST_DEBUG_FUNCPTR (gst_lame_sink_setcaps));
599   gst_element_add_pad (GST_ELEMENT (lame), lame->sinkpad);
601   lame->srcpad =
602       gst_pad_new_from_static_template (&gst_lame_src_template, "src");
603   gst_pad_set_setcaps_function (lame->srcpad,
604       GST_DEBUG_FUNCPTR (gst_lame_src_setcaps));
605   gst_element_add_pad (GST_ELEMENT (lame), lame->srcpad);
607   /* create an encoder state so we can ask about defaults */
608   lame->lgf = lame_init ();
609   if (lame->lgf == NULL)
610     goto init_error;
612   if (lame_init_params (lame->lgf) < 0)
613     goto init_error;
615   lame->samplerate = 44100;
616   lame->num_channels = 2;
617   lame->setup = FALSE;
619   lame->bitrate = 128;          /* lame_get_brate (lame->lgf);
620                                  * => 0/out of range */
621   lame->compression_ratio = 0.0;        /* lame_get_compression_ratio (lame->lgf);
622                                          * => 0/out of range ...
623                                          * NOTE: 0.0 makes bitrate take precedence */
624   lame->quality = 5;            /* lame_get_quality (lame->lgf);
625                                  * => -1/out of range */
626   lame->mode = lame_get_mode (lame->lgf);
627   lame->requested_mode = lame->mode;
628   lame->force_ms = lame_get_force_ms (lame->lgf);
629   lame->free_format = lame_get_free_format (lame->lgf);
630   lame->copyright = lame_get_copyright (lame->lgf);
631   lame->original = lame_get_original (lame->lgf);
632   lame->error_protection = lame_get_error_protection (lame->lgf);
633   lame->padding_type = lame_get_padding_type (lame->lgf);
634   lame->extension = lame_get_extension (lame->lgf);
635   lame->strict_iso = lame_get_strict_ISO (lame->lgf);
636   lame->disable_reservoir = lame_get_disable_reservoir (lame->lgf);
637   lame->vbr = vbr_off;          /* lame_get_VBR (lame->lgf); */
638   lame->vbr_quality = 5;
639 #if 0
640   /* Replaced by our own more informative constants, 
641      rather than LAME's defaults */
642   lame->vbr_mean_bitrate = lame_get_VBR_mean_bitrate_kbps (lame->lgf);
643   lame->vbr_min_bitrate = lame_get_VBR_min_bitrate_kbps (lame->lgf);
644   lame->vbr_max_bitrate = 0;    /* lame_get_VBR_max_bitrate_kbps (lame->lgf);
645                                  * => 0/no vbr possible */
646 #else
647   lame->vbr_mean_bitrate = DEFAULT_MEAN_VBR_BITRATE;
648   lame->vbr_min_bitrate = DEFAULT_MIN_VBR_BITRATE;
649   lame->vbr_max_bitrate = DEFAULT_MAX_VBR_BITRATE;
650 #endif
651   lame->vbr_hard_min = lame_get_VBR_hard_min (lame->lgf);
652   /* lame->lowpass_freq = 50000;    lame_get_lowpassfreq (lame->lgf);
653    * => 0/lowpass on everything ? */
654   lame->lowpass_freq = 0;
655   lame->lowpass_width = 0;      /* lame_get_lowpasswidth (lame->lgf);
656                                  * => -1/out of range */
657   lame->highpass_freq = lame_get_highpassfreq (lame->lgf);
658   lame->highpass_width = 0;     /* lame_get_highpasswidth (lame->lgf);
659                                  * => -1/out of range */
660   lame->ath_only = lame_get_ATHonly (lame->lgf);
661   lame->ath_short = lame_get_ATHshort (lame->lgf);
662   lame->no_ath = lame_get_noATH (lame->lgf);
663   /*  lame->ath_type = lame_get_ATHtype (lame->lgf); */
664   lame->ath_lower = lame_get_ATHlower (lame->lgf);
665   lame->cwlimit = 8.8717;       /* lame_get_cwlimit (lame->lgf); => 0 */
666   lame->allow_diff_short = lame_get_allow_diff_short (lame->lgf);
667   lame->no_short_blocks = TRUE; /* lame_get_no_short_blocks (lame->lgf); */
668   lame->emphasis = lame_get_emphasis (lame->lgf);
669   lame->preset = 0;
670   lame_close (lame->lgf);
671   lame->lgf = NULL;
673   GST_DEBUG_OBJECT (lame, "done initializing");
674   lame->init_error = FALSE;
675   return;
677 /* ERRORS */
678 init_error:
679   {
680     GST_ERROR_OBJECT (lame, "error initializing");
681     lame->init_error = TRUE;
682     if (lame->lgf) {
683       lame_close (lame->lgf);
684       lame->lgf = NULL;
685     }
686   }
689 /* <php-emulation-mode>three underscores for ___rate is really really really
690  * private as opposed to one underscore<php-emulation-mode> */
691 /* call this MACRO outside of the NULL state so that we have a higher chance
692  * of actually having a pipeline and bus to get the message through */
694 #define CHECK_AND_FIXUP_BITRATE(obj,param,rate,free_format)               \
695 G_STMT_START {                                                            \
696   gint ___rate = rate;                                                    \
697   gint maxrate = 320;                                                     \
698   gint multiplier = 64;                                                   \
699   if (!free_format) {                                                     \
700     if (rate <= 64) {                                                     \
701       maxrate = 64; multiplier = 8;                                       \
702       if ((rate % 8) != 0) ___rate = GST_ROUND_UP_8 (rate);               \
703     } else if (rate <= 128) {                                             \
704       maxrate = 128; multiplier = 16;                                     \
705       if ((rate % 16) != 0) ___rate = GST_ROUND_UP_16 (rate);             \
706     } else if (rate <= 256) {                                             \
707       maxrate = 256; multiplier = 32;                                     \
708       if ((rate % 32) != 0) ___rate = GST_ROUND_UP_32 (rate);             \
709     } else if (rate <= 320) {                                             \
710       maxrate = 320; multiplier = 64;                                     \
711       if ((rate % 64) != 0) ___rate = GST_ROUND_UP_64 (rate);             \
712     }                                                                     \
713     if (___rate != rate) {                                                \
714       GST_ELEMENT_WARNING (obj, LIBRARY, SETTINGS,                        \
715           (_("The requested bitrate %d kbit/s for property '%s' "         \
716              "is not allowed. "                                           \
717             "The bitrate was changed to %d kbit/s."), rate,               \
718             param,  ___rate),                                             \
719           ("A bitrate below %d should be a multiple of %d.",              \
720               maxrate, multiplier));                                      \
721       rate = ___rate;                                                     \
722     }                                                                     \
723   }                                                                       \
724 } G_STMT_END
726 static void
727 gst_lame_set_property (GObject * object, guint prop_id, const GValue * value,
728     GParamSpec * pspec)
730   GstLame *lame;
732   lame = GST_LAME (object);
734   switch (prop_id) {
735     case ARG_BITRATE:
736       lame->bitrate = g_value_get_int (value);
737       break;
738     case ARG_COMPRESSION_RATIO:
739       lame->compression_ratio = g_value_get_float (value);
740       break;
741     case ARG_QUALITY:
742       lame->quality = g_value_get_enum (value);
743       break;
744     case ARG_MODE:
745       lame->requested_mode = g_value_get_enum (value);
746       break;
747     case ARG_FORCE_MS:
748       lame->force_ms = g_value_get_boolean (value);
749       break;
750     case ARG_FREE_FORMAT:
751       lame->free_format = g_value_get_boolean (value);
752       break;
753     case ARG_COPYRIGHT:
754       lame->copyright = g_value_get_boolean (value);
755       break;
756     case ARG_ORIGINAL:
757       lame->original = g_value_get_boolean (value);
758       break;
759     case ARG_ERROR_PROTECTION:
760       lame->error_protection = g_value_get_boolean (value);
761       break;
762     case ARG_PADDING_TYPE:
763       lame->padding_type = g_value_get_int (value);
764       break;
765     case ARG_EXTENSION:
766       lame->extension = g_value_get_boolean (value);
767       break;
768     case ARG_STRICT_ISO:
769       lame->strict_iso = g_value_get_boolean (value);
770       break;
771     case ARG_DISABLE_RESERVOIR:
772       lame->disable_reservoir = g_value_get_boolean (value);
773       break;
774     case ARG_VBR:
775       lame->vbr = g_value_get_enum (value);
776       break;
777     case ARG_VBR_QUALITY:
778       lame->vbr_quality = g_value_get_enum (value);
779       break;
780     case ARG_VBR_MEAN_BITRATE:
781       lame->vbr_mean_bitrate = g_value_get_int (value);
782       break;
783     case ARG_VBR_MIN_BITRATE:
784       lame->vbr_min_bitrate = g_value_get_int (value);
785       break;
786     case ARG_VBR_MAX_BITRATE:
787       lame->vbr_max_bitrate = g_value_get_int (value);
788       break;
789     case ARG_VBR_HARD_MIN:
790       lame->vbr_hard_min = g_value_get_int (value);
791       break;
792     case ARG_LOWPASS_FREQ:
793       lame->lowpass_freq = g_value_get_int (value);
794       break;
795     case ARG_LOWPASS_WIDTH:
796       lame->lowpass_width = g_value_get_int (value);
797       break;
798     case ARG_HIGHPASS_FREQ:
799       lame->highpass_freq = g_value_get_int (value);
800       break;
801     case ARG_HIGHPASS_WIDTH:
802       lame->highpass_width = g_value_get_int (value);
803       break;
804     case ARG_ATH_ONLY:
805       lame->ath_only = g_value_get_boolean (value);
806       break;
807     case ARG_ATH_SHORT:
808       lame->ath_short = g_value_get_boolean (value);
809       break;
810     case ARG_NO_ATH:
811       lame->no_ath = g_value_get_boolean (value);
812       break;
813     case ARG_ATH_LOWER:
814       lame->ath_lower = g_value_get_int (value);
815       break;
816     case ARG_CWLIMIT:
817       lame->cwlimit = g_value_get_int (value);
818       break;
819     case ARG_ALLOW_DIFF_SHORT:
820       lame->allow_diff_short = g_value_get_boolean (value);
821       break;
822     case ARG_NO_SHORT_BLOCKS:
823       lame->no_short_blocks = g_value_get_boolean (value);
824       break;
825     case ARG_EMPHASIS:
826       lame->emphasis = g_value_get_boolean (value);
827       break;
828     case ARG_XINGHEADER:
829       break;
830 #ifdef GSTLAME_PRESET
831     case ARG_PRESET:
832       lame->preset = g_value_get_enum (value);
833       break;
834 #endif
835     default:
836       break;
837   }
841 static void
842 gst_lame_get_property (GObject * object, guint prop_id, GValue * value,
843     GParamSpec * pspec)
845   GstLame *lame;
847   lame = GST_LAME (object);
849   switch (prop_id) {
850     case ARG_BITRATE:
851       g_value_set_int (value, lame->bitrate);
852       break;
853     case ARG_COMPRESSION_RATIO:
854       g_value_set_float (value, lame->compression_ratio);
855       break;
856     case ARG_QUALITY:
857       g_value_set_enum (value, lame->quality);
858       break;
859     case ARG_MODE:
860       g_value_set_enum (value, lame->requested_mode);
861       break;
862     case ARG_FORCE_MS:
863       g_value_set_boolean (value, lame->force_ms);
864       break;
865     case ARG_FREE_FORMAT:
866       g_value_set_boolean (value, lame->free_format);
867       break;
868     case ARG_COPYRIGHT:
869       g_value_set_boolean (value, lame->copyright);
870       break;
871     case ARG_ORIGINAL:
872       g_value_set_boolean (value, lame->original);
873       break;
874     case ARG_ERROR_PROTECTION:
875       g_value_set_boolean (value, lame->error_protection);
876       break;
877     case ARG_PADDING_TYPE:
878       g_value_set_enum (value, lame->padding_type);
879       break;
880     case ARG_EXTENSION:
881       g_value_set_boolean (value, lame->extension);
882       break;
883     case ARG_STRICT_ISO:
884       g_value_set_boolean (value, lame->strict_iso);
885       break;
886     case ARG_DISABLE_RESERVOIR:
887       g_value_set_boolean (value, lame->disable_reservoir);
888       break;
889     case ARG_VBR:
890       g_value_set_enum (value, lame->vbr);
891       break;
892     case ARG_VBR_QUALITY:
893       g_value_set_enum (value, lame->vbr_quality);
894       break;
895     case ARG_VBR_MEAN_BITRATE:
896       g_value_set_int (value, lame->vbr_mean_bitrate);
897       break;
898     case ARG_VBR_MIN_BITRATE:
899       g_value_set_int (value, lame->vbr_min_bitrate);
900       break;
901     case ARG_VBR_MAX_BITRATE:
902       g_value_set_int (value, lame->vbr_max_bitrate);
903       break;
904     case ARG_VBR_HARD_MIN:
905       g_value_set_int (value, lame->vbr_hard_min);
906       break;
907     case ARG_LOWPASS_FREQ:
908       g_value_set_int (value, lame->lowpass_freq);
909       break;
910     case ARG_LOWPASS_WIDTH:
911       g_value_set_int (value, lame->lowpass_width);
912       break;
913     case ARG_HIGHPASS_FREQ:
914       g_value_set_int (value, lame->highpass_freq);
915       break;
916     case ARG_HIGHPASS_WIDTH:
917       g_value_set_int (value, lame->highpass_width);
918       break;
919     case ARG_ATH_ONLY:
920       g_value_set_boolean (value, lame->ath_only);
921       break;
922     case ARG_ATH_SHORT:
923       g_value_set_boolean (value, lame->ath_short);
924       break;
925     case ARG_NO_ATH:
926       g_value_set_boolean (value, lame->no_ath);
927       break;
928     case ARG_ATH_LOWER:
929       g_value_set_int (value, lame->ath_lower);
930       break;
931     case ARG_CWLIMIT:
932       g_value_set_int (value, lame->cwlimit);
933       break;
934     case ARG_ALLOW_DIFF_SHORT:
935       g_value_set_boolean (value, lame->allow_diff_short);
936       break;
937     case ARG_NO_SHORT_BLOCKS:
938       g_value_set_boolean (value, lame->no_short_blocks);
939       break;
940     case ARG_EMPHASIS:
941       g_value_set_boolean (value, lame->emphasis);
942       break;
943     case ARG_XINGHEADER:
944       break;
945 #ifdef GSTLAME_PRESET
946     case ARG_PRESET:
947       g_value_set_enum (value, lame->preset);
948       break;
949 #endif
950     default:
951       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
952       break;
953   }
956 static gboolean
957 gst_lame_sink_event (GstPad * pad, GstEvent * event)
959   gboolean ret;
960   GstLame *lame;
962   lame = GST_LAME (gst_pad_get_parent (pad));
964   switch (GST_EVENT_TYPE (event)) {
965     case GST_EVENT_EOS:{
966       GST_DEBUG_OBJECT (lame, "handling EOS event");
968       if (lame->lgf != NULL) {
969         GstBuffer *buf;
970         gint size;
972         buf = gst_buffer_new_and_alloc (7200);
973         size = lame_encode_flush (lame->lgf, GST_BUFFER_DATA (buf), 7200);
975         if (size > 0 && lame->last_flow == GST_FLOW_OK) {
976           gint64 duration;
978           duration = gst_util_uint64_scale (size, 8 * GST_SECOND,
979               1000 * lame->bitrate);
981           if (lame->last_ts == GST_CLOCK_TIME_NONE) {
982             lame->last_ts = lame->eos_ts;
983             lame->last_duration = duration;
984           } else {
985             lame->last_duration += duration;
986           }
988           GST_BUFFER_TIMESTAMP (buf) = lame->last_ts;
989           GST_BUFFER_DURATION (buf) = lame->last_duration;
990           lame->last_ts = GST_CLOCK_TIME_NONE;
991           GST_BUFFER_SIZE (buf) = size;
992           GST_DEBUG_OBJECT (lame, "pushing final packet of %u bytes", size);
993           gst_buffer_set_caps (buf, GST_PAD_CAPS (lame->srcpad));
994           gst_pad_push (lame->srcpad, buf);
995         } else {
996           GST_DEBUG_OBJECT (lame, "no final packet (size=%d, last_flow=%s)",
997               size, gst_flow_get_name (lame->last_flow));
998           gst_buffer_unref (buf);
999         }
1000       }
1002       ret = gst_pad_event_default (pad, event);
1003       break;
1004     }
1005     case GST_EVENT_FLUSH_START:
1006       GST_DEBUG_OBJECT (lame, "handling FLUSH start event");
1007       /* forward event */
1008       ret = gst_pad_push_event (lame->srcpad, event);
1009       break;
1010     case GST_EVENT_FLUSH_STOP:
1011     {
1012       guchar *mp3_data = NULL;
1013       gint mp3_buffer_size, mp3_size = 0;
1015       GST_DEBUG_OBJECT (lame, "handling FLUSH stop event");
1017       /* clear buffers */
1018       mp3_buffer_size = 7200;
1019       mp3_data = g_malloc (mp3_buffer_size);
1020       mp3_size = lame_encode_flush (lame->lgf, mp3_data, mp3_buffer_size);
1022       ret = gst_pad_push_event (lame->srcpad, event);
1023       break;
1024     }
1025     case GST_EVENT_TAG:
1026       GST_DEBUG_OBJECT (lame, "ignoring TAG event, passing it on");
1027       ret = gst_pad_push_event (lame->srcpad, event);
1028       break;
1029     default:
1030       ret = gst_pad_event_default (pad, event);
1031       break;
1032   }
1033   gst_object_unref (lame);
1034   return ret;
1037 static GstFlowReturn
1038 gst_lame_chain (GstPad * pad, GstBuffer * buf)
1040   GstLame *lame;
1041   guchar *mp3_data;
1042   gint mp3_buffer_size, mp3_size;
1043   gint64 duration;
1044   GstFlowReturn result;
1045   gint num_samples;
1046   guint8 *data;
1047   guint size;
1049   lame = GST_LAME (GST_PAD_PARENT (pad));
1051   GST_LOG_OBJECT (lame, "entered chain");
1053   if (lame->init_error)
1054     goto init_error;
1056   if (!lame->setup)
1057     goto not_setup;
1059   data = GST_BUFFER_DATA (buf);
1060   size = GST_BUFFER_SIZE (buf);
1062   num_samples = size / 2;
1064   /* allocate space for output */
1065   mp3_buffer_size = 1.25 * num_samples + 7200;
1066   mp3_data = g_malloc (mp3_buffer_size);
1068   /* lame seems to be too stupid to get mono interleaved going */
1069   if (lame->num_channels == 1) {
1070     mp3_size = lame_encode_buffer (lame->lgf,
1071         (short int *) data,
1072         (short int *) data, num_samples, mp3_data, mp3_buffer_size);
1073   } else {
1074     mp3_size = lame_encode_buffer_interleaved (lame->lgf,
1075         (short int *) data,
1076         num_samples / lame->num_channels, mp3_data, mp3_buffer_size);
1077   }
1079   GST_LOG_OBJECT (lame, "encoded %d bytes of audio to %d bytes of mp3",
1080       size, mp3_size);
1082   duration = gst_util_uint64_scale_int (size, GST_SECOND,
1083       2 * lame->samplerate * lame->num_channels);
1085   if (GST_BUFFER_DURATION (buf) != GST_CLOCK_TIME_NONE &&
1086       GST_BUFFER_DURATION (buf) != duration) {
1087     GST_DEBUG_OBJECT (lame, "incoming buffer had incorrect duration %"
1088         GST_TIME_FORMAT ", outgoing buffer will have correct duration %"
1089         GST_TIME_FORMAT,
1090         GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_TIME_ARGS (duration));
1091   }
1093   if (lame->last_ts == GST_CLOCK_TIME_NONE) {
1094     lame->last_ts = GST_BUFFER_TIMESTAMP (buf);
1095     lame->last_offs = GST_BUFFER_OFFSET (buf);
1096     lame->last_duration = duration;
1097   } else {
1098     lame->last_duration += duration;
1099   }
1101   gst_buffer_unref (buf);
1103   if (mp3_size < 0) {
1104     g_warning ("error %d", mp3_size);
1105   }
1107   if (mp3_size > 0) {
1108     GstBuffer *outbuf;
1110     outbuf = gst_buffer_new ();
1111     GST_BUFFER_DATA (outbuf) = mp3_data;
1112     GST_BUFFER_MALLOCDATA (outbuf) = mp3_data;
1113     GST_BUFFER_SIZE (outbuf) = mp3_size;
1114     GST_BUFFER_TIMESTAMP (outbuf) = lame->last_ts;
1115     GST_BUFFER_OFFSET (outbuf) = lame->last_offs;
1116     GST_BUFFER_DURATION (outbuf) = lame->last_duration;
1117     gst_buffer_set_caps (outbuf, GST_PAD_CAPS (lame->srcpad));
1119     result = gst_pad_push (lame->srcpad, outbuf);
1120     lame->last_flow = result;
1121     if (result != GST_FLOW_OK) {
1122       GST_DEBUG_OBJECT (lame, "flow return: %s", gst_flow_get_name (result));
1123     }
1125     if (GST_CLOCK_TIME_IS_VALID (lame->last_ts))
1126       lame->eos_ts = lame->last_ts + lame->last_duration;
1127     else
1128       lame->eos_ts = GST_CLOCK_TIME_NONE;
1129     lame->last_ts = GST_CLOCK_TIME_NONE;
1130   } else {
1131     g_free (mp3_data);
1132     result = GST_FLOW_OK;
1133   }
1135   return result;
1137   /* ERRORS */
1138 not_setup:
1139   {
1140     gst_buffer_unref (buf);
1141     GST_ELEMENT_ERROR (lame, CORE, NEGOTIATION, (NULL),
1142         ("encoder not initialized (input is not audio?)"));
1143     return GST_FLOW_ERROR;
1144   }
1145 init_error:
1146   {
1147     gst_buffer_unref (buf);
1148     GST_ELEMENT_ERROR (lame, LIBRARY, INIT, (NULL), (NULL));
1149     return GST_FLOW_ERROR;
1150   }
1153 /* set up the encoder state */
1154 static gboolean
1155 gst_lame_setup (GstLame * lame)
1158 #define CHECK_ERROR(command) G_STMT_START {\
1159   if ((command) < 0) { \
1160     GST_ERROR_OBJECT (lame, "setup failed: " G_STRINGIFY (command)); \
1161     return FALSE; \
1162   } \
1163 }G_STMT_END
1165   int retval;
1166   GstCaps *allowed_caps;
1168   GST_DEBUG_OBJECT (lame, "starting setup");
1170   /* check if we're already setup; if we are, we might want to check
1171    * if this initialization is compatible with the previous one */
1172   /* FIXME: do this */
1173   if (lame->setup) {
1174     GST_WARNING_OBJECT (lame, "already setup");
1175     lame->setup = FALSE;
1176   }
1178   lame->lgf = lame_init ();
1180   if (lame->lgf == NULL)
1181     return FALSE;
1183   /* copy the parameters over */
1184   lame_set_in_samplerate (lame->lgf, lame->samplerate);
1186   /* let lame choose default samplerate unless outgoing sample rate is fixed */
1187   allowed_caps = gst_pad_get_allowed_caps (lame->srcpad);
1189   if (allowed_caps != NULL) {
1190     GstStructure *structure;
1191     gint samplerate;
1193     structure = gst_caps_get_structure (allowed_caps, 0);
1195     if (gst_structure_get_int (structure, "rate", &samplerate)) {
1196       GST_DEBUG_OBJECT (lame, "Setting sample rate to %d as fixed in src caps",
1197           samplerate);
1198       lame_set_out_samplerate (lame->lgf, samplerate);
1199     } else {
1200       GST_DEBUG_OBJECT (lame, "Letting lame choose sample rate");
1201       lame_set_out_samplerate (lame->lgf, 0);
1202     }
1203     gst_caps_unref (allowed_caps);
1204     allowed_caps = NULL;
1205   } else {
1206     GST_DEBUG_OBJECT (lame, "No peer yet, letting lame choose sample rate");
1207     lame_set_out_samplerate (lame->lgf, 0);
1208   }
1210   /* force mono encoding if we only have one channel */
1211   if (lame->num_channels == 1)
1212     lame->mode = 3;
1213   else
1214     lame->mode = lame->requested_mode;
1216   CHECK_ERROR (lame_set_num_channels (lame->lgf, lame->num_channels));
1217   CHECK_AND_FIXUP_BITRATE (lame, "bitrate", lame->bitrate, lame->free_format);
1218   CHECK_ERROR (lame_set_brate (lame->lgf, lame->bitrate));
1219   CHECK_ERROR (lame_set_compression_ratio (lame->lgf, lame->compression_ratio));
1220   CHECK_ERROR (lame_set_quality (lame->lgf, lame->quality));
1221   CHECK_ERROR (lame_set_mode (lame->lgf, lame->mode));
1222   CHECK_ERROR (lame_set_force_ms (lame->lgf, lame->force_ms));
1223   CHECK_ERROR (lame_set_free_format (lame->lgf, lame->free_format));
1224   CHECK_ERROR (lame_set_copyright (lame->lgf, lame->copyright));
1225   CHECK_ERROR (lame_set_original (lame->lgf, lame->original));
1226   CHECK_ERROR (lame_set_error_protection (lame->lgf, lame->error_protection));
1227   CHECK_ERROR (lame_set_padding_type (lame->lgf, lame->padding_type));
1228   CHECK_ERROR (lame_set_extension (lame->lgf, lame->extension));
1229   CHECK_ERROR (lame_set_strict_ISO (lame->lgf, lame->strict_iso));
1230   CHECK_ERROR (lame_set_disable_reservoir (lame->lgf, lame->disable_reservoir));
1231   CHECK_ERROR (lame_set_VBR (lame->lgf, lame->vbr));
1232   CHECK_ERROR (lame_set_VBR_q (lame->lgf, lame->vbr_quality));
1233   CHECK_ERROR (lame_set_VBR_mean_bitrate_kbps (lame->lgf,
1234           lame->vbr_mean_bitrate));
1235   CHECK_AND_FIXUP_BITRATE (lame, "vbr-min-bitrate", lame->vbr_min_bitrate,
1236       lame->free_format);
1237   CHECK_ERROR (lame_set_VBR_min_bitrate_kbps (lame->lgf,
1238           lame->vbr_min_bitrate));
1239   CHECK_AND_FIXUP_BITRATE (lame, "vbr-max-bitrate", lame->vbr_max_bitrate,
1240       lame->free_format);
1241   CHECK_ERROR (lame_set_VBR_max_bitrate_kbps (lame->lgf,
1242           lame->vbr_max_bitrate));
1243   CHECK_ERROR (lame_set_VBR_hard_min (lame->lgf, lame->vbr_hard_min));
1244   CHECK_ERROR (lame_set_lowpassfreq (lame->lgf, lame->lowpass_freq));
1245   CHECK_ERROR (lame_set_lowpasswidth (lame->lgf, lame->lowpass_width));
1246   CHECK_ERROR (lame_set_highpassfreq (lame->lgf, lame->highpass_freq));
1247   CHECK_ERROR (lame_set_highpasswidth (lame->lgf, lame->highpass_width));
1248   CHECK_ERROR (lame_set_ATHonly (lame->lgf, lame->ath_only));
1249   CHECK_ERROR (lame_set_ATHshort (lame->lgf, lame->ath_short));
1250   CHECK_ERROR (lame_set_noATH (lame->lgf, lame->no_ath));
1251   CHECK_ERROR (lame_set_ATHlower (lame->lgf, lame->ath_lower));
1252   CHECK_ERROR (lame_set_cwlimit (lame->lgf, lame->cwlimit));
1253   CHECK_ERROR (lame_set_allow_diff_short (lame->lgf, lame->allow_diff_short));
1254   CHECK_ERROR (lame_set_no_short_blocks (lame->lgf, lame->no_short_blocks));
1255   CHECK_ERROR (lame_set_emphasis (lame->lgf, lame->emphasis));
1256   CHECK_ERROR (lame_set_bWriteVbrTag (lame->lgf, 0));
1257 #ifdef GSTLAME_PRESET
1258   if (lame->preset > 0) {
1259     CHECK_ERROR (lame_set_preset (lame->lgf, lame->preset));
1260   }
1261 #endif
1263   /* initialize the lame encoder */
1264   if ((retval = lame_init_params (lame->lgf)) >= 0) {
1265     lame->setup = TRUE;
1266     /* FIXME: it would be nice to print out the mode here */
1267     GST_INFO ("lame encoder setup (%d kbit/s, %d Hz, %d channels)",
1268         lame->bitrate, lame->samplerate, lame->num_channels);
1269   } else {
1270     GST_ERROR_OBJECT (lame, "lame_init_params returned %d", retval);
1271   }
1273   GST_DEBUG_OBJECT (lame, "done with setup");
1275   return lame->setup;
1276 #undef CHECK_ERROR
1279 static GstStateChangeReturn
1280 gst_lame_change_state (GstElement * element, GstStateChange transition)
1282   GstLame *lame;
1283   GstStateChangeReturn result;
1285   lame = GST_LAME (element);
1287   switch (transition) {
1288     case GST_STATE_CHANGE_READY_TO_PAUSED:
1289       lame->last_flow = GST_FLOW_OK;
1290       lame->last_ts = GST_CLOCK_TIME_NONE;
1291       lame->eos_ts = GST_CLOCK_TIME_NONE;
1292       break;
1293     default:
1294       break;
1295   }
1297   result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
1299   switch (transition) {
1300     case GST_STATE_CHANGE_READY_TO_NULL:
1301       gst_lame_release_memory (lame);
1302       break;
1303     default:
1304       break;
1305   }
1307   return result;
1310 static gboolean
1311 plugin_init (GstPlugin * plugin)
1313   GST_DEBUG_CATEGORY_INIT (debug, "lame", 0, "lame mp3 encoder");
1315 #ifdef ENABLE_NLS
1316   GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
1317       LOCALEDIR);
1318   bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
1319 #endif /* ENABLE_NLS */
1321   if (!gst_element_register (plugin, "lame", GST_RANK_NONE, GST_TYPE_LAME))
1322     return FALSE;
1324   return TRUE;
1327 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
1328     GST_VERSION_MINOR,
1329     "lame",
1330     "Encode MP3s with LAME",
1331     plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);