diff options
author | Thomas Vander Stichele <thomas@apestaart.org> | 2006-05-01 17:58:38 +0000 |
---|---|---|
committer | Thomas Vander Stichele <thomas@apestaart.org> | 2006-05-01 17:58:38 +0000 |
commit | 9e8733719f54b7511cc6d66aa55a957b24921ded (patch) | |
tree | a178712c99b7d8358f663259c2ea80cc089304c7 /ext | |
parent | cfb3b247bff2feaa6efbd32426c38e874b738eaf (diff) | |
download | gst-plugins-bad-9e8733719f54b7511cc6d66aa55a957b24921ded.tar.gz gst-plugins-bad-9e8733719f54b7511cc6d66aa55a957b24921ded.tar.bz2 gst-plugins-bad-9e8733719f54b7511cc6d66aa55a957b24921ded.zip |
moved to good. Closes #336110
Original commit message from CVS:
* configure.ac:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/inspect/plugin-taglib.xml:
* ext/Makefile.am:
* ext/taglib/Makefile.am:
* ext/taglib/gstid3v2mux.cc:
* ext/taglib/gstid3v2mux.h:
* ext/taglib/gsttaglib.cc:
* ext/taglib/gsttaglib.h:
* tests/check/Makefile.am:
* tests/check/elements/tagid3v2mux.c:
moved to good. Closes #336110
Diffstat (limited to 'ext')
-rw-r--r-- | ext/Makefile.am | 8 | ||||
-rw-r--r-- | ext/taglib/Makefile.am | 16 | ||||
-rw-r--r-- | ext/taglib/gstid3v2mux.cc | 364 | ||||
-rw-r--r-- | ext/taglib/gstid3v2mux.h | 54 | ||||
-rw-r--r-- | ext/taglib/gsttaglib.cc | 390 | ||||
-rw-r--r-- | ext/taglib/gsttaglib.h | 69 |
6 files changed, 0 insertions, 901 deletions
diff --git a/ext/Makefile.am b/ext/Makefile.am index 561874b5..c28a13aa 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -202,12 +202,6 @@ else SWFDEC_DIR= endif -if USE_TAGLIB -TAGLIB_DIR = taglib -else -TAGLIB_DIR = -endif - if USE_THEORADEC THEORA_DIR = theora else @@ -267,7 +261,6 @@ SUBDIRS=\ $(SNDFILE_DIR) \ $(SOUNDTOUCH_DIR) \ $(SWFDEC_DIR) \ - $(TAGLIB_DIR) \ $(TARKIN_DIR) \ $(THEORA_DIR) \ $(WAVPACK_DIR) \ @@ -290,7 +283,6 @@ DIST_SUBDIRS= \ sdl \ swfdec \ soundtouch \ - taglib \ theora \ wavpack \ xvid diff --git a/ext/taglib/Makefile.am b/ext/taglib/Makefile.am deleted file mode 100644 index 0b608f3d..00000000 --- a/ext/taglib/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -plugin_LTLIBRARIES = libgsttaglib.la - -libgsttaglib_la_SOURCES = gsttaglib.cc gstid3v2mux.cc -libgsttaglib_la_CXXFLAGS = \ - $(GST_CFLAGS) \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(TAGLIB_CFLAGS) -libgsttaglib_la_LIBADD = \ - $(GST_LIBS) \ - $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ - $(TAGLIB_LIBS) -libgsttaglib_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - -noinst_HEADERS = gsttaglib.h gstid3v2mux.h - -#EXTRA_DIST = README diff --git a/ext/taglib/gstid3v2mux.cc b/ext/taglib/gstid3v2mux.cc deleted file mode 100644 index a1e4537e..00000000 --- a/ext/taglib/gstid3v2mux.cc +++ /dev/null @@ -1,364 +0,0 @@ -/* GStreamer taglib-based ID3v2 muxer - * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org> - * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> - * - * 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-id3v2mux - * @see_also: #GstID3Demux, #GstTagSetter - * - * <refsect2> - * <para> - * This element adds ID3v2 tags to the beginning of a stream using the taglib - * library. More precisely, the tags written are ID3 version 2.4.0 tags (which - * means in practice that some hardware players or outdated programs might not - * be able to read them properly). - * </para> - * <para> - * Applications can set the tags to write using the #GstTagSetter interface. - * Tags sent by upstream elements will be picked up automatically (and merged - * according to the merge mode set via the tag setter interface). - * </para> - * <para> - * Here is a simple pipeline that transcodes a file from Ogg/Vorbis to mp3 - * format with an ID3v2 that contains the same as the the Ogg/Vorbis file: - * <programlisting> - * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3v2mux ! filesink location=foo.mp3 - * </programlisting> - * Make sure the Ogg/Vorbis file actually has comments to preserve. - * You can verify the tags were written using: - * <programlisting> - * gst-launch -m filesrc location=foo.mp3 ! id3demux ! fakesink silent=TRUE 2> /dev/null | grep taglist - * </programlisting> - * </para> - * </refsect2> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "gstid3v2mux.h" - -#include <string.h> - -#include <textidentificationframe.h> -#include <uniquefileidentifierframe.h> -#include <id3v2tag.h> -#include <gst/tag/tag.h> - -using namespace TagLib; - -GST_DEBUG_CATEGORY_STATIC (gst_id3v2_mux_debug); -#define GST_CAT_DEFAULT gst_id3v2_mux_debug - -static const GstElementDetails gst_id3v2_mux_details = -GST_ELEMENT_DETAILS ("TagLib-based ID3v2 Muxer", - "Formatter/Metadata", - "Adds an ID3v2 header to the beginning of MP3 files using taglib", - "Christophe Fergeau <teuf@gnome.org>"); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("application/x-id3")); - - -GST_BOILERPLATE (GstId3v2Mux, gst_id3v2_mux, GstTagLibMux, - GST_TYPE_TAG_LIB_MUX); - -static GstBuffer *gst_id3v2_mux_render_tag (GstTagLibMux * mux, - GstTagList * taglist); - -static void -gst_id3v2_mux_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_template)); - - gst_element_class_set_details (element_class, &gst_id3v2_mux_details); - - GST_DEBUG_CATEGORY_INIT (gst_id3v2_mux_debug, "id3v2mux", 0, - "taglib-based ID3v2 tag muxer"); -} - -static void -gst_id3v2_mux_class_init (GstId3v2MuxClass * klass) -{ - GST_TAG_LIB_MUX_CLASS (klass)->render_tag = - GST_DEBUG_FUNCPTR (gst_id3v2_mux_render_tag); -} - -static void -gst_id3v2_mux_init (GstId3v2Mux * id3v2mux, GstId3v2MuxClass * id3v2mux_class) -{ - /* nothing to do */ -} - -static void -add_one_txxx_musicbrainz_tag (ID3v2::Tag * id3v2tag, const gchar * spec_id, - const gchar * realworld_id, const gchar * id_str) -{ - ID3v2::UserTextIdentificationFrame * frame; - - if (id_str == NULL) - return; - - GST_DEBUG ("Setting %s to %s", GST_STR_NULL (spec_id), id_str); - - if (spec_id) { - frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); - id3v2tag->addFrame (frame); - frame->setDescription (spec_id); - frame->setText (id_str); - } - - if (realworld_id) { - frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); - id3v2tag->addFrame (frame); - frame->setDescription (realworld_id); - frame->setText (id_str); - } -} - -static void -add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) -{ - ID3v2::Tag * id3v2tag = (ID3v2::Tag *) user_data; - gboolean result; - - /* FIXME: if there are several values set for the same tag, this won't - * work, only the first value will be taken into account - */ - if (strcmp (tag, GST_TAG_TITLE) == 0) { - char *title; - - result = gst_tag_list_get_string_index (list, tag, 0, &title); - if (result != FALSE) { - GST_DEBUG ("Setting title to %s", title); - id3v2tag->setTitle (String::String (title, String::UTF8)); - } - g_free (title); - } else if (strcmp (tag, GST_TAG_ALBUM) == 0) { - char *album; - - result = gst_tag_list_get_string_index (list, tag, 0, &album); - if (result != FALSE) { - GST_DEBUG ("Setting album to %s", album); - id3v2tag->setAlbum (String::String (album, String::UTF8)); - } - g_free (album); - } else if (strcmp (tag, GST_TAG_ARTIST) == 0) { - char *artist; - - result = gst_tag_list_get_string_index (list, tag, 0, &artist); - if (result != FALSE) { - GST_DEBUG ("Setting artist to %s", artist); - id3v2tag->setArtist (String::String (artist, String::UTF8)); - } - g_free (artist); - } else if (strcmp (tag, GST_TAG_GENRE) == 0) { - char *genre; - - result = gst_tag_list_get_string_index (list, tag, 0, &genre); - if (result != FALSE) { - GST_DEBUG ("Setting genre to %s", genre); - id3v2tag->setGenre (String::String (genre, String::UTF8)); - } - g_free (genre); - } else if (strcmp (tag, GST_TAG_COMMENT) == 0) { - char *comment; - - result = gst_tag_list_get_string_index (list, tag, 0, &comment); - if (result != FALSE) { - GST_DEBUG ("Setting comment to %s", comment); - id3v2tag->setComment (String::String (comment, String::UTF8)); - } - g_free (comment); - } else if (strcmp (tag, GST_TAG_DATE) == 0) { - GDate *date; - - result = gst_tag_list_get_date_index (list, tag, 0, &date); - if (result != FALSE) { - GDateYear year; - - year = g_date_get_year (date); - GST_DEBUG ("Setting track year to %d", year); - id3v2tag->setYear (year); - g_date_free (date); - } - } else if (strcmp (tag, GST_TAG_TRACK_NUMBER) == 0) { - guint track_number; - - result = gst_tag_list_get_uint_index (list, tag, 0, &track_number); - if (result != FALSE) { - guint total_tracks; - - result = gst_tag_list_get_uint_index (list, GST_TAG_TRACK_COUNT, - 0, &total_tracks); - if (result) { - gchar *tag_str; - - ID3v2::TextIdentificationFrame * frame; - - frame = new ID3v2::TextIdentificationFrame ("TRCK", String::UTF8); - tag_str = g_strdup_printf ("%d/%d", track_number, total_tracks); - GST_DEBUG ("Setting track number to %s", tag_str); - id3v2tag->addFrame (frame); - frame->setText (tag_str); - g_free (tag_str); - } else { - GST_DEBUG ("Setting track number to %d", track_number); - id3v2tag->setTrack (track_number); - } - } - } else if (strcmp (tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) { - guint volume_number; - - result = gst_tag_list_get_uint_index (list, tag, 0, &volume_number); - - if (result != FALSE) { - guint volume_count; - gchar *tag_str; - - ID3v2::TextIdentificationFrame * frame; - - frame = new ID3v2::TextIdentificationFrame ("TPOS", String::UTF8); - result = gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_COUNT, - 0, &volume_count); - if (result) { - tag_str = g_strdup_printf ("%d/%d", volume_number, volume_count); - } else { - tag_str = g_strdup_printf ("%d", volume_number); - } - - GST_DEBUG ("Setting album number to %s", tag_str); - - id3v2tag->addFrame (frame); - frame->setText (tag_str); - g_free (tag_str); - } - } else if (strcmp (tag, GST_TAG_COPYRIGHT) == 0) { - gchar *copyright; - - result = gst_tag_list_get_string_index (list, tag, 0, ©right); - - if (result != FALSE) { - ID3v2::TextIdentificationFrame * frame; - - GST_DEBUG ("Setting copyright to %s", copyright); - - frame = new ID3v2::TextIdentificationFrame ("TCOP", String::UTF8); - - id3v2tag->addFrame (frame); - frame->setText (copyright); - g_free (copyright); - } - } else if (strcmp (tag, GST_TAG_MUSICBRAINZ_ARTISTID) == 0) { - gchar *id_str; - - if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { - add_one_txxx_musicbrainz_tag (id3v2tag, "MusicBrainz Artist Id", - "musicbrainz_artistid", id_str); - g_free (id_str); - } - } else if (strcmp (tag, GST_TAG_MUSICBRAINZ_ALBUMID) == 0) { - gchar *id_str; - - if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { - add_one_txxx_musicbrainz_tag (id3v2tag, "MusicBrainz Album Id", - "musicbrainz_albumid", id_str); - g_free (id_str); - } - } else if (strcmp (tag, GST_TAG_MUSICBRAINZ_ALBUMARTISTID) == 0) { - gchar *id_str; - - if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { - add_one_txxx_musicbrainz_tag (id3v2tag, "MusicBrainz Album Artist Id", - "musicbrainz_albumartistid", id_str); - g_free (id_str); - } - } else if (strcmp (tag, GST_TAG_MUSICBRAINZ_TRMID) == 0) { - gchar *id_str; - - if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { - add_one_txxx_musicbrainz_tag (id3v2tag, "MusicBrainz TRM Id", - "musicbrainz_trmid", id_str); - g_free (id_str); - } - } else if (strcmp (tag, GST_TAG_MUSICBRAINZ_TRACKID) == 0) { - gchar *id_str; - - if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { - ID3v2::UniqueFileIdentifierFrame * frame; - - GST_DEBUG ("Setting Musicbrainz Track Id to %s", id_str); - - frame = new ID3v2::UniqueFileIdentifierFrame ("http://musicbrainz.org", - id_str); - id3v2tag->addFrame (frame); - g_free (id_str); - } - } else { - GST_WARNING ("Unsupported tag: %s", tag); - } -} - -static GstBuffer * -gst_id3v2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist) -{ - ID3v2::Tag id3v2tag; - ByteVector rendered_tag; - GstBuffer *buf; - guint tag_size; - - /* Render the tag */ - gst_tag_list_foreach (taglist, add_one_tag, &id3v2tag); - - rendered_tag = id3v2tag.render (); - tag_size = rendered_tag.size (); - - GST_LOG_OBJECT (mux, "tag size = %d bytes", tag_size); - - /* Create buffer with tag */ - buf = gst_buffer_new_and_alloc (tag_size); - memcpy (GST_BUFFER_DATA (buf), rendered_tag.data (), tag_size); - gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); - - return buf; -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - if (!gst_element_register (plugin, "id3v2mux", GST_RANK_NONE, - GST_TYPE_ID3V2_MUX)) - return FALSE; - - gst_tag_register_musicbrainz_tags (); - - return TRUE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "taglib", - "Tag writing plug-in based on taglib", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/taglib/gstid3v2mux.h b/ext/taglib/gstid3v2mux.h deleted file mode 100644 index 855b2296..00000000 --- a/ext/taglib/gstid3v2mux.h +++ /dev/null @@ -1,54 +0,0 @@ -/* GStreamer taglib-based ID3v2 muxer - * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org> - * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> - * - * 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. - */ - -#ifndef GST_ID3V2_MUX_H -#define GST_ID3V2_MUX_H - -#include "gsttaglib.h" - -G_BEGIN_DECLS - -typedef struct _GstId3v2Mux GstId3v2Mux; -typedef struct _GstId3v2MuxClass GstId3v2MuxClass; - -typedef struct _GstId3v2Mux { - GstTagLibMux taglibmux; -}; - -typedef struct _GstId3v2MuxClass { - GstTagLibMuxClass taglibmux_class; -}; - -#define GST_TYPE_ID3V2_MUX \ - (gst_id3v2_mux_get_type()) -#define GST_ID3V2_MUX(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3V2_MUX,GstId3v2Mux)) -#define GST_ID3V2_MUX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3V2_MUX,GstId3v2MuxClass)) -#define GST_IS_ID3V2_MUX(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3V2_MUX)) -#define GST_IS_ID3V2_MUX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3V2_MUX)) - -GType gst_id3v2_mux_get_type (void); - -G_END_DECLS - -#endif /* GST_ID3V2_MUX_H */ diff --git a/ext/taglib/gsttaglib.cc b/ext/taglib/gsttaglib.cc deleted file mode 100644 index 35ec89fe..00000000 --- a/ext/taglib/gsttaglib.cc +++ /dev/null @@ -1,390 +0,0 @@ -/* GStreamer taglib-based muxer base class - * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org> - * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> - - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <gst/gsttagsetter.h> -#include <gst/tag/tag.h> -#include "gsttaglib.h" - -GST_DEBUG_CATEGORY_STATIC (gst_tag_lib_mux_debug); -#define GST_CAT_DEFAULT gst_tag_lib_mux_debug - -static GstStaticPadTemplate gst_tag_lib_mux_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("ANY")); - -static void -gst_tag_lib_mux_iface_init (GType taglib_type) -{ - static const GInterfaceInfo tag_setter_info = { - NULL, - NULL, - NULL - }; - - g_type_add_interface_static (taglib_type, GST_TYPE_TAG_SETTER, - &tag_setter_info); -} - -GST_BOILERPLATE_FULL (GstTagLibMux, gst_tag_lib_mux, - GstElement, GST_TYPE_ELEMENT, gst_tag_lib_mux_iface_init); - - -static GstStateChangeReturn -gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition); -static GstFlowReturn gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer); -static gboolean gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event); - -static void -gst_tag_lib_mux_finalize (GObject * obj) -{ - GstTagLibMux *mux = GST_TAG_LIB_MUX (obj); - - if (mux->newsegment_ev) { - gst_event_unref (mux->newsegment_ev); - mux->newsegment_ev = NULL; - } - - if (mux->event_tags) { - gst_tag_list_free (mux->event_tags); - mux->event_tags = NULL; - } - - G_OBJECT_CLASS (parent_class)->finalize (obj); -} - -static void -gst_tag_lib_mux_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_tag_lib_mux_sink_template)); - - GST_DEBUG_CATEGORY_INIT (gst_tag_lib_mux_debug, "taglibmux", 0, - "taglib-based muxer"); -} - -static void -gst_tag_lib_mux_class_init (GstTagLibMuxClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_tag_lib_mux_finalize); - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_tag_lib_mux_change_state); -} - -static void -gst_tag_lib_mux_init (GstTagLibMux * mux, GstTagLibMuxClass * mux_class) -{ - GstElementClass *element_klass = GST_ELEMENT_CLASS (mux_class); - GstPadTemplate *tmpl; - - /* pad through which data comes in to the element */ - mux->sinkpad = - gst_pad_new_from_static_template (&gst_tag_lib_mux_sink_template, "sink"); - gst_pad_set_chain_function (mux->sinkpad, - GST_DEBUG_FUNCPTR (gst_tag_lib_mux_chain)); - gst_pad_set_event_function (mux->sinkpad, - GST_DEBUG_FUNCPTR (gst_tag_lib_mux_sink_event)); - gst_element_add_pad (GST_ELEMENT (mux), mux->sinkpad); - - /* pad through which data goes out of the element */ - tmpl = gst_element_class_get_pad_template (element_klass, "src"); - if (tmpl) { - mux->srcpad = gst_pad_new_from_template (tmpl, "src"); - gst_pad_use_fixed_caps (mux->srcpad); - gst_pad_set_caps (mux->srcpad, gst_pad_template_get_caps (tmpl)); - gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); - } - - mux->render_tag = TRUE; -} - -static GstBuffer * -gst_tag_lib_mux_render_tag (GstTagLibMux * mux) -{ - GstTagLibMuxClass *klass; - GstBuffer *buffer; - GstTagSetter *tagsetter = GST_TAG_SETTER (mux); - const GstTagList *tagsetter_tags; - GstTagList *taglist; - GstEvent *event; - - if (mux->event_tags != NULL) { - taglist = gst_tag_list_copy (mux->event_tags); - } else { - taglist = gst_tag_list_new (); - } - - tagsetter_tags = gst_tag_setter_get_tag_list (tagsetter); - if (tagsetter_tags) { - GstTagMergeMode merge_mode; - - merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter); - GST_LOG_OBJECT (mux, "merging tags, merge mode = %d", merge_mode); - GST_LOG_OBJECT (mux, "event tags: %" GST_PTR_FORMAT, taglist); - GST_LOG_OBJECT (mux, "set tags: %" GST_PTR_FORMAT, tagsetter_tags); - gst_tag_list_insert (taglist, tagsetter_tags, merge_mode); - } - - GST_LOG_OBJECT (mux, "final tags: %" GST_PTR_FORMAT, taglist); - - klass = GST_TAG_LIB_MUX_CLASS (G_OBJECT_GET_CLASS (mux)); - - if (klass->render_tag == NULL) - goto no_vfunc; - - buffer = klass->render_tag (mux, taglist); - - if (buffer == NULL) - goto render_error; - - mux->tag_size = GST_BUFFER_SIZE (buffer); - GST_LOG_OBJECT (mux, "tag size = %d bytes", mux->tag_size); - - /* Send newsegment event from byte position 0, so the tag really gets - * written to the start of the file, independent of the upstream segment */ - gst_pad_push_event (mux->srcpad, - gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); - - /* Send an event about the new tags to downstream elements */ - /* gst_event_new_tag takes ownership of the list, so no need to unref it */ - event = gst_event_new_tag (taglist); - gst_pad_push_event (mux->srcpad, event); - - GST_BUFFER_OFFSET (buffer) = 0; - - return buffer; - -no_vfunc: - { - GST_ERROR_OBJECT (mux, "Subclass does not implement render_tag vfunc!"); - return NULL; - } - -render_error: - { - GST_ERROR_OBJECT (mux, "Failed to render tag"); - return NULL; - } -} - -static GstEvent * -gst_tag_lib_mux_adjust_event_offsets (GstTagLibMux * mux, - const GstEvent * newsegment_event) -{ - GstFormat format; - gint64 start, stop, cur; - - gst_event_parse_new_segment ((GstEvent *) newsegment_event, NULL, NULL, - &format, &start, &stop, &cur); - - g_assert (format == GST_FORMAT_BYTES); - - if (start != -1) - start += mux->tag_size; - if (stop != -1) - stop += mux->tag_size; - if (cur != -1) - cur += mux->tag_size; - - GST_DEBUG_OBJECT (mux, "adjusting newsegment event offsets to start=%" - G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ", cur=%" G_GINT64_FORMAT - " (delta = +%u)", start, stop, cur, mux->tag_size); - - return gst_event_new_new_segment (TRUE, 1.0, format, start, stop, cur); -} - -static GstFlowReturn -gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer) -{ - GstTagLibMux *mux = GST_TAG_LIB_MUX (GST_OBJECT_PARENT (pad)); - - if (mux->render_tag) { - GstFlowReturn ret; - GstBuffer *tag_buffer; - - GST_INFO_OBJECT (mux, "Adding tags to stream"); - tag_buffer = gst_tag_lib_mux_render_tag (mux); - if (tag_buffer == NULL) - goto no_tag_buffer; - ret = gst_pad_push (mux->srcpad, tag_buffer); - if (ret != GST_FLOW_OK) { - GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret)); - gst_buffer_unref (buffer); - return ret; - } - - /* Now send the cached newsegment event that we got from upstream */ - if (mux->newsegment_ev) { - GST_DEBUG_OBJECT (mux, "sending cached newsegment event"); - gst_pad_push_event (mux->srcpad, - gst_tag_lib_mux_adjust_event_offsets (mux, mux->newsegment_ev)); - gst_event_unref (mux->newsegment_ev); - mux->newsegment_ev = NULL; - } else { - /* upstream sent no newsegment event or only one in a non-BYTE format */ - } - - mux->render_tag = FALSE; - } - - buffer = gst_buffer_make_metadata_writable (buffer); - - if (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE) { - GST_LOG_OBJECT (mux, "Adjusting buffer offset from %" G_GINT64_FORMAT - " to %" G_GINT64_FORMAT, GST_BUFFER_OFFSET (buffer), - GST_BUFFER_OFFSET (buffer) + mux->tag_size); - GST_BUFFER_OFFSET (buffer) += mux->tag_size; - } - - gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad)); - return gst_pad_push (mux->srcpad, buffer); - -/* ERRORS */ -no_tag_buffer: - { - GST_ELEMENT_ERROR (mux, LIBRARY, ENCODE, (NULL), (NULL)); - return GST_FLOW_ERROR; - } -} - -static gboolean -gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event) -{ - GstTagLibMux *mux; - gboolean result; - - mux = GST_TAG_LIB_MUX (gst_pad_get_parent (pad)); - result = FALSE; - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_TAG:{ - GstTagList *tags; - - gst_event_parse_tag (event, &tags); - - GST_INFO_OBJECT (mux, "Got tag event: %" GST_PTR_FORMAT, tags); - - if (mux->event_tags != NULL) { - gst_tag_list_insert (mux->event_tags, tags, GST_TAG_MERGE_REPLACE); - } else { - mux->event_tags = gst_tag_list_copy (tags); - } - - GST_INFO_OBJECT (mux, "Event tags are now: %" GST_PTR_FORMAT, - mux->event_tags); - - /* just drop the event, we'll push a new tag event in render_tag */ - gst_event_unref (event); - result = TRUE; - break; - } - case GST_EVENT_NEWSEGMENT:{ - GstFormat fmt; - - gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, NULL, NULL); - - if (fmt != GST_FORMAT_BYTES) { - GST_WARNING_OBJECT (mux, "dropping newsegment event in %s format", - gst_format_get_name (fmt)); - gst_event_unref (event); - break; - } - - if (mux->render_tag) { - /* we have not rendered the tag yet, which means that we don't know - * how large it is going to be yet, so we can't adjust the offsets - * here at this point and need to cache the newsegment event for now - * (also, there could be tag events coming after this newsegment event - * and before the first buffer). */ - if (mux->newsegment_ev) { - GST_WARNING_OBJECT (mux, "discarding old cached newsegment event"); - gst_event_unref (mux->newsegment_ev); - } - - GST_LOG_OBJECT (mux, "caching newsegment event for later"); - mux->newsegment_ev = event; - } else { - GST_DEBUG_OBJECT (mux, "got newsegment event, adjusting offsets"); - gst_pad_push_event (mux->srcpad, - gst_tag_lib_mux_adjust_event_offsets (mux, event)); - gst_event_unref (event); - } - event = NULL; - result = TRUE; - break; - } - default: - result = gst_pad_event_default (pad, event); - break; - } - - gst_object_unref (mux); - - return result; -} - - -static GstStateChangeReturn -gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition) -{ - GstTagLibMux *mux; - GstStateChangeReturn result; - - mux = GST_TAG_LIB_MUX (element); - - result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - if (result != GST_STATE_CHANGE_SUCCESS) { - return result; - } - - switch (transition) { - case GST_STATE_CHANGE_PAUSED_TO_READY:{ - if (mux->newsegment_ev) { - gst_event_unref (mux->newsegment_ev); - mux->newsegment_ev = NULL; - } - if (mux->event_tags) { - gst_tag_list_free (mux->event_tags); - mux->event_tags = NULL; - } - mux->tag_size = 0; - mux->render_tag = TRUE; - break; - } - default: - break; - } - - return result; -} diff --git a/ext/taglib/gsttaglib.h b/ext/taglib/gsttaglib.h deleted file mode 100644 index 5b91a93e..00000000 --- a/ext/taglib/gsttaglib.h +++ /dev/null @@ -1,69 +0,0 @@ -/* GStreamer taglib-based muxer base class - * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org> - * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> - - * 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. - */ - -#ifndef GST_TAG_LIB_H -#define GST_TAG_LIB_H - -#include <gst/gst.h> - -G_BEGIN_DECLS - -typedef struct _GstTagLibMux GstTagLibMux; -typedef struct _GstTagLibMuxClass GstTagLibMuxClass; - -/* Definition of structure storing data for this element. */ -typedef struct _GstTagLibMux { - GstElement element; - - GstPad *srcpad; - GstPad *sinkpad; - GstTagList *event_tags; /* tags received from upstream elements */ - gsize tag_size; - gboolean render_tag; - - GstEvent *newsegment_ev; /* cached newsegment event from upstream */ -}; - -/* Standard definition defining a class for this element. */ -typedef struct _GstTagLibMuxClass { - GstElementClass parent_class; - - /* vfuncs */ - GstBuffer * (*render_tag) (GstTagLibMux * mux, GstTagList * tag_list); -}; - -/* Standard macros for defining types for this element. */ -#define GST_TYPE_TAG_LIB_MUX \ - (gst_tag_lib_mux_get_type()) -#define GST_TAG_LIB_MUX(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_LIB_MUX,GstTagLibMux)) -#define GST_TAG_LIB_MUX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_LIB_MUX,GstTagLibMuxClass)) -#define GST_IS_TAG_LIB_MUX(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_LIB_MUX)) -#define GST_IS_TAG_LIB_MUX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_LIB_MUX)) - -/* Standard function returning type information. */ -GType gst_tag_lib_mux_get_type (void); - -G_END_DECLS - -#endif |