add: openh264 (#779)

* add: openh264

* Update pre.rhai

Signed-off-by: madomado <madonuko@outlook.com>

* Update openh264.spec

Signed-off-by: madomado <madonuko@outlook.com>

* Update pre.rhai

Signed-off-by: madomado <madonuko@outlook.com>

---------

Signed-off-by: madomado <madonuko@outlook.com>
This commit is contained in:
madomado
2023-11-05 14:46:49 +08:00
committed by GitHub
parent 41d68feecf
commit af8be29789
6 changed files with 451 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
project pkg {
rpm {
spec = "openh264.spec"
}
}
+201
View File
@@ -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 <bnocera@redhat.com> - 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"
@@ -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',
+213
View File
@@ -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 <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2015 Kalev Lember <klember@redhat.com> -->
<component type="codec">
<id>gstreamer-openh264</id>
<metadata_license>CC0-1.0</metadata_license>
<name>GStreamer Multimedia Codecs - H.264</name>
<summary>Multimedia playback for H.264</summary>
<description>
<p>
This addon includes a codec for H.264 playback and encoding.
</p>
<p>
These codecs can be used to encode and decode media files where the
format is not patent encumbered.
</p>
<p>
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.
</p>
</description>
<url type="homepage">http://gstreamer.freedesktop.org/</url>
<url type="bugtracker">https://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer</url>
<url type="help">http://gstreamer.freedesktop.org/documentation/</url>
<url type="donation">http://www.gnome.org/friends/</url>
<update_contact><!-- upstream-contact_at_email.com --></update_contact>
</component>
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
+14
View File
@@ -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());
+4
View File
@@ -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));