Back to posts.
Compiling GStreamer from source on Windows
Recently I had to compile GStreamer form source on Windows and
Linux. In this article I'll explain how you can compile
GStreamer from sources in a local development
directory. This allows you to have several GStreamer versions
next to each other and change the source of GStreamer itself
which can be helpfull during development.
GStreamer provides several solutions to
get everything you need to start developing on Windows. They
provide an installer that you can use for a system wide
installation. Note that each installer comes with a unique ID and
you can only install one version at a time; for binary release
distributions this is fine, but this is not flexible when you
want to install GStreamer in your own source tree.
GStreamer has an article that describes how you can
compile from source using their cerbero build scripts.
I ran into too many issues while using this solution and I was
advised to use their new gst-build repository which
uses the meson build tool.
GStreamer has many dependencies and the GStreamer team did an
amazing job of writing the necessary scripts that compile these
dependencies on Linux/Mac and Window.
Prerequisites:
Make sure that you've installed the following tools:
Compiling GStreamer from source on Windows
Follow these steps to compile GStreamer on Windows. I've disabled
a couple of plugins because currently the build system throws an
error while trying to compile those.
- Open a x64 Native Tools Command Prompt for VS 2019
Get the gst-build repository:
mkdir gst-build
cd gst-build
git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git .
Configure:
meson --prefix=%cd%/installed ^
-Ddevtools=disabled ^
-Dbad=enabled ^
-Dugly=enabled ^
-Dlibav=enabled ^
-Dgst-plugins-ugly:x264=disabled ^
-Dgst-plugins-bad:tests=disabled ^
-Dgst-plugins-good:soup=disabled build
Compile and install:
ninja -C build
meson install -C build
Using the GStreamer libraries in your project
As you can see from the above meson command, I've used the
installed
directory as the install prefix. Below this directory
you'll find the headers and libraries you need to link with.
Add these include paths to your project:
installed/include/
installed/include/gstreamer-1.0/
installed/lib/gstreamer-1.0/include
installed/lib/glib-2.0/include
Link with the gstreamer and glib libraries:
installed/lib/gstreamer-1.0.lib
installed/lib/gobject-2.0.lib
installed/lib/glib-2.0.lib
Link with any other plugin library that you use:
installed/lib/gstgl-1.0.lib
installed/lib/gstapp-1.0.lib
Note that your application needs to be able to find the DLLs
that GStreamer created. Of course this is the gstreamer-1.0.dll
but there are several other dependencies. Because of these dependencies
it's the easiest to copy the DLLs into the right directory. Let's
assume that you have app.exe in myapp/bin/app.exe
, then make sure
to copy the files like this:
installed/bin/*.dll > myapp/bin/
installed/lib/gstreamer-1.0/*.dll > myapp/lib/
Troubleshooting
GStreamer cannot find certain DLLs
Make sure that the *.dll
from the installed/bin
directory are
next to your application.exe and also make sure that the plugin
DLLs can be found; this means all the DLLs. These need to be in
a directory relative to the gstreamer-1.0.dll
. As
gstreamer-1.0.dll
must be in the same directory as your
application.exe you should use: application.exe/../lib/
for the
plugin DLLs. Also note that GStreamer may try to find libraries
from a couple of other standard locations which are
described at this page, see the At runtime, GStreamer
will look for its plugins in the following folders: section.
Enable verbose debug output
You can set the following environment variable to get a very
detailed log that tells you exactly what GStreamer is doing. When
you see that certain plugins can't be loaded don't be fooled by
the error message and make sure to use a tool like Depenencies
to inspect the DLL. To enable verbose output you can run
your application after setting the environment variable:
set GST_DEBUG=*REGISTRY*:7 && application.exe
-
NAT Types
This is so exciting, in this article I dive into some of the different ways a NAT device translates addresses which is important for peer-to-peer connections.
-
Building Cabinets
In this post I dive into the design and construction of a cabinet with an interact LED strip. I also explain how I dynamically change the colors of the LEDs over TCP/UDP.
-
Compiling GStreamer from source on Windows
How to compile GStreamer on Windows from Source using Visual Studio 2019 and the meson build system.
-
Debugging CMake Issues
In this post I explain a process you can follow to debug issues with CMake by focusing on a specific target and making the output verbose.
-
Dual Boot Arch Linux and Windows 10
How to install Arch Linux and Windows 10 Pro as dual boot. A step by step tutorial how to create bootable installers, partition and setup a dual boot menu.
-
Mindset Updated Edition, Carol S. Dweck (Book Notes)
Paragraphs I marked from the book "Mindset" from Carol S. Dweck.
-
How to setup a self-hosted Unifi NVR with Arch Linux
A step by step HOW-TO that explain show to setup a Unifi Video Controller with an NFS share with Arch Linux.
-
Blender 2.8 How to use Transparent Textures
Follow this node setup when you want to use an image with transparency as a "sticker".
-
Compiling FFmpeg with X264 on Windows 10 using MSVC
A couple of steps to compile FFmpeg on Windows using MSVC.
-
Blender 2.8 OpenGL Buffer Exporter
The following Blender script creates a [name].h and [name].cpp for the selected object and stores the positions, normals and UVs.
-
Blender 2.8 Baking lightmaps
Light maps are a cheap way to add a lot of realism to you static scenes and have been used forever.
-
Blender 2.8 Tips and Tricks
Use Environment Map only for reflections; create a floor plane for a Product Render, diffuse texture for roughness and more!
-
Setting up a Bluetooth Headset on Arch Linux
Learn how to setup a Sennheiser PXC 550 Bluetooth headset on Arch Linux.
-
Compiling x264 on Windows with MSVC
Compile the excellent x264 source on Windows using MSYS2 and MSVC.
-
C/C++ Snippets
Is a number divisible by four?
-
Reading Chunks from a Buffer
Some thoughts on reading bytes from a file; handy for reading NALs.
-
Handy Bash Commands
Bash scripts: removing white space, lowercase filenames, backup using tar, etc.
-
Building a zero copy parser
Simple solution to parse data in a pretty performant way. Used this for a RTSP protocol parser.
-
Kalman Filter
A very simple yet powerful filter which works great when you have to smooth noisy data. Used for the Nike Rise 2.0 project.
-
Saving pixel data using libpng
Do you have raw RGBA data that you want to save? Use this snippet to save it into a PNG file.
-
Compile Apache, PHP and MySQL on Mac 10.10
Setup you own PHP, MySQL and Apache and with virtual document roots.
-
Fast Pixel Transfers with Pixel Buffer Objects
Using Pixel Buffer Objects (PBO) for fast asynchronous data transfers and OpenGL.
-
High Resolution Timer function in C/C++
Wait...... wait.. fast high resolution timer funtions (Windows, Linux, Mac)
-
Rendering text with Pango, Cairo and Freetype
My never ending obsession with font rendering. A complex beast to do well. Use Pango and FreeType for the heavy lifting.
-
Fast OpenGL blur shader
Make things look blurry ... and fast using this OpenGL blur shader.
-
Spherical Environment Mapping with OpenGL
An old trick to get great lighting effects using Environment Maps and OpenGL.
-
Using OpenSSL with memory BIOs
OpenSSL is a great library with lots of abstractions. In this post I discuss how to break some of these abstractions and use your own memory buffers.
-
Attributeless Vertex Shader with OpenGL
A simple way to render a fullscreen quad without a vertex buffer with OpenGL.
-
Circular Image Selector
Some thoughts on a different way to select images from a huge collection in a compact UI.
-
Decoding H264 and YUV420P playback
Using libav to demux and playback with OpenGL.
-
Fast Fourier Transform
Analyse your audio using the Fastest Fourier Transform in the West.
-
OpenGL Rim Shader
Pretty glowy edges using a GLSL rim shader.
-
Rendering The Depth Buffer
Render the non-linear OpenGL Depth Buffer.
-
Delaunay Triangulation
Do you need to triangulate some shape: use the “Triangle” library.
-
RapidXML
RapidXML is a versatile and fast XML parser with a simple API. Check out these examples.
-
Git Snippets
Some simple GIT snippets; added here to remind myself.
-
Basic Shading With OpenGL
A couple of basic GLSL shaders with explanation.
-
Open Source Libraries For Creative Coding
Collection of great open source libraries for you creative programming projects.
-
Bouncing particle effect
Snippet that can be used to create a bouncy particle effect; basic, effective, simple but nice.
-
OpenGL Instanced Rendering
Want to render thousands and thousands of objects? Use OpenGL instanced rendering. The solution...the only solution.
-
Mapping a texture on a disc
Ever heard about projective interpolation related to texture mapping? Learn about this intertesting issue with OpenGL and texture mapping.
-
Download HTML page using CURL
When you want a quick solution to perform a HTTP(S) request CURL is always a quick an simple solution. Check out this example code.
-
Height Field Simulation on GPU
Although not a Navier-Stokes implementation ... still a very nice and enjoyable effect.
-
OpenCV
Optical Flow: when doing anything with tracking you've probably heard of it. See this simple example code using OpenCV and OpenGL.
-
Some notes on OpenGL
FBOs and Depth Testing, using different Attachment Points, a YUV420p shader, ...
-
Math
Meaning of the Dot Product in 3D graphics, calculating a perpendicular vector using Sam Hocevar's solution, orientation matrix and more.
-
Gists to remember
Some gists that I want to remember, often use, etc...
-
Reverse SSH
Do you want to login, into a remote PC but the remote PC is behind a firewall? Then use this simple reverse SSH trick which doesn't require changing your firewall rules.
-
Working Set
Having issues with your compiler? Or during linking? Check these common issues and their solutions. I also list several tools that you can use to get a some useful info.
-
Consumer + Producer model with libuv
Example of a common Multi Threaded Consumer/Producer Model using LibUV.
-
Parsing binary data
Learn about the basic of a binary protocol and how to create one easily yourself.
-
C++ file operation snippets
Reading a file into a string, vector, checking the file size, change to a position, etc. A collection of C++ file operation snippets.
-
Importance of blur with image gradients
Do you want to experiment with OpenGL and aligning Brush Strokes along Image Gradients? Then check out this post about the importance of blurring.
-
Real-time oil painting with openGL
Code snippet for fake "oil painting" effect with OpenGL using instanced rendering.
-
x264 encoder
Basic example on how to use libx264 to encode image data using libav
-
Generative helix with openGL
Screenshots of a project I worked on with that generates a DNA helix.
-
Mini test with vector field
Screenshots while experimenting with a vector field; nothing much to see here.
-
Protractor gesture recognizer
Testing the amazing One Dollar $1 gesture recognizer. The simplest and very good gesture recognizer.
-
Hair simulation
Example code that implements the "Fast Simulation of Inextensible Hair and Fur" paper from M. Müller, T.Y. Kim and N.Chentanez.
-
Some glitch screenshots
Glitch screenshots.
-
Working on video installation
Screenshots of some experiments of a video installation.
-
Generative meshes
I enjoy creating physics based simulations and render them on high res. Here are some experiments I did a time ago.
-
Converting video/audio using avconv
Examples that show you how to use avconv to manipulate video and audio files.
-
Auto start terminal app on mac
Automatically start you application whe Mac boots and make sure that it restarts your app when it exists. Handy for interactive installations.
-
Export blender object to simple file format
Export the selected object in Blender into a .h and .cpp file that prepresents the buffer.