Ever generated a large gstreamer graph?
Make it a convenient map with OpenLayers.

gStreamer graphs can be large

Take the gst-launch command from this previous article:

gst-launch-1.0 ximagesrc xid=0x200004c ! video/x-raw,framerate=30/1 ! videoconvert ! vaapih264enc quality-level=1 ! h264parse config-interval=10 ! queue ! mux. pulsesrc device=alsa_output.pci-0000_00_1f.3.analog-stereo.monitor ! "audio/x-raw,rate=16000,channels=2,depth=16" ! audioconvert ! avenc_aac ! aacparse ! queue ! mux. mpegtsmux name=mux ! rtpmp2tpay ! udpsink host= port=5000

You can dump a graph of the pipeline by adding GST_DEBUG_DUMP_DOT_DIR=/tmp in front of the command.
See: gstreamer debug docs

Reminder: the dot graph in converted in to a png image via this command:

dot -Tpng > pipeline.png


Fresh from the attic

Because Terminals are cool~

Tired of websites plagued with heavy JavaScript, ads and consent pop-up?
There were simpler times on the internet when everything was text-based.
A time where cathode-ray tube displayed 80 by 24 blocks of glowing and colorful characters.

But I don’t wanna to learn those pesky terminal escape characters!

Don’t worry, Python comes to the rescue. It has a module to generate the ASCII art, without the pain:
Rich — https://github.com/willmcgugan/rich
Learn more about Rich capabilities in this article or this one

Tips to share a movie over internet and watch it together with someone else.

Do you miss watching a movie with friends or family? Isn’t it great when you can pause a movie and discuss about it?

If you try to share your desktop, running a movie player, inside your favorite video meeting solution, it is probably not going to be great because of low framerate and maybe bad sound. This functionality is designed for business presentation, not video.

This article shows how to stream your desktop movie player directly. It even works directly from a DVD. …

Don’t stare at me

Using simple OpenGL 3D view rotation


Do you remember inastitch, the video stitcher for live stream?

Quick summary: inastitch merges three live video streams into a single wider stream.

In this previous project, homography of the input streams was simply achieved in 2D by warping pixels using an OpenGL pixel shader. This article introduces homography in 3D with a vertex shader. It becomes very easy to rotate the view.

Concave camera setup

The first evolution from the previous demo is to replace the convex camera setup with a concave camera setup.

Synchronized 3-camera array recording itself in the dark

As low as 100µs delay can be reached with stock Raspberry Pi and no custom hardware.

Examples use-cases for synchronized video streams are:

  • image stitching for panoramic photo/video, or image blending for example: HDR or low light imagery
  • stereovision for 3D reconstruction and depth sensing applications
  • multi-camera tracking for example: eye tracking with one camera dedicated to each eye

Why is synchronization so important?

Let’s see an early stitching test with free running cameras.
Each camera is capturing at 90fps, hence there is about 11ms between each consecutive frame in the stream.

Scanning the streets might not need an expensive setup.

Do you remember the 8-camera video stitcher project?

Eight Raspberry Pi and corresponding camera are connected on a local network and synchronized to capture 360° panoramic images.

What if you let it grow taller and attach a bike to it?

Stitching with OpenCV is all nice, but what if you wanted to do it all in hardware on GPU with vanilla OpenGL?


OpenCV comes with an advanced sample implementation which produces great results on still images, however, using this program on every single frame of video streams is unsurprisingly extremely slow. This is the solution which was used for 360° video using Raspberry Pi(s).

This article follows the one mentioned above, where video frames were transformed on the CPU with OpenCV, and introduce a full GPU pipeline.

It should be noted that OpenCV has GPU support for many operations, but…

PTP on Raspberry Pi, it’s apt install linuxptp and done, right?
Maybe not. Here are some tips to run it better than the default settings.

This article is part of a series about inastitch.
In this project, clock synchronization is critical for frame capture alignment.

Two Raspberry’s hearts beating together

It all started with this git repo of patches to make PTP work on Raspberry Pi 3: https://github.com/twteamware/raspberrypi-ptp. Those patches are now integrated in the official release of RPi OS.

The page performance.md is the most interesting. …

You have cool project idea and you want to make a prototype more compatible with the automotive world? Here are some design choices for you…

Of course, some old-school hard real-time C code running bare metal on a microcontroller would always rekindle the heart of automotive engineers, but for quick prototyping it is definitely not the most convenient target. On the other hand, using a Linux-based target is unfortunately not real-time, but enables to leverage many open-source libraries.

This article uses inastitch as sample project to explain how each library was used in a practical example.

inastitch 3-camera hardware prototype in its 3D-printed case

Inastitch is a prototype…

OpenCV stitching calibration image

What would it take to make your own video footage at 360 degrees?
The answer: a bunch of cameras and some open source software.
Let’s try…

First we need to talk about image stitching. With no surprise, OpenCV has a great sample implementation for this and often gives impressive seamless results. The thing is we want to produce video, not static images, so we need to talk next about camera synchronization on the Raspberry Pi in order to capture frames at the same time. And finally, how do we make a 360 degrees video with all of this?

Image stitching

Stitching is…

Vincent Jordan

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store