From 4e04dc11c8aecd5b05f5b0f1506f4594f3f9541b Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 31 Dec 2008 13:32:58 +0000 Subject: [PATCH] Wrap gst-plugins-base's tag helper library. Original commit message from CVS: * configure.ac: * gst/Makefile.am: * gst/tag.defs: * gst/tag.override: * gst/tagmodule.c: (inittag): Wrap gst-plugins-base's tag helper library. Partially fixes #565762 --- ChangeLog | 10 +++ configure.ac | 3 + gst/Makefile.am | 22 +++++ gst/tag.defs | 219 +++++++++++++++++++++++++++++++++++++++++++++++ gst/tag.override | 64 ++++++++++++++ gst/tagmodule.c | 56 ++++++++++++ 6 files changed, 374 insertions(+) create mode 100644 gst/tag.defs create mode 100644 gst/tag.override create mode 100644 gst/tagmodule.c diff --git a/ChangeLog b/ChangeLog index 984fe6af80..62b21fe6ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-12-31 Edward Hervey + + * configure.ac: + * gst/Makefile.am: + * gst/tag.defs: + * gst/tag.override: + * gst/tagmodule.c: (inittag): + Wrap gst-plugins-base's tag helper library. + Partially fixes #565762 + 2008-12-31 Edward Hervey * configure.ac: diff --git a/configure.ac b/configure.ac index b1fa006396..5944624ef6 100644 --- a/configure.ac +++ b/configure.ac @@ -186,6 +186,7 @@ then then AC_DEFINE_UNQUOTED(HAVE_GST_AUDIO, 1, [We can use the gst-audio library]) AC_DEFINE_UNQUOTED(HAVE_GST_VIDEO, 1, [We can use the gst-video library]) + AC_DEFINE_UNQUOTED(HAVE_GST_TAG, 1, [We can use the gst-tag library]) fi else @@ -203,6 +204,7 @@ else AC_DEFINE_UNQUOTED(HAVE_PLUGINS_INSTALL, 1, [We can use the plugins-install methods]) AC_DEFINE_UNQUOTED(HAVE_GST_AUDIO, 1, [We can use the gst-audio library]) AC_DEFINE_UNQUOTED(HAVE_GST_VIDEO, 1, [We can use the gst-video library]) + AC_DEFINE_UNQUOTED(HAVE_GST_TAG, 1, [We can use the gst-tag library]) fi AC_DEFINE_UNQUOTED(HAVE_VIDEO_ORIENTATION_INTERFACE, 1, [We can use the videoorientation interface]) AC_SUBST(IGNORE_GST_0_10_13) @@ -220,6 +222,7 @@ AC_SUBST(HAVE_VIDEO_ORIENTATION) AC_SUBST(HAVE_PLUGINS_INSTALL) AM_CONDITIONAL(HAVE_GST_AUDIO, $HAVE_GST_AUDIO) AM_CONDITIONAL(HAVE_GST_VIDEO, $HAVE_GST_VIDEO) +AM_CONDITIONAL(HAVE_GST_TAG, $HAVE_GST_TAG) dnl check for gstreamer-base; uninstalled is selected preferentially PKG_CHECK_MODULES(GST_BASE, gstreamer-base-$GST_MAJORMINOR >= $GST_REQ, diff --git a/gst/Makefile.am b/gst/Makefile.am index 5867866a4d..4d1c288ac0 100644 --- a/gst/Makefile.am +++ b/gst/Makefile.am @@ -149,6 +149,28 @@ video.c: $(VIDEO_DEFS) $(VIDEO_OVERRIDES) $(GEN_FILES) endif +# GStreamer tag bindings +TAG_OVERRIDES = tag.override +TAG_DEFS = tag.defs +CLEANFILES += tag.c +EXTRA_DIST += $(TAG_DEFS) $(TAG_OVERRIDES) +defs_DATA += $(TAG_DEFS) +GEN_FILES += $(TAG_DEFS) + +if HAVE_GST_TAG + + tag_lib = tag.la + pygstexec_LTLIBRARIES += $(tag_lib) + tag_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS) + tag_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgsttag-0.10 + tag_la_LDFLAGS = $(common_ldflags) \ + -export-symbols-regex "^(inittag|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS) + tag_la_SOURCES = tagmodule.c gst-argtypes.c pygstminiobject.c + nodist_tag_la_SOURCES = tag.c +tag.c: $(TAG_DEFS) $(TAG_OVERRIDES) $(GEN_FILES) + +endif + .defs.c: ($(PYTHON) $(top_srcdir)/codegen/codegen.py \ diff --git a/gst/tag.defs b/gst/tag.defs new file mode 100644 index 0000000000..3adbf9d229 --- /dev/null +++ b/gst/tag.defs @@ -0,0 +1,219 @@ +;; -*- scheme -*- +; object definitions ... +(define-object TagDemux + (in-module "Gst") + (parent "GstElement") + (c-name "GstTagDemux") + (gtype-id "GST_TYPE_TAG_DEMUX") +) + +;; Enumerations and flags ... + +(define-enum TagDemuxResult + (in-module "Gst") + (c-name "GstTagDemuxResult") + (gtype-id "GST_TYPE_TAG_DEMUX_RESULT") + (values + '("broken-tag" "GST_TAG_DEMUX_RESULT_BROKEN_TAG") + '("again" "GST_TAG_DEMUX_RESULT_AGAIN") + '("ok" "GST_TAG_DEMUX_RESULT_OK") + ) +) + +(define-enum TagImageType + (in-module "Gst") + (c-name "GstTagImageType") + (gtype-id "GST_TYPE_TAG_IMAGE_TYPE") + (values + '("none" "GST_TAG_IMAGE_TYPE_NONE") + '("undefined" "GST_TAG_IMAGE_TYPE_UNDEFINED") + '("front-cover" "GST_TAG_IMAGE_TYPE_FRONT_COVER") + '("back-cover" "GST_TAG_IMAGE_TYPE_BACK_COVER") + '("leaflet-page" "GST_TAG_IMAGE_TYPE_LEAFLET_PAGE") + '("medium" "GST_TAG_IMAGE_TYPE_MEDIUM") + '("lead-artist" "GST_TAG_IMAGE_TYPE_LEAD_ARTIST") + '("artist" "GST_TAG_IMAGE_TYPE_ARTIST") + '("conductor" "GST_TAG_IMAGE_TYPE_CONDUCTOR") + '("band-orchestra" "GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA") + '("composer" "GST_TAG_IMAGE_TYPE_COMPOSER") + '("lyricist" "GST_TAG_IMAGE_TYPE_LYRICIST") + '("recording-location" "GST_TAG_IMAGE_TYPE_RECORDING_LOCATION") + '("during-recording" "GST_TAG_IMAGE_TYPE_DURING_RECORDING") + '("during-performance" "GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE") + '("video-capture" "GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE") + '("fish" "GST_TAG_IMAGE_TYPE_FISH") + '("illustration" "GST_TAG_IMAGE_TYPE_ILLUSTRATION") + '("band-artist-logo" "GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO") + '("publisher-studio-logo" "GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO") + ) +) + + +;; From gsttagdemux.h + +(define-function demux_get_type + (c-name "gst_tag_demux_get_type") + (return-type "GType") +) + + + +;; From tag.h + +(define-function image_type_get_type + (c-name "gst_tag_image_type_get_type") + (return-type "GType") +) + +(define-function from_vorbis_tag + (c-name "gst_tag_from_vorbis_tag") + (return-type "const-gchar*") + (parameters + '("const-gchar*" "vorbis_tag") + ) +) + +(define-function to_vorbis_tag + (c-name "gst_tag_to_vorbis_tag") + (return-type "const-gchar*") + (parameters + '("const-gchar*" "gst_tag") + ) +) + +(define-function gst_vorbis_tag_add + (c-name "gst_vorbis_tag_add") + (return-type "none") + (parameters + '("GstTagList*" "list") + '("const-gchar*" "tag") + '("const-gchar*" "value") + ) +) + +(define-function to_vorbis_comments + (c-name "gst_tag_to_vorbis_comments") + (return-type "GList*") + (parameters + '("const-GstTagList*" "list") + '("const-gchar*" "tag") + ) +) + +(define-function list_from_vorbiscomment_buffer + (c-name "gst_tag_list_from_vorbiscomment_buffer") + (return-type "GstTagList*") + (parameters + '("const-GstBuffer*" "buffer") + '("const-guint8*" "id_data") + '("const-guint" "id_data_length") + '("gchar**" "vendor_string") + ) +) + +(define-method to_vorbiscomment_buffer + (of-object "GstTagList") + (c-name "gst_tag_list_to_vorbiscomment_buffer") + (return-type "GstBuffer*") + (parameters + '("const-guint8*" "id_data") + '("const-guint" "id_data_length") + '("const-gchar*" "vendor_string") + ) +) + +(define-function id3_genre_count + (c-name "gst_tag_id3_genre_count") + (return-type "guint") +) + +(define-function id3_genre_get + (c-name "gst_tag_id3_genre_get") + (return-type "const-gchar*") + (parameters + '("const-guint" "id") + ) +) + +(define-function list_new_from_id3v1 + (c-name "gst_tag_list_new_from_id3v1") + (return-type "GstTagList*") + (parameters + '("const-guint8*" "data") + ) +) + +(define-function from_id3_tag + (c-name "gst_tag_from_id3_tag") + (return-type "const-gchar*") + (parameters + '("const-gchar*" "id3_tag") + ) +) + +(define-function from_id3_user_tag + (c-name "gst_tag_from_id3_user_tag") + (return-type "const-gchar*") + (parameters + '("const-gchar*" "type") + '("const-gchar*" "id3_user_tag") + ) +) + +(define-function to_id3_tag + (c-name "gst_tag_to_id3_tag") + (return-type "const-gchar*") + (parameters + '("const-gchar*" "gst_tag") + ) +) + +(define-method add_id3_image + (of-object "GstTagList") + (c-name "gst_tag_list_add_id3_image") + (return-type "gboolean") + (parameters + '("const-guint8*" "image_data") + '("guint" "image_data_len") + '("guint" "id3_picture_type") + ) +) + +(define-function parse_extended_comment + (c-name "gst_tag_parse_extended_comment") + (return-type "gboolean") + (parameters + '("const-gchar*" "ext_comment") + '("gchar**" "key") + '("gchar**" "lang") + '("gchar**" "value") + '("gboolean" "fail_if_no_key") + ) +) + +(define-function freeform_string_to_utf8 + (c-name "gst_tag_freeform_string_to_utf8") + (return-type "gchar*") + (parameters + '("const-gchar*" "data") + '("gint" "size") + '("const-gchar**" "env_vars") + ) +) + +(define-function image_data_to_image_buffer + (c-name "gst_tag_image_data_to_image_buffer") + (return-type "GstBuffer*") + (parameters + '("const-guint8*" "image_data") + '("guint" "image_data_len") + '("GstTagImageType" "image_type") + ) +) + +(define-function register_musicbrainz_tags + (c-name "gst_tag_register_musicbrainz_tags") + (return-type "none") +) + + diff --git a/gst/tag.override b/gst/tag.override new file mode 100644 index 0000000000..52ef76b552 --- /dev/null +++ b/gst/tag.override @@ -0,0 +1,64 @@ +/* -*- Mode: C; c-basic-offset: 4 -*- */ +/* gst-python + * Copyright (C) 2008 + * + * 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. + */ +%% +headers + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define NO_IMPORT_PYGOBJECT +#include "common.h" + +#include + +#include +#include +#include "pygstminiobject.h" +GST_DEBUG_CATEGORY_EXTERN (pygst_debug); +#define GST_CAT_DEFAULT pygst_debug + +/* Boonky define that allows for backwards compatibility with Python 2.4 */ +#if PY_VERSION_HEX < 0x02050000 +#define Py_ssize_t int +#endif + +%% +modulename gst.tag +%% +import gobject.GObject as PyGObject_Type +import gst.Object as PyGstObject_Type +import gst.Structure as PyGstStructure_Type +import gst.Element as PyGstElement_Type +import gst.Pad as PyGstPad_Type +import gst.Buffer as PyGstBuffer_Type +import gst.Message as PyGstMessage_Type +import gst.SystemClock as PyGstSystemClock_Type +import gst.BaseTransform as PyGstBaseTransform_Type +import gst.BaseSink as PyGstBaseSink_Type +%% +include + gstversion.override +%% +ignore-glob + _* + *init + *_free + *_get_type diff --git a/gst/tagmodule.c b/gst/tagmodule.c new file mode 100644 index 0000000000..91d4e3adec --- /dev/null +++ b/gst/tagmodule.c @@ -0,0 +1,56 @@ +/* -*- Mode: C; c-basic-offset: 4 -*- */ +/* gst-python + * Copyright (C) 2008 Edward Hervey + * + * 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 this first, before NO_IMPORT_PYGOBJECT is defined */ +#include +#include +#include + +void pytag_register_classes (PyObject *d); +void pytag_add_constants(PyObject *module, const gchar *strip_prefix); + +extern PyMethodDef pytag_functions[]; + +GST_DEBUG_CATEGORY (pygst_debug); /* for python code */ + +DL_EXPORT(void) +inittag (void) +{ + PyObject *m, *d; + + init_pygobject (); + /* Initialize tag library */ + gst_tag_register_musicbrainz_tags (); + + m = Py_InitModule ("tag", pytag_functions); + d = PyModule_GetDict (m); + + pytag_register_classes (d); + pytag_add_constants (m, "GST_"); + + if (PyErr_Occurred ()) { + PyErr_Print (); + Py_FatalError ("can't initialize module gst.tag"); + } +}