Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gstreamer.16413 for openSUSE:Leap:15.2:Update checked in at 2021-06-01 17:52:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Leap:15.2:Update/gstreamer.16413 (Old) and /work/SRC/openSUSE:Leap:15.2:Update/.gstreamer.16413.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer.16413" Tue Jun 1 17:52:20 2021 rev:1 rq:896678 version:1.16.3 Changes: -------- New Changes file: --- /dev/null 2021-05-27 11:03:55.685848939 +0200 +++ /work/SRC/openSUSE:Leap:15.2:Update/.gstreamer.16413.new.1898/gstreamer.changes 2021-06-01 17:52:20.662084181 +0200 @@ -0,0 +1,2820 @@ +------------------------------------------------------------------- +Wed May 19 09:37:15 UTC 2021 - Jia Zhaocong <zc...@suse.com> + +- Update to version 1.16.3 (bsc#1181255): + - delay creation of threadpools + - bin: Fix `deep-element-removed` log message + - buffer: fix meta sequence number fallback on rpi + - bufferlist: foreach: always remove as parent if buffer is changed + - bus: Make setting/replacing/clearing the sync handler thread-safe + - elementfactory: Fix missing features in case a feature moves to another filename + - element: When removing a ghost pad also unset its target + - meta: intern registered impl string + - registry: Use a toolchain-specific registry file on Windows + - systemclock: Invalid internal time calculation causes non-increasing clock time on Windows + - value: don't write to `const char *` + - value: Fix segfault comparing empty GValueArrays + - Revert floating enforcing + - aggregator: fix iteration direction in skip_buffers + - sparsefile: fix possible crash when seeking + - baseparse: cache fix + - baseparse: fix memory leak when subclass skips whole input buffer + - baseparse: Set the private duration before posting a duration-changed message + - basetransform: allow not passthrough if generate_output is implemented + - identity: Fix a minor leak using meta_str + - queue: protect against lost wakeups for iterm_del condition + - queue2: Avoid races when posting buffering messages + - queue2: Fix missing/dropped buffering messages at startup + - identity: Unblock condition variable on FLUSH_START + - check: Use `g_thread_yield()` instead of `g_usleep(1)` + - tests: use cpu_family for arch checks + - gst-launch: Follow up to missing `s/g_print/gst_print/g` + - gst-inspect: Add define guard for `g_log_writer_supports_color()` + - gst-launch: go back down to `GST_STATE_NULL` in one step. + - device-monitor: list hidden providers before listing devices + - autotools build fixes for GNU make 4.3 + +------------------------------------------------------------------- +Wed Dec 4 10:20:33 UTC 2019 - Bj??rn Lie <bjorn....@gmail.com> + +- Update to version 1.16.2: + + Interlaced video scaling fixes + + CineForm video support in AVI + + audioresample: avoid glitches due to rounding errors after + changing rate + + Command line tool output printing improvements on Windows + + various performance improvements, memory leak fixes and + security fixes + + VP9 decoding fixes + + wasapi: bug fixes and stability improvements + + tsdemux: improved handling of certain discontinuities + + vaapi h265 decoder: wait for I-frame before trying to decode + + tee: Make sure to actually deactivate pads that are released + + bin: Drop need-context messages without source instead of + crashing + + gst: Don't pass miniobjects to GST_DEBUG_OBJECT() and similar + macros + + tracers: Don't leak temporary GstStructure + +------------------------------------------------------------------- +Tue Sep 24 07:29:25 UTC 2019 - Bj??rn Lie <bjorn....@gmail.com> + +- Update to version 1.16.1: + + GStreamer-vaapi: fix green frames and decoding artefacts in + some cases. + + OpenGL: fix wayland event source burning CPU in certain + circumstances. + + Memory leak fixes and memory footprint improvements. + + Performance improvements. + + Stability and security fixes. + + Fix enum for GST_MESSAGE_DEVICE_CHANGED which is technically an + API break, but this is only used internally in GStreamer and + duplicated another message enum. + + hls: Make crypto dependency optional when hls-crypto is auto. + + player: fix switching back and forth between forward and + reverse playback. + + decklinkaudiosink: Drop late buffers. + + openh264enc: Fix compilation with openh264 v2.0. + + wasapisrc: fix segtotal value being always 2. + +------------------------------------------------------------------- +Wed Jul 10 13:16:43 UTC 2019 - Dominique Leuenberger <dims...@opensuse.org> + +- Fix meson script using sed: since we rename gst-plugin-helper for + multi arch purpose, we also need to fix meson.build to make the + code look for the correct name (boo#1140998). + +------------------------------------------------------------------- +Mon Jul 1 09:45:51 UTC 2019 - Andreas Schwab <sch...@suse.de> + +- Use libunwind only if available + +------------------------------------------------------------------- +Wed Jun 12 20:08:46 UTC 2019 - mgo...@suse.com + +- Update to version 1.16.0: + + Highlights + - GStreamer WebRTC stack gained support for data channels for + peer-to-peer communication based on SCTP, BUNDLE support, + as well as support for multiple TURN servers. + - AV1 video codec support for Matroska and QuickTime/MP4 + containers and more configuration options and supported + input formats for the AOMedia AV1 encoder + - Support for Closed Captions and other Ancillary Data in video + - Support for planar (non-interleaved) raw audio + - GstVideoAggregator, compositor and OpenGL mixer elements are + now in -base + - New alternate fields interlace mode where each buffer carries + a single field + - WebM and Matroska ContentEncryption support in the Matroska + demuxer + - new WebKit WPE-based web browser source element + - Video4Linux: HEVC encoding and decoding, JPEG encoding, and + improved dmabuf import/export + - Hardware-accelerated Nvidia video decoder gained support for + VP8/VP9 decoding, whilst the encoder gained support for + H.265/HEVC encoding. + - Many improvements to the Intel Media SDK based + hardware-accelerated video decoder and encoder plugin + (msdk): dmabuf import/export for zero-copy integration with + other components; VP9 decoding; 10-bit HEVC encoding; video + post-processing (vpp) support including deinterlacing; and + the video decoder now handles dynamic resolution changes. + - The ASS/SSA subtitle overlay renderer can now handle multiple + subtitles that overlap in time and will show them on screen + simultaneously + - The Meson build is now feature-complete (*) and it is now the + recommended build system on all platforms. The Autotools + build is scheduled to be removed in the next cycle. + - The GStreamer Rust bindings and Rust plugins module are now + officially part of upstream GStreamer. + - The GStreamer Editing Services gained a gesdemux element + that allows directly playing back serialized edit list with + playbin or (uri)decodebin + - Many performance improvements +- Switch to meson on Tumbleweed. +- Rebase gstreamer-rpm-prov.patch. +- Require libdw. Helps with generating backtraces. +- Place gdb autoload files in -devel package. +- Add gstreamer-pie.patch to generate position-independent + executables. Previously done through CFLAGS/LDFLAGS, but this + makes ninja pass -pie when linking libraries as well, causing + the link to fail. +- Now requires glib2 >= 2.40.0. + +------------------------------------------------------------------- +Fri May 31 21:23:20 UTC 2019 - Bj??rn Lie <bjorn....@gmail.com> + +- Update to version 1.14.5: + + aggregator: + - Take the pad lock around queue gap event removal. + - Don???t leak gap buffer when out of segment. + + buffer: fix possible memory corruption in + gst_buffer_foreach_meta() when removing metas. + + bus: + - Make removing of signal/bus watches thread-safe. + - Don???t allow removing signal watches with + gst_bus_remove_watch(). + + controlbinding: Check if the weak pointer was cleared before + explicitly removing it. + + ptp clock: Wait for ANNOUNCE before selecting a master; + increase tolerance for late follow-up and delay-resp. + + segment: Allow stop == -1 in gst_segment_to_running_time() and + negative rate. + + g-i: annotations fixes. + +------------------------------------------------------------------- +Wed Oct 03 00:54:38 UTC 2018 - s...@suspend.net + +- Update to version 1.14.4: + + glviewconvert: wait and set the gl sync meta on buffers. + + glviewconvert: copy composition meta from the primary buffer to + both outputs. + + glcolorconvert: don't copy overlay composition meta over to + NULL outbufs. + + matroskademux: add functionality needed for MSE use case fixing + youtube playback in epiphany/webkit-gtk. + + tagdemux: Use upstream GST_EVENT_STREAM_START (and stream-id) + if present. + + vorbisdec: fix header handling regression: init decoder + immediately once we have headers. + + wasapisink: recover from low buffer levels in shared mode. + + fix GstSegment unit test which would fail on some 32-bit x86 + CPUs. + +------------------------------------------------------------------- +Wed Sep 26 20:18:24 UTC 2018 - bjorn....@gmail.com + +- Update to version 1.14.3: + + opusenc: fix crash on 32-bit platforms. + + compositor: fix major buffer leak when doing crossfading on + some but not all pads. + + wasapi: various fixes for wasapisrc and wasapisink regressions. + + x264enc: Set bit depth to fix "This build of x264 requires + 8-bit depth. Rebuild to..." runtime errors with x264 version + ??? 153. + + audioaggregator, audiomixer: caps negotiation fixes. + + input-selector: latency handling fixes. ++++ 2623 more lines (skipped) ++++ between /dev/null ++++ and /work/SRC/openSUSE:Leap:15.2:Update/.gstreamer.16413.new.1898/gstreamer.changes New: ---- baselibs.conf gstreamer-1.16.3.tar.xz gstreamer-pie.patch gstreamer-rpm-prov.patch gstreamer.changes gstreamer.macros gstreamer.prov gstreamer.spec ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gstreamer.spec ++++++ # # spec file for package gstreamer # # Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ # %if 0%{?suse_version} > 1500 %define use_meson 1 %else %define use_meson 0 %endif %define gst_branch 1.0 Name: gstreamer Version: 1.16.3 Release: 0 Summary: Streaming-Media Framework Runtime License: LGPL-2.1-or-later Group: Productivity/Multimedia/Other URL: http://gstreamer.freedesktop.org/ Source0: https://gstreamer.freedesktop.org/src/gstreamer/%{name}-%{version}.tar.xz Source1: gstreamer.macros Source2: gstreamer.prov Source99: baselibs.conf # PATCH-FEATURE-UPSTREAM gstreamer-rpm-prov.patch bgo#588784 dims...@opensuse.org -- Add --rpm parameter to allow creation of rpm provides, patch from fedora Patch1: gstreamer-rpm-prov.patch # PATCH-FIX-OPENSUSE gstreamer-pie.patch mgo...@suse.com -- create position-independent executables. Patch2: gstreamer-pie.patch BuildRequires: bison >= 2.4 BuildRequires: check-devel BuildRequires: fdupes BuildRequires: flex >= 2.5.31 BuildRequires: gnome-patch-translation BuildRequires: gobject-introspection-devel >= 1.31.1 BuildRequires: gtk-doc >= 1.12 BuildRequires: libcap-devel BuildRequires: libcap-progs %if %{use_meson} BuildRequires: meson >= 0.47.0 %else BuildRequires: libtool %endif BuildRequires: pkgconfig BuildRequires: python3-base BuildRequires: python3-xml BuildRequires: translation-update-upstream BuildRequires: pkgconfig(bash-completion) >= 2.0 BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(gio-unix-2.0) BuildRequires: pkgconfig(glib-2.0) >= 2.40.0 BuildRequires: pkgconfig(gmodule-2.0) BuildRequires: pkgconfig(gobject-2.0) BuildRequires: pkgconfig(libdw) %define libunwind_archs %{ix86} ia64 x86_64 %{arm} ppc ppc64 ppc64le aarch64 %ifarch %{libunwind_archs} BuildRequires: pkgconfig(libunwind) %endif # Ensure that the documentation corresponds with the installed version: Requires: libgstreamer-1_0-0 = %{version} # Core modules may depend on new enough libraries: Requires: libgstreamer-1_0-0 >= %{version} Requires(pre): permissions Recommends: %{name}-lang = %{version} # Generic name, never used in SuSE: Provides: gstreamer-doc = %{version} %description GStreamer is a streaming-media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plug-in-based architecture means that new data types or processing capabilities can be added by installing new plug-ins. %package -n libgstreamer-1_0-0 Summary: Streaming-Media Framework Runtime # We want to have core modules installed: Group: System/Libraries Requires: %{name} %description -n libgstreamer-1_0-0 GStreamer is a streaming-media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plug-in-based architecture means that new data types or processing capabilities can be added by installing new plug-ins. %package -n typelib-1_0-Gst-1_0 Summary: Streaming-Media Framework Runtime -- Introspection bindings Group: System/Libraries %description -n typelib-1_0-Gst-1_0 GStreamer is a streaming-media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plug-in-based architecture means that new data types or processing capabilities can be added by installing new plug-ins. This package provides the GObject Introspection bindings for GStreamer. %package doc Summary: GStreamer Streaming-Media Framework Plug-Ins Group: Development/Libraries/C and C++ Requires: %{name} = %{version} %description doc GStreamer is a streaming media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plugin-based architecture means that new data types or processing capabilities can be added simply by installing new plug-ins. %package utils Summary: Streaming-Media Framework Runtime # Generic name, never used in SuSE: Group: Productivity/Multimedia/Other Provides: gstreamer:%{_bindir}/gst-launch-%{gst_branch} = %{version} # Symbol for unversioned wrappers: Provides: gstreamer-utils_versioned = %{version} %description utils GStreamer is a streaming-media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plug-in-based architecture means that new data types or processing capabilities can be added by installing new plug-ins. %package devel Summary: Include Files and Libraries mandatory for Development Group: Development/Libraries/C and C++ Requires: %{name} = %{version} # gstreamer-utils is required for the gstreamer-provides rpm magic. Requires: gstreamer-utils = %{version} Requires: libgstreamer-1_0-0 = %{version} Requires: typelib-1_0-Gst-1_0 = %{version} %description devel This package contains all necessary include files and libraries needed to develop applications that require these. %lang_package %prep %setup -q -n gstreamer-%{version} translation-update-upstream po gstreamer-%{gst_branch} gnome-patch-translation-prepare po gstreamer-%{gst_branch} # The order matters. Only run gnome-patch-translation-update after patching! %patch1 -p1 %patch2 -p1 gnome-patch-translation-update po gstreamer-%{gst_branch} %build export PYTHON=%{_bindir}/python3 %if %{use_meson} sed -i "s/^executable('gst-plugin-scanner',/executable('gst-plugin-scanner-%{_target_cpu}',/" libs/gst/helpers/meson.build sed -i "s/gst-plugin-scanner/gst-plugin-scanner-%{_target_cpu}/" meson.build # TODO: enable dbghelp %{meson} \ -Dptp-helper-permissions=capabilities \ -Dpackage-name='openSUSE GStreamer package' \ -Dpackage-origin='http://download.opensuse.org' \ -Dgtk_doc=enabled \ -Dintrospection=enabled \ -Dbenchmarks=disabled \ -Dexamples=disabled \ -Dtests=disabled \ -Ddbghelp=disabled \ %ifnarch %{libunwind_archs} -Dlibunwind=disabled \ %endif %{nil} %{meson_build} %else export CFLAGS="%{optflags} -fPIE" export LDFLAGS="-pie" %configure \ --with-ptp-helper-permissions=capabilities \ --with-package-name='openSUSE GStreamer package' \ --with-package-origin='http://download.opensuse.org' \ --enable-gtk-doc \ --enable-introspection \ --disable-benchmarks \ --disable-examples \ --disable-static \ --disable-tests \ --program-transform-name='s/gst-plugin-scanner/gst-plugin-scanner-%{_target_cpu}/' \ %{nil} %make_build %endif %install %if %{use_meson} %{meson_install} %else %make_install %endif %find_lang %{name}-%{gst_branch} find %{buildroot} -type f -name "*.la" -delete -print mkdir -p %{buildroot}%{_datadir}/gstreamer-%{gst_branch}/presets # Install the rpm macros install -m644 -D %{SOURCE1} %{buildroot}%{_libexecdir}/rpm/fileattrs/gstreamer.attr install -m755 -D %{SOURCE2} %{buildroot}%{_libexecdir}/rpm/gstreamer-provides %fdupes %{buildroot}%{_datadir}/gtk-doc %verifyscript %verify_permissions -e %{_libexecdir}/gstreamer-%{gst_branch}/gst-ptp-helper %post %set_permissions %{_libexecdir}/gstreamer-%{gst_branch}/gst-ptp-helper %post -n libgstreamer-1_0-0 -p /sbin/ldconfig %postun -n libgstreamer-1_0-0 -p /sbin/ldconfig %files %license COPYING %dir %{_datadir}/gstreamer-%{gst_branch} %dir %{_datadir}/gstreamer-%{gst_branch}/presets %dir %{_libdir}/gstreamer-%{gst_branch} %{_libdir}/gstreamer-%{gst_branch}/libgstcoreelements.so %{_libdir}/gstreamer-%{gst_branch}/libgstcoretracers.so %dir %{_libexecdir}/gstreamer-%{gst_branch} %{_libexecdir}/gstreamer-%{gst_branch}/gst-completion-helper %{_libexecdir}/gstreamer-%{gst_branch}/gst-plugin-scanner-%{_target_cpu} %verify(not mode caps) %{_libexecdir}/gstreamer-%{gst_branch}/gst-ptp-helper %{_datadir}/bash-completion/completions/ %{_datadir}/bash-completion/helpers/ %files -n libgstreamer-1_0-0 %{_libdir}/*.so.* %files -n typelib-1_0-Gst-1_0 %{_libdir}/girepository-1.0/Gst-1.0.typelib %{_libdir}/girepository-1.0/GstBase-1.0.typelib %{_libdir}/girepository-1.0/GstCheck-1.0.typelib %{_libdir}/girepository-1.0/GstController-1.0.typelib %{_libdir}/girepository-1.0/GstNet-1.0.typelib %files utils %{_bindir}/*-%{gst_branch} %{_mandir}/man?/*-%{gst_branch}*%{ext_man} %files devel %{_datadir}/aclocal/*.m4 # Own these directories to avoid build requirement on gdb # only for directories ownership %dir %{_datadir}/gdb %dir %{_datadir}/gdb/auto-load %dir %{_datadir}/gdb/auto-load%{_prefix} %dir %{_datadir}/gdb/auto-load%{_libdir} %{_datadir}/gdb/auto-load%{_libdir}/lib%{name}*.py %dir %{_datadir}/gstreamer-%{gst_branch}/gdb %{_datadir}/gstreamer-%{gst_branch}/gdb/glib_gobject_helper.py %{_datadir}/gstreamer-%{gst_branch}/gdb/gst_gdb.py %{_includedir}/* %{_libdir}/*.so %{_libdir}/pkgconfig/*.pc %{_libexecdir}/rpm/gstreamer-provides %{_libexecdir}/rpm/fileattrs/gstreamer.attr %{_datadir}/gir-1.0/*.gir %files doc %doc AUTHORS ChangeLog NEWS README RELEASE %{_datadir}/gtk-doc/html/* %files lang -f %{name}-%{gst_branch}.lang %changelog ++++++ baselibs.conf ++++++ gstreamer +/usr/lib/gstreamer-.*/gst-plugin-scanner-.* libgstreamer-1_0-0 requires "gstreamer-<targettype>" ++++++ gstreamer-pie.patch ++++++ diff -urp gstreamer-1.16.0.orig/libs/gst/helpers/meson.build gstreamer-1.16.0/libs/gst/helpers/meson.build --- gstreamer-1.16.0.orig/libs/gst/helpers/meson.build 2019-01-26 19:10:08.000000000 -0600 +++ gstreamer-1.16.0/libs/gst/helpers/meson.build 2019-06-12 15:06:33.120486636 -0500 @@ -5,6 +5,7 @@ executable('gst-plugin-scanner', dependencies : [gobject_dep, gmodule_dep, glib_dep, mathlib, gst_dep], install_dir : helpers_install_dir, install: true, + pie: true, ) # Used in test env setup to make tests find plugin scanner in build tree @@ -18,6 +19,7 @@ if bashcomp_found dependencies : [gobject_dep, glib_dep, gst_dep], install_dir : helpers_install_dir, install: true, + pie: true, ) endif @@ -118,7 +120,8 @@ if have_ptp include_directories : [configinc, libsinc], dependencies : [gio_dep, gobject_dep, glib_dep, mathlib, gst_dep, cap_dep], install_dir : helpers_install_dir, - install : true) + install : true, + pie : true) meson.add_install_script('ptp_helper_post_install.sh', helpers_install_dir, with_ptp_helper_permissions, ++++++ gstreamer-rpm-prov.patch ++++++ diff -urp gstreamer-1.16.0.orig/tools/gst-inspect.c gstreamer-1.16.0/tools/gst-inspect.c --- gstreamer-1.16.0.orig/tools/gst-inspect.c 2019-04-11 17:58:09.000000000 -0500 +++ gstreamer-1.16.0/tools/gst-inspect.c 2019-06-12 09:28:27.004257869 -0500 @@ -1730,7 +1730,224 @@ print_tracer_info (GstPluginFeature * fe * is meant for machines, not humans. */ static void -print_plugin_automatic_install_info_codecs (GstElementFactory * factory) +print_gst_structure_append_field (GList * strings, const char *field) +{ + GList *s; + + //g_message ("adding '%s' to the string", field); + + for (s = strings; s != NULL; s = s->next) { + g_string_append (s->data, field); + } +} + +static void +print_gst_structure_append_field_index (GList * strings, const char *field, + guint num_items, guint offset) +{ + GList *s; + guint i; + + //g_message ("adding '%s' to the string (num: %d offset: %d)", field, num_items, offset); + + for (s = strings, i = 0; s != NULL; s = s->next, i++) { + if (i == offset) { + //g_message ("adding '%s' at '%d'", field, i); + g_string_append (s->data, field); + } + if (i == num_items) + i = 0; + } + +} + +static GList * +print_gst_structure_dup_fields (GList * strings, guint num_items) +{ + guint new_items, i; + + if (num_items == 1) + return strings; + + //g_message ("creating %d new items", num_items); + + new_items = g_list_length (strings) * (num_items - 1); + for (i = 0; i < new_items; i++) { + GString *s, *first; + + first = strings->data; + s = g_string_new_len (first->str, first->len); + strings = g_list_prepend (strings, s); + } + + return strings; +} + +enum +{ + FIELD_VERSION = 0, + FIELD_LAYER, + FIELD_VARIANT, + FIELD_SYSTEMSTREAM +}; + +static int +field_get_type (const char *field_name) +{ + if (strstr (field_name, "version") != NULL) + return FIELD_VERSION; + if (strcmp (field_name, "layer") == 0) + return FIELD_LAYER; + if (strcmp (field_name, "systemstream") == 0) + return FIELD_SYSTEMSTREAM; + if (strcmp (field_name, "variant") == 0) + return FIELD_VARIANT; + + return -1; +} + +static gint +fields_type_compare (const char *a, const char *b) +{ + gint a_type, b_type; + + a_type = field_get_type (a); + b_type = field_get_type (b); + if (a_type < b_type) + return -1; + if (b_type < a_type) + return 1; + return 0; +} + +static void +print_gst_structure_for_rpm (const char *type_name, GstStructure * s) +{ + guint i, num_fields; + const char *name; + GList *fields, *l, *strings; + GString *string; + + name = gst_structure_get_name (s); + strings = NULL; + num_fields = gst_structure_n_fields (s); + fields = NULL; + + for (i = 0; i < num_fields; i++) { + const char *field_name; + + field_name = gst_structure_nth_field_name (s, i); + if (field_get_type (field_name) < 0) { + //g_message ("ignoring field named %s", field_name); + continue; + } + + fields = + g_list_insert_sorted (fields, g_strdup (field_name), + (GCompareFunc) fields_type_compare); + } + + /* Example: + * gstreamer1(decoder-video/mpeg)(mpegversion=1)()(64bit) */ + string = g_string_new ("gstreamer1"); + g_string_append_c (string, '('); + g_string_append (string, type_name); + g_string_append_c (string, '-'); + g_string_append (string, name); + g_string_append_c (string, ')'); + + strings = g_list_append (strings, string); + + for (l = fields; l != NULL; l = l->next) { + char *field_name; + GType type; + + field_name = l->data; + + type = gst_structure_get_field_type (s, field_name); + //g_message ("field is: %s, type: %s", field_name, g_type_name (type)); + + if (type == G_TYPE_INT) { + char *field; + int value; + + gst_structure_get_int (s, field_name, &value); + field = g_strdup_printf ("(%s=%d)", field_name, value); + print_gst_structure_append_field (strings, field); + g_free (field); + } else if (type == G_TYPE_BOOLEAN) { + char *field; + int value; + + gst_structure_get_boolean (s, field_name, &value); + field = g_strdup_printf ("(%s=%s)", field_name, value ? "true" : "false"); + print_gst_structure_append_field (strings, field); + g_free (field); + } else if (type == GST_TYPE_INT_RANGE) { + const GValue *value; + int min, max; + + value = gst_structure_get_value (s, field_name); + min = gst_value_get_int_range_min (value); + max = gst_value_get_int_range_max (value); + + strings = print_gst_structure_dup_fields (strings, max - min + 1); + + for (i = min; i <= max; i++) { + char *field; + + field = g_strdup_printf ("(%s=%d)", field_name, i); + print_gst_structure_append_field_index (strings, field, max - min + 1, + i - min); + g_free (field); + } + } else if (type == GST_TYPE_LIST) { + const GValue *value; + int num_items; + + value = gst_structure_get_value (s, field_name); + num_items = gst_value_list_get_size (value); + + strings = print_gst_structure_dup_fields (strings, num_items); + + for (i = 0; i < num_items; i++) { + char *field; + const GValue *item_value; + + item_value = gst_value_list_get_value (value, i); + field = g_strdup_printf ("(%s=%d)", field_name, + g_value_get_int (item_value)); + print_gst_structure_append_field_index (strings, field, num_items, i); + g_free (field); + } + } else if (type == G_TYPE_STRING) { + char *field; + const char *value; + + value = gst_structure_get_string (s, field_name); + field = g_strdup_printf ("(%s=%s)", field_name, value); + print_gst_structure_append_field (strings, field); + g_free (field); + } else { + g_warning ("unhandled type! %s", g_type_name (type)); + } + + g_free (field_name); + } + + g_list_free (fields); + + for (l = strings; l != NULL; l = l->next) { + string = l->data; + g_print ("%s\n", string->str); + g_string_free (string, TRUE); + } + g_list_free (strings); +} + +static void +print_plugin_automatic_install_info_codecs (GstElementFactory * factory, + gboolean rpm_format) { GstPadDirection direction; const gchar *type_name; @@ -1756,6 +1973,13 @@ print_plugin_automatic_install_info_code return; } + if (rpm_format) { + /* Ignore NONE ranked plugins */ + if ((gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (factory))) == + GST_RANK_NONE) + return; + } + /* decoder/demuxer sink pads should always be static and there should only * be one, the same applies to encoders/muxers and source pads */ static_templates = gst_element_factory_get_static_pad_templates (factory); @@ -1792,15 +2016,20 @@ print_plugin_automatic_install_info_code gst_structure_remove_field (s, "rate"); gst_structure_remove_field (s, "depth"); gst_structure_remove_field (s, "clock-rate"); - s_str = gst_structure_to_string (s); - g_print ("%s-%s\n", type_name, s_str); - g_free (s_str); + if (!rpm_format) { + s_str = gst_structure_to_string (s); + g_print ("%s-%s\n", type_name, s_str); + g_free (s_str); + } else { + print_gst_structure_for_rpm (type_name, s); + } } gst_caps_unref (caps); } static void -print_plugin_automatic_install_info_protocols (GstElementFactory * factory) +print_plugin_automatic_install_info_protocols (GstElementFactory * factory, + gboolean rpm_format) { const gchar *const *protocols; @@ -1809,13 +2038,19 @@ print_plugin_automatic_install_info_prot switch (gst_element_factory_get_uri_type (factory)) { case GST_URI_SINK: while (*protocols != NULL) { - g_print ("urisink-%s\n", *protocols); + if (!rpm_format) + g_print ("urisink-%s\n", *protocols); + else + g_print ("gstreamer1(urisink-%s)\n", *protocols); ++protocols; } break; case GST_URI_SRC: while (*protocols != NULL) { - g_print ("urisource-%s\n", *protocols); + if (!rpm_format) + g_print ("urisource-%s\n", *protocols); + else + g_print ("gstreamer1(urisource-%s)\n", *protocols); ++protocols; } break; @@ -1826,7 +2061,7 @@ print_plugin_automatic_install_info_prot } static void -print_plugin_automatic_install_info (GstPlugin * plugin) +print_plugin_automatic_install_info (GstPlugin * plugin, gboolean rpm_format) { GList *features, *l; @@ -1845,11 +2080,15 @@ print_plugin_automatic_install_info (Gst if (feature_plugin == plugin) { GstElementFactory *factory; - g_print ("element-%s\n", gst_plugin_feature_get_name (feature)); + if (!rpm_format) + g_print ("element-%s\n", gst_plugin_feature_get_name (feature)); + else + g_print ("gstreamer1(element-%s)\n", + gst_plugin_feature_get_name (feature)); factory = GST_ELEMENT_FACTORY (feature); - print_plugin_automatic_install_info_protocols (factory); - print_plugin_automatic_install_info_codecs (factory); + print_plugin_automatic_install_info_protocols (factory, rpm_format); + print_plugin_automatic_install_info_codecs (factory, rpm_format); } if (feature_plugin) gst_object_unref (feature_plugin); @@ -1871,7 +2110,7 @@ print_all_plugin_automatic_install_info plugin = (GstPlugin *) (plugins->data); plugins = g_list_next (plugins); - print_plugin_automatic_install_info (plugin); + print_plugin_automatic_install_info (plugin, FALSE); } gst_plugin_list_free (orig_plugins); } @@ -1938,6 +2177,7 @@ main (int argc, char *argv[]) gboolean do_print_blacklist = FALSE; gboolean plugin_name = FALSE; gboolean print_aii = FALSE; + gboolean print_aii_rpm = FALSE; gboolean uri_handlers = FALSE; gboolean check_exists = FALSE; gchar *min_version = NULL; @@ -1958,6 +2198,9 @@ main (int argc, char *argv[]) "or all plugins provide.\n " "Useful in connection with external automatic plugin " "installation mechanisms"), NULL}, + {"rpm", '\0', 0, G_OPTION_ARG_NONE, &print_aii_rpm, + N_("Print the machine-parsable list of features of a plugin in RPM " + "Provides compatible-format"), NULL}, {"plugin", '\0', 0, G_OPTION_ARG_NONE, &plugin_name, N_("List the plugin contents"), NULL}, {"types", 't', 0, G_OPTION_ARG_STRING, &types, @@ -2113,7 +2356,7 @@ main (int argc, char *argv[]) /* if there is such a plugin, print out info */ if (plugin) { if (print_aii) { - print_plugin_automatic_install_info (plugin); + print_plugin_automatic_install_info (plugin, print_aii_rpm); } else { print_plugin_info (plugin); print_plugin_features (plugin); @@ -2126,13 +2369,17 @@ main (int argc, char *argv[]) if (plugin) { if (print_aii) { - print_plugin_automatic_install_info (plugin); + print_plugin_automatic_install_info (plugin, print_aii_rpm); } else { print_plugin_info (plugin); print_plugin_features (plugin); } } else { - g_printerr (_("Could not load plugin file: %s\n"), error->message); + if (!print_aii_rpm) + g_print (_("Could not load plugin file: %s\n"), error->message); + else + g_printerr (_("Could not load plugin file: %s\n"), + error->message); g_clear_error (&error); exit_code = -1; goto done; ++++++ gstreamer.macros ++++++ %__gstreamer_provides %{_rpmconfigdir}/gstreamer-provides %__gstreamer_path libgst %__gstreamer_magic ELF.*(shared object|executable) %__gstreamer_flags magic_and_path ++++++ gstreamer.prov ++++++ #!/bin/bash # # Script to install in: # /usr/lib/rpm/redhat/find-provides.d # # Transform GStreamer auto install info into RPM provides # # Author: Bastien Nocera <had...@hadess.net> # Based on other provides scripts from RPM # # We need a way to disable automatic gst provides. # Simply "%define SKIP_GSTPROVIDES 1" anywhere in the spec file grep -q -E '^[^#]?%define\s+SKIP_GSTPROVIDES\s.*[^0\s].*' "$RPMBUILD_SPECFILE" && exit 0 filelist=`grep -e '.so$' | sed "s/['\"]/\\\&/g"` # --- Alpha does not mark 64bit dependencies??????? case `uname -m` in alpha*) mark64="" ;; *) mark64="()(64bit)" ;; esac solist=$(echo $filelist | grep "libgst" | \ xargs file -L 2>/dev/null | grep -E "ELF.*(shared object|executable)" | cut -d: -f1 ) function getmark() { lib64=`if file -L $1 2>/dev/null | \ grep "ELF 64-bit" >/dev/null; then echo -n "$mark64"; fi` } function libdir() { buildlibdir=`dirname $1` buildlibdir=`dirname $buildlibdir` } for so in $solist ; do getmark $so libdir $so LD_LIBRARY_PATH=$buildlibdir gst-inspect-1.0 --print-plugin-auto-install-info --rpm $so 2> /dev/null | while read line ; do echo -n "$line"; echo -n "$lib64" echo done done