GStreamer In-Band Metadata for MPEG Transport Stream - Getting Started - Building natively
GStreamer In-Band Metadata for MPEG Transport Stream |
---|
MPEG TS Metadata Basics |
Getting Started |
User Guide |
Examples |
FAQ |
Contact Us |
Overview
In order to compile the meta plugin and install it directly, we need to patch some GStreamer libraries, so we need to:
- Get gst-metadata source code
- Install needed dependencies
- Download GStreamer, gst-plugins-base and gst-plugins-bad source code
- Patch GStreamer and gst-plugins bad source code
- Compile these three packages in order
- Overwrite system packages (Not required: Backup the files in case something goes wrong)
- Compile gst-metadata
- Install gst-metadata
NOTE: This assumes you already have GStreamer installed, if this is not the case, please proceede to install it in your system first. |
Installation guide
Before proceeding with each step, we are gonna need some general variables and steps to set up the building environment:
export BRANCH=$(gst-inspect-1.0 --version | awk 'NR==2 {print $2}') # This gets the version of GStreamer installed in the system export BRANCH_PATCHES=$(echo $BRANCH | cut -d'.' -f 1-2) # This gets only the Major and Minor from the GStreamer version, we will need it later export LIBRARY_VERSION=$(echo $BRANCH | awk -F "." '{f=$2; l=$3} END{if(l < 10)l=0l; print f l}') # This sets the Minor and Patch from the version in GStreamer as 1405 for example for version v1.14.5
Then we need to set the GStreamer installation path from your system, please check the table below to set it:
Platform | Path |
---|---|
Ubuntu 64-bits | /usr/lib/x86_64-linux-gnu |
RidgeRun's Embedded FS | -/usr |
Jetson TX1 TX2 Xavier Nano | /usr/lib/aarch64-linux-gnu |
For example:
# For NVIDIA JETSON export INSTALL_PATH=/usr/lib/aarch64-linux-gnu # For a PC with X86 export INSTALL_PATH=/usr/lib/x86_64-linux-gnu
Then we can set our environment, you can change to any folder where you will like to start building the packages, for example, you can switch to home, this guide builds them inside the gst-build folder:
cd ~ export BUILD_DIR=`pwd`/gst-build # We will build all the packages inside of this folder mkdir -p $BUILD_DIR mkdir -p $BUILD_DIR/prefix
Download gst-metadata
You can get the gst-metatada source code in place, for this you can clone the repo inside BUILD_DIR directory with the next commands, or you can move the folder inside to it.
cd $BUILD_DIR YOUR_NAME=your_name # Change this with your name in the repo REPO_URL=https://gitlab.com/RidgeRun/orders/$YOUR_NAME/gst-metadata git clone $REPO_URL
Install needed dependencies
This is the list of dependencies required to compile GStreamer
sudo apt-get install \ pkg-config bison flex git \ libglib2.0-dev liborc-0.4-dev \ libtool autopoint autoconf \ gettext yasm build-essential \ autotools-dev dpkg-dev automake \ libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev wget
You may also need the development version of different libraries:
sudo apt-get install \ liborc-dev autopoint gtk-doc-tools libgstreamer1.0-dev \ libxv-dev libasound2-dev libtheora-dev libogg-dev libvorbis-dev \ libbz2-dev libv4l-dev libvpx-dev libjack-jackd2-dev libsoup2.4-dev libpulse-dev \ faad libfaad-dev libfaac-dev libgl1-mesa-dev libgles2-mesa-dev \ libx264-dev libmad0-dev
Download and patch GStreamer<=1.18
Download GStreamer source code
To start the building process, we need the source code of gstreamer, gst-plugins-base and gst-plugins-bad, for this, we can run the following lines in bash:
set -e cd $BUILD_DIR MODULES="gstreamer gst-plugins-base gst-plugins-bad" for m in $MODULES do if [ ! -f "$m-$BRANCH.tar.xz" ]; then echo " --> Downloading $m-$BRANCH.tar.xz" wget http://gstreamer.freedesktop.org/src/$m/$m-$BRANCH.tar.xz else echo "$ --> Found $m-$BRANCH.tar.xz locally, skipping download" fi if [ -d "$m" ]; then rm -rf $m fi echo " --> Extracting $m-$BRANCH.tar.xz" tar -xf $m-$BRANCH.tar.xz && mv $m-$BRANCH $m done
This will download each package and decompress it, then changes each folder's name to remove the -$BRANCH from them.
Patch gstreamer and gst-plugins bad
The next step before compilation of GStreamer, is patching it, for this we should copy the patches and apply them in their respective package as follows:
echo "Patching GStreamer core" # Copy GStreamer patch to gstreamer folder cd $BUILD_DIR cp gst-metadata/extras/gstreamer-$BRANCH_PATCHES.x/fix-sparse-flag-setting-up.patch gstreamer/ # Apply GStreamer patch cd gstreamer git apply fix-sparse-flag-setting-up.patch echo "Patching GStreamer Plugins Bad core" # Copy GStreamer plugins bad patches to gstreamer-plugins-bad folder cd $BUILD_DIR cp gst-metadata/extras/gstreamer-$BRANCH_PATCHES.x/mpegtsmux-reference-clock-on-waiting-pad.patch gst-plugins-bad/ cp gst-metadata/extras/gstreamer-$BRANCH_PATCHES.x/mpegtsmux-meta-specific-pad-templates.patch gst-plugins-bad/ cp gst-metadata/extras/gstreamer-$BRANCH_PATCHES.x/tsmux-demux-update-klv-support.patch gst-plugins-bad/ # Apply GStreamer plugins bad patches cd gst-plugins-bad git apply mpegtsmux-reference-clock-on-waiting-pad.patch git apply mpegtsmux-meta-specific-pad-templates.patch git apply tsmux-demux-update-klv-support.patch
Compiling GStreamer
To compile GStreamer, is enough to get inside each of the packages' folder and compile inside, just as below:
cd $BUILD_DIR MODULES="gstreamer gst-plugins-base gst-plugins-bad" for m in $MODULES do cd $m ./autogen.sh --disable-gtk-doc --disable-tests --disable-nls && make -j8 export PKG_CONFIG_PATH=`pwd`/pkgconfig:$PKG_CONFIG_PATH cd .. done
If you run into the following error:
error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options. #error This file requires compiler and library support \
Please run the following commands instead
cd $BUILD_DIR MODULES="gstreamer gst-plugins-base gst-plugins-bad" for m in $MODULES do cd $m ./autogen.sh --disable-gtk-doc --disable-tests --disable-nls && make CXXFLAGS=-std=c++11 -j8 export PKG_CONFIG_PATH=`pwd`/pkgconfig:$PKG_CONFIG_PATH cd .. done
Overwrite GStreamer system packages
From the compilation stage, we need to copy some libraries into the system libraries, so for this is highly recommended to backup the original ones first just in case anything goes wrong or you simply want to revert the changes:
sudo cp $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so.bk
Then we can update them by installing the ones we just compiled:
cd $BUILD_DIR sudo cp $BUILD_DIR/gstreamer/libs/gst/base/.libs/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gst-plugins-bad/gst-libs/gst/codecparsers/.libs/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gst-plugins-bad/gst-libs/gst/mpegts/.libs/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gst-plugins-bad/gst/mpegdemux/.libs/libgstmpegpsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so sudo cp $BUILD_DIR/gst-plugins-bad/gst/mpegtsmux/.libs/libgstmpegtsmux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so sudo cp $BUILD_DIR/gst-plugins-bad/gst/mpegtsdemux/.libs/libgstmpegtsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so
Download and patch GStreamer >=1.20
Download GStreamer source code
To start the building process, we need the source code of gstreamer, gst-plugins-base and gst-plugins-bad, for this, we can run the following lines in bash:
cd $BUILD_DIR git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git cd gstreamer/ git checkout $BRANCH
This will download the gstreamer mono repository.
Patch gstreamer and gst-plugins bad
The next step before compilation of GStreamer, is patching it, for this we should copy the patches and apply them in their respective package as follows:
echo "Patching GStreamer core" # Copy GStreamer patch to gstreamer folder cd $BUILD_DIR cp cp gst-metadata/extras/gstreamer-$BRANCH_PATCHES.x/* gstreamer/ # Apply GStreamer patch cd gstreamer git apply 0001-select-non-sparse-stream-as-pcr.patch git apply 0002-avoid-waiting-for-sparse-streams.patch git apply 0003-support-sync-metadata.patch git apply 0004-Fix-timestamp-issue.patch git apply 0005-eval-mode.patch git apply 0006-Ignore-error-if-processing-KLV.patch
Compiling GStreamer
To compile GStreamer, get inside the mono repo folder and compile inside, just as below:
meson build --prefix=`pwd`/install/usr ninja -C build
Overwrite GStreamer system packages
From the compilation stage, we need to copy some libraries into the system libraries, so for this is highly recommended to backup the original ones first just in case anything goes wrong or you simply want to revert the changes:
sudo cp $INSTALL_PATH/libgstmpegts-1.0.so $INSTALL_PATH/libgstmpegts-1.0.so.bk sudo cp $INSTALL_PATH/libgstcodecparsers-1.0.so $INSTALL_PATH/libgstcodecparsers-1.0.so.bk sudo cp $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so.bk sudo cp $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so.bk
Then we can update them by installing the ones we just compiled:
cd $BUILD_DIR sudo cp $BUILD_DIR/gstreamer/install/usr/lib/aarch64-linux-gnu/libgstmpegts-1.0.so $INSTALL_PATH/libgstmpegts-1.0.so sudo cp $BUILD_DIR/gstreamer/install/usr/lib/aarch64-linux-gnu/libgstcodecparsers-1.0.so $INSTALL_PATH/libgstcodecparsers-1.0.so sudo cp $BUILD_DIR/gstreamer/build/subprojects/gstreamer/libs/gst/base/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstbase-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gstreamer/build/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstcodecparsers-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gstreamer/build/subprojects/gst-plugins-bad/gst-libs/gst/mpegts/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 $INSTALL_PATH/libgstmpegts-1.0.so.0.$LIBRARY_VERSION.0 sudo cp $BUILD_DIR/gstreamer/build/subprojects/gst-plugins-bad/gst/mpegdemux/libgstmpegpsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegpsdemux.so sudo cp $BUILD_DIR/gstreamer/build/subprojects/gst-plugins-bad/gst/mpegtsmux/libgstmpegtsmux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsmux.so sudo cp $BUILD_DIR/gstreamer/build/subprojects/gst-plugins-bad/gst/mpegtsdemux/libgstmpegtsdemux.so $INSTALL_PATH/gstreamer-1.0/libgstmpegtsdemux.so
Compile gst-metadata
Now that we have GStreamer patched, the compilation of gst-metadata is our next step, for this execute the following lines:
cd $BUILD_DIR cd gst-metadata ./autogen.sh ./configure --prefix $BUILD_DIR/prefix/ make all make install
Install gst-metadata
Finally, we can install gst-metadata by copying it:
cd $BUILD_DIR sudo cp $BUILD_DIR/prefix/lib/gstreamer-1.0/libgstmeta.so $INSTALL_PATH/gstreamer-1.0/libgstmeta.so
Verify installation
At this point, it should be possible to inspect the meta element:
# Command gst-inspect-1.0 meta # Output: Plugin Details: Name meta Description Elements used to send and receive metadata Filename /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstmeta.so Version 1.6.3 License Proprietary Source module gst-plugin-meta Binary package RidgeRun elements Origin URL http://www.ridgerun.com metasrc: Metadata Source metasink: Metadata Sink misbparser: MISB Parser 3 features: +-- 3 elements
The plugin is ready to be used, check the examples section to use the meta plugin.