diff --git a/anda/lib/openh264/anda.hcl b/anda/lib/openh264/anda.hcl new file mode 100644 index 0000000000..e652be253d --- /dev/null +++ b/anda/lib/openh264/anda.hcl @@ -0,0 +1,5 @@ +project pkg { + rpm { + spec = "openh264.spec" + } +} diff --git a/anda/lib/openh264/gst-p-bad-cleanup.sh b/anda/lib/openh264/gst-p-bad-cleanup.sh new file mode 100644 index 0000000000..92211717e0 --- /dev/null +++ b/anda/lib/openh264/gst-p-bad-cleanup.sh @@ -0,0 +1,201 @@ +#!/bin/sh + +# Process a gst-plugins-bad tarball to remove +# unwanted GStreamer plugins. +# +# This script here is taken from Fedora gstreamer1-plugins-bad-free repo, with +# only change being openh264 addition. +# +# See https://bugzilla.redhat.com/show_bug.cgi?id=532470 +# for details +# +# Bastien Nocera - 2010 +# + +SOURCE="$1" +NEW_SOURCE=`echo $SOURCE | sed 's/bad-/bad-openh264-/'` +DIRECTORY=`echo $SOURCE | sed 's/\.tar\.xz//'` + +ALLOWED=" +aacparse +accurip +adpcmdec +adpcmenc +aiff +aiffparse +amrparse +asfmux +audiobuffersplit +audiofxbad +audiolatency +audiomixer +audiomixmatrix +audioparsers +audiovisualizers +autoconvert +bayer +camerabin +camerabin2 +cdxaparse +codecalpha +codectimestamper +coloreffects +colorspace +compositor +dataurisrc +dccp +debugutils +dtmf +dvbsubenc +faceoverlay +festival +fieldanalysis +freeverb +freeze +frei0r +gaudieffects +gdp +geometrictransform +h264parse +hdvparse +hls +id3tag +inter +interlace +invtelecine +ivfparse +ivtc +jpegformat +jp2kdecimator +legacyresample +librfb +liveadder +midi +mve +mpegdemux +mpeg4videoparse +mpegpsmux +mpegtsdemux +mpegtsmux +mpegvideoparse +mxf +netsim +nsf +nuvdemux +onvif +openh264 +patchdetect +pcapparse +pnm +proxy +qtmux +rawparse +removesilence +rist +rtmp2 +rtp +rtpmux +rtpvp8 +scaletempo +sdi +sdp +segmentclip +selector +smooth +speed +stereo +subenc +switchbin +timecode +transcode +tta +valve +videofilters +videoframe_audiolevel +videomaxrate +videomeasure +videoparsers +videosignal +vmnc +yadif +y4m +" + +NOT_ALLOWED=" +dvbsuboverlay +dvdspu +real +siren +" + +error() +{ + MESSAGE=$1 + echo $MESSAGE + exit 1 +} + +check_allowed() +{ + MODULE=$1 + for i in $ALLOWED ; do + if test x$MODULE = x$i ; then + return 0; + fi + done + # Ignore errors coming from ext/ directory + # they require external libraries so are ineffective anyway + return 1; +} + +check_not_allowed() +{ + MODULE=$1 + for i in $NOT_ALLOWED ; do + if test x$MODULE = x$i ; then + return 0; + fi + done + return 1; +} + +rm -rf $DIRECTORY +tar xJf $SOURCE || error "Cannot unpack $SOURCE" +pushd $DIRECTORY > /dev/null || error "Cannot open directory \"$DIRECTORY\"" + +unknown="" +for subdir in gst ext sys; do + for dir in $subdir/* ; do + # Don't touch non-directories + if ! [ -d $dir ] ; then + continue; + fi + MODULE=`basename $dir` + if ( check_not_allowed $MODULE ) ; then + echo "**** Removing $MODULE ****" + echo "Removing directory $dir" + rm -r $dir || error "Cannot remove $dir" + echo + elif test $subdir = ext || test $subdir = sys; then + # Ignore library or system non-blacklisted plugins + continue; + elif ! ( check_allowed $MODULE ) ; then + echo "Unknown module in $dir" + unknown="$unknown $dir" + fi + done +done + +echo + +if test "x$unknown" != "x"; then + echo -n "Aborting due to unkown modules: " + echo "$unknown" | sed "s/ /\n /g" + exit 1 +fi + +popd > /dev/null + +tar cJf $NEW_SOURCE $DIRECTORY +echo "$NEW_SOURCE is ready to use" + diff --git a/anda/lib/openh264/hardcode-openh264-dep.patch b/anda/lib/openh264/hardcode-openh264-dep.patch new file mode 100644 index 0000000000..fbedcd96e1 --- /dev/null +++ b/anda/lib/openh264/hardcode-openh264-dep.patch @@ -0,0 +1,14 @@ +diff -up gst-plugins-bad-1.18.2/ext/openh264/meson.build.orig gst-plugins-bad-1.18.2/ext/openh264/meson.build +--- gst-plugins-bad-1.18.2/ext/openh264/meson.build.orig 2020-12-06 14:24:13.000000000 +0100 ++++ gst-plugins-bad-1.18.2/ext/openh264/meson.build 2021-02-11 11:48:58.660450319 +0100 +@@ -4,9 +4,7 @@ openh264_sources = [ + 'gstopenh264plugin.c', + ] + +-openh264_dep = dependency('openh264', version : '>= 1.3.0', +- required : get_option('openh264'), +- fallback: ['openh264', 'openh264_dep']) ++openh264_dep = cc.find_library('openh264') + + if openh264_dep.found() + gstopenh264 = library('gstopenh264', diff --git a/anda/lib/openh264/openh264.spec b/anda/lib/openh264/openh264.spec new file mode 100644 index 0000000000..46f5180d0f --- /dev/null +++ b/anda/lib/openh264/openh264.spec @@ -0,0 +1,213 @@ +# ref: https://src.fedoraproject.org/rpms/openh264 +%global commit1 3a01c086d1b0394238ff1b5ad22e76022830625a +%global shortcommit1 %(c=%{commit1}; echo ${c:0:7}) + +%global openh264_version 2.3.1 +%global gst_version 1.22.5 + +Name: openh264 +Version: %{openh264_version} +# Also bump the Release tag for gstreamer1-plugin-openh264 down below +Release: 1%{?dist} +Summary: H.264 codec library + +License: BSD +URL: https://www.openh264.org/ +Source0: https://github.com/cisco/openh264/archive/v%{openh264_version}/openh264-%{openh264_version}.tar.gz +Source1: https://github.com/mozilla/gmp-api/archive/%{commit1}/gmp-api-%{shortcommit1}.tar.gz +# The source is: +# http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-%%{gst_version}.tar.xz +# modified with gst-p-bad-cleanup.sh from SOURCE3 +Source2: gst-plugins-bad-openh264-%{gst_version}.tar.xz +Source3: gst-p-bad-cleanup.sh + +# Don't use pkg-config for finding openh264 as we are building against an in-tree copy +Patch2: hardcode-openh264-dep.patch + +BuildRequires: gcc-c++ +BuildRequires: gstreamer1-devel >= %{gst_version} +BuildRequires: gstreamer1-plugins-base-devel >= %{gst_version} +BuildRequires: make +BuildRequires: meson +BuildRequires: nasm + +%description +OpenH264 is a codec library which supports H.264 encoding and decoding. It is +suitable for use in real time applications such as WebRTC. + + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{openh264_version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + + +%package -n mozilla-openh264 +Summary: H.264 codec support for Mozilla browsers +Requires: %{name}%{?_isa} = %{openh264_version}-%{release} +Requires: mozilla-filesystem%{?_isa} + +%description -n mozilla-openh264 +The mozilla-openh264 package contains a H.264 codec plugin for Mozilla +browsers. + + +%package -n gstreamer1-plugin-openh264 +Version: %{gst_version} +Release: 2%{?dist} +Summary: GStreamer H.264 plugin + +%description -n gstreamer1-plugin-openh264 +GStreamer is a streaming media framework, based on graphs of elements which +operate on media data. + +This package contains the H.264 plugin. + + +%prep +%setup -q + +# Extract gmp-api archive +tar -xf %{S:1} +mv gmp-api-%{commit1} gmp-api + +# Extract gst-plugins-bad-free archive +tar -xf %{S:2} +pushd gst-plugins-bad-%{gst_version} +%patch2 -p1 +popd + + +%build +# Update the makefile with our build options +# Must be done in %%build in order to pick up correct LDFLAGS. +sed -i -e 's|^CFLAGS_OPT=.*$|CFLAGS_OPT=%{optflags}|' Makefile +sed -i -e 's|^PREFIX=.*$|PREFIX=%{_prefix}|' Makefile +sed -i -e 's|^LIBDIR_NAME=.*$|LIBDIR_NAME=%{_lib}|' Makefile +sed -i -e 's|^SHAREDLIB_DIR=.*$|SHAREDLIB_DIR=%{_libdir}|' Makefile +sed -i -e '/^CFLAGS_OPT=/i LDFLAGS=%{__global_ldflags}' Makefile + +# First build the openh264 libraries +make %{?_smp_mflags} + +# ... then build the mozilla plugin +make plugin %{?_smp_mflags} + +# ... and finally build the gstreamer plugin against the previously built +# openh264 libraries +pushd gst-plugins-bad-%{gst_version} +CFLAGS="%{build_cflags} -I`pwd`/../codec/api" \ +CXXFLAGS="%{build_cflags} -I`pwd`/../codec/api" \ +LDFLAGS="%{build_ldflags} -L`pwd`/.." \ +%meson \ + --auto-features=disabled \ + -D package-name="Fedora gstreamer1-plugin-openh264 package" \ + -D package-origin="http://www.openh264.org/" \ + -D openh264=enabled +%meson_build +popd + + +%install +%make_install + +# Install mozilla plugin +mkdir -p $RPM_BUILD_ROOT%{_libdir}/mozilla/plugins/gmp-gmpopenh264/system-installed +cp -a libgmpopenh264.so* gmpopenh264.info $RPM_BUILD_ROOT%{_libdir}/mozilla/plugins/gmp-gmpopenh264/system-installed/ + +mkdir -p $RPM_BUILD_ROOT%{_libdir}/firefox/defaults/pref +cat > $RPM_BUILD_ROOT%{_libdir}/firefox/defaults/pref/gmpopenh264.js << EOF +pref("media.gmp-gmpopenh264.autoupdate", false); +pref("media.gmp-gmpopenh264.version", "system-installed"); +EOF + +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/profile.d +cat > $RPM_BUILD_ROOT%{_sysconfdir}/profile.d/gmpopenh264.sh << EOF +MOZ_GMP_PATH="${MOZ_GMP_PATH}${MOZ_GMP_PATH:+:}%{_libdir}/mozilla/plugins/gmp-gmpopenh264/system-installed" +export MOZ_GMP_PATH +EOF + +# Remove static libraries +rm $RPM_BUILD_ROOT%{_libdir}/*.a + +# Install the gstreamer plugin +pushd gst-plugins-bad-%{gst_version} +%meson_install + +# Register as an AppStream component to be visible in the software center +# +# NOTE: It would be *awesome* if this file was maintained by the upstream +# project, translated and installed into the right place during `make install`. +# +# See http://www.freedesktop.org/software/appstream/docs/ for more details. +# +mkdir -p $RPM_BUILD_ROOT%{_datadir}/appdata +cat > $RPM_BUILD_ROOT%{_datadir}/appdata/gstreamer-openh264.appdata.xml < + + + gstreamer-openh264 + CC0-1.0 + GStreamer Multimedia Codecs - H.264 + Multimedia playback for H.264 + +

