Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
|
|
|
|
/* Copyright 2005 Jan Schmidt <thaytan@mad.scientist.com>
|
|
|
|
* 2006 Michael Smith <msmith@fluendo.com>
|
|
|
|
* Copyright (C) 2003-2004 Benjamin Otte <otte@gnome.org>
|
|
|
|
*
|
|
|
|
* 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., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* SECTION:element-icydemux
|
|
|
|
* @short_description: reads tag information from an Icy (Icecast/Shoutcast)
|
|
|
|
* stream, outputting them as tag messages, and forwarding the enclosed data.
|
|
|
|
*
|
|
|
|
* <refsect2>
|
|
|
|
* <para>
|
2007-04-12 16:06:31 +00:00
|
|
|
* icydemux accepts data streams with ICY metadata at known intervals, as
|
|
|
|
* transmitted from an upstream element (usually read as response headers from
|
|
|
|
* an HTTP stream). The mime type of the data between the tag blocks is
|
|
|
|
* detected using typefind functions, and the appropriate output mime type set
|
|
|
|
* on outgoing buffers.
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
* </para>
|
|
|
|
* <title>Example launch line</title>
|
|
|
|
* <para>
|
|
|
|
* <programlisting>
|
|
|
|
* gst-launch gnomevfssrc location=http://some.server/ ! icydemux ! fakesink -t
|
|
|
|
* </programlisting>
|
2007-04-12 16:06:31 +00:00
|
|
|
* This pipeline should read any available ICY tag information and output it.
|
|
|
|
* The contents of the stream should be detected, and the appropriate mime
|
|
|
|
* type set on buffers produced from icydemux.
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
* </para>
|
|
|
|
* </refsect2>
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
#include <gst/gst.h>
|
|
|
|
#include <gst/gst-i18n-plugin.h>
|
2007-06-05 16:32:19 +00:00
|
|
|
#include <gst/tag/tag.h>
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
|
|
|
#include "gsticydemux.h"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
Define GstElementDetails as const and also static (when defined as global)
Original commit message from CVS:
* ext/aalib/gstaasink.c:
* ext/annodex/gstcmmldec.c:
* ext/annodex/gstcmmlenc.c:
* ext/cairo/gsttextoverlay.c:
* ext/cairo/gsttimeoverlay.c:
* ext/cdio/gstcdiocddasrc.c:
* ext/dv/gstdvdec.c:
* ext/dv/gstdvdemux.c:
* ext/esd/esdmon.c:
* ext/esd/esdsink.c:
* ext/flac/gstflacenc.c:
* ext/flac/gstflactag.c:
* ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init):
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init):
* ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init):
* ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init):
* ext/gdk_pixbuf/pixbufscale.c:
* ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init):
* ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init):
* ext/jpeg/gstjpegdec.c:
* ext/jpeg/gstjpegenc.c:
* ext/jpeg/gstsmokedec.c:
* ext/jpeg/gstsmokeenc.c:
* ext/libcaca/gstcacasink.c:
* ext/libmng/gstmngdec.c:
* ext/libmng/gstmngenc.c:
* ext/libpng/gstpngdec.c:
* ext/libpng/gstpngenc.c:
* ext/mikmod/gstmikmod.c:
* ext/raw1394/gstdv1394src.c:
* ext/shout2/gstshout2.c: (gst_shout2send_init):
* ext/shout2/gstshout2.h:
* ext/speex/gstspeexdec.c:
* ext/speex/gstspeexenc.c:
* gst/alpha/gstalpha.c:
* gst/alpha/gstalphacolor.c:
* gst/apetag/gstapedemux.c:
* gst/auparse/gstauparse.c:
* gst/autodetect/gstautoaudiosink.c:
(gst_auto_audio_sink_base_init):
* gst/autodetect/gstautovideosink.c:
(gst_auto_video_sink_base_init):
* gst/avi/gstavidemux.c: (gst_avi_demux_base_init):
* gst/avi/gstavimux.c: (gst_avimux_base_init):
* gst/cutter/gstcutter.c:
* gst/debug/breakmydata.c:
* gst/debug/efence.c:
* gst/debug/gstnavigationtest.c:
* gst/debug/gstnavseek.c:
* gst/debug/negotiation.c:
* gst/debug/progressreport.c:
* gst/debug/testplugin.c:
* gst/effectv/gstaging.c:
* gst/effectv/gstdice.c:
* gst/effectv/gstedge.c:
* gst/effectv/gstquark.c:
* gst/effectv/gstrev.c:
* gst/effectv/gstshagadelic.c:
* gst/effectv/gstvertigo.c:
* gst/effectv/gstwarp.c:
* gst/flx/gstflxdec.c:
* gst/goom/gstgoom.c:
* gst/icydemux/gsticydemux.c:
* gst/id3demux/gstid3demux.c:
* gst/interleave/deinterleave.c:
* gst/interleave/interleave.c:
* gst/law/alaw-decode.c: (gst_alawdec_base_init):
* gst/law/alaw-encode.c: (gst_alawenc_base_init):
* gst/law/mulaw-decode.c: (gst_mulawdec_base_init):
* gst/law/mulaw-encode.c: (gst_mulawenc_base_init):
* gst/level/gstlevel.c:
* gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init):
* gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init):
* gst/median/gstmedian.c:
* gst/monoscope/gstmonoscope.c:
* gst/multipart/multipartdemux.c:
* gst/multipart/multipartmux.c:
* gst/oldcore/gstaggregator.c:
* gst/oldcore/gstfdsink.c:
* gst/oldcore/gstmd5sink.c:
* gst/oldcore/gstmultifilesrc.c:
* gst/oldcore/gstpipefilter.c:
* gst/oldcore/gstshaper.c:
* gst/oldcore/gststatistics.c:
* gst/rtp/gstasteriskh263.c:
* gst/rtp/gstrtpL16depay.c:
* gst/rtp/gstrtpL16pay.c:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpamrpay.c:
* gst/rtp/gstrtpdepay.c:
* gst/rtp/gstrtpgsmpay.c:
* gst/rtp/gstrtph263pay.c:
* gst/rtp/gstrtph263pdepay.c:
* gst/rtp/gstrtph263ppay.c:
* gst/rtp/gstrtpilbcdepay.c:
* gst/rtp/gstrtpmp4gpay.c:
* gst/rtp/gstrtpmp4vdepay.c:
* gst/rtp/gstrtpmp4vpay.c:
* gst/rtp/gstrtpmpadepay.c:
* gst/rtp/gstrtpmpapay.c:
* gst/rtp/gstrtppcmadepay.c:
* gst/rtp/gstrtppcmapay.c:
* gst/rtp/gstrtppcmudepay.c:
* gst/rtp/gstrtppcmupay.c:
* gst/rtp/gstrtpspeexdepay.c:
* gst/rtp/gstrtpspeexpay.c:
* gst/rtsp/gstrtpdec.c:
* gst/rtsp/gstrtspsrc.c:
* gst/smpte/gstsmpte.c:
* gst/udp/gstdynudpsink.c:
* gst/udp/gstmultiudpsink.c:
* gst/udp/gstudpsink.c:
* gst/udp/gstudpsrc.c:
* gst/videobox/gstvideobox.c:
* gst/videofilter/gstgamma.c: (gst_gamma_base_init):
* gst/videofilter/gstvideobalance.c:
* gst/videofilter/gstvideoflip.c:
* gst/videofilter/gstvideotemplate.c:
(gst_videotemplate_base_init):
* gst/videomixer/videomixer.c:
* gst/wavparse/gstwavparse.c: (gst_wavparse_base_init),
(gst_wavparse_class_init), (gst_wavparse_dispose),
(gst_wavparse_reset), (gst_wavparse_init),
(gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info),
(gst_wavparse_peek_chunk), (gst_wavparse_stream_headers),
(gst_wavparse_parse_stream_init), (gst_wavparse_send_event),
(gst_wavparse_add_src_pad), (gst_wavparse_stream_data),
(gst_wavparse_chain), (gst_wavparse_srcpad_event),
(gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull),
(gst_wavparse_change_state):
* gst/wavparse/gstwavparse.h:
* sys/oss/gstossmixerelement.c:
* sys/oss/gstosssink.c:
* sys/oss/gstosssrc.c:
* sys/osxaudio/gstosxaudioelement.c:
* sys/osxaudio/gstosxaudiosink.c:
* sys/osxaudio/gstosxaudiosrc.c:
* sys/sunaudio/gstsunaudiomixer.c:
* sys/sunaudio/gstsunaudiosink.c:
Define GstElementDetails as const and also static (when defined as
global)
2006-04-25 21:39:46 +00:00
|
|
|
static const GstElementDetails gst_icydemux_details =
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
GST_ELEMENT_DETAILS ("ICY tag demuxer",
|
|
|
|
"Codec/Demuxer/Metadata",
|
|
|
|
"Read and output ICY tags while demuxing the contents",
|
|
|
|
"Jan Schmidt <thaytan@mad.scientist.com>\n"
|
|
|
|
"Michael Smith <msmith@fluendo.com>");
|
|
|
|
|
|
|
|
#define ICY_TYPE_FIND_MAX_SIZE (40*1024)
|
|
|
|
|
2006-06-22 19:31:04 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (icydemux_debug);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
#define GST_CAT_DEFAULT (icydemux_debug)
|
|
|
|
|
|
|
|
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS ("application/x-icy, metadata-interval = (int)[0, MAX]")
|
|
|
|
);
|
|
|
|
|
|
|
|
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_SOMETIMES,
|
|
|
|
GST_STATIC_CAPS ("ANY")
|
|
|
|
);
|
|
|
|
|
|
|
|
static void gst_icydemux_class_init (GstICYDemuxClass * klass);
|
|
|
|
static void gst_icydemux_base_init (GstICYDemuxClass * klass);
|
|
|
|
static void gst_icydemux_init (GstICYDemux * icydemux);
|
|
|
|
static void gst_icydemux_dispose (GObject * object);
|
|
|
|
|
|
|
|
static GstFlowReturn gst_icydemux_chain (GstPad * pad, GstBuffer * buf);
|
gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later.
Original commit message from CVS:
* gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps),
(gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags),
(gst_icydemux_handle_event), (gst_icydemux_send_cached_events),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_send_tag_event):
* gst/icydemux/gsticydemux.h:
Fix event handling: cache events when typefinding and forward later.
2006-04-28 14:57:57 +00:00
|
|
|
static gboolean gst_icydemux_handle_event (GstPad * pad, GstEvent * event);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
|
|
|
static gboolean gst_icydemux_add_srcpad (GstICYDemux * icydemux,
|
|
|
|
GstCaps * new_caps);
|
|
|
|
static gboolean gst_icydemux_remove_srcpad (GstICYDemux * icydemux);
|
|
|
|
|
|
|
|
static GstStateChangeReturn gst_icydemux_change_state (GstElement * element,
|
|
|
|
GstStateChange transition);
|
|
|
|
static gboolean gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps);
|
|
|
|
|
|
|
|
static void gst_icydemux_send_tag_event (GstICYDemux * icydemux,
|
|
|
|
GstTagList * taglist);
|
|
|
|
|
|
|
|
static GstElementClass *parent_class = NULL;
|
|
|
|
|
|
|
|
GType
|
|
|
|
gst_icydemux_get_type (void)
|
|
|
|
{
|
|
|
|
static GType plugin_type = 0;
|
|
|
|
|
|
|
|
if (!plugin_type) {
|
|
|
|
static const GTypeInfo plugin_info = {
|
|
|
|
sizeof (GstICYDemuxClass),
|
|
|
|
(GBaseInitFunc) gst_icydemux_base_init,
|
|
|
|
NULL,
|
|
|
|
(GClassInitFunc) gst_icydemux_class_init,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
sizeof (GstICYDemux),
|
|
|
|
0,
|
|
|
|
(GInstanceInitFunc) gst_icydemux_init,
|
|
|
|
};
|
|
|
|
plugin_type = g_type_register_static (GST_TYPE_ELEMENT,
|
|
|
|
"GstICYDemux", &plugin_info, 0);
|
|
|
|
}
|
|
|
|
return plugin_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_base_init (GstICYDemuxClass * klass)
|
|
|
|
{
|
|
|
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
|
|
|
|
|
|
|
gst_element_class_add_pad_template (element_class,
|
|
|
|
gst_static_pad_template_get (&src_factory));
|
|
|
|
gst_element_class_add_pad_template (element_class,
|
|
|
|
gst_static_pad_template_get (&sink_factory));
|
|
|
|
gst_element_class_set_details (element_class, &gst_icydemux_details);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_class_init (GstICYDemuxClass * klass)
|
|
|
|
{
|
|
|
|
GObjectClass *gobject_class;
|
|
|
|
GstElementClass *gstelement_class;
|
|
|
|
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gstelement_class = (GstElementClass *) klass;
|
|
|
|
|
|
|
|
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
|
|
|
|
|
|
|
gobject_class->dispose = gst_icydemux_dispose;
|
|
|
|
|
|
|
|
gstelement_class->change_state = gst_icydemux_change_state;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_reset (GstICYDemux * icydemux)
|
|
|
|
{
|
|
|
|
/* Unknown at the moment (this is a fatal error if don't have a value by the
|
|
|
|
* time we get to our chain function)
|
|
|
|
*/
|
|
|
|
icydemux->meta_interval = -1;
|
|
|
|
icydemux->remaining = 0;
|
|
|
|
|
|
|
|
icydemux->typefinding = TRUE;
|
|
|
|
|
|
|
|
gst_caps_replace (&(icydemux->src_caps), NULL);
|
|
|
|
|
|
|
|
gst_icydemux_remove_srcpad (icydemux);
|
|
|
|
|
|
|
|
if (icydemux->cached_tags) {
|
|
|
|
gst_tag_list_free (icydemux->cached_tags);
|
|
|
|
icydemux->cached_tags = NULL;
|
|
|
|
}
|
|
|
|
|
gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later.
Original commit message from CVS:
* gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps),
(gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags),
(gst_icydemux_handle_event), (gst_icydemux_send_cached_events),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_send_tag_event):
* gst/icydemux/gsticydemux.h:
Fix event handling: cache events when typefinding and forward later.
2006-04-28 14:57:57 +00:00
|
|
|
if (icydemux->cached_events) {
|
|
|
|
g_list_foreach (icydemux->cached_events,
|
|
|
|
(GFunc) gst_mini_object_unref, NULL);
|
|
|
|
g_list_free (icydemux->cached_events);
|
|
|
|
icydemux->cached_events = NULL;
|
|
|
|
}
|
|
|
|
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
if (icydemux->meta_adapter) {
|
|
|
|
gst_adapter_clear (icydemux->meta_adapter);
|
|
|
|
g_object_unref (icydemux->meta_adapter);
|
|
|
|
icydemux->meta_adapter = NULL;
|
|
|
|
}
|
|
|
|
|
2006-09-14 10:38:42 +00:00
|
|
|
if (icydemux->typefind_buf) {
|
|
|
|
gst_buffer_unref (icydemux->typefind_buf);
|
|
|
|
icydemux->typefind_buf = NULL;
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_init (GstICYDemux * icydemux)
|
|
|
|
{
|
|
|
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (icydemux);
|
|
|
|
|
|
|
|
icydemux->sinkpad =
|
|
|
|
gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
|
|
|
|
"sink"), "sink");
|
|
|
|
gst_pad_set_chain_function (icydemux->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_icydemux_chain));
|
gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later.
Original commit message from CVS:
* gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps),
(gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags),
(gst_icydemux_handle_event), (gst_icydemux_send_cached_events),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_send_tag_event):
* gst/icydemux/gsticydemux.h:
Fix event handling: cache events when typefinding and forward later.
2006-04-28 14:57:57 +00:00
|
|
|
gst_pad_set_event_function (icydemux->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_icydemux_handle_event));
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
gst_pad_set_setcaps_function (icydemux->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_icydemux_sink_setcaps));
|
|
|
|
gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->sinkpad);
|
|
|
|
|
|
|
|
gst_icydemux_reset (icydemux);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad));
|
|
|
|
GstStructure *structure = gst_caps_get_structure (caps, 0);
|
|
|
|
|
|
|
|
if (!gst_structure_get_int (structure, "metadata-interval",
|
|
|
|
&icydemux->meta_interval))
|
|
|
|
return FALSE;
|
|
|
|
else {
|
|
|
|
/* We have a meta interval, so initialise the rest */
|
|
|
|
icydemux->remaining = icydemux->meta_interval;
|
|
|
|
icydemux->meta_remaining = 0;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_dispose (GObject * object)
|
|
|
|
{
|
|
|
|
GstICYDemux *icydemux = GST_ICYDEMUX (object);
|
|
|
|
|
|
|
|
gst_icydemux_reset (icydemux);
|
|
|
|
|
|
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gst_icydemux_add_srcpad (GstICYDemux * icydemux, GstCaps * new_caps)
|
|
|
|
{
|
|
|
|
GstPad *srcpad = NULL;
|
|
|
|
|
|
|
|
if (icydemux->src_caps == NULL ||
|
|
|
|
!gst_caps_is_equal (new_caps, icydemux->src_caps)) {
|
|
|
|
gst_caps_replace (&(icydemux->src_caps), new_caps);
|
|
|
|
if (icydemux->srcpad != NULL) {
|
|
|
|
GST_DEBUG_OBJECT (icydemux, "Changing src pad caps to %" GST_PTR_FORMAT,
|
|
|
|
icydemux->src_caps);
|
|
|
|
|
|
|
|
gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Caps never changed */
|
|
|
|
gst_caps_unref (new_caps);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (icydemux->srcpad == NULL) {
|
|
|
|
srcpad = icydemux->srcpad =
|
|
|
|
gst_pad_new_from_template (gst_element_class_get_pad_template
|
|
|
|
(GST_ELEMENT_GET_CLASS (icydemux), "src"), "src");
|
|
|
|
g_return_val_if_fail (icydemux->srcpad != NULL, FALSE);
|
|
|
|
|
|
|
|
gst_pad_use_fixed_caps (icydemux->srcpad);
|
|
|
|
|
|
|
|
if (icydemux->src_caps)
|
|
|
|
gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (icydemux, "Adding src pad with caps %" GST_PTR_FORMAT,
|
|
|
|
icydemux->src_caps);
|
|
|
|
|
2006-10-11 13:24:42 +00:00
|
|
|
gst_pad_set_active (icydemux->srcpad, TRUE);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
if (!(gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->srcpad)))
|
|
|
|
return FALSE;
|
|
|
|
gst_element_no_more_pads (GST_ELEMENT (icydemux));
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gst_icydemux_remove_srcpad (GstICYDemux * icydemux)
|
|
|
|
{
|
|
|
|
gboolean res = TRUE;
|
|
|
|
|
|
|
|
if (icydemux->srcpad != NULL) {
|
|
|
|
res = gst_element_remove_pad (GST_ELEMENT (icydemux), icydemux->srcpad);
|
|
|
|
g_return_val_if_fail (res != FALSE, FALSE);
|
|
|
|
icydemux->srcpad = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
|
2007-04-12 16:06:31 +00:00
|
|
|
static gchar *
|
|
|
|
gst_icydemux_unicodify (const gchar * str)
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
{
|
2007-04-12 16:06:31 +00:00
|
|
|
const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING",
|
|
|
|
"GST_TAG_ENCODING", NULL
|
|
|
|
};
|
|
|
|
|
2007-06-05 16:32:19 +00:00
|
|
|
return gst_tag_freeform_string_to_utf8 (str, -1, env_vars);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux)
|
|
|
|
{
|
|
|
|
GstTagList *tags = gst_tag_list_new ();
|
|
|
|
const guint8 *data;
|
|
|
|
int length, i;
|
|
|
|
gchar *buffer;
|
|
|
|
gchar **strings;
|
|
|
|
gboolean found_tag = FALSE;
|
|
|
|
|
|
|
|
length = gst_adapter_available (icydemux->meta_adapter);
|
|
|
|
|
|
|
|
data = gst_adapter_peek (icydemux->meta_adapter, length);
|
|
|
|
|
|
|
|
/* Now, copy this to a buffer where we can NULL-terminate it to make things
|
|
|
|
* a bit easier, then do that parsing. */
|
|
|
|
buffer = g_malloc (length + 1);
|
|
|
|
memcpy (buffer, data, length);
|
|
|
|
buffer[length] = 0;
|
|
|
|
|
|
|
|
strings = g_strsplit (buffer, "';", 0);
|
|
|
|
|
|
|
|
for (i = 0; strings[i]; i++) {
|
|
|
|
if (!g_ascii_strncasecmp (strings[i], "StreamTitle=", 12)) {
|
|
|
|
char *title = gst_icydemux_unicodify (strings[i] + 13);
|
|
|
|
|
|
|
|
if (title && *title) {
|
|
|
|
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE,
|
|
|
|
title, NULL);
|
|
|
|
g_free (title);
|
|
|
|
found_tag = TRUE;
|
|
|
|
}
|
|
|
|
} else if (!g_ascii_strncasecmp (strings[i], "StreamUrl=", 10)) {
|
|
|
|
char *url = gst_icydemux_unicodify (strings[i] + 11);
|
|
|
|
|
|
|
|
if (url) {
|
|
|
|
/*
|
|
|
|
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_URL,
|
|
|
|
url, NULL);
|
|
|
|
found_tag = TRUE;
|
|
|
|
*/
|
|
|
|
g_free (url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g_strfreev (strings);
|
|
|
|
g_free (buffer);
|
|
|
|
gst_adapter_clear (icydemux->meta_adapter);
|
|
|
|
|
|
|
|
if (found_tag) {
|
|
|
|
if (icydemux->srcpad) {
|
|
|
|
gst_icydemux_send_tag_event (icydemux, tags);
|
|
|
|
} else {
|
|
|
|
if (!icydemux->cached_tags) {
|
|
|
|
icydemux->cached_tags = gst_tag_list_new ();
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_tag_list_insert (icydemux->cached_tags, tags,
|
|
|
|
GST_TAG_MERGE_REPLACE_ALL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later.
Original commit message from CVS:
* gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps),
(gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags),
(gst_icydemux_handle_event), (gst_icydemux_send_cached_events),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_send_tag_event):
* gst/icydemux/gsticydemux.h:
Fix event handling: cache events when typefinding and forward later.
2006-04-28 14:57:57 +00:00
|
|
|
static gboolean
|
|
|
|
gst_icydemux_handle_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
|
|
|
GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad));
|
|
|
|
|
|
|
|
if (icydemux->typefinding) {
|
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
|
|
|
g_list_foreach (icydemux->cached_events,
|
|
|
|
(GFunc) gst_mini_object_unref, NULL);
|
|
|
|
g_list_free (icydemux->cached_events);
|
|
|
|
icydemux->cached_events = NULL;
|
|
|
|
|
|
|
|
return gst_pad_event_default (pad, event);
|
|
|
|
default:
|
|
|
|
icydemux->cached_events = g_list_append (icydemux->cached_events,
|
|
|
|
event);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return gst_pad_event_default (pad, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_send_cached_events (GstICYDemux * icydemux)
|
|
|
|
{
|
|
|
|
GList *l;
|
|
|
|
|
|
|
|
for (l = icydemux->cached_events; l != NULL; l = l->next) {
|
|
|
|
GstEvent *event = GST_EVENT (l->data);
|
|
|
|
|
|
|
|
gst_pad_push_event (icydemux->srcpad, event);
|
|
|
|
}
|
|
|
|
g_list_free (icydemux->cached_events);
|
|
|
|
icydemux->cached_events = NULL;
|
|
|
|
}
|
|
|
|
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_icydemux_typefind_or_forward (GstICYDemux * icydemux, GstBuffer * buf)
|
|
|
|
{
|
|
|
|
if (icydemux->typefinding) {
|
2006-09-14 10:38:42 +00:00
|
|
|
GstBuffer *tf_buf;
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
GstCaps *caps;
|
2006-10-16 18:22:47 +00:00
|
|
|
GstTypeFindProbability prob;
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
2006-09-14 10:38:42 +00:00
|
|
|
if (icydemux->typefind_buf) {
|
|
|
|
icydemux->typefind_buf = gst_buffer_join (icydemux->typefind_buf, buf);
|
|
|
|
} else {
|
|
|
|
icydemux->typefind_buf = buf;
|
|
|
|
}
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
|
|
|
caps = gst_type_find_helper_for_buffer (GST_OBJECT (icydemux),
|
2006-09-14 10:38:42 +00:00
|
|
|
icydemux->typefind_buf, &prob);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
|
|
|
if (caps == NULL) {
|
2006-09-14 10:38:42 +00:00
|
|
|
if (GST_BUFFER_SIZE (icydemux->typefind_buf) < ICY_TYPE_FIND_MAX_SIZE) {
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
/* Just break for more data */
|
|
|
|
return GST_FLOW_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We failed typefind */
|
2006-09-14 10:38:42 +00:00
|
|
|
GST_ELEMENT_ERROR (icydemux, STREAM, TYPE_NOT_FOUND, (NULL),
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
("No caps found for contents within an ICY stream"));
|
2006-09-14 10:38:42 +00:00
|
|
|
gst_buffer_unref (icydemux->typefind_buf);
|
|
|
|
icydemux->typefind_buf = NULL;
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!gst_icydemux_add_srcpad (icydemux, caps)) {
|
|
|
|
GST_DEBUG_OBJECT (icydemux, "Failed to add srcpad");
|
|
|
|
gst_caps_unref (caps);
|
2006-09-14 10:38:42 +00:00
|
|
|
gst_buffer_unref (icydemux->typefind_buf);
|
|
|
|
icydemux->typefind_buf = NULL;
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
|
gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later.
Original commit message from CVS:
* gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps),
(gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags),
(gst_icydemux_handle_event), (gst_icydemux_send_cached_events),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_send_tag_event):
* gst/icydemux/gsticydemux.h:
Fix event handling: cache events when typefinding and forward later.
2006-04-28 14:57:57 +00:00
|
|
|
if (icydemux->cached_events) {
|
|
|
|
gst_icydemux_send_cached_events (icydemux);
|
|
|
|
}
|
|
|
|
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
if (icydemux->cached_tags) {
|
|
|
|
gst_icydemux_send_tag_event (icydemux, icydemux->cached_tags);
|
|
|
|
icydemux->cached_tags = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Move onto streaming: call ourselves recursively with the typefind buffer
|
|
|
|
* to get that forwarded. */
|
|
|
|
icydemux->typefinding = FALSE;
|
|
|
|
|
2006-09-14 10:38:42 +00:00
|
|
|
tf_buf = icydemux->typefind_buf;
|
|
|
|
icydemux->typefind_buf = NULL;
|
|
|
|
return gst_icydemux_typefind_or_forward (icydemux, tf_buf);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
} else {
|
|
|
|
if (G_UNLIKELY (icydemux->srcpad == NULL)) {
|
|
|
|
gst_buffer_unref (buf);
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
|
|
|
|
2006-09-14 10:38:42 +00:00
|
|
|
buf = gst_buffer_make_metadata_writable (buf);
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
gst_buffer_set_caps (buf, icydemux->src_caps);
|
|
|
|
|
2006-09-14 10:38:42 +00:00
|
|
|
/* Most things don't care, and it's a pain to track (we should preserve a
|
|
|
|
* 0 offset on the first buffer though if it's there, for id3demux etc.) */
|
|
|
|
if (GST_BUFFER_OFFSET (buf) != 0) {
|
|
|
|
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
}
|
Add icydemux, and tests.
Original commit message from CVS:
* configure.ac:
* gst/icydemux/Makefile.am:
* gst/icydemux/gsticydemux.c: (gst_icydemux_get_type),
(gst_icydemux_base_init), (gst_icydemux_class_init),
(gst_icydemux_reset), (gst_icydemux_init),
(gst_icydemux_sink_setcaps), (gst_icydemux_dispose),
(gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad),
(unicodify), (gst_icydemux_unicodify),
(gst_icydemux_parse_and_send_tags),
(gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta),
(gst_icydemux_chain), (gst_icydemux_change_state),
(gst_icydemux_send_tag_event), (plugin_init):
* gst/icydemux/gsticydemux.h:
* tests/check/Makefile.am:
* tests/check/elements/icydemux.c: (typefind_succeed),
(plugin_init), (icydemux_found_pad), (create_icydemux),
(cleanup_icydemux), (push_data), (GST_START_TEST),
(icydemux_suite), (main):
Add icydemux, and tests.
2006-04-21 09:27:11 +00:00
|
|
|
|
|
|
|
return gst_pad_push (icydemux->srcpad, buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_add_meta (GstICYDemux * icydemux, GstBuffer * buf)
|
|
|
|
{
|
|
|
|
if (!icydemux->meta_adapter)
|
|
|
|
icydemux->meta_adapter = gst_adapter_new ();
|
|
|
|
|
|
|
|
gst_adapter_push (icydemux->meta_adapter, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
|
|
|
gst_icydemux_chain (GstPad * pad, GstBuffer * buf)
|
|
|
|
{
|
|
|
|
GstICYDemux *icydemux;
|
|
|
|
guint size, chunk, offset;
|
|
|
|
GstBuffer *sub;
|
|
|
|
GstFlowReturn ret = GST_FLOW_OK;
|
|
|
|
|
|
|
|
icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad));
|
|
|
|
g_return_val_if_fail (GST_IS_ICYDEMUX (icydemux), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (icydemux->meta_interval >= 0, GST_FLOW_ERROR);
|
|
|
|
|
|
|
|
if (icydemux->meta_interval == 0) {
|
|
|
|
ret = gst_icydemux_typefind_or_forward (icydemux, buf);
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Go through the buffer, chopping it into appropriate chunks. Forward as
|
|
|
|
* tags or buffers, as appropriate
|
|
|
|
*/
|
|
|
|
size = GST_BUFFER_SIZE (buf);
|
|
|
|
offset = 0;
|
|
|
|
while (size) {
|
|
|
|
if (icydemux->remaining) {
|
|
|
|
chunk = (size <= icydemux->remaining) ? size : icydemux->remaining;
|
|
|
|
sub = gst_buffer_create_sub (buf, offset, chunk);
|
|
|
|
offset += chunk;
|
|
|
|
icydemux->remaining -= chunk;
|
|
|
|
size -= chunk;
|
|
|
|
|
|
|
|
/* This buffer goes onto typefinding, and/or directly pushed out */
|
|
|
|
ret = gst_icydemux_typefind_or_forward (icydemux, sub);
|
|
|
|
if (ret != GST_FLOW_OK)
|
|
|
|
goto done;
|
|
|
|
} else if (icydemux->meta_remaining) {
|
|
|
|
chunk = (size <= icydemux->meta_remaining) ?
|
|
|
|
size : icydemux->meta_remaining;
|
|
|
|
sub = gst_buffer_create_sub (buf, offset, chunk);
|
|
|
|
gst_icydemux_add_meta (icydemux, sub);
|
|
|
|
|
|
|
|
offset += chunk;
|
|
|
|
icydemux->meta_remaining -= chunk;
|
|
|
|
size -= chunk;
|
|
|
|
|
|
|
|
if (icydemux->meta_remaining == 0) {
|
|
|
|
/* Parse tags from meta_adapter, send off as tag messages */
|
|
|
|
GST_DEBUG_OBJECT (icydemux, "No remaining metadata, parsing for tags");
|
|
|
|
gst_icydemux_parse_and_send_tags (icydemux);
|
|
|
|
|
|
|
|
icydemux->remaining = icydemux->meta_interval;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* We need to read a single byte (always safe at this point in the loop)
|
|
|
|
* to figure out how many bytes of metadata exist.
|
|
|
|
* The 'spec' tells us to read 16 * (byte_value) bytes of metadata after
|
|
|
|
* this (zero is common, and means the metadata hasn't changed).
|
|
|
|
*/
|
|
|
|
icydemux->meta_remaining = 16 * GST_BUFFER_DATA (buf)[offset];
|
|
|
|
if (icydemux->meta_remaining == 0)
|
|
|
|
icydemux->remaining = icydemux->meta_interval;
|
|
|
|
|
|
|
|
offset += 1;
|
|
|
|
size -= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
|
|
|
gst_buffer_unref (buf);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_icydemux_change_state (GstElement * element, GstStateChange transition)
|
|
|
|
{
|
|
|
|
GstStateChangeReturn ret;
|
|
|
|
GstICYDemux *icydemux = GST_ICYDEMUX (element);
|
|
|
|
|
|
|
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
|
|
|
|
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
|
|
|
gst_icydemux_reset (icydemux);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_icydemux_send_tag_event (GstICYDemux * icydemux, GstTagList * tags)
|
|
|
|
{
|
|
|
|
GstEvent *event;
|
|
|
|
|
|
|
|
gst_element_post_message (GST_ELEMENT (icydemux),
|
|
|
|
gst_message_new_tag (GST_OBJECT (icydemux), gst_tag_list_copy (tags)));
|
|
|
|
|
|
|
|
event = gst_event_new_tag (tags);
|
|
|
|
GST_EVENT_TIMESTAMP (event) = 0;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (icydemux, "Sending tag event on src pad");
|
|
|
|
gst_pad_push_event (icydemux->srcpad, event);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
plugin_init (GstPlugin * plugin)
|
|
|
|
{
|
|
|
|
GST_DEBUG_CATEGORY_INIT (icydemux_debug, "icydemux", 0,
|
|
|
|
"GStreamer ICY tag demuxer");
|
|
|
|
|
|
|
|
return gst_element_register (plugin, "icydemux",
|
|
|
|
GST_RANK_PRIMARY, GST_TYPE_ICYDEMUX);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
|
|
GST_VERSION_MINOR,
|
|
|
|
"icydemux",
|
|
|
|
"Demux ICY tags from a stream",
|
|
|
|
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|