From 2f767fb24ac8ee001bde7e1452b46a4f8fe3a719 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 28 Dec 2016 10:42:15 +0000 Subject: [PATCH] mad: remove plugin We have better replacements such as the mpg123 plugin. The main reason to keep around mad was for 'freeform' mp3 support, but mpg123 can handle those too nowadays. Also, mad is GPL and has been unmaintained for years. https://bugzilla.gnome.org/show_bug.cgi?id=776140 --- config.h.meson | 3 - configure.ac | 21 +- docs/plugins/Makefile.am | 1 - docs/plugins/gst-plugins-ugly-plugins-docs.sgml | 2 - docs/plugins/gst-plugins-ugly-plugins-sections.txt | 14 - docs/plugins/inspect/plugin-mad.xml | 34 -- ext/Makefile.am | 8 - ext/mad/Makefile.am | 14 - ext/mad/gstmad.c | 565 --------------------- ext/mad/gstmad.h | 82 --- ext/mad/meson.build | 15 - ext/meson.build | 1 - 12 files changed, 1 insertion(+), 759 deletions(-) delete mode 100644 docs/plugins/inspect/plugin-mad.xml delete mode 100644 ext/mad/Makefile.am delete mode 100644 ext/mad/gstmad.c delete mode 100644 ext/mad/gstmad.h delete mode 100644 ext/mad/meson.build diff --git a/config.h.meson b/config.h.meson index 2fef992..4e4ece7 100644 --- a/config.h.meson +++ b/config.h.meson @@ -160,9 +160,6 @@ /* Define to enable lame mp3 encoder library (used by lame). */ #mesondefine HAVE_LAME -/* Define to enable mad mp3 decoder (used by mad). */ -#mesondefine HAVE_MAD - /* Define to 1 if you have the header file. */ #mesondefine HAVE_MALLOC_H diff --git a/configure.ac b/configure.ac index cf1f3af..87edbe0 100644 --- a/configure.ac +++ b/configure.ac @@ -19,7 +19,7 @@ dnl check if this is a release version AS_NANO(GST_GIT="no", GST_GIT="yes") dnl can autoconf find the source ? -AC_CONFIG_SRCDIR([ext/mad/gstmad.c]) +AC_CONFIG_SRCDIR([gst/asfdemux/gstasfdemux.c]) dnl define the output header for config AC_CONFIG_HEADERS(config.h) @@ -319,23 +319,6 @@ AG_GST_CHECK_FEATURE(LAME, [lame mp3 encoder library], lame, [ ]) ]) -dnl *** mad *** -translit(dnm, m, l) AM_CONDITIONAL(USE_MAD, true) -AG_GST_CHECK_FEATURE(MAD, [mad mp3 decoder], mad, [ - - dnl check with pkg-config first - AG_GST_PKG_CHECK_MODULES(MAD, mad >= 0.15) - MAD_LIBS="$MAD_LIBS" - if test "x$HAVE_MAD" = "xno"; then - dnl fall back to oldskool detection - AC_CHECK_HEADER(mad.h, [ - AC_CHECK_LIB(mad, mad_decoder_finish, - HAVE_MAD="yes" MAD_LIBS="-lmad") - ]) - fi -]) -AC_SUBST(MAD_LIBS) - dnl *** mpeg2dec *** translit(dnm, m, l) AM_CONDITIONAL(USE_MPEG2DEC, true) AG_GST_CHECK_FEATURE(MPEG2DEC, [mpeg2dec], mpeg2dec, [ @@ -395,7 +378,6 @@ AM_CONDITIONAL(USE_AMRWB, false) AM_CONDITIONAL(USE_CDIO, false) AM_CONDITIONAL(USE_DVDREAD, false) AM_CONDITIONAL(USE_LAME, false) -AM_CONDITIONAL(USE_MAD, false) AM_CONDITIONAL(USE_MPEG2DEC, false) AM_CONDITIONAL(USE_MPG123, false) AM_CONDITIONAL(USE_SIDPLAY, false) @@ -480,7 +462,6 @@ ext/amrwbdec/Makefile ext/cdio/Makefile ext/dvdread/Makefile ext/lame/Makefile -ext/mad/Makefile ext/mpeg2dec/Makefile ext/mpg123/Makefile ext/sidplay/Makefile diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am index cfe47e1..7679fd2 100644 --- a/docs/plugins/Makefile.am +++ b/docs/plugins/Makefile.am @@ -60,7 +60,6 @@ EXTRA_HFILES = \ $(top_srcdir)/ext/amrwbdec/amrwbdec.h \ $(top_srcdir)/ext/cdio/gstcdiocddasrc.h \ $(top_srcdir)/ext/lame/gstlamemp3enc.h \ - $(top_srcdir)/ext/mad/gstmad.h \ $(top_srcdir)/ext/sidplay/gstsiddec.h \ $(top_srcdir)/ext/twolame/gsttwolamemp2enc.h \ $(top_srcdir)/ext/x264/gstx264enc.h \ diff --git a/docs/plugins/gst-plugins-ugly-plugins-docs.sgml b/docs/plugins/gst-plugins-ugly-plugins-docs.sgml index 6217c5a..a0b4525 100644 --- a/docs/plugins/gst-plugins-ugly-plugins-docs.sgml +++ b/docs/plugins/gst-plugins-ugly-plugins-docs.sgml @@ -23,7 +23,6 @@ - @@ -47,7 +46,6 @@ - diff --git a/docs/plugins/gst-plugins-ugly-plugins-sections.txt b/docs/plugins/gst-plugins-ugly-plugins-sections.txt index fcd8d20..ec5ffe8 100644 --- a/docs/plugins/gst-plugins-ugly-plugins-sections.txt +++ b/docs/plugins/gst-plugins-ugly-plugins-sections.txt @@ -93,20 +93,6 @@ gst_lamemp3enc_register
-element-mad -mad -GstMad - -GstMadClass -GST_MAD -GST_MAD_CLASS -GST_IS_MAD -GST_IS_MAD_CLASS -GST_TYPE_MAD -gst_mad_get_type -
- -
element-mpg123audiodec mpg123audiodec GstMpg123AudioDec diff --git a/docs/plugins/inspect/plugin-mad.xml b/docs/plugins/inspect/plugin-mad.xml deleted file mode 100644 index 6ce0182..0000000 --- a/docs/plugins/inspect/plugin-mad.xml +++ /dev/null @@ -1,34 +0,0 @@ - - mad - mp3 decoding based on the mad library - ../../ext/mad/.libs/libgstmad.so - libgstmad.so - 1.10.0 - GPL - gst-plugins-ugly - GStreamer Ugly Plug-ins source release - Unknown package origin - - - mad - mad mp3 decoder - Codec/Decoder/Audio - Uses mad code to decode mp3 streams - Wim Taymans <wim.taymans@gmail.com> - - - sink - sink - always -
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, channels=(int)[ 1, 2 ]
-
- - src - source - always -
audio/x-raw, format=(string)S32LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, channels=(int)[ 1, 2 ]
-
-
-
-
-
\ No newline at end of file diff --git a/ext/Makefile.am b/ext/Makefile.am index c600554..3f94406 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -34,12 +34,6 @@ else LAME_DIR = endif -if USE_MAD -MAD_DIR = mad -else -MAD_DIR = -endif - if USE_MPEG2DEC MPEG2DEC_DIR = mpeg2dec else @@ -77,7 +71,6 @@ SUBDIRS = \ $(CDIO_DIR) \ $(DVDREAD_DIR) \ $(LAME_DIR) \ - $(MAD_DIR) \ $(MPEG2DEC_DIR) \ $(MPG123_DIR) \ $(SIDPLAY_DIR) \ @@ -91,7 +84,6 @@ DIST_SUBDIRS = \ cdio \ dvdread \ lame \ - mad \ mpeg2dec \ mpg123 \ sidplay \ diff --git a/ext/mad/Makefile.am b/ext/mad/Makefile.am deleted file mode 100644 index d6b4407..0000000 --- a/ext/mad/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -plugin_LTLIBRARIES = libgstmad.la - -libgstmad_la_SOURCES = gstmad.c - -libgstmad_la_CFLAGS = \ - $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) \ - $(MAD_CFLAGS) -libgstmad_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \ - $(GST_BASE_LIBS) $(GST_LIBS) $(MAD_LIBS) -libgstmad_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstmad_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) - -noinst_HEADERS = gstmad.h diff --git a/ext/mad/gstmad.c b/ext/mad/gstmad.c deleted file mode 100644 index 55899a5..0000000 --- a/ext/mad/gstmad.c +++ /dev/null @@ -1,565 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-mad - * @see_also: lame - * - * MP3 audio decoder. Note that while the mad plugin code is licensed under - * the LGPL, the libmad library itself is GPL licensed, so the effective - * runtime license of using the mad element is GPL. - * - * The mpg123audiodec and avdec_mp3 decoder elements are LGPL licensed and - * also tend to use less CPU for decoding. - * - * In general it doesn't matter which MP3 decoder you use, the main advantage - * of the mad decoder is that it also supports so-called 'freeform' mp3s which - * are mp3s with a bitrate higher than what the standard usually allows. - * - * - * Example pipelines - * |[ - * gst-launch-1.0 filesrc location=music.mp3 ! mpegaudioparse ! mad ! audioconvert ! audioresample ! autoaudiosink - * ]| Decode and play an mp3 file - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include "gstmad.h" -#include - -enum -{ - ARG_0, - ARG_HALF, - ARG_IGNORE_CRC -}; - -GST_DEBUG_CATEGORY_STATIC (mad_debug); -#define GST_CAT_DEFAULT mad_debug - -static GstStaticPadTemplate mad_src_template_factory = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw, " - "format = (string) " GST_AUDIO_NE (S32) ", " - "layout = (string) interleaved, " - "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, " - "channels = (int) [ 1, 2 ]") - ); - -/* FIXME: make three caps, for mpegversion 1, 2 and 2.5 */ -static GstStaticPadTemplate mad_sink_template_factory = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, " - "channels = (int) [ 1, 2 ]") - ); - - -static gboolean gst_mad_start (GstAudioDecoder * dec); -static gboolean gst_mad_stop (GstAudioDecoder * dec); -static GstFlowReturn gst_mad_parse (GstAudioDecoder * dec, - GstAdapter * adapter, gint * offset, gint * length); -static GstFlowReturn gst_mad_handle_frame (GstAudioDecoder * dec, - GstBuffer * buffer); -static void gst_mad_flush (GstAudioDecoder * dec, gboolean hard); - -static void gst_mad_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_mad_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -#define parent_class gst_mad_parent_class -G_DEFINE_TYPE (GstMad, gst_mad, GST_TYPE_AUDIO_DECODER); - -static void -gst_mad_class_init (GstMadClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - GstElementClass *element_class = (GstElementClass *) klass; - GstAudioDecoderClass *base_class = (GstAudioDecoderClass *) klass; - - gobject_class->set_property = gst_mad_set_property; - gobject_class->get_property = gst_mad_get_property; - - /* init properties */ - /* currently, string representations are used, we might want to change that */ - /* FIXME: descriptions need to be more technical, - * default values and ranges need to be selected right */ - g_object_class_install_property (gobject_class, ARG_HALF, - g_param_spec_boolean ("half", "Half", "Generate PCM at 1/2 sample rate", - FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_IGNORE_CRC, - g_param_spec_boolean ("ignore-crc", "Ignore CRC", "Ignore CRC errors", - TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - gst_element_class_add_static_pad_template (element_class, - &mad_sink_template_factory); - gst_element_class_add_static_pad_template (element_class, - &mad_src_template_factory); - - gst_element_class_set_static_metadata (element_class, "mad mp3 decoder", - "Codec/Decoder/Audio", - "Uses mad code to decode mp3 streams", - "Wim Taymans "); - - base_class->start = GST_DEBUG_FUNCPTR (gst_mad_start); - base_class->stop = GST_DEBUG_FUNCPTR (gst_mad_stop); - base_class->parse = GST_DEBUG_FUNCPTR (gst_mad_parse); - base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_mad_handle_frame); - base_class->flush = GST_DEBUG_FUNCPTR (gst_mad_flush); -} - -static void -gst_mad_init (GstMad * mad) -{ - GstAudioDecoder *dec; - - dec = GST_AUDIO_DECODER (mad); - gst_audio_decoder_set_tolerance (dec, 20 * GST_MSECOND); - gst_audio_decoder_set_use_default_pad_acceptcaps (dec, TRUE); - GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (dec)); - - mad->half = FALSE; - mad->ignore_crc = TRUE; -} - -static gboolean -gst_mad_start (GstAudioDecoder * dec) -{ - GstMad *mad = GST_MAD (dec); - guint options = 0; - - GST_DEBUG_OBJECT (dec, "start"); - mad_stream_init (&mad->stream); - mad_frame_init (&mad->frame); - mad_synth_init (&mad->synth); - mad->rate = 0; - mad->channels = 0; - mad->caps_set = FALSE; - mad->frame.header.samplerate = 0; - if (mad->ignore_crc) - options |= MAD_OPTION_IGNORECRC; - if (mad->half) - options |= MAD_OPTION_HALFSAMPLERATE; - mad_stream_options (&mad->stream, options); - mad->header.mode = -1; - mad->header.emphasis = -1; - mad->eos = FALSE; - - /* call upon legacy upstream byte support (e.g. seeking) */ - gst_audio_decoder_set_estimate_rate (dec, TRUE); - - return TRUE; -} - -static gboolean -gst_mad_stop (GstAudioDecoder * dec) -{ - GstMad *mad = GST_MAD (dec); - - GST_DEBUG_OBJECT (dec, "stop"); - mad_synth_finish (&mad->synth); - mad_frame_finish (&mad->frame); - mad_stream_finish (&mad->stream); - - return TRUE; -} - -static inline gint32 -scale (mad_fixed_t sample) -{ -#if MAD_F_FRACBITS < 28 - /* round */ - sample += (1L << (28 - MAD_F_FRACBITS - 1)); -#endif - - /* clip */ - if (sample >= MAD_F_ONE) - sample = MAD_F_ONE - 1; - else if (sample < -MAD_F_ONE) - sample = -MAD_F_ONE; - -#if MAD_F_FRACBITS < 28 - /* quantize */ - sample >>= (28 - MAD_F_FRACBITS); -#endif - - /* convert from 29 bits to 32 bits */ - return (gint32) (sample << 3); -} - -/* internal function to check if the header has changed and thus the - * caps need to be reset. Only call during normal mode, not resyncing */ -static void -gst_mad_check_caps_reset (GstMad * mad) -{ - guint nchannels; - guint rate; - - nchannels = MAD_NCHANNELS (&mad->frame.header); - -#if MAD_VERSION_MINOR <= 12 - rate = mad->header.sfreq; -#else - rate = mad->frame.header.samplerate; -#endif - - /* rate and channels are not supposed to change in a continuous stream, - * so check this first before doing anything */ - - /* only set caps if they weren't already set for this continuous stream */ - if (!gst_pad_has_current_caps (GST_AUDIO_DECODER_SRC_PAD (mad)) - || mad->channels != nchannels || mad->rate != rate) { - GstAudioInfo info; - static const GstAudioChannelPosition chan_pos[2][2] = { - {GST_AUDIO_CHANNEL_POSITION_MONO}, - {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT} - }; - - if (mad->caps_set) { - GST_DEBUG_OBJECT (mad, "Header changed from %d Hz/%d ch to %d Hz/%d ch, " - "failed sync after seek ?", mad->rate, mad->channels, rate, - nchannels); - /* we're conservative on stream changes. However, our *initial* caps - * might have been wrong as well - mad ain't perfect in syncing. So, - * we count caps changes and change if we pass a limit treshold (3). */ - if (nchannels != mad->pending_channels || rate != mad->pending_rate) { - mad->times_pending = 0; - mad->pending_channels = nchannels; - mad->pending_rate = rate; - } - if (++mad->times_pending < 3) - return; - } - - if (mad->stream.options & MAD_OPTION_HALFSAMPLERATE) - rate >>= 1; - - /* we set the caps even when the pad is not connected so they - * can be gotten for streaminfo */ - gst_audio_info_init (&info); - gst_audio_info_set_format (&info, - GST_AUDIO_FORMAT_S32, rate, nchannels, chan_pos[nchannels - 1]); - - gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (mad), &info); - - mad->caps_set = TRUE; - mad->channels = nchannels; - mad->rate = rate; - } -} - -static GstFlowReturn -gst_mad_parse (GstAudioDecoder * dec, GstAdapter * adapter, - gint * _offset, gint * len) -{ - GstMad *mad; - GstFlowReturn ret = GST_FLOW_EOS; - gint av, size, offset; - const guint8 *data; - gboolean eos, sync; - guint8 *guard = NULL; - - mad = GST_MAD (dec); - - av = gst_adapter_available (adapter); - data = gst_adapter_map (adapter, av); - - gst_audio_decoder_get_parse_state (dec, &sync, &eos); - GST_LOG_OBJECT (mad, "parse state sync %d, eos %d", sync, eos); - - if (eos) { - /* This is one streaming hack right there. - * mad will not decode the last frame if it is not followed by - * a number of 0 bytes, due to some buffer overflow, which can - * not be fixed for reasons I did not inquire into, see - * http://www.mars.org/mailman/public/mad-dev/2001-May/000262.html - */ - guard = g_malloc (av + MAD_BUFFER_GUARD); - /* let's be nice and not mess with baseclass state and keep hacks local */ - memcpy (guard, data, av); - memset (guard + av, 0, MAD_BUFFER_GUARD); - GST_DEBUG_OBJECT (mad, "Added %u zero guard bytes in the adapter; " - "using fallback buffer of size %u", - MAD_BUFFER_GUARD, av + MAD_BUFFER_GUARD); - data = guard; - av = av + MAD_BUFFER_GUARD; - } - - /* we basically let mad library do parsing, - * and translate that back to baseclass. - * if a frame is found (and also decoded), subsequent handle_frame - * only needs to synthesize it */ - - offset = 0; - size = 0; - -resume: - if (G_UNLIKELY (offset + MAD_BUFFER_GUARD > av)) - goto exit; - - GST_LOG_OBJECT (mad, "setup mad stream at offset %d (of av %d)", offset, av); - mad_stream_buffer (&mad->stream, data + offset, av - offset); - /* convey sync idea to mad */ - mad->stream.sync = sync; - /* if we get back here, lost sync anyway */ - sync = FALSE; - - while (TRUE) { - GST_LOG_OBJECT (mad, "decoding the header now"); - if (mad_header_decode (&mad->frame.header, &mad->stream) == -1) { - /* HACK it seems mad reports wrong error when it is trying to determine - * free bitrate and scanning for next header */ - if (mad->stream.error == MAD_ERROR_LOSTSYNC) { - const guint8 *ptr = mad->stream.this_frame; - guint32 header; - - if (ptr >= data && ptr < data + av) { - header = GST_READ_UINT32_BE (ptr); - /* looks like possible freeform header with not much data */ - if (((header & 0xFFE00000) == 0xFFE00000) && - (((header >> 12) & 0xF) == 0x0) && (av < 4096)) { - GST_DEBUG_OBJECT (mad, "overriding freeform LOST_SYNC to BUFLEN"); - mad->stream.error = MAD_ERROR_BUFLEN; - } - } - } - if (mad->stream.error == MAD_ERROR_BUFLEN) { - GST_LOG_OBJECT (mad, "not enough data, getting more"); - offset = mad->stream.next_frame - data; - break; - } else if (mad->stream.error == MAD_ERROR_LOSTSYNC) { - GST_LOG_OBJECT (mad, "lost sync"); - continue; - } else { - /* probably some bogus header, basically also lost sync */ - GST_DEBUG_OBJECT (mad, "mad_header_decode had an error: %s", - mad_stream_errorstr (&mad->stream)); - continue; - } - } - - /* could have a frame now, subsequent will confirm */ - offset = mad->stream.this_frame - data; - size = mad->stream.next_frame - mad->stream.this_frame; - g_assert (size); - - GST_LOG_OBJECT (mad, "parsing and decoding one frame now " - "(offset %d, size %d)", offset, size); - if (mad_frame_decode (&mad->frame, &mad->stream) == -1) { - GST_LOG_OBJECT (mad, "got error %d", mad->stream.error); - - /* not enough data, need to wait for next buffer? */ - if (mad->stream.error == MAD_ERROR_BUFLEN) { - /* not really expect this error at this stage anymore - * assume bogus frame and bad sync and move along a bit */ - GST_WARNING_OBJECT (mad, "not enough data (unexpected), moving along"); - offset++; - goto resume; - } else if (mad->stream.error == MAD_ERROR_BADDATAPTR) { - GST_DEBUG_OBJECT (mad, "bad data ptr, skipping presumed frame"); - /* flush past presumed frame */ - offset += size; - goto resume; - } else { - GST_WARNING_OBJECT (mad, "mad_frame_decode had an error: %s", - mad_stream_errorstr (&mad->stream)); - if (!MAD_RECOVERABLE (mad->stream.error)) { - /* well, all may be well enough bytes later on ... */ - GST_AUDIO_DECODER_ERROR (mad, 1, STREAM, DECODE, (NULL), - ("mad error: %s", mad_stream_errorstr (&mad->stream)), ret); - } - /* move along and try again */ - offset++; - goto resume; - } - g_assert_not_reached (); - } - - /* so decoded ok, got a frame now */ - ret = GST_FLOW_OK; - break; - } - -exit: - - gst_adapter_unmap (adapter); - - *_offset = offset; - *len = size; - - /* ensure that if we added some dummy guard bytes above, we don't claim - to have used them as they're unknown to the caller. */ - if (eos) { - g_assert (av >= MAD_BUFFER_GUARD); - av -= MAD_BUFFER_GUARD; - if (*_offset > av) - *_offset = av; - if (*len > av) - *len = av; - g_assert (guard); - g_free (guard); - } - - return ret; -} - -static GstFlowReturn -gst_mad_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) -{ - GstMad *mad; - GstFlowReturn ret = GST_FLOW_EOS; - GstBuffer *outbuffer; - guint nsamples; - GstMapInfo outmap; - gint32 *outdata; - mad_fixed_t const *left_ch, *right_ch; - - mad = GST_MAD (dec); - - /* no fancy draining */ - if (G_UNLIKELY (!buffer)) - return GST_FLOW_OK; - - /* _parse prepared a frame */ - nsamples = MAD_NSBSAMPLES (&mad->frame.header) * - (mad->stream.options & MAD_OPTION_HALFSAMPLERATE ? 16 : 32); - GST_LOG_OBJECT (mad, "mad frame with %d samples", nsamples); - - /* arrange for initial caps before pushing data, - * and update later on if needed */ - gst_mad_check_caps_reset (mad); - - mad_synth_frame (&mad->synth, &mad->frame); - left_ch = mad->synth.pcm.samples[0]; - right_ch = mad->synth.pcm.samples[1]; - - outbuffer = gst_buffer_new_and_alloc (nsamples * mad->channels * 4); - - gst_buffer_map (outbuffer, &outmap, GST_MAP_WRITE); - outdata = (gint32 *) outmap.data; - - /* output sample(s) in 16-bit signed native-endian PCM */ - if (mad->channels == 1) { - gint count = nsamples; - - while (count--) { - *outdata++ = scale (*left_ch++) & 0xffffffff; - } - } else { - gint count = nsamples; - - while (count--) { - *outdata++ = scale (*left_ch++) & 0xffffffff; - *outdata++ = scale (*right_ch++) & 0xffffffff; - } - } - - gst_buffer_unmap (outbuffer, &outmap); - - ret = gst_audio_decoder_finish_frame (dec, outbuffer, 1); - - return ret; -} - -static void -gst_mad_flush (GstAudioDecoder * dec, gboolean hard) -{ - GstMad *mad; - - mad = GST_MAD (dec); - if (hard) { - mad_frame_mute (&mad->frame); - mad_synth_mute (&mad->synth); - } -} - -static void -gst_mad_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstMad *mad; - - mad = GST_MAD (object); - - switch (prop_id) { - case ARG_HALF: - mad->half = g_value_get_boolean (value); - break; - case ARG_IGNORE_CRC: - mad->ignore_crc = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_mad_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstMad *mad; - - mad = GST_MAD (object); - - switch (prop_id) { - case ARG_HALF: - g_value_set_boolean (value, mad->half); - break; - case ARG_IGNORE_CRC: - g_value_set_boolean (value, mad->ignore_crc); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* plugin initialisation */ - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (mad_debug, "mad", 0, "mad mp3 decoding"); - - /* FIXME 0.11: rename to something better like madmp3dec or madmpegaudiodec - * or so? */ - return gst_element_register (plugin, "mad", GST_RANK_SECONDARY, - gst_mad_get_type ()); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - mad, - "mp3 decoding based on the mad library", - plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/mad/gstmad.h b/ext/mad/gstmad.h deleted file mode 100644 index f3011c1..0000000 --- a/ext/mad/gstmad.h +++ /dev/null @@ -1,82 +0,0 @@ -/* GStreamer - * Copyright (C) 2003 Benjamin Otte - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - - -#ifndef __GST_MAD_H__ -#define __GST_MAD_H__ - -#include -#include -#include - -#include - -G_BEGIN_DECLS - -#define GST_TYPE_MAD \ - (gst_mad_get_type()) -#define GST_MAD(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MAD,GstMad)) -#define GST_MAD_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MAD,GstMadClass)) -#define GST_IS_MAD(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MAD)) -#define GST_IS_MAD_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MAD)) - - -typedef struct _GstMad GstMad; -typedef struct _GstMadClass GstMadClass; - -struct _GstMad -{ - GstAudioDecoder element; - - /* state */ - struct mad_stream stream; - struct mad_frame frame; - struct mad_synth synth; - - /* info */ - struct mad_header header; - - /* negotiated format */ - gint rate, pending_rate; - gint channels, pending_channels; - gint times_pending; - gboolean caps_set; /* used to keep track of whether to change/update caps */ - - gboolean eos; - - /* properties */ - gboolean half; - gboolean ignore_crc; -}; - -struct _GstMadClass -{ - GstAudioDecoderClass parent_class; -}; - -GType gst_mad_get_type (void); -gboolean gst_mad_register (GstPlugin * plugin); - -G_END_DECLS - -#endif /* __GST_MAD_H__ */ diff --git a/ext/mad/meson.build b/ext/mad/meson.build deleted file mode 100644 index c8983ff..0000000 --- a/ext/mad/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -mad_dep = dependency('mad', version : '>= 0.15', required : false) -if not mad_dep.found() and cc.has_header_symbol('mad.h', 'mad_decoder_finish') - mad_dep = cc.find_library('mad', required : false) -endif - -if mad_dep.found() - mad = library('gstmad', - ['gstmad.c'], - c_args : ugly_args, - include_directories : [configinc], - dependencies : [gstaudio_dep, mad_dep], - install : true, - install_dir : plugins_install_dir, - ) -endif diff --git a/ext/meson.build b/ext/meson.build index 11728a9..6c5a176 100644 --- a/ext/meson.build +++ b/ext/meson.build @@ -4,7 +4,6 @@ subdir('amrwbdec') subdir('cdio') subdir('dvdread') subdir('lame') -subdir('mad') subdir('mpeg2dec') subdir('mpg123') #subdir('sidplay') # FIXME -- 2.7.4