+ This addon includes a codec for H.264 playback and encoding. +

+

+ These codecs can be used to encode and decode media files where the + format is not patent encumbered. +

+

+ A codec decodes audio and video for playback or editing and is also + used for transmission or storage. + Different codecs are used in video-conferencing, streaming media and + video editing applications. +

+
+ http://gstreamer.freedesktop.org/ + https://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer + http://gstreamer.freedesktop.org/documentation/ + http://www.gnome.org/friends/ + +
+EOF + +# Remove unwanted gst-plugins-bad files +rm -rf $RPM_BUILD_ROOT%{_bindir}/gst-transcoder-1.0 +rm -rf $RPM_BUILD_ROOT%{_includedir}/gstreamer-1.0/ +rm -rf $RPM_BUILD_ROOT%{_libdir}/pkgconfig/gstreamer-*.pc +rm -rf $RPM_BUILD_ROOT%{_libdir}/libgst*.so* +rm -rf $RPM_BUILD_ROOT%{_datadir}/gstreamer-1.0/ +popd + + +%files +%license LICENSE +%doc README.md +%{_libdir}/libopenh264.so.7 +%{_libdir}/libopenh264.so.%{openh264_version} + +%files devel +%{_includedir}/wels/ +%{_libdir}/libopenh264.so +%{_libdir}/pkgconfig/openh264.pc + +%files -n mozilla-openh264 +%{_sysconfdir}/profile.d/gmpopenh264.sh +%dir %{_libdir}/firefox +%dir %{_libdir}/firefox/defaults +%dir %{_libdir}/firefox/defaults/pref +%{_libdir}/firefox/defaults/pref/gmpopenh264.js +%{_libdir}/mozilla/plugins/gmp-gmpopenh264/ + +%files -n gstreamer1-plugin-openh264 +%{_datadir}/appdata/*.appdata.xml +%{_libdir}/gstreamer-1.0/libgstopenh264.so + + +%changelog +%autochangelog diff --git a/anda/lib/openh264/pre.rhai b/anda/lib/openh264/pre.rhai new file mode 100644 index 0000000000..6cfc5a8b63 --- /dev/null +++ b/anda/lib/openh264/pre.rhai @@ -0,0 +1,14 @@ +let cwd = "anda/lib/openh264"; +let spec = open_file("anda/lib/openh264/openh264.spec").read_string(); +let gst = find("%global gst_version ([\\d.]+)", spec, 1); +print(`:: found gst version ${gst}`); +let out = sh(`wget https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${gst}.tar.xz`, cwd); +//print(":: wget stdout below"); +//print(out.sh_stdout()); +//print(":: wget stderr below"); +//print(out.sh_stderr()); +out = sh(`sh gst-p-bad-cleanup.sh gst-plugins-bad-${gst}.tar.xz`, cwd); +//print(":: script stdout below"); +//print(out.sh_stdout()); +//print(":: script stderr below"); +//print(out.sh_stderr()); diff --git a/anda/lib/openh264/update.rhai b/anda/lib/openh264/update.rhai new file mode 100644 index 0000000000..68b90ffb62 --- /dev/null +++ b/anda/lib/openh264/update.rhai @@ -0,0 +1,4 @@ +rpm.global("commit1", get("https://api.github.com/repos/mozilla/gmp-api/commits/HEAD").json().sha); +rpm.global("openh264_version", gh("cisco/openh264")); +let html = get("https://gstreamer.freedesktop.org/src/gst-plugins-bad/?C=N;O=D"); +rpm.global("gst_version", find("gst-plugins-bad-([\\d.]+).tar.xz", html, 1));