From 08d8aefcdaaf89ecb6dd53ec1e4f95cd42d01664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 16 Feb 2016 10:44:33 +0000 Subject: [PATCH] mpg123: move plugin from -bad to -ugly https://bugzilla.gnome.org/show_bug.cgi?id=719849 --- Makefile.am | 2 + configure.ac | 10 - .../plugins/gst-plugins-bad-plugins-docs.sgml | 1 - .../gst-plugins-bad-plugins-sections.txt | 14 - docs/plugins/inspect/plugin-mpg123.xml | 34 - ext/Makefile.am | 8 - ext/mpg123/Makefile.am | 12 - ext/mpg123/gstmpg123audiodec.c | 633 ------------------ ext/mpg123/gstmpg123audiodec.h | 62 -- gst-plugins-bad.spec.in | 1 - tests/check/Makefile.am | 12 - tests/check/elements/.gitignore | 2 +- tests/check/elements/mpg123audiodec.c | 534 --------------- 13 files changed, 3 insertions(+), 1322 deletions(-) delete mode 100644 docs/plugins/inspect/plugin-mpg123.xml delete mode 100644 ext/mpg123/Makefile.am delete mode 100644 ext/mpg123/gstmpg123audiodec.c delete mode 100644 ext/mpg123/gstmpg123audiodec.h delete mode 100644 tests/check/elements/mpg123audiodec.c diff --git a/Makefile.am b/Makefile.am index 0f2a09a129..357faec40e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -56,6 +56,7 @@ CRUFT_FILES = \ $(top_builddir)/ext/hls/.libs/libgstfragmented* \ $(top_builddir)/ext/ivorbis/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/ext/jack/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/ext/mpg123/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/aacparse/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/amrparse/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/audioparsers/.libs/*.{so,dll,DLL,dylib} \ @@ -122,6 +123,7 @@ CRUFT_DIRS = \ $(top_srcdir)/ext/ivorbis \ $(top_srcdir)/ext/jack \ $(top_srcdir)/ext/metadata \ + $(top_srcdir)/ext/mpg123 \ $(top_srcdir)/ext/swfdec \ $(top_srcdir)/ext/tarkin \ $(top_srcdir)/ext/theora \ diff --git a/configure.ac b/configure.ac index e40ae62c5d..f1e093acfb 100644 --- a/configure.ac +++ b/configure.ac @@ -2455,14 +2455,6 @@ AG_GST_CHECK_FEATURE(MPEG2ENC, [mpeg2enc], mpeg2enc, [ fi ]) -dnl *** mpg123 *** -translit(dnm, m, l) AM_CONDITIONAL(USE_MPG123, true) -AG_GST_CHECK_FEATURE(MPG123, [mpg123 audio decoder], mpg123, [ - PKG_CHECK_MODULES(MPG123, libmpg123 >= 1.13, HAVE_MPG123="yes", HAVE_MPG123="no") - AC_SUBST(MPG123_CFLAGS) - AC_SUBST(MPG123_LIBS) -]) - dnl *** mplex *** translit(dnm, m, l) AM_CONDITIONAL(USE_MPLEX, true) AG_GST_CHECK_FEATURE(MPLEX, [mplex], mplex, [ @@ -3301,7 +3293,6 @@ AM_CONDITIONAL(USE_LINSYS, false) AM_CONDITIONAL(USE_MODPLUG, false) AM_CONDITIONAL(USE_MIMIC, false) AM_CONDITIONAL(USE_MPEG2ENC, false) -AM_CONDITIONAL(USE_MPG123, false) AM_CONDITIONAL(USE_MPLEX, false) AM_CONDITIONAL(USE_MUSEPACK, false) AM_CONDITIONAL(USE_NAS, false) @@ -3615,7 +3606,6 @@ ext/libvisual/Makefile ext/Makefile ext/modplug/Makefile ext/mpeg2enc/Makefile -ext/mpg123/Makefile ext/mimic/Makefile ext/mplex/Makefile ext/musepack/Makefile diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml index bd25df3800..69db609b7d 100644 --- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml +++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml @@ -68,7 +68,6 @@ - diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt index a289e226d1..7fed114cff 100644 --- a/docs/plugins/gst-plugins-bad-plugins-sections.txt +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -974,20 +974,6 @@ GST_MPLEX_WAIT gst_mplex_get_type -
-element-mpg123audiodec -mpg123audiodec -GstMpg123AudioDec - -GstMpg123AudioDecClass -GST_MPG123_AUDIO_DEC -GST_MPG123_AUDIO_DEC_CLASS -GST_IS_MPG123_AUDIO_DEC -GST_IS_MPG123_AUDIO_DEC_CLASS -GST_TYPE_MPG123_AUDIO_DEC -gst_mpg123_audio_dec_get_type -
-
element-mxfdemux mxfdemux diff --git a/docs/plugins/inspect/plugin-mpg123.xml b/docs/plugins/inspect/plugin-mpg123.xml deleted file mode 100644 index 3d0005b697..0000000000 --- a/docs/plugins/inspect/plugin-mpg123.xml +++ /dev/null @@ -1,34 +0,0 @@ - - mpg123 - mp3 decoding based on the mpg123 library - ../../ext/mpg123/.libs/libgstmpg123.so - libgstmpg123.so - 1.7.1 - LGPL - gst-plugins-bad - GStreamer Bad Plug-ins source release - Unknown package origin - - - mpg123audiodec - mpg123 mp3 decoder - Codec/Decoder/Audio - Decodes mp3 streams using the mpg123 library - Carlos Rafael Giani <dv@pseudoterminal.org> - - - 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 ], parsed=(boolean)true
-
- - src - source - always -
audio/x-raw, format=(string){ S16LE, U16LE, S32LE, U32LE, S24LE, U24LE, F32LE }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, channels=(int)[ 1, 2 ], layout=(string)interleaved
-
-
-
-
-
\ No newline at end of file diff --git a/ext/Makefile.am b/ext/Makefile.am index d1a8258289..d75f119087 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -184,12 +184,6 @@ else MPEG2ENC_DIR= endif -if USE_MPG123 -MPG123_DIR=mpg123 -else -MPG123_DIR= -endif - if USE_MIMIC MIMIC_DIR=mimic else @@ -446,7 +440,6 @@ SUBDIRS=\ $(LIBVISUAL_DIR) \ $(MODPLUG_DIR) \ $(MPEG2ENC_DIR) \ - $(MPG123_DIR) \ $(MIMIC_DIR) \ $(MPLEX_DIR) \ $(MUSEPACK_DIR) \ @@ -514,7 +507,6 @@ DIST_SUBDIRS = \ modplug \ mimic \ mpeg2enc \ - mpg123 \ mplex \ musepack \ nas \ diff --git a/ext/mpg123/Makefile.am b/ext/mpg123/Makefile.am deleted file mode 100644 index 6c96207c86..0000000000 --- a/ext/mpg123/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -plugin_LTLIBRARIES = libgstmpg123.la - -libgstmpg123_la_SOURCES = gstmpg123audiodec.c -libgstmpg123_la_CFLAGS = -DGST_USE_UNSTABLE_API \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(MPG123_CFLAGS) -libgstmpg123_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@ \ - $(GST_BASE_LIBS) $(GST_LIBS) $(MPG123_LIBS) -libgstmpg123_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstmpg123_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) - -noinst_HEADERS = gstmpg123audiodec.h diff --git a/ext/mpg123/gstmpg123audiodec.c b/ext/mpg123/gstmpg123audiodec.c deleted file mode 100644 index cfd017ea32..0000000000 --- a/ext/mpg123/gstmpg123audiodec.c +++ /dev/null @@ -1,633 +0,0 @@ -/* MP3 decoding plugin for GStreamer using the mpg123 library - * Copyright (C) 2012 Carlos Rafael Giani - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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-mpg123audiodec - * @see_also: lamemp3enc, mad - * - * Audio decoder for MPEG-1 layer 1/2/3 audio data. - * - * - * Example pipelines - * |[ - * gst-launch-1.0 filesrc location=music.mp3 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! audioresample ! autoaudiosink - * ]| Decode and play the mp3 file - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gstmpg123audiodec.h" - -#include -#include - -GST_DEBUG_CATEGORY_STATIC (mpg123_debug); -#define GST_CAT_DEFAULT mpg123_debug - -/* Omitted sample formats that mpg123 supports (or at least can support): - * - 8bit integer signed - * - 8bit integer unsigned - * - a-law - * - mu-law - * - 64bit float - * - * The first four formats are not supported by the GstAudioDecoder base class. - * (The internal gst_audio_format_from_caps_structure() call fails.) - * - * The 64bit float issue is tricky. mpg123 actually decodes to "real", - * not necessarily to "float". - * - * "real" can be fixed point, 32bit float, 64bit float. There seems to be - * no way how to find out which one of them is actually used. - * - * However, in all known installations, "real" equals 32bit float, so that's - * what is used. */ - -static GstStaticPadTemplate static_sink_template = -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 ], " "parsed = (boolean) true ") - ); - -static gboolean gst_mpg123_audio_dec_start (GstAudioDecoder * dec); -static gboolean gst_mpg123_audio_dec_stop (GstAudioDecoder * dec); -static GstFlowReturn gst_mpg123_audio_dec_push_decoded_bytes (GstMpg123AudioDec - * mpg123_decoder, unsigned char const *decoded_bytes, - size_t const num_decoded_bytes); -static GstFlowReturn gst_mpg123_audio_dec_handle_frame (GstAudioDecoder * dec, - GstBuffer * input_buffer); -static gboolean gst_mpg123_audio_dec_set_format (GstAudioDecoder * dec, - GstCaps * input_caps); -static void gst_mpg123_audio_dec_flush (GstAudioDecoder * dec, gboolean hard); - -G_DEFINE_TYPE (GstMpg123AudioDec, gst_mpg123_audio_dec, GST_TYPE_AUDIO_DECODER); - -static void -gst_mpg123_audio_dec_class_init (GstMpg123AudioDecClass * klass) -{ - GstAudioDecoderClass *base_class; - GstElementClass *element_class; - GstPadTemplate *src_template, *sink_template; - int error; - - GST_DEBUG_CATEGORY_INIT (mpg123_debug, "mpg123", 0, "mpg123 mp3 decoder"); - - base_class = GST_AUDIO_DECODER_CLASS (klass); - element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_set_static_metadata (element_class, - "mpg123 mp3 decoder", - "Codec/Decoder/Audio", - "Decodes mp3 streams using the mpg123 library", - "Carlos Rafael Giani "); - - /* Not using static pad template for srccaps, since the comma-separated list - * of formats needs to be created depending on whatever mpg123 supports */ - { - const int *format_list; - const long *rates_list; - size_t num, i; - GString *s; - GstCaps *src_template_caps; - - s = g_string_new ("audio/x-raw, "); - - mpg123_encodings (&format_list, &num); - g_string_append (s, "format = { "); - for (i = 0; i < num; ++i) { - switch (format_list[i]) { - case MPG123_ENC_SIGNED_16: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (S16)); - break; - case MPG123_ENC_UNSIGNED_16: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (U16)); - break; - case MPG123_ENC_SIGNED_24: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (S24)); - break; - case MPG123_ENC_UNSIGNED_24: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (U24)); - break; - case MPG123_ENC_SIGNED_32: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (S32)); - break; - case MPG123_ENC_UNSIGNED_32: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (U32)); - break; - case MPG123_ENC_FLOAT_32: - g_string_append (s, (i > 0) ? ", " : ""); - g_string_append (s, GST_AUDIO_NE (F32)); - break; - default: - GST_DEBUG ("Ignoring mpg123 format %d", format_list[i]); - break; - } - } - g_string_append (s, " }, "); - - mpg123_rates (&rates_list, &num); - g_string_append (s, "rate = (int) { "); - for (i = 0; i < num; ++i) { - g_string_append_printf (s, "%s%lu", (i > 0) ? ", " : "", rates_list[i]); - } - g_string_append (s, "}, "); - - g_string_append (s, "channels = (int) [ 1, 2 ], "); - g_string_append (s, "layout = (string) interleaved"); - - src_template_caps = gst_caps_from_string (s->str); - src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - src_template_caps); - - g_string_free (s, TRUE); - } - - sink_template = gst_static_pad_template_get (&static_sink_template); - - gst_element_class_add_pad_template (element_class, sink_template); - gst_element_class_add_pad_template (element_class, src_template); - - base_class->start = GST_DEBUG_FUNCPTR (gst_mpg123_audio_dec_start); - base_class->stop = GST_DEBUG_FUNCPTR (gst_mpg123_audio_dec_stop); - base_class->handle_frame = - GST_DEBUG_FUNCPTR (gst_mpg123_audio_dec_handle_frame); - base_class->set_format = GST_DEBUG_FUNCPTR (gst_mpg123_audio_dec_set_format); - base_class->flush = GST_DEBUG_FUNCPTR (gst_mpg123_audio_dec_flush); - - error = mpg123_init (); - if (G_UNLIKELY (error != MPG123_OK)) - GST_ERROR ("Could not initialize mpg123 library: %s", - mpg123_plain_strerror (error)); - else - GST_INFO ("mpg123 library initialized"); -} - - -void -gst_mpg123_audio_dec_init (GstMpg123AudioDec * mpg123_decoder) -{ - mpg123_decoder->handle = NULL; - gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (mpg123_decoder), TRUE); - gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST - (mpg123_decoder), TRUE); - GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (mpg123_decoder)); -} - - -static gboolean -gst_mpg123_audio_dec_start (GstAudioDecoder * dec) -{ - GstMpg123AudioDec *mpg123_decoder; - int error; - - mpg123_decoder = GST_MPG123_AUDIO_DEC (dec); - error = 0; - - mpg123_decoder->handle = mpg123_new (NULL, &error); - mpg123_decoder->has_next_audioinfo = FALSE; - mpg123_decoder->frame_offset = 0; - - /* Initially, the mpg123 handle comes with a set of default formats - * supported. This clears this set. This is necessary, since only one - * format shall be supported (see set_format for more). */ - mpg123_format_none (mpg123_decoder->handle); - - /* Built-in mpg123 support for gapless decoding is disabled for now, - * since it does not work well with seeking */ - mpg123_param (mpg123_decoder->handle, MPG123_REMOVE_FLAGS, MPG123_GAPLESS, 0); - /* Tells mpg123 to use a small read-ahead buffer for better MPEG sync; - * essential for MP3 radio streams */ - mpg123_param (mpg123_decoder->handle, MPG123_ADD_FLAGS, MPG123_SEEKBUFFER, 0); - /* Sets the resync limit to the end of the stream (otherwise mpg123 may give - * up on decoding prematurely, especially with mp3 web radios) */ - mpg123_param (mpg123_decoder->handle, MPG123_RESYNC_LIMIT, -1, 0); -#if MPG123_API_VERSION >= 36 - /* The precise API version where MPG123_AUTO_RESAMPLE appeared is - * somewhere between 29 and 36 */ - /* Don't let mpg123 resample output */ - mpg123_param (mpg123_decoder->handle, MPG123_REMOVE_FLAGS, - MPG123_AUTO_RESAMPLE, 0); -#endif - /* Don't let mpg123 print messages to stdout/stderr */ - mpg123_param (mpg123_decoder->handle, MPG123_ADD_FLAGS, MPG123_QUIET, 0); - - /* Open in feed mode (= encoded data is fed manually into the handle). */ - error = mpg123_open_feed (mpg123_decoder->handle); - - if (G_UNLIKELY (error != MPG123_OK)) { - GST_ELEMENT_ERROR (dec, LIBRARY, INIT, (NULL), - ("%s", mpg123_strerror (mpg123_decoder->handle))); - mpg123_close (mpg123_decoder->handle); - mpg123_delete (mpg123_decoder->handle); - mpg123_decoder->handle = NULL; - return FALSE; - } - - GST_INFO_OBJECT (dec, "mpg123 decoder started"); - - return TRUE; -} - - -static gboolean -gst_mpg123_audio_dec_stop (GstAudioDecoder * dec) -{ - GstMpg123AudioDec *mpg123_decoder = GST_MPG123_AUDIO_DEC (dec); - - if (G_LIKELY (mpg123_decoder->handle != NULL)) { - mpg123_close (mpg123_decoder->handle); - mpg123_delete (mpg123_decoder->handle); - mpg123_decoder->handle = NULL; - } - - GST_INFO_OBJECT (dec, "mpg123 decoder stopped"); - - return TRUE; -} - - -static GstFlowReturn -gst_mpg123_audio_dec_push_decoded_bytes (GstMpg123AudioDec * mpg123_decoder, - unsigned char const *decoded_bytes, size_t const num_decoded_bytes) -{ - GstBuffer *output_buffer; - GstAudioDecoder *dec; - - output_buffer = NULL; - dec = GST_AUDIO_DECODER (mpg123_decoder); - - if ((num_decoded_bytes == 0) || (decoded_bytes == NULL)) { - /* This occurs in the first few frames, which do not carry data; once - * MPG123_AUDIO_DEC_NEW_FORMAT is received, the empty frames stop occurring */ - GST_DEBUG_OBJECT (mpg123_decoder, - "cannot decode yet, need more data -> no output buffer to push"); - return GST_FLOW_OK; - } - - output_buffer = gst_buffer_new_allocate (NULL, num_decoded_bytes, NULL); - - if (output_buffer == NULL) { - /* This is necessary to advance playback in time, - * even when nothing was decoded. */ - return gst_audio_decoder_finish_frame (dec, NULL, 1); - } else { - GstMapInfo info; - - if (gst_buffer_map (output_buffer, &info, GST_MAP_WRITE)) { - memcpy (info.data, decoded_bytes, num_decoded_bytes); - gst_buffer_unmap (output_buffer, &info); - } else { - GST_ERROR_OBJECT (mpg123_decoder, "gst_buffer_map() returned NULL"); - gst_buffer_unref (output_buffer); - output_buffer = NULL; - } - - return gst_audio_decoder_finish_frame (dec, output_buffer, 1); - } -} - - -static GstFlowReturn -gst_mpg123_audio_dec_handle_frame (GstAudioDecoder * dec, - GstBuffer * input_buffer) -{ - GstMpg123AudioDec *mpg123_decoder; - int decode_error; - unsigned char *decoded_bytes; - size_t num_decoded_bytes; - GstFlowReturn retval; - - mpg123_decoder = GST_MPG123_AUDIO_DEC (dec); - - g_assert (mpg123_decoder->handle != NULL); - - /* The actual decoding */ - { - /* feed input data (if there is any) */ - if (G_LIKELY (input_buffer != NULL)) { - GstMapInfo info; - - if (gst_buffer_map (input_buffer, &info, GST_MAP_READ)) { - mpg123_feed (mpg123_decoder->handle, info.data, info.size); - gst_buffer_unmap (input_buffer, &info); - } else { - GST_AUDIO_DECODER_ERROR (mpg123_decoder, 1, RESOURCE, READ, (NULL), - ("gst_memory_map() failed"), retval); - return retval; - } - } - - /* Try to decode a frame */ - decoded_bytes = NULL; - num_decoded_bytes = 0; - decode_error = mpg123_decode_frame (mpg123_decoder->handle, - &mpg123_decoder->frame_offset, &decoded_bytes, &num_decoded_bytes); - } - - retval = GST_FLOW_OK; - - switch (decode_error) { - case MPG123_NEW_FORMAT: - /* As mentioned in gst_mpg123_audio_dec_set_format(), the next audioinfo - * is not set immediately; instead, the code waits for mpg123 to take - * note of the new format, and then sets the audioinfo. This fixes glitches - * with mp3s containing several format headers (for example, first half - * using 44.1kHz, second half 32 kHz) */ - - GST_LOG_OBJECT (dec, - "mpg123 reported a new format -> setting next srccaps"); - - gst_mpg123_audio_dec_push_decoded_bytes (mpg123_decoder, decoded_bytes, - num_decoded_bytes); - - /* If there is a next audioinfo, use it, then set has_next_audioinfo to - * FALSE, to make sure gst_audio_decoder_set_output_format() isn't called - * again until set_format is called by the base class */ - if (mpg123_decoder->has_next_audioinfo) { - if (!gst_audio_decoder_set_output_format (dec, - &(mpg123_decoder->next_audioinfo))) { - GST_WARNING_OBJECT (dec, "Unable to set output format"); - retval = GST_FLOW_NOT_NEGOTIATED; - } - mpg123_decoder->has_next_audioinfo = FALSE; - } - - break; - - case MPG123_NEED_MORE: - case MPG123_OK: - retval = gst_mpg123_audio_dec_push_decoded_bytes (mpg123_decoder, - decoded_bytes, num_decoded_bytes); - break; - - case MPG123_DONE: - /* If this happens, then the upstream parser somehow missed the ending - * of the bitstream */ - GST_LOG_OBJECT (dec, "mpg123 is done decoding"); - gst_mpg123_audio_dec_push_decoded_bytes (mpg123_decoder, decoded_bytes, - num_decoded_bytes); - retval = GST_FLOW_EOS; - break; - - default: - { - /* Anything else is considered an error */ - int errcode; - retval = GST_FLOW_ERROR; /* use error by default */ - switch (decode_error) { - case MPG123_ERR: - errcode = mpg123_errcode (mpg123_decoder->handle); - break; - default: - errcode = decode_error; - } - switch (errcode) { - case MPG123_BAD_OUTFORMAT:{ - GstCaps *input_caps = - gst_pad_get_current_caps (GST_AUDIO_DECODER_SINK_PAD (dec)); - GST_ELEMENT_ERROR (dec, STREAM, FORMAT, (NULL), - ("Output sample format could not be used when trying to decode frame. " - "This is typically caused when the input caps (often the sample " - "rate) do not match the actual format of the audio data. " - "Input caps: %" GST_PTR_FORMAT, input_caps) - ); - gst_caps_unref (input_caps); - break; - } - default:{ - char const *errmsg = mpg123_plain_strerror (errcode); - /* GST_AUDIO_DECODER_ERROR sets a new return value according to - * its estimations */ - GST_AUDIO_DECODER_ERROR (mpg123_decoder, 1, STREAM, DECODE, (NULL), - ("mpg123 decoding error: %s", errmsg), retval); - } - } - } - } - - return retval; -} - - -static gboolean -gst_mpg123_audio_dec_set_format (GstAudioDecoder * dec, GstCaps * input_caps) -{ - /* "encoding" is the sample format specifier for mpg123 */ - int encoding; - int sample_rate, num_channels; - GstAudioFormat format; - GstMpg123AudioDec *mpg123_decoder; - gboolean retval = FALSE; - - mpg123_decoder = GST_MPG123_AUDIO_DEC (dec); - - g_assert (mpg123_decoder->handle != NULL); - - mpg123_decoder->has_next_audioinfo = FALSE; - - /* Get sample rate and number of channels from input_caps */ - { - GstStructure *structure; - gboolean err = FALSE; - - /* Only the first structure is used (multiple - * input caps structures don't make sense */ - structure = gst_caps_get_structure (input_caps, 0); - - if (!gst_structure_get_int (structure, "rate", &sample_rate)) { - err = TRUE; - GST_ERROR_OBJECT (dec, "Input caps do not have a rate value"); - } - if (!gst_structure_get_int (structure, "channels", &num_channels)) { - err = TRUE; - GST_ERROR_OBJECT (dec, "Input caps do not have a channel value"); - } - - if (G_UNLIKELY (err)) - goto done; - } - - /* Get sample format from the allowed src caps */ - { - GstCaps *allowed_srccaps = - gst_pad_get_allowed_caps (GST_AUDIO_DECODER_SRC_PAD (dec)); - - if (allowed_srccaps == NULL) { - /* srcpad is not linked (yet), so no peer information is available; - * just use the default sample format (16 bit signed integer) */ - GST_DEBUG_OBJECT (mpg123_decoder, - "srcpad is not linked (yet) -> using S16 sample format"); - format = GST_AUDIO_FORMAT_S16; - encoding = MPG123_ENC_SIGNED_16; - } else if (gst_caps_is_empty (allowed_srccaps)) { - gst_caps_unref (allowed_srccaps); - goto done; - } else { - gchar const *format_str; - GValue const *format_value; - - /* Look at the sample format values from the first structure */ - GstStructure *structure = gst_caps_get_structure (allowed_srccaps, 0); - format_value = gst_structure_get_value (structure, "format"); - - if (format_value == NULL) { - gst_caps_unref (allowed_srccaps); - goto done; - } else if (GST_VALUE_HOLDS_LIST (format_value)) { - /* if value is a format list, pick the first entry */ - GValue const *fmt_list_value = - gst_value_list_get_value (format_value, 0); - format_str = g_value_get_string (fmt_list_value); - } else if (G_VALUE_HOLDS_STRING (format_value)) { - /* if value is a string, use it directly */ - format_str = g_value_get_string (format_value); - } else { - GST_ERROR_OBJECT (mpg123_decoder, "unexpected type for 'format' field " - "in caps structure %" GST_PTR_FORMAT, structure); - gst_caps_unref (allowed_srccaps); - goto done; - } - - /* get the format value from the string */ - format = gst_audio_format_from_string (format_str); - gst_caps_unref (allowed_srccaps); - - g_assert (format != GST_AUDIO_FORMAT_UNKNOWN); - - /* convert format to mpg123 encoding */ - switch (format) { - case GST_AUDIO_FORMAT_S16: - encoding = MPG123_ENC_SIGNED_16; - break; - case GST_AUDIO_FORMAT_S24: - encoding = MPG123_ENC_SIGNED_24; - break; - case GST_AUDIO_FORMAT_S32: - encoding = MPG123_ENC_SIGNED_32; - break; - case GST_AUDIO_FORMAT_U16: - encoding = MPG123_ENC_UNSIGNED_16; - break; - case GST_AUDIO_FORMAT_U24: - encoding = MPG123_ENC_UNSIGNED_24; - break; - case GST_AUDIO_FORMAT_U32: - encoding = MPG123_ENC_UNSIGNED_32; - break; - case GST_AUDIO_FORMAT_F32: - encoding = MPG123_ENC_FLOAT_32; - break; - default: - g_assert_not_reached (); - goto done; - } - } - } - - /* Sample rate, number of channels, and sample format are known at this point. - * Set the audioinfo structure's values and the mpg123 format. */ - { - int err; - - /* clear all existing format settings from the mpg123 instance */ - mpg123_format_none (mpg123_decoder->handle); - /* set the chosen format */ - err = - mpg123_format (mpg123_decoder->handle, sample_rate, num_channels, - encoding); - - if (err != MPG123_OK) { - GST_WARNING_OBJECT (dec, - "mpg123_format() failed: %s", - mpg123_strerror (mpg123_decoder->handle)); - } else { - gst_audio_info_init (&(mpg123_decoder->next_audioinfo)); - gst_audio_info_set_format (&(mpg123_decoder->next_audioinfo), format, - sample_rate, num_channels, NULL); - GST_LOG_OBJECT (dec, "The next audio format is: %s, %u Hz, %u channels", - gst_audio_format_to_string (format), sample_rate, num_channels); - mpg123_decoder->has_next_audioinfo = TRUE; - - retval = TRUE; - } - } - -done: - return retval; -} - - -static void -gst_mpg123_audio_dec_flush (GstAudioDecoder * dec, gboolean hard) -{ - int error; - GstMpg123AudioDec *mpg123_decoder; - - GST_LOG_OBJECT (dec, "Flushing decoder"); - - mpg123_decoder = GST_MPG123_AUDIO_DEC (dec); - - g_assert (mpg123_decoder->handle != NULL); - - /* Flush by reopening the feed */ - mpg123_close (mpg123_decoder->handle); - error = mpg123_open_feed (mpg123_decoder->handle); - - if (G_UNLIKELY (error != MPG123_OK)) { - GST_ELEMENT_ERROR (dec, LIBRARY, INIT, (NULL), - ("Error while reopening mpg123 feed: %s", - mpg123_plain_strerror (error))); - mpg123_close (mpg123_decoder->handle); - mpg123_delete (mpg123_decoder->handle); - mpg123_decoder->handle = NULL; - } - - if (hard) - mpg123_decoder->has_next_audioinfo = FALSE; - - /* opening/closing feeds do not affect the format defined by the - * mpg123_format() call that was made in gst_mpg123_audio_dec_set_format(), - * and since the up/downstream caps are not expected to change here, no - * mpg123_format() calls are done */ -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - return gst_element_register (plugin, "mpg123audiodec", - GST_RANK_MARGINAL, gst_mpg123_audio_dec_get_type ()); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - mpg123, "mp3 decoding based on the mpg123 library", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/mpg123/gstmpg123audiodec.h b/ext/mpg123/gstmpg123audiodec.h deleted file mode 100644 index e837a56b0c..0000000000 --- a/ext/mpg123/gstmpg123audiodec.h +++ /dev/null @@ -1,62 +0,0 @@ -/* MP3 decoding plugin for GStreamer using the mpg123 library - * Copyright (C) 2012 Carlos Rafael Giani - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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_MPG123_AUDIO_DEC_H__ -#define __GST_MPG123_AUDIO_DEC_H__ - -#include -#include -#include - - -G_BEGIN_DECLS - - -typedef struct _GstMpg123AudioDec GstMpg123AudioDec; -typedef struct _GstMpg123AudioDecClass GstMpg123AudioDecClass; - - -#define GST_TYPE_MPG123_AUDIO_DEC (gst_mpg123_audio_dec_get_type()) -#define GST_MPG123_AUDIO_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_MPG123_AUDIO_DEC,GstMpg123AudioDec)) -#define GST_MPG123_AUDIO_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MPG123_AUDIO_DEC,GstMpg123AudioDecClass)) -#define GST_IS_MPG123_AUDIO_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_MPG123_AUDIO_DEC)) -#define GST_IS_MPG123_AUDIO_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MPG123_AUDIO_DEC)) - -struct _GstMpg123AudioDec -{ - GstAudioDecoder parent; - - mpg123_handle *handle; - - GstAudioInfo next_audioinfo; - gboolean has_next_audioinfo; - - off_t frame_offset; -}; - - -struct _GstMpg123AudioDecClass -{ - GstAudioDecoderClass parent_class; -}; - -G_GNUC_INTERNAL GType gst_mpg123_audio_dec_get_type (void); - -G_END_DECLS - -#endif diff --git a/gst-plugins-bad.spec.in b/gst-plugins-bad.spec.in index 0e717bb4fe..4fb17d740d 100644 --- a/gst-plugins-bad.spec.in +++ b/gst-plugins-bad.spec.in @@ -223,7 +223,6 @@ make ERROR_CFLAGS='' ERROR_CXXFLAGS='' %{_libdir}/gstreamer-%{majorminor}/libgstfreeverb.so %{_libdir}/gstreamer-%{majorminor}/libgstivtc.so %{_libdir}/gstreamer-%{majorminor}/libgstmidi.so -%{_libdir}/gstreamer-%{majorminor}/libgstmpg123.so %{_libdir}/gstreamer-%{majorminor}/libgstrfbsrc.so %{_libdir}/gstreamer-%{majorminor}/libgstsmoothstreaming.so %{_libdir}/gstreamer-%{majorminor}/libgstvideofiltersbad.so diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index ca0554914a..1828cb6f9f 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -84,12 +84,6 @@ else check_mpeg2enc = endif -if USE_MPG123 -check_mpg123 = elements/mpg123audiodec -else -check_mpg123 = -endif - if USE_MPLEX check_mplex = elements/mplex else @@ -281,7 +275,6 @@ check_PROGRAMS = \ elements/mpegtsmux \ elements/mpegvideoparse \ elements/mpeg4videoparse \ - $(check_mpg123) \ elements/mxfdemux \ elements/mxfmux \ elements/netsim \ @@ -455,11 +448,6 @@ elements_assrender_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION elements_mpegtsmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_mpegtsmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LDADD) -elements_mpg123audiodec_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) -elements_mpg123audiodec_LDADD = \ - $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \ - -lgstaudio-@GST_API_VERSION@ -lgstfft-@GST_API_VERSION@ -lgstapp-@GST_API_VERSION@ - elements_uvch264demux_CFLAGS = -DUVCH264DEMUX_DATADIR="$(srcdir)/elements/uvch264demux_data" \ $(AM_CFLAGS) diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index 06f0978401..881dcd3d4f 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -38,12 +38,12 @@ mpeg2enc mpegvideoparse mpeg4videoparse mpegtsmux -mpg123audiodec mplex mssdemux mxfdemux mxfmux neonhttpsrc +netsim ofa opus pcapparse diff --git a/tests/check/elements/mpg123audiodec.c b/tests/check/elements/mpg123audiodec.c deleted file mode 100644 index 20d6e779dd..0000000000 --- a/tests/check/elements/mpg123audiodec.c +++ /dev/null @@ -1,534 +0,0 @@ -/* GStreamer - * - * unit test for mpg123audiodec - * - * Copyright (c) 2012 Carlos Rafael Giani - * - * 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. - */ - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include - -/* For ease of programming we use globals to keep refs for our floating - * src and sink pads we create; otherwise we always have to do get_pad, - * get_peer, and then remove references in every test function */ -static GstPad *mysrcpad, *mysinkpad; - - -#define MP2_STREAM_FILENAME "stream.mp2" -#define MP3_CBR_STREAM_FILENAME "cbr_stream.mp3" -#define MP3_VBR_STREAM_FILENAME "vbr_stream.mp3" - - -/* mpeg 1 layer 2 stream created with: - * gst-launch-1.0 -v audiotestsrc wave=sine freq=440 volume=1 num-buffers=32 ! \ - * "audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)44100, channels=(int)1" ! \ - * avenc_mp2 bitrate=32000 ! tee name=t \ - * t. ! queue ! fakesink silent=false \ - * t. ! queue ! filesink location=test.mp2 - * - * mpeg 1 layer 3 CBR stream created with: - * gst-launch-1.0 -v audiotestsrc wave=sine freq=440 volume=1 num-buffers=32 ! \ - * "audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)44100, channels=(int)1" ! \ - * lamemp3enc encoding-engine-quality=high cbr=true target=bitrate bitrate=32 ! \ - * "audio/mpeg, rate=(int)44100, channels=(int)1" ! tee name=t \ - * t. ! queue ! fakesink silent=false \ - * t. ! queue ! filesink location=test.mp3 - * - * mpeg 1 layer 3 VBR stream created with: - * gst-launch-1.0 -v audiotestsrc wave=sine freq=440 volume=1 num-buffers=32 ! \ - * "audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)44100, channels=(int)1" ! \ - * lamemp3enc encoding-engine-quality=high cbr=false target=quality quality=7 ! \ - * "audio/mpeg, rate=(int)44100, channels=(int)1" ! tee name=t \ - * t. ! queue ! fakesink silent=false \ - * t. ! queue ! filesink location=test.mp3 - */ - - -/* FFT test helpers taken from gst-plugins-base tests/check/audioresample.c */ - -#define FFT_HELPERS(type,ffttag,ffttag2,scale) \ -static gdouble magnitude##ffttag (const GstFFT##ffttag##Complex *c) \ -{ \ - gdouble mag = (gdouble) c->r * (gdouble) c->r; \ - mag += (gdouble) c->i * (gdouble) c->i; \ - mag /= scale * scale; \ - mag = 10.0 * log10 (mag); \ - return mag; \ -} \ -static gdouble find_main_frequency_spot_##ffttag ( \ - const GstFFT##ffttag##Complex *v, int elements) \ -{ \ - int i; \ - gdouble maxmag = -9999; \ - int maxidx = 0; \ - for (i=0; i maxmag) { \ - maxmag = mag; \ - maxidx = i; \ - } \ - } \ - return maxidx / (gdouble) elements; \ -} \ -static gboolean is_zero_except_##ffttag (const GstFFT##ffttag##Complex *v, \ - int elements, gdouble spot) \ -{ \ - int i; \ - for (i=0; i 0.01) { \ - if (mag > -35.0) { \ - GST_LOG("Found magnitude at %f : %f (peak at %f)\n", pos, mag, spot); \ - return FALSE; \ - } \ - } \ - } \ - return TRUE; \ -} \ -static void check_main_frequency_spot_##ffttag (GstBuffer *buffer, gdouble \ - expected_spot) \ -{ \ - GstMapInfo map; \ - int num_samples; \ - gdouble actual_spot; \ - GstFFT##ffttag *ctx; \ - GstFFT##ffttag##Complex *fftdata; \ - \ - gst_buffer_map (buffer, &map, GST_MAP_READ); \ - \ - num_samples = map.size / sizeof(type) & ~1; \ - ctx = gst_fft_##ffttag2##_new (num_samples, FALSE); \ - fftdata = g_new (GstFFT##ffttag##Complex, num_samples / 2 + 1); \ - \ - gst_fft_##ffttag2##_window (ctx, (type*)map.data, \ - GST_FFT_WINDOW_HAMMING); \ - gst_fft_##ffttag2##_fft (ctx, (type*)map.data, fftdata); \ - \ - actual_spot = find_main_frequency_spot_##ffttag (fftdata, \ - num_samples / 2 + 1); \ - GST_LOG ("Expected spot: %.3f actual: %.3f %f", expected_spot, actual_spot, \ - fabs (expected_spot - actual_spot)); \ - fail_unless (fabs (expected_spot - actual_spot) < 0.05, \ - "Actual main frequency spot is too far away from expected one"); \ - fail_unless (is_zero_except_##ffttag (fftdata, num_samples / 2 + 1, \ - actual_spot), "One secondary peak in spectrum exceeds threshold"); \ - \ - gst_buffer_unmap (buffer, &map); \ - \ - gst_fft_##ffttag2##_free (ctx); \ - g_free (fftdata); \ -} -FFT_HELPERS (gint32, S32, s32, 2147483647.0); - - -static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw, format = (string) " GST_AUDIO_NE (S32)) - ); -static GstStaticPadTemplate layer2_srctemplate = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); -static GstStaticPadTemplate layer3_srctemplate = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); - - -static void -setup_input_pipeline (gchar const *stream_filename, GstElement ** pipeline, - GstElement ** appsink) -{ - GstElement *source, *parser; - - *pipeline = gst_pipeline_new (NULL); - source = gst_element_factory_make ("filesrc", NULL); - parser = gst_element_factory_make ("mpegaudioparse", NULL); - *appsink = gst_element_factory_make ("appsink", NULL); - - gst_bin_add_many (GST_BIN (*pipeline), source, parser, *appsink, NULL); - gst_element_link_many (source, parser, *appsink, NULL); - - { - char *full_filename = - g_build_filename (GST_TEST_FILES_PATH, stream_filename, NULL); - g_object_set (G_OBJECT (source), "location", full_filename, NULL); - g_free (full_filename); - } - - gst_element_set_state (*pipeline, GST_STATE_PLAYING); -} - -static void -cleanup_input_pipeline (GstElement * pipeline) -{ - gst_element_set_state (pipeline, GST_STATE_NULL); - gst_object_unref (pipeline); -} - -static GstElement * -setup_mpeg1layer2dec (void) -{ - GstElement *mpg123audiodec; - GstCaps *caps; - - GST_DEBUG ("setup_mpeg1layer2dec"); - mpg123audiodec = gst_check_setup_element ("mpg123audiodec"); - mysrcpad = gst_check_setup_src_pad (mpg123audiodec, &layer2_srctemplate); - mysinkpad = gst_check_setup_sink_pad (mpg123audiodec, &sinktemplate); - gst_pad_set_active (mysrcpad, TRUE); - gst_pad_set_active (mysinkpad, TRUE); - - /* This is necessary to trigger a set_format call in the decoder; - * fixed caps don't trigger it */ - caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, 2, - "rate", G_TYPE_INT, 44100, - "channels", G_TYPE_INT, 1, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); - gst_check_setup_events (mysrcpad, mpg123audiodec, caps, GST_FORMAT_TIME); - gst_caps_unref (caps); - - return mpg123audiodec; -} - -static GstElement * -setup_mpeg1layer3dec (void) -{ - GstElement *mpg123audiodec; - GstCaps *caps; - - GST_DEBUG ("setup_mpeg1layer3dec"); - mpg123audiodec = gst_check_setup_element ("mpg123audiodec"); - mysrcpad = gst_check_setup_src_pad (mpg123audiodec, &layer3_srctemplate); - mysinkpad = gst_check_setup_sink_pad (mpg123audiodec, &sinktemplate); - gst_pad_set_active (mysrcpad, TRUE); - gst_pad_set_active (mysinkpad, TRUE); - - /* This is necessary to trigger a set_format call in the decoder; - * fixed caps don't trigger it */ - caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, 3, - "rate", G_TYPE_INT, 44100, - "channels", G_TYPE_INT, 1, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); - gst_check_setup_events (mysrcpad, mpg123audiodec, caps, GST_FORMAT_TIME); - gst_caps_unref (caps); - - return mpg123audiodec; -} - -static void -cleanup_mpg123audiodec (GstElement * mpg123audiodec) -{ - GST_DEBUG ("cleanup_mpeg1layer2dec"); - gst_element_set_state (mpg123audiodec, GST_STATE_NULL); - - gst_pad_set_active (mysrcpad, FALSE); - gst_pad_set_active (mysinkpad, FALSE); - gst_check_teardown_src_pad (mpg123audiodec); - gst_check_teardown_sink_pad (mpg123audiodec); - gst_check_teardown_element (mpg123audiodec); -} - -static void -run_decoding_test (GstElement * mpg123audiodec, gchar const *filename) -{ - GstBus *bus; - unsigned int num_input_buffers, num_decoded_buffers; - gint expected_size; - GstCaps *out_caps, *caps; - GstAudioInfo audioinfo; - GstElement *input_pipeline, *input_appsink; - int i; - GstBuffer *outbuffer; - - /* 440 Hz = frequency of sine wave in audio data - * 44100 Hz = sample rate - * (44100 / 2) Hz = Nyquist frequency */ - static double const expected_frequency_spot = 440.0 / (44100.0 / 2.0); - - fail_unless (gst_element_set_state (mpg123audiodec, - GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, - "could not set to playing"); - bus = gst_bus_new (); - - gst_element_set_bus (mpg123audiodec, bus); - - setup_input_pipeline (filename, &input_pipeline, &input_appsink); - - num_input_buffers = 0; - while (TRUE) { - GstSample *sample; - GstBuffer *input_buffer; - - sample = gst_app_sink_pull_sample (GST_APP_SINK (input_appsink)); - if (sample == NULL) - break; - - fail_unless (GST_IS_SAMPLE (sample)); - - input_buffer = gst_sample_get_buffer (sample); - fail_if (input_buffer == NULL); - - /* This is done to be on the safe side - docs say lifetime of the input buffer - * depends *solely* on the sample */ - input_buffer = gst_buffer_copy (input_buffer); - - fail_unless_equals_int (gst_pad_push (mysrcpad, input_buffer), GST_FLOW_OK); - - ++num_input_buffers; - - gst_sample_unref (sample); - } - - num_decoded_buffers = g_list_length (buffers); - - /* check number of decoded buffers */ - fail_unless_equals_int (num_decoded_buffers, num_input_buffers - 2); - - caps = gst_pad_get_current_caps (mysinkpad); - GST_LOG ("output caps %" GST_PTR_FORMAT, caps); - fail_unless (gst_audio_info_from_caps (&audioinfo, caps), - "Getting audio info from caps failed"); - - /* check caps */ - out_caps = gst_caps_new_simple ("audio/x-raw", - "format", G_TYPE_STRING, GST_AUDIO_NE (S32), - "layout", G_TYPE_STRING, "interleaved", - "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, NULL); - - fail_unless (gst_caps_is_equal_fixed (caps, out_caps), "Incorrect out caps"); - - gst_caps_unref (out_caps); - gst_caps_unref (caps); - - /* here, test if decoded data is a sine tone, and if the sine frequency is at the - * right spot in the spectrum */ - for (i = 0; i < num_decoded_buffers; ++i) { - outbuffer = GST_BUFFER (buffers->data); - fail_if (outbuffer == NULL, "Invalid buffer retrieved"); - - /* MPEG 1 layer 2 uses 1152 samples per frame */ - expected_size = 1152 * GST_AUDIO_INFO_BPF (&audioinfo); - fail_unless_equals_int (gst_buffer_get_size (outbuffer), expected_size); - - check_main_frequency_spot_S32 (outbuffer, expected_frequency_spot); - - buffers = g_list_remove (buffers, outbuffer); - gst_buffer_unref (outbuffer); - outbuffer = NULL; - } - - g_list_free (buffers); - buffers = NULL; - - cleanup_input_pipeline (input_pipeline); - gst_bus_set_flushing (bus, TRUE); - gst_element_set_bus (mpg123audiodec, NULL); - gst_object_unref (GST_OBJECT (bus)); -} - - -GST_START_TEST (test_decode_mpeg1layer2) -{ - GstElement *mpg123audiodec; - mpg123audiodec = setup_mpeg1layer2dec (); - run_decoding_test (mpg123audiodec, MP2_STREAM_FILENAME); - cleanup_mpg123audiodec (mpg123audiodec); - mpg123audiodec = NULL; -} - -GST_END_TEST; - - -GST_START_TEST (test_decode_mpeg1layer3_cbr) -{ - GstElement *mpg123audiodec; - mpg123audiodec = setup_mpeg1layer3dec (); - run_decoding_test (mpg123audiodec, MP3_CBR_STREAM_FILENAME); - cleanup_mpg123audiodec (mpg123audiodec); -} - -GST_END_TEST; - - -GST_START_TEST (test_decode_mpeg1layer3_vbr) -{ - GstElement *mpg123audiodec; - mpg123audiodec = setup_mpeg1layer3dec (); - run_decoding_test (mpg123audiodec, MP3_VBR_STREAM_FILENAME); - cleanup_mpg123audiodec (mpg123audiodec); -} - -GST_END_TEST; - - -GST_START_TEST (test_decode_garbage_mpeg1layer2) -{ - GstElement *mpg123audiodec; - GstBuffer *inbuffer; - GstBus *bus; - int i, num_buffers; - guint32 *tmpbuf; - - mpg123audiodec = setup_mpeg1layer2dec (); - - fail_unless (gst_element_set_state (mpg123audiodec, - GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, - "could not set to playing"); - bus = gst_bus_new (); - - /* initialize the buffer with something that is no mpeg2 */ - tmpbuf = g_new (guint32, 4096); - for (i = 0; i < 4096; i++) { - tmpbuf[i] = i; - } - inbuffer = gst_buffer_new_wrapped (tmpbuf, 4096 * sizeof (guint32)); - - ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); - - gst_element_set_bus (mpg123audiodec, bus); - - /* should be possible to push without problems but nothing gets decoded */ - fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); - - num_buffers = g_list_length (buffers); - - /* should be 0 buffers as decoding should've been impossible */ - fail_unless_equals_int (num_buffers, 0); - - g_list_free (buffers); - buffers = NULL; - - gst_bus_set_flushing (bus, TRUE); - gst_element_set_bus (mpg123audiodec, NULL); - gst_object_unref (GST_OBJECT (bus)); - cleanup_mpg123audiodec (mpg123audiodec); - mpg123audiodec = NULL; -} - -GST_END_TEST; - - -GST_START_TEST (test_decode_garbage_mpeg1layer3) -{ - GstElement *mpg123audiodec; - GstBuffer *inbuffer; - GstBus *bus; - int i, num_buffers; - guint32 *tmpbuf; - - mpg123audiodec = setup_mpeg1layer3dec (); - - fail_unless (gst_element_set_state (mpg123audiodec, - GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, - "could not set to playing"); - bus = gst_bus_new (); - - /* initialize the buffer with something that is no mpeg2 */ - tmpbuf = g_new (guint32, 4096); - for (i = 0; i < 4096; i++) { - tmpbuf[i] = i; - } - inbuffer = gst_buffer_new_wrapped (tmpbuf, 4096 * sizeof (guint32)); - - ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); - - gst_element_set_bus (mpg123audiodec, bus); - - /* should be possible to push without problems but nothing gets decoded */ - fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); - - num_buffers = g_list_length (buffers); - - /* should be 0 buffers as decoding should've been impossible */ - fail_unless_equals_int (num_buffers, 0); - - g_list_free (buffers); - buffers = NULL; - - gst_bus_set_flushing (bus, TRUE); - gst_element_set_bus (mpg123audiodec, NULL); - gst_object_unref (GST_OBJECT (bus)); - cleanup_mpg123audiodec (mpg123audiodec); - mpg123audiodec = NULL; -} - -GST_END_TEST; - - -static gboolean -is_test_file_available (gchar const *filename) -{ - gboolean ret; - gchar *full_filename; - gchar *cwd; - - cwd = g_get_current_dir (); - full_filename = g_build_filename (cwd, GST_TEST_FILES_PATH, filename, NULL); - ret = - g_file_test (full_filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS); - g_free (full_filename); - g_free (cwd); - return ret; -} - -static Suite * -mpg123audiodec_suite (void) -{ - GstRegistry *registry; - Suite *s = suite_create ("mpg123audiodec"); - TCase *tc_chain = tcase_create ("general"); - - registry = gst_registry_get (); - - suite_add_tcase (s, tc_chain); - if (gst_registry_check_feature_version (registry, "filesrc", - GST_VERSION_MAJOR, GST_VERSION_MINOR, 0) && - gst_registry_check_feature_version (registry, "mpegaudioparse", - GST_VERSION_MAJOR, GST_VERSION_MINOR, 0) && - gst_registry_check_feature_version (registry, "appsrc", - GST_VERSION_MAJOR, GST_VERSION_MINOR, 0)) { - if (is_test_file_available (MP2_STREAM_FILENAME)) - tcase_add_test (tc_chain, test_decode_mpeg1layer2); - if (is_test_file_available (MP3_CBR_STREAM_FILENAME)) - tcase_add_test (tc_chain, test_decode_mpeg1layer3_cbr); - if (is_test_file_available (MP3_VBR_STREAM_FILENAME)) - tcase_add_test (tc_chain, test_decode_mpeg1layer3_vbr); - } - tcase_add_test (tc_chain, test_decode_garbage_mpeg1layer2); - tcase_add_test (tc_chain, test_decode_garbage_mpeg1layer3); - - return s; -} - - -GST_CHECK_MAIN (mpg123audiodec)