<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
	<title>Dabrain34&#39;s igalian blog</title>
	<subtitle>Dabrain34&#39;s blog.</subtitle>
	<link href="https://blogs.igalia.com/scerveau/feed/feed.xml" rel="self"/>
	<link href="https://blogs.igalia.com/scerveau/"/>
	<updated>2026-04-08T00:00:00Z</updated>
	<id>https://blogs.igalia.com/</id>
	<author>
		<name>Stéphane Cerveau</name>
		<email>scerveau@igalia.com</email>
	</author>
	
	<entry>
		<title>Introducing GstPrinceOfParser 0.4.3</title>
		<link href="https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/"/>
		<updated>2026-04-08T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/</id>
		<content type="html">&lt;h1 id=&quot;gstprinceofparser-an-all-in-one-tool-to-play-with-gstreamer-on-any-platform&quot; tabindex=&quot;-1&quot;&gt;GstPrinceOfParser: An All-in-One Tool to Play With GStreamer on Any Platform &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Introducing &lt;a href=&quot;https://github.com/dabrain34/gstpop&quot;&gt;gst-pop&lt;/a&gt;, the GStreamer Prince of Parser — a tool to make interaction with GStreamer easier, global, and remotely accessible.&lt;/p&gt;
&lt;h2 id=&quot;what-is-gstreamer&quot; tabindex=&quot;-1&quot;&gt;What is GStreamer? &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; is an open-source multimedia framework started in 1999. It lets you build pipelines of interconnected elements to stream, encode, decode, and manipulate media. The core idea is simple: a source element produces data, passes it through one or more transform elements, and delivers it to a sink. For example, here is a pipeline that decodes an MP3 audio file:&lt;/p&gt;
&lt;pre class=&quot;language-mermaid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-mermaid&quot;&gt;    filesrc &lt;span class=&quot;token arrow operator&quot;&gt;--&gt;&lt;/span&gt; mp3dec &lt;span class=&quot;token arrow operator&quot;&gt;--&gt;&lt;/span&gt; audiosink&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more than 20 years, GStreamer has relied on its in-house toolbox to demonstrate the power
of its pipelines. As this toolbox is used in thousands of projects and serves as a reference
implementation, modifications and enhancements are deliberately kept minimal to maintain stability.
gst-pop was created to go beyond these limitations.&lt;/p&gt;
&lt;h2 id=&quot;a-unified-interface-for-gstreamer&quot; tabindex=&quot;-1&quot;&gt;A Unified Interface for GStreamer &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Accessible over the network, via CLI arguments, or through D-Bus, gst-pop aims to provide
a multi-pipeline-capable command-line tool.&lt;/p&gt;
&lt;p&gt;With a simple invocation of &lt;code&gt;gst-pop&lt;/code&gt; (or its alias &lt;code&gt;gst-popd&lt;/code&gt;), you can run a daemon that accepts
multiple pipelines simultaneously, accessible through D-Bus or WebSocket via the pipeline
ID. You’ll be able to control, query, and get information about each pipeline — all of that
over a remote network, secured with API key authentication and origin validation to prevent unauthorized access.&lt;/p&gt;
&lt;p&gt;As demonstrated in the &lt;a href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;blog post related to GstPipelineStudio&lt;/a&gt;, it will be possible to connect to a remote pipeline or launch new pipelines through the GStreamer GUI. If a GUI is not available
on the platform, it will soon be possible to use a web interface to control GStreamer, offering
everything GStreamer can provide and more, limited only by your imagination.&lt;/p&gt;
&lt;h2 id=&quot;remote-element-inspection&quot; tabindex=&quot;-1&quot;&gt;Remote Element Inspection &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;gst-pop (or its alias &lt;code&gt;gst-pop-inspect&lt;/code&gt;) is also capable of listing the elements on a local or remote host, inspecting their capabilities, and providing a remote way to interact with your GStreamer installation.&lt;/p&gt;
&lt;h2 id=&quot;media-discovery&quot; tabindex=&quot;-1&quot;&gt;Media Discovery &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It can also provide information on a media file using GStreamer’s discovery interface using &lt;code&gt;gst-pop-discovery&lt;/code&gt;, offering an easy and remote-capable media discovery system for your setup.&lt;/p&gt;
&lt;h2 id=&quot;playback&quot; tabindex=&quot;-1&quot;&gt;Playback &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And of course, it can serve as an alternative to the &lt;code&gt;gst-play&lt;/code&gt; tool, with &lt;code&gt;gst-pop-play&lt;/code&gt;, allowing you to instantiate as many playback sessions as you need, with the ability to use any sink you want.&lt;/p&gt;
&lt;p&gt;The possibilities are vast: provide multimedia services such as transcoding, media analysis, or remote playback to your setup using the power of a remote machine, all controllable from your terminal or a GUI such as &lt;a href=&quot;https://gps.mooday.dev&quot;&gt;GstPipelineStudio&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;cross-platform-and-language-support&quot; tabindex=&quot;-1&quot;&gt;Cross-Platform and Language Support &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The tool is written in Rust for memory safety and reliability and provides client libraries in both Rust and C, offering all the flexibility needed for your existing applications. It is available on Linux (deb, rpm or docker), MacOS, and Windows, see the &lt;a href=&quot;https://github.com/dabrain34/gstpop/releases/tag/v0.4.3&quot;&gt;release page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;examples&quot; tabindex=&quot;-1&quot;&gt;Examples &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstprinceofparser-0-4-3/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Start the daemon&lt;/span&gt;&lt;br&gt;gst-pop&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Launch a pipeline&lt;/span&gt;&lt;br&gt;gst-pop launch videotestsrc &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; autovideosink&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Inspect an element&lt;/span&gt;&lt;br&gt;gst-pop inspect videotestsrc&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Discover media info&lt;/span&gt;&lt;br&gt;gst-pop discover file:///path/to/video.mp4&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Play a media file&lt;/span&gt;&lt;br&gt;gst-pop play file:///path/to/video.mp4&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Create a pipeline with the client&lt;/span&gt;&lt;br&gt;gst-popctl create &lt;span class=&quot;token string&quot;&gt;&quot;videotestsrc ! autovideosink&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# List pipelines on a remote daemon&lt;/span&gt;&lt;br&gt;gst-popctl list&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Play the pipeline with ID 0&lt;/span&gt;&lt;br&gt;gst-popctl play &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Stop the pipeline with ID 0&lt;/span&gt;&lt;br&gt;gst-popctl stop &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Run via Docker&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9000&lt;/span&gt;:9000 ghcr.io/dabrain34/gstpop:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Give it a try and let us know what ideas you might have — we have plenty coming, so stay tuned.&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about gst-pop, GStreamer, or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Introducing GstPipelineStudio 0.5.1</title>
		<link href="https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/"/>
		<updated>2026-04-07T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/</id>
		<content type="html">&lt;h1 id=&quot;gstpipelinestudio-0-5-1&quot; tabindex=&quot;-1&quot;&gt;GstPipelineStudio 0.5.1 &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;your-gstreamer-pipelines-at-a-glance&quot; tabindex=&quot;-1&quot;&gt;Your GStreamer Pipelines, at a Glance &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;New version of GstPipelineStudio is out!&lt;/p&gt;
&lt;p&gt;After months of improvements and intermediate releases since October 2024, it’s time for an official announcement for &lt;a href=&quot;https://gps.mooday.dev&quot;&gt;0.5.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GstPipelineStudio provides a visual interface to GStreamer, the marvelous Swiss Army knife of multimedia pipelines. But what is GStreamer exactly?&lt;/p&gt;
&lt;h2 id=&quot;what-is-gstreamer&quot; tabindex=&quot;-1&quot;&gt;What is GStreamer? &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; is an open-source multimedia framework started in 1999. It lets you build pipelines of interconnected elements to stream, encode, decode, and manipulate media. The core idea is simple: a source element produces data, passes it through one or more transform elements, and delivers it to a sink. For example, here is a pipeline that decodes an MP3 audio file:&lt;/p&gt;
&lt;pre class=&quot;language-mermaid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-mermaid&quot;&gt;    filesrc &lt;span class=&quot;token arrow operator&quot;&gt;--&gt;&lt;/span&gt; mp3dec &lt;span class=&quot;token arrow operator&quot;&gt;--&gt;&lt;/span&gt; audiosink&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GStreamer is written in C, with a growing ecosystem of plugins in Rust and bindings for languages such as Python and C++. It ships with many command-line tools to build and test pipelines, but validating ideas still requires writing C/Rust/Python code or using the command line. That’s where GstPipelineStudio comes in — providing a visual interface to help newcomers discover and adopt GStreamer, and skilled developers debug their pipelines.&lt;/p&gt;
&lt;h2 id=&quot;the-story-behind-gstpipelinestudio&quot; tabindex=&quot;-1&quot;&gt;The Story Behind GstPipelineStudio &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The GstPipelineStudio project started in 2021 with the idea to provide the same environment that brought me to multimedia: GraphEdit on Windows with DirectShow. Indeed, DirectShow and GStreamer share the same idea of plugins sharing data. As I started to implement a DVB decoder with DirectShow, the graphical interface made it easier to validate which filters to use. But DirectShow only works natively on Windows, unlike GStreamer which can run everywhere — Linux, macOS, Windows, iOS, Android, and even low-power devices such as a Raspberry Pi.&lt;/p&gt;
&lt;p&gt;GstPipelineStudio aims to work on all these platforms, easing GStreamer adoption where its use was not always obvious, such as on Windows.
GStreamer is based on GLib, a cross-platform toolkit that abstracts system calls and provides a common base layer. For the GUI, since Rust was offering very good bindings, GTK was the natural choice to achieve cross-platform support.
There was an attempt to create a GUI using Qt, named &lt;a href=&quot;https://github.com/virinext/pipeviz&quot;&gt;pipeviz&lt;/a&gt;, which has been a great inspiration for GPS, but the Qt Rust bindings were not mature enough, unlike those for GTK.&lt;/p&gt;
&lt;p&gt;The first official release of GPS was 0.3.4, and you can read its &lt;a href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;official blog post&lt;/a&gt; published in 2023. Since then, we have been devoted to providing new features
to bring GPS to another level.&lt;/p&gt;
&lt;p&gt;A first revision, GPS 0.4.0, came out before Christmas 2024 with a refreshed interface — including zoom on the graph
and contextual menus on any element or pad of the pipeline. The versions of GStreamer and GTK have also been updated to get the latest plugins and features from both frameworks.
A new icon has also been introduced to let GPS dive into another dimension.&lt;/p&gt;
&lt;h2 id=&quot;what-s-new-in-0-5-1&quot; tabindex=&quot;-1&quot;&gt;What’s New in &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/releases&quot;&gt;0.5.1&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;0.5.1 is here, and it brings a game changer: the dot file reader.
Previously, it was possible to open a command-line pipeline or save/open pipelines with an XML-based format, but now you can also open the generated dot files, the native format in GStreamer, to display a pipeline graphically. This is still a beta version as it can only display
high-level pipelines such as those described with the command line. Nevertheless this is a great improvement and allows users to see their pipeline and manipulate it.&lt;/p&gt;
&lt;p&gt;Here is the list of other improvements you’ll find in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open Dot Folder menu entry for loading dot files from the common GStreamer folder&lt;/li&gt;
&lt;li&gt;Remote pipeline introspection using the GStreamer tracers&lt;/li&gt;
&lt;li&gt;App ID renamed to dev.mooday.GstPipelineStudio&lt;/li&gt;
&lt;li&gt;Improved look and feel of the interface&lt;/li&gt;
&lt;li&gt;Auto-connect on node click (node-link-request)&lt;/li&gt;
&lt;li&gt;File selector button for location property&lt;/li&gt;
&lt;li&gt;Logger copy to clipboard with multi-selection support&lt;/li&gt;
&lt;li&gt;Auto-arrange elements on screen&lt;/li&gt;
&lt;li&gt;GStreamer 1.28.0&lt;/li&gt;
&lt;li&gt;GTK 4.20&lt;/li&gt;
&lt;li&gt;RPM and AppImage artifacts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;remote-pipeline-introspection&quot; tabindex=&quot;-1&quot;&gt;Remote Pipeline Introspection &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The remote pipeline introspection is a new way to connect to the WebSocket tracer available in GStreamer, pipeline-snapshot.
In addition to dot file loader, it allows you to visualize a pipeline directly in GPS from an external process running with the tracer.&lt;/p&gt;
&lt;p&gt;As you may know, GStreamer pipelines can be very complex, so one dream was to be able to visualize them live. There is already a mini tool in GStreamer named &lt;code&gt;gst-dots-viewer&lt;/code&gt; which creates a web server to display pipelines in a browser from the &lt;code&gt;$XDG_CACHE_DIR&lt;/code&gt; folder, see the &lt;a href=&quot;https://blogs.gnome.org/tsaunier/2025/05/16/gst-dots-viewer-a-new-tool-for-gstreamer-pipeline-visualization/&quot;&gt;blog post&lt;/a&gt; from Thibault about it.&lt;/p&gt;
&lt;p&gt;Now with GPS, you can directly create a WebSocket server and let the tracer connect to it and provide available dot files to be displayed.&lt;/p&gt;
&lt;p&gt;For example, to visualize a running pipeline in GPS:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In GPS: &lt;strong&gt;Menu → Remote Pipeline → Listen…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter the WebSocket address (e.g., &lt;code&gt;ws://localhost:8080&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Run your GStreamer pipeline with the &lt;code&gt;pipeline-snapshot&lt;/code&gt; tracer:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;GST_TRACERS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pipeline-snapshot(dots-viewer-ws-url=ws://localhost:8080)&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;br&gt;  gst-launch-1.0 videotestsrc &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; autovideosink&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The pipeline graph will appear in GPS once the tracer connects.&lt;/p&gt;
&lt;p&gt;These dot files are converted to GPS pipelines, making it possible to modify them. That’s a first step for real interaction with GStreamer pipelines — and there are more features coming in the &lt;em&gt;pipeline&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;coming-in-0-6-0&quot; tabindex=&quot;-1&quot;&gt;Coming in 0.6.0 &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-5-1/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In parallel, a new tool named &lt;a href=&quot;https://github.com/dabrain34/gstpop&quot;&gt;GstPrinceOfParser&lt;/a&gt; (gst-pop) has also been implemented. This tool allows remote control of all pipelines instantiated locally or over the network.
It is a multi-pipeline daemon accessible through WebSocket or D-Bus, aiming to centralize all GStreamer options in one tool for &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/tutorials/basic/gstreamer-tools.html#gstlaunch10&quot;&gt;launch&lt;/a&gt;, &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/tutorials/basic/gstreamer-tools.html#gstinspect10&quot;&gt;inspection&lt;/a&gt;, and &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/tutorials/basic/gstreamer-tools.html#gstdiscoverer10&quot;&gt;discovery&lt;/a&gt;. GstPipelineStudio will be able to control this daemon, making gst-pop the backbone of the GStreamer GUI. A blog post will come soon, stay tuned…&lt;/p&gt;
&lt;p&gt;A new tracer is under development: a WebSocket server that will allow you to inspect and interact with the current pipeline — modify the play state (pause, seek), fetch the logs, and of course see the current dot representation, all from the GstPipelineStudio interface.&lt;/p&gt;
&lt;p&gt;In addition, more features are on the way: a new look and feel based on libadwaita on Linux/macOS/Windows, better localization, an auto-plug feature, seek and step-by-step playback, and bug fixes on demand.&lt;/p&gt;
&lt;p&gt;We hope you’ll enjoy this new version of the tool and please feel free to propose
new features with an RFC &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/issues/new&quot;&gt;here&lt;/a&gt; or merge requests &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/merge_requests&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for the next &lt;a href=&quot;https://discourse.gstreamer.org/t/gstreamer-spring-hackfest-2026-on-29-31-may-2026-in-nice-france/5762&quot;&gt;GStreamer Spring hackfest 2026&lt;/a&gt; coming soon (end of May) where new features and deeper interaction with GStreamer pipelines will be discussed.&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about GstPipelineStudio, GStreamer, or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Vulkan video with NVK driver</title>
		<link href="https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/"/>
		<updated>2025-04-28T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/</id>
		<content type="html">&lt;p&gt;This blog post might interest you if you want to try the bleeding edge NVK driver which allows to decode H264/5 video with the power of the Vulkan extensions &lt;code&gt;VK_KHR_video_decode_h26x&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is a summary of the instructions provided in the &lt;a href=&quot;https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31867&quot;&gt;MR&lt;/a&gt;. This work needs a recent kernel with new features, so it will describe the steps to add this feature and build this new kernel on an Ubuntu based system.&lt;/p&gt;
&lt;p&gt;To accomplish that what you would need, is a recent NVIDIA hardware such as GeForce RTX 4060, a Linux kernel greater than 6.12.8 and the mesa branch supporting Vulkan Video using NVK: &lt;a href=&quot;https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31867&quot;&gt;https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31867&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lets start by the root, the kernel.&lt;/p&gt;
&lt;h1 id=&quot;kernel-build&quot; tabindex=&quot;-1&quot;&gt;Kernel build &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To run the NVK driver, you need a custom patch to be applied on top of the &lt;code&gt;Nouveau&lt;/code&gt; driver. This patch applies on minimum 6.12 kernel so you need to build a new kernel except if your distribution is running bleeding edge kernel which i doubt so here is my method I used to build this kernel.&lt;/p&gt;
&lt;p&gt;I mainly got my inspiration from &lt;a href=&quot;https://askubuntu.com/questions/718381/how-to-compile-and-install-custom-mainline-kernel&quot;&gt;https://askubuntu.com/questions/718381/how-to-compile-and-install-custom-mainline-kernel&lt;/a&gt; but I had to adapt it a bit to make it work.&lt;/p&gt;
&lt;p&gt;All of this blog post has been performed on a regular ubuntu 24.04.&lt;/p&gt;
&lt;p&gt;First you need to install the following ubuntu package:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt install -y git build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll have to download a recent kernel. I ended up using a git clone as it was easier than a tarball to build all necessary bits.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git clone --branch v6.12.8 --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-stable
$ cd linux-stable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you’ll have to apply the given patch to your work tree:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index 2a0617e5fe2a..eaef5effbb3d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -379,6 +379,9 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
 			case NOUVEAU_FIFO_ENGINE_CE:
 				engine = NV_DEVICE_HOST_RUNLIST_ENGINES_CE;
 				break;
+			case 0x300:
+				engine = NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC;
+				break;
 			default:
 				return nouveau_abi16_put(abi16, -ENOSYS);
 			}
@@ -456,10 +459,12 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
 			goto done;
 		break;
 	case NV_DEVICE_INFO_V0_TURING:
-		ret = nvif_object_ctor(&amp;amp;chan-&amp;gt;chan-&amp;gt;user, &amp;quot;abi16CeWar&amp;quot;, 0, TURING_DMA_COPY_A,
-				       NULL, 0, &amp;amp;chan-&amp;gt;ce);
-		if (ret)
-			goto done;
+		if (engine != NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC) {
+			ret = nvif_object_ctor(&amp;amp;chan-&amp;gt;chan-&amp;gt;user, &amp;quot;abi16CeWar&amp;quot;, 0, TURING_DMA_COPY_A,
+					       NULL, 0, &amp;amp;chan-&amp;gt;ce);
+			if (ret)
+				goto done;
+		}
 		break;
 	default:
 		break;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next step will be to configure the kernel. The best option I’ll recommend you is to copy the kernel config, your distribution is shipping with. On Ubuntu you can find it in &lt;code&gt;/boot&lt;/code&gt; with the name &lt;code&gt;config-6.8.0-52-generic&lt;/code&gt; for example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cp /boot/config-6.8.0-52-generic .config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then to get the default config, your kernel will use, including the specific options coming with Ubuntu, you’ll have to run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ make defconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will setup the build and make it ready to compile with this version of the kernel, auto configuring the new features.&lt;/p&gt;
&lt;p&gt;Two options &lt;code&gt;CONFIG_SYSTEM_TRUSTED_KEYS&lt;/code&gt; and &lt;code&gt;CONFIG_SYSTEM_REVOCATION_KEYS&lt;/code&gt; must be disabled to avoid compilation errors with missing certificates. For that you can set it up within &lt;code&gt;menuconfig&lt;/code&gt; or you can edit &lt;code&gt;.config&lt;/code&gt; and set these values to &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then you should be ready to go for a break ☕, short or long depending on your machine to cook the brand new kernel debian packaged, ready to use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ make clean
$ make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-custom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The process should end up with a new package named &lt;code&gt;linux-image-6.12.8-custom_6.12.8-3_amd64.deb&lt;/code&gt; in the upper folder which can then be installed along your previous kernel.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo dpkg -i ../linux-image-6.12.8-custom_6.12.8-3_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first one will replace your current default menulist item in grub upon installation. This means that if you install it, next time you reboot, you’ll boot into that kernel.&lt;/p&gt;
&lt;h1 id=&quot;mesa-build-for-nvk&quot; tabindex=&quot;-1&quot;&gt;Mesa build for NVK &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Now that we have a working kernel which allows to discuss with &lt;code&gt;nvidia&lt;/code&gt; codec engine using &lt;code&gt;nouveau&lt;/code&gt; driver. We can start the build of mesa.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot; tabindex=&quot;-1&quot;&gt;Prerequisites &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mesa depends on various system packages in addition to python modules and the the rust toolchain. So first we’ll have to install the given package which are all present in Ubuntu 24.04:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt install build-essential ninja-build glslang-tools python3-pip llvm byacc flex pkg-config bindgen libclc-19-dev libllvmspirvlib-18-dev libdrm-dev libclang-cpp-dev libclang-18-dev

$ sudo apt install libelf-dev libwayland-bin libwayland-dev libwayland-egl-backend-dev libx11-xcb-dev libxcb-randr0-dev libxfixes-dev libxcb-glx0-dev libxcb-shm0-dev libxcb-dri3-dev

$ sudo apt install libxcb-present-dev libxshmfence-dev libxxf86vm-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you’ll have to install the rust toolchain and some cargo package:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl --proto &#39;=https&#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ cargo install bindgen-cli
$ cargo install cbindgen

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When all the system package are installed, you can install the python modules needed by Mesa build system.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo pip3 install --break-system-packages meson mako pyyaml
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configure-and-build&quot; tabindex=&quot;-1&quot;&gt;Configure and build &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As Mesa is highly depending on the system, you might need some additional packages but worth a try to launch the build with the given instructions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd ~/DEV/
$ git clone https://gitlab.freedesktop.org/dwlsalmeida/mesa.git --branch=nvk-vulkan-video
$ meson setup builddir --libdir lib64 --prefix `pwd`/builddir/install -Dbuildtype=debug -Dvulkan-drivers=nouveau -Dgallium-drivers=nouveau -Dtools=nouveau
$ ninja -C builddir install
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;use-of-nvk-driver&quot; tabindex=&quot;-1&quot;&gt;Use of NVK driver &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Now that the kernel and the Mesa driver have been built and are available for your machine, you should be able to decode your first h264 stream with the NVK driver.&lt;/p&gt;
&lt;h2 id=&quot;important-nouveau-driver-might-be-disabled&quot; tabindex=&quot;-1&quot;&gt;Important: Nouveau driver might be disabled !! &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you might have use the Nvidia driver first and installed with your regular kernel, you might hit a weired error when invoking &lt;code&gt;vulkaninfo&lt;/code&gt; such as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ERROR: [Loader Message] Code 0 : setup_loader_term_phys_devs:  Failed to detect any valid GPUs in the current config
ERROR at ./vulkaninfo/./vulkaninfo.h:247:vkEnumeratePhysicalDevices failed with ERROR_INITIALIZATION_FAILED
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Indeed &lt;code&gt;nouveau&lt;/code&gt; driver can not live along the Nvidia driver, so you’ll have to uninstall the Nvidia driver first to be able to use &lt;code&gt;nouveau&lt;/code&gt; properly and the vulkan extensions.
One other solution is to boot on your new custom kernel and modify the file &lt;code&gt;/etc/modprobe.d/nvidia-installer-disable-nouveau.conf&lt;/code&gt; to get something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# generated by nvidia-installer
#blacklist nouveau
options nouveau modeset=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In that case the &lt;code&gt;modeset=1&lt;/code&gt; option will enable the driver and allow to use it.
Then you’ll have to reboot with this new configuration&lt;/p&gt;
&lt;h2 id=&quot;run-vulkaninfo&quot; tabindex=&quot;-1&quot;&gt;Run vulkaninfo &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you may have noticed, during the configure stage that we chose to install the artifacts of the build in a folder named &lt;code&gt;mesa/builddir/install&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is a script &lt;code&gt;run-nvk.sh&lt;/code&gt; which you can use before calling any binary which will use this folder as a base to set the environment variable dedicated to the NVK Vulkan driver&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
MESA=$HOME/DEV/mesa/builddir/install &#92;
LD_LIBRARY_PATH=$MESA/lib64:$MESA/lib:$LD_LIBRARY_PATH &#92;
VK_ICD_FILENAMES=$MESA/share/vulkan/icd.d/nouveau_icd.x86_64.json &#92;
VK_DRIVER_FILES=$MESA/share/vulkan/icd.d/nouveau_icd.x86_64.json &#92;
NVK_I_WANT_A_BROKEN_VULKAN_DRIVER=true &#92;
exec &amp;quot;$@&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After all these stage you should be able to run &lt;code&gt;vulkaninfo&lt;/code&gt; such as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ~/DEV/SCRIPTS/run-nvk.sh vulkaninfo | grep video_decode

	VK_KHR_video_decode_h264                    : extension revision 9
	VK_KHR_video_decode_h265                    : extension revision 8
	VK_KHR_video_decode_queue                   : extension revision 8

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;run-gstreamer-playback&quot; tabindex=&quot;-1&quot;&gt;Run GStreamer playback &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-with-nvk-driver/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now its time to run a real application exploiting the power of Vulkan to decode multimedia content. For that I’ll recommend you to use GStreamer which ship with Vulkan elements for decoding in 1.24.2 version bundled in Ubuntu 24.04.&lt;/p&gt;
&lt;p&gt;First of all, you’ll have to install the ubuntu packages for GStreamer&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check that the elements are available with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gst-inspect vulkan

  vulkancolorconvert: Vulkan Color Convert
  vulkandeviceprovider: Vulkan Device Provider
  vulkandownload: Vulkan Downloader
  vulkanh264dec: Vulkan H.264 decoder
  vulkanh265dec: Vulkan H.265 decoder
  vulkanimageidentity: Vulkan Image Identity
  vulkanoverlaycompositor: Vulkan Overlay Compositor
  vulkanshaderspv: Vulkan Shader SPV
  vulkansink: Vulkan video sink
  vulkanupload: Vulkan Uploader
  vulkanviewconvert: Vulkan View Convert
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you succeed to see this list of elements, you should be able to run a GStreamer pipeline with Vulkan Video extensioms. Here is a pipeline to decode a content:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ~/DEV/SCRIPTS/run-nvk.sh gst-launch-1.0 urisourcebin uri=https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_1MB.mp4 ! parsebin ! vulkanh264dec ! vulkandownload ! autovideosink
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hope you enjoyed this blog post and you are now able to decode h26x content with the &lt;strong&gt;open&lt;/strong&gt; Vulkan Video extensions.&lt;/p&gt;
&lt;p&gt;Thanks a lot to the work of David Airlie and Daniel Almeida who allow to decode h26x content with NVK driver.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Vulkanised 2025</title>
		<link href="https://blogs.igalia.com/scerveau/vulkanised-2025/"/>
		<updated>2025-03-11T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/vulkanised-2025/</id>
		<content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-600.avif 600w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-900.avif 900w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-1200.avif 1200w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-600.webp 600w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-900.webp 900w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-1200.webp 1200w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-600.jpeg 600w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-900.jpeg 900w, https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-1200.jpeg 1200w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;img alt=&quot;Vulkanised&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/scerveau/img/_Xnk8twK-_-600.jpeg&quot; width=&quot;1200&quot; height=&quot;675&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h1 id=&quot;uk-calling&quot; tabindex=&quot;-1&quot;&gt;UK calling &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkanised-2025/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Long time no see this beautiful grey sky, roast beef on sunday and large but full packed pub when there is a football or a rugby game (The rose team has been lucky this year, grrr).&lt;/p&gt;
&lt;p&gt;It was a delightful journey in the UK starting with my family visiting London including a lot (yes a lot…) of sightviews in a very short amount of time. But we managed to fit everything in. We saw the changing of the guards, the Thames river tide on a boat, Harry Potter gift shops and the beautiful Arsenal stadium with its legendary pitch, one of the best of England.&lt;/p&gt;
&lt;p&gt;It was our last attraction in London and now it was time for my family to go to Standsted back home and me to Cambridge and its legendary university.&lt;/p&gt;
&lt;p&gt;To start the journey in Cambridge, first I got some rest on Monday in the hotel to face the hail of information I will get during the conference. This year, Vulkanised took place on Arm’s campus, who kindly hosted the event, providing everything we needed to feel at home and comfortable.&lt;/p&gt;
&lt;p&gt;The first day, we started with an introduction from Ralph Potter, the Vulkan Working Group Chair at Khronos, who introduced the new 1.4 release and all the extensions coming along
including “Vulkan Video”. Then we could start this conference with my favorite topic, decoding video content with Vulkan Video. And the game was on! There was a presentation
every 30 minutes including a neat one from &lt;a href=&quot;https://www.youtube.com/watch?v=8FCgLGa76yU&quot;&gt;my colleague at Igalia Ricardo Garcia about Device-Generated Commands in Vulkan&lt;/a&gt; and a break every 3 presentations. It took a lot of mental energy to keep up with all the topics as each presentation was more interesting than the last.
During the break, we had time to relax with good coffee, delicious cookies, and nice conversations.&lt;/p&gt;
&lt;p&gt;The first day ended up with a tooling demonstrations from LunarG, helping us all to understand and tame the Vulkan beast. The beast is ours now!&lt;/p&gt;
&lt;p&gt;As I was not in the best shape due to a bug I caught on Sunday, I decided to play it safe and went to the hotel just after a nice indian meal. I had to prepare myself for the next day, where I would present “Vulkan Video is Open: Application Showcase”.&lt;/p&gt;
&lt;h1 id=&quot;vulkan-video-is-open-application-showcase&quot; tabindex=&quot;-1&quot;&gt;Vulkan Video is Open: Application showcase ! &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkanised-2025/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;First Srinath Kumarapuram from Nvidia gave a &lt;a href=&quot;https://www.youtube.com/watch?v=IYzKWPRZNiY&quot;&gt;presentation&lt;/a&gt; about the new extensions made available during 2024 by the Vulkan Video TSG.
It started with a brief timeline of the video extensions from the initial h26x decoding to the latest VP9 decode coming this year including the 2024 extensions such as the AV1 codec.
Then he presented more specific extensions such as &lt;code&gt;VK_KHR_video_encode_quantization_map&lt;/code&gt;, &lt;code&gt;VK_KHR_video_maintenance2&lt;/code&gt; released during 2024 and coming in 2025, &lt;code&gt;VK_KHR_video_encode_intra_refresh&lt;/code&gt;.
He mentioned that the Vulkan toolbox now completely supports Vulkan Video, including the Validation Layers, Vulkan Profiles, &lt;code&gt;vulkaninfo&lt;/code&gt; or &lt;code&gt;GFXReconstruct&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After some deserved applause for a neat presentation, it was my time to be on stage.&lt;/p&gt;
&lt;p&gt;During this presentation I focused on the Open source ecosystem around Vulkan Video. Indeed Vulkan Video ships with a &lt;a href=&quot;https://github.com/KhronosGroup/Vulkan-Video-Samples&quot;&gt;sample app&lt;/a&gt; which is totally open
along with the regular &lt;a href=&quot;https://github.com/KhronosGroup/VK-GL-CTS&quot;&gt;Conformance Test Suite&lt;/a&gt;. But that’s not all!
Two major frameworks now ship with Vulkan Video support: &lt;a href=&quot;https://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; and &lt;a href=&quot;https://ffmpeg.org/&quot;&gt;FFmpeg&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before this, I started by talking about &lt;a href=&quot;https://www.mesa3d.org/&quot;&gt;Mesa&lt;/a&gt;, the open graphics library. This library which is totally open provides drivers which support Vulkan Video extensions and allow applications to run Vulkan Video decode or encode.
The 3 major chip vendors are now supported. It started in 2022 with RADV, a userspace driver that implements the Vulkan API on most modern AMD GPUs. This driver supports all the vulkan video extensions except the lastest ones such as &lt;code&gt;VK_KHR_video_encode_quantization_map&lt;/code&gt; or &lt;code&gt;VK_KHR_video_maintenance2&lt;/code&gt; but this they should be implemented sometime in 2025. Intel GPUs are now supported with the ANV driver, this driver also supports the common video extensions such as h264/5 and AV1 codec. The last driver to gain support was at the end of 2024
where several of the Vulkan Video extensions were introduced to NVK, a Vulkan driver for NVIDIA GPUs. This driver is still experimental but it’s possible to decode H264 and H265 content as well as its proprietary version. This completes the offering of the main GPUs on the market.&lt;/p&gt;
&lt;p&gt;Then I moved to the applications including GStreamer, FFmpeg and Vulkan-Video-Samples. In addition to the extensions supported in 2025, we talked mainly about the decode conformance using Fluster. To compare all the implementations, including the driver, the version and the framework, a spreadsheet can be found &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1qL8NLZs4_60YE6PzzSmMO_jXbS95nptmaZ3k0m7yEg4/edit?gid=0#gid=0&quot;&gt;here&lt;/a&gt;.
In this spreadsheet we summarize the 3 supported codecs (H264, H265 and AV1) with their associated test suites and compare their implemententations using Vulkan Video (or not, see results
for VAAPI with GStreamer).
GStreamer, my favorite playground, can now decode H264 and H265 since 1.24 and recently got the support for AV1 but the merge request is still under review. It supports more than 80% of the H264 test vectors for the &lt;code&gt;JVT-AVC_V1&lt;/code&gt; and
85% of the H265 test vectors in &lt;code&gt;JCT-VC-HEVC_V1&lt;/code&gt;.
FFMpeg is offering better figures  passing 90% of the tests. It supports all the avaliable codecs including all of the encoders as well.
And finally Vulkan-Video-Samples is the app that you want to use to support all codecs for both encode and decode, but its currently missing support for mesa drivers when it comes to use Fluster decode tests…&lt;/p&gt;
&lt;h1 id=&quot;vulkanised-on-the-3rd-day&quot; tabindex=&quot;-1&quot;&gt;Vulkanised on the 3rd day &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkanised-2025/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;During the 3rd day, we had interesting talks as well demonstrating the power of Vulkan, from Blender, a free and open-source 3D computer graphics software tool switching progressively to Vulkan, to the implementation of 3D a game engine using Rust, or compute shaders in Astronomy. My other colleague at Igalia, Lucas Fryzek, also had a presentation on Mesa with &lt;a href=&quot;https://www.youtube.com/watch?v=raUHBYPD5BI&amp;amp;list=PLMLurvdlOpWO_jDP_l0ix1hz0BXEBwAFc&amp;amp;index=22&quot;&gt;Lavapipe: a Mesa’s Software Renderer for Vulkan&lt;/a&gt; which allows you to have a hardware free implementation of Vulkan and to validate extensions in a simpler way. Finally, we finished this prolific and dense conference with Android and its close collaboration with Vulkan.&lt;/p&gt;
&lt;p&gt;If you are interested in 3D graphics, I encourage you to attend future Vulkanised editions, which are full of passionate people. And if you can not attend you can still watch the presentation online.&lt;/p&gt;
&lt;p&gt;If you are interested in the Vulkan Video presentation I gave, you can catch up the video here:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/sBKtQAfwhMA?si=Wq8ST0jG31VBnQWe&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Or follow our Igalia live blog post on Vulkan Video:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.igalia.com/vjaquez/vulkan-video-status/&quot;&gt;https://blogs.igalia.com/vjaquez/vulkan-video-status/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about Vulkan, GStreamer or any other open multimedia framework, please feel free to &lt;a href=&quot;https://www.igalia.com/contact/&quot;&gt;contact us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Vulkan Video encoder in GStreamer</title>
		<link href="https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/"/>
		<updated>2023-12-10T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/</id>
		<content type="html">&lt;h1 id=&quot;vulkan-video-encoder-in-gstreamer&quot; tabindex=&quot;-1&quot;&gt;Vulkan Video encoder in GStreamer &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;During the last months of 2023, we, at &lt;a href=&quot;https://www.igalia.com/about/&quot;&gt;Igalia&lt;/a&gt;, decided to focus on the latest provisional specs proposed
by the &lt;a href=&quot;https://www.khronos.org/news/press/vulkan-sdk-is-vulkan-video-ready&quot;&gt;Vulkan Video Khronos TSG group&lt;/a&gt; to support encode operations in an open reference.&lt;/p&gt;
&lt;p&gt;As the &lt;a href=&quot;https://www.khronos.org/blog/khronos-finalizes-vulkan-video-extensions-for-accelerated-h.264-and-h.265-encode?mc_cid=e4afdbcd22&amp;amp;mc_eid=47d3c1b7bb&quot;&gt;Khronos TSG Finalizes Vulkan Video Extensions for Accelerated H.264 and H.265 Encode&lt;/a&gt;
the 19th of December 2023, here is an update on our work to support both h264 and h265 codec in GStreamer.&lt;/p&gt;
&lt;p&gt;This work has been possible thanks to the relentless work of the Khronos TSG during the past years, including the IHV vendors, such as
AMD, NVIDIA, Intel, but also Rastergrid and its massive work on the specifications wording and the vulkan tooling, and of course Cognizant for its valuable
contributions to the &lt;a href=&quot;https://github.com/KhronosGroup/VK-GL-CTS&quot;&gt;Vulkan CTS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This work started with moving structures in drivers and specifications along the CTS tests definition. It has been a joint venture
to validate the specifications and check that the drivers suppports properly the features necessary to encode a video
with h264 &lt;strong&gt;and&lt;/strong&gt; h265 codecs. &lt;em&gt;Breaking news, more formats should come very soon…&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-gstreamer-code&quot; tabindex=&quot;-1&quot;&gt;The GStreamer code &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;building-a-community&quot; tabindex=&quot;-1&quot;&gt;Building a community &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thanks first to &lt;a href=&quot;https://lynne.ee/pages/about.html&quot;&gt;Lynne&lt;/a&gt; and &lt;a href=&quot;https://airlied.blogspot.com/&quot;&gt;David Airlie&lt;/a&gt;, on their RADV/FFmpeg effort,
a first implementation was available last year to validate the provisional specifications of the encoders.
This work helped us a lot to design the GStreamer version and offer a performant solution for it.&lt;/p&gt;
&lt;p&gt;The GStreamer Vulkan bits have been also possible thanks to the tight collaboration with the CTS folks which helped us a lot to understand the
crashes we could experience without any clues in the drivers.&lt;/p&gt;
&lt;p&gt;To write this GStreamer code, we got inspiration from the code written by the GStreamer community along the &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/va/index.html?gi-language=c&quot;&gt;GstVA encoders&lt;/a&gt; and
v4l2codecs plugins. So great kudos to the GStreamer community and especially to He Junayan from Intel, Collabora folks paving the way to stateless codecs and of course
Igalia’s past contributions.&lt;/p&gt;
&lt;p&gt;And finally the active and accurate reviews from Centricular folks to achieve a valid synchronized operation in Vulkan,
see for example &lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5079&quot;&gt;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5079&lt;/a&gt; in addition to their initial work to
support Vulkan.&lt;/p&gt;
&lt;h3 id=&quot;give-me-the-de-coded-bits&quot; tabindex=&quot;-1&quot;&gt;Give me the (de)coded bits &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The code is available on the &lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5739&quot;&gt;GStreamer MR&lt;/a&gt; and we plan to have it ready in the 1.24 version.&lt;/p&gt;
&lt;p&gt;This code needs at least the Vulkan SDK version 1.3.274 with KHR Vulkan Video encoding extension support. It should be available publicly when the specifications and the tooling will be available
along the next SDK release early 2024.&lt;/p&gt;
&lt;p&gt;To build it, nothing is more simple than (after installing the &lt;a href=&quot;https://vulkan.lunarg.com/#new_tab&quot;&gt;LunarG SDK&lt;/a&gt; and the &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-meson.html?gi-language=c&quot;&gt;GST requirements&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ meson setup builddir -Dgst-plugins-bad:vulkan-video=enabled
$ ninja -C builddir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And to run it, you’ll need an IHV driver supporting the KHR extension, which should happen very soon, or the community driven driver such as &lt;a href=&quot;https://gitlab.freedesktop.org/zzoon/mesa/-/tree/h264enc_anv_4?ref_type=heads&quot;&gt;Igalia’s Intel ANV driver&lt;/a&gt;.
You can also try the AMD RADV driver available &lt;a href=&quot;https://gitlab.freedesktop.org/airlied/mesa/-/commits/radv-vulkan-video-encode-h2645-spec-latest/?ref_type=undefined&quot;&gt;here&lt;/a&gt;
when KHR will be available.&lt;/p&gt;
&lt;p&gt;To encode and validate the bitstream you can run this transcode GStreamer pipeline:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gst-launch-1.0 videotestsrc ! vulkanupload ! vulkanh265enc ! h265parse ! avdec_h265 ! autovideosink
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see a &lt;code&gt;vulkanupload&lt;/code&gt; is necessary to upload the GStreamer buffers to the GPU memory, then the buffer will be encoded
through the &lt;code&gt;vulkanh265enc&lt;/code&gt; which will generate a byte-stream AU aligned stream which can be decoded with any decoder, here the FFMpeg one.&lt;/p&gt;
&lt;p&gt;We are planning to simplify this pipeline and allow to select an encoder from a multiple device configuration.&lt;/p&gt;
&lt;p&gt;It supports most of the Vulkan video encoder features and can encode I, P and B Frames for better streaming performance. See this
&lt;a href=&quot;https://www.rastergrid.com/blog/multimedia/2021/05/video-compression-basics/&quot;&gt;blog post&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;challenges&quot; tabindex=&quot;-1&quot;&gt;Challenges &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the most important challenge here was to put &lt;strong&gt;all&lt;/strong&gt; the bits together and understand when the drivers tell you that you are doing
something wrong with only an obscure segfault.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/Q5VBs5lDkE-300.avif 300w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/Q5VBs5lDkE-300.webp 300w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;img alt=&quot;Vulkan Video&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/scerveau/img/Q5VBs5lDkE-300.png&quot; width=&quot;300&quot; height=&quot;320&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The vulkan process to encode &lt;em&gt;stateless&lt;/em&gt; a raw bitstream is quite simple as it will be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initialize the video session with the correct video profile (h264,h265 etc…)&lt;/li&gt;
&lt;li&gt;Initialize the sessions paramaters such as SPS/PPS which will be used by the driver during the encode session&lt;/li&gt;
&lt;li&gt;Reset the codec state&lt;/li&gt;
&lt;li&gt;Encode the buffers:
&lt;ul&gt;
&lt;li&gt;Change the quality/rate control if necessary&lt;/li&gt;
&lt;li&gt;Retrieve the video session parameters from the driver if necessary&lt;/li&gt;
&lt;li&gt;Set the bitstream standard parameters such as slice header data.&lt;/li&gt;
&lt;li&gt;Set the begin video info to give the context to the encoder for the reference&lt;/li&gt;
&lt;li&gt;Encode the buffer&lt;/li&gt;
&lt;li&gt;Query the encoded result&lt;/li&gt;
&lt;li&gt;End the video coding operation&lt;/li&gt;
&lt;li&gt;&lt;em&gt;repeat …&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The challenge here was not the state machine design but more the understanding of the underlying bits necessary to tell
the driver what and how to encode it. Indeed to encode a video stream, a lot of parameters (more than 200…) are necessary and a bad
use of these parameters can lead to obscure crashes in the driver stack.&lt;/p&gt;
&lt;p&gt;So first it was important to validate the data provided to the Vulkan drivers through the Validation layer. This part
in implementing an application using Vulkan is the first and essential step to avoid headaches, see &lt;a href=&quot;https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Validation_layers&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can checkout the code from &lt;a href=&quot;https://github.com/KhronosGroup/Vulkan-ValidationLayers&quot;&gt;here&lt;/a&gt; to get the latest one and configure it to validate
your project. Otherwise it should come from the Vulkan SDK.&lt;/p&gt;
&lt;p&gt;This step helped us a lot to understand the mechanics expected by the driver to provide the frames and their references
to encode those properly. It also helped to use some API such as the rate control or the quality level.&lt;/p&gt;
&lt;p&gt;But Validation Layers cant do everything and that’s why designing, reviewing a solid codebase in CTS as a reference
is crucial to implement the GStreamer application or any other 3rd party application. So a lot of time in Igalia has been
dedicated to ease and simplify the CTS tests to facilitate its usage.&lt;/p&gt;
&lt;p&gt;Indeed the Validation Layers do not validate the Video Standard parameters for example such as the one provided for the format
underlying specific data.&lt;/p&gt;
&lt;p&gt;So we spent a few hours checking some missing parameters in CTS as in GStreamer which was leading to obscure crash, especially
when we were playing with references. A blog post should follow explaining this part.&lt;/p&gt;
&lt;p&gt;To debug this missing bits, we used some facilitating tools such as &lt;a href=&quot;https://vulkan.lunarg.com/doc/view/latest/linux/capture_tools.html&quot;&gt;GfxReconstruct Vulkan layer&lt;/a&gt;
or the &lt;code&gt;VK_LAYER_LUNARG_api_dump&lt;/code&gt; which allows you to get an essential dump of your calls and compare the results with other implemetations.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/vulkan-video-encoder-in-gstreamer/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It was a great journey providing a cross platform solution to the community to encode video using largely adopted codec
such as h264 and h265. As said before other codecs will come very soon, so stay tuned!&lt;/p&gt;
&lt;p&gt;I mentioned the team work in this journey as without the dedication of all, it wouldn’t have been possible to achieve this work
in a short time span.&lt;/p&gt;
&lt;p&gt;And last but not least, I’d like to special thank also Valve to sponsor this work without whom it wouldn’t have been possible to go as far and as fast!&lt;/p&gt;
&lt;p&gt;We’ll attend the &lt;a href=&quot;https://www.khronos.org/events/vulkanised-2024&quot;&gt;Vulkanised 2024&lt;/a&gt; event where we’ll demonstrate this work.
Feel free to come and talk to us there. We’ll be delighted to hear and discuss your doubts or brilliant ideas !&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about Vulkan, GStreamer or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Introducing GstPipelineStudio 0.3.4</title>
		<link href="https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/"/>
		<updated>2023-10-20T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/</id>
		<content type="html">&lt;h2 id=&quot;gstpipelinestudio&quot; tabindex=&quot;-1&quot;&gt;GstPipelineStudio &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As it’s not always convenient to use the powerful command line based, &lt;code&gt;gst-launch&lt;/code&gt; tool and also manage all the debug possibilities on all the platforms supported by GStreamer,
I started this personal project in 2021 to facilitate the adoption to the GStreamer framework and help newbies as confirmed engineers enjoy the power of it.&lt;/p&gt;
&lt;p&gt;Indeed a few other projects, such as &lt;a href=&quot;https://github.com/virinext/pipeviz&quot;&gt;Pipeviz&lt;/a&gt; (greatly inspired from…) or &lt;a href=&quot;https://gitlab.gnome.org/GNOME/gst-debugger&quot;&gt;gst-debugger&lt;/a&gt;, already tried to offer this GUI capability,
my idea with GPS was to provide a cross-platform tool written in Rust with the powerful framework, gtk-rs.&lt;/p&gt;
&lt;p&gt;The aim of this project is to provide the GUI for GStreamer but also being able to remote debug existing pipeline while offering
a very simple and accessible interface as back in the days I discovered DirectShow with the help of &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/directshow/using-graphedit&quot;&gt;graphedit&lt;/a&gt; or &lt;a href=&quot;https://www.videohelp.com/software/GraphStudio&quot;&gt;GraphStudioNext&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;project-details&quot; tabindex=&quot;-1&quot;&gt;Project details &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/YyhaJBWbN6-600.avif 600w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/YyhaJBWbN6-600.webp 600w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;img alt=&quot;GstPipelineStudio interface&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/scerveau/img/YyhaJBWbN6-600.png&quot; width=&quot;600&quot; height=&quot;311&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The interface includes 5 important zones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) The registry area gives you an access to the GStreamer registry including all the plugins/elements available on your system. It provides
you details on each elements. You can also access to a favorite list.&lt;/li&gt;
&lt;li&gt;(2) the main drawing area is where you can add elements from the registry area and connect them together. This area
allows you to have multiple independent pipelines with its own player for each drawing area.&lt;/li&gt;
&lt;li&gt;(3) The control playback area, each pipeline can be controlled from this area including basic play/stop/pause but also a seekbar.&lt;/li&gt;
&lt;li&gt;(4) the debug zone where you’ll receive the messages from the application.&lt;/li&gt;
&lt;li&gt;(5) The render zone where you can have a video preview if a video sink has been added to the pipeline. Future work includes to have tracers or audio analysis in this zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The project has been written in Rust to offer more stability and thanks to the wonderful work to use the GTK framework, it
was perfectly fitting to this project as it gives an easy way to use it over the 3 platforms targeted such as GNU/Linux, MacOS and
Windows.
On this last platform which is quite well “implanted” in the desktop eco-system, the use of GStreamer
can lead to difficulties, that’s why &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/uploads/ce4b8443e2d3161eeaed089071cdc402/GstPipelineStudio-0.3.4.msi&quot;&gt;GstPipelineStudio Windows MSI&lt;/a&gt; will be a perfect match to test the power of the GStreamer framework.&lt;/p&gt;
&lt;p&gt;This project has been written under the GPL v3 License.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works-under-the-hood&quot; tabindex=&quot;-1&quot;&gt;How it works under the hood &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The trick is quite simple as it uses the power of &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/gstreamer/gstparse.html?gi-language=c#gst_parse_launch&quot;&gt;gst-parse-launch API&lt;/a&gt; to build a pipeline as a transformation of the visual pipeline to a command line.&lt;/p&gt;
&lt;p&gt;So its a clearly a sibling of &lt;code&gt;gst-launch&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Right now its directly linked to the GStreamer installed on your system but future work could be to connect it over daemons
such as &lt;a href=&quot;https://github.com/dabrain34/gpop&quot;&gt;GstPrinceOfParser&lt;/a&gt;
or &lt;a href=&quot;https://developer.ridgerun.com/wiki/index.php/GStreamer_Daemon&quot;&gt;gstd&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-s-new-in-0-3-4&quot; tabindex=&quot;-1&quot;&gt;What’s new in &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/releases&quot;&gt;0.3.4&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The main feature of this release is the cross platform ready state. These are beta versions but the CI is now ready
to build and deploy Flathub (Linux), Mac OS and Windows version of GstPipelineStudio.&lt;/p&gt;
&lt;p&gt;You can download the installers from the project &lt;a href=&quot;https://dabrain34.pages.freedesktop.org/GstPipelineStudio/&quot;&gt;page&lt;/a&gt; or with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux: &lt;code&gt;flatpak install org.freedesktop.dabrain34.GstPipelineStudio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;MacOS: &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/uploads/5ac641779cfb7e8fffdf9be6a61fba17/GstPipelineStudio-0.3.4.dmg&quot;&gt;DMG file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows: &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/uploads/ce4b8443e2d3161eeaed089071cdc402/GstPipelineStudio-0.3.4.msi&quot;&gt;MSI file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a list of main features added to the app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open a pipeline from the command line and it will be drawn automatically on the screen. This feature
allows you to take any command line pipeline and draw it on the screen to allow any new play tricks with the pipeline, such as change of elements, properties etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple graphview allows you to draw multiple independent pipeline in the same instance of GstPipelineStudio.
The playback state is totally independent for each of the views.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Capsfilter has been added to the links allowing to add this crucial feature of GStreamer pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gstreamer-1.0 wrap support to the build system. So you can
build your own version of GPS using a dedicated GStreamer version.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-s-next-in-the-pipeline&quot; tabindex=&quot;-1&quot;&gt;What’s next in the pipeline &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/introducing-gstpipelinestudio-0-3-4/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Among multiple use case, key and debug features, the most upcoming features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support the zoom on the graphview. As a pipeline can be quite big, the zoom is a key/must features for GPS. See &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/merge_requests/53&quot;&gt;MR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debug sections such as receiving events/tags/messages or tracers and terminal support, see &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/merge_requests/55&quot;&gt;MR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elements compatibility to check if an element can connect to the previous/next one.&lt;/li&gt;
&lt;li&gt;Remote debugging: A tracer wsserver is currently under development allowing to send over websocket the pipeline events such as connections, properties or element addition.
A &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/merge_requests/52&quot;&gt;MR&lt;/a&gt; is under development to connect this tracer and render the corresponding pipeline.&lt;/li&gt;
&lt;li&gt;Auto plugging according to the rank of each compatible elements for a given pad caps.&lt;/li&gt;
&lt;li&gt;Display the audio signal in a dedicated render tab.&lt;/li&gt;
&lt;li&gt;Translations&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Unit tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a &lt;a href=&quot;https://gstconf.ubicast.tv/videos/gstpipelinestudio-version-030-is-out/&quot;&gt;lighning talk&lt;/a&gt;, I gave about this release (0.3.3), during the 2023 GStreamer conference.&lt;/p&gt;
&lt;p&gt;Hope you’ll enjoy this tool and please feel free to provide
new features with an RFC &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/issues/new&quot;&gt;here&lt;/a&gt; or merge requests &lt;a href=&quot;https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio/-/merge_requests&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about GstPipelineStudio, GStreamer or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>This is a post with no description</title>
		<link href="https://blogs.igalia.com/scerveau/this-is-a-post-with-no-description/"/>
		<updated>2023-10-06T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/this-is-a-post-with-no-description/</id>
		<content type="html">&lt;p&gt;When the post has not &lt;code&gt;description:&lt;/code&gt; field, this first paragraph is the &lt;strong&gt;excerpt&lt;/strong&gt; but we want it to be rendered using &lt;em&gt;markdown&lt;/em&gt;.
The rest of the post content is not relevant for this particular case.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Discover GStreamer full static mode</title>
		<link href="https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/"/>
		<updated>2023-07-25T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/</id>
		<content type="html">&lt;h1 id=&quot;how-to-embed-statically-your-own-tailored-version-of-gstreamer-in-your-application&quot; tabindex=&quot;-1&quot;&gt;How to embed statically your own tailored version of GStreamer in your application &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Since the &lt;a href=&quot;https://dabrain34.github.io/2021/10/04/shrinking_gstreamer.html&quot;&gt;gstreamer-full effort&lt;/a&gt;, it was possible to create a shared library which will embed the GStreamer framework in addition to its set of plugins.&lt;/p&gt;
&lt;p&gt;Within this effort, it was also possible to register the selected plugins/features automatically by calling the &lt;code&gt;gst_init&lt;/code&gt; method in your application linking with &lt;code&gt;gstreamer-full&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This method was offering a &lt;code&gt;gstreamer-full&lt;/code&gt; package with library, headers and pc files but it was not possible to embed GStreamer statically in your application and use it transparently.&lt;/p&gt;
&lt;h1 id=&quot;gstvkvideoparser-a-standalone-solution&quot; tabindex=&quot;-1&quot;&gt;GstVkVideoParser: a standalone solution &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In the journey to bring an open source solution for a video parser to the &lt;a href=&quot;https://github.com/KhronosGroup/VK-GL-CTS&quot;&gt;Vulkan Conformance Test Suite&lt;/a&gt;, we chose first to use GStreamer as it was bringing all the parsing facilities
necessary to support the needed codecs such as H26x or VPx. This solution was supposed to be also cross platform and dragging as less as possible system dependencies.
Seen that GStreamer is usually dragging its own dependencies such as glib or orc and as we wanted to have a standalone &lt;a href=&quot;https://github.com/Igalia/GstVkVideoParser&quot;&gt;GstVkVideoParser&lt;/a&gt; library supported on Windows, a little bit
of work and love was necessary to add this to GStreamer.&lt;/p&gt;
&lt;p&gt;Unfortunately this solution has not be retained by the Vulkan Video TSG, not because it was not working but another parser has been made available and easy to integrate to the CTS at source level avoiding binary linkage, see Vulkan Video &lt;a href=&quot;https://github.com/KhronosGroup/VK-GL-CTS/commit/e5db10e7ae436dbd9b46dad9518f3254dd6eeea2&quot;&gt;change&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;gstreamer-as-a-full-static-library&quot; tabindex=&quot;-1&quot;&gt;GStreamer as a full static library &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;With the &lt;code&gt;gstreamer-full&lt;/code&gt; work, everything was almost ready to be used except to have &lt;code&gt;gstreamer-full&lt;/code&gt; as a real static library and be able to link with it in any application.&lt;/p&gt;
&lt;p&gt;Here is the &lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4128&quot;&gt;MR&lt;/a&gt; merged and the challenges taken up:&lt;/p&gt;
&lt;h2 id=&quot;adding-gst-full-target-type-static&quot; tabindex=&quot;-1&quot;&gt;Adding gst-full-target-type=static &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To generate the &lt;code&gt;gstreamer-full&lt;/code&gt; dependency which will be statically linked into the application, we decided to introduce a new gst meson options, &lt;code&gt;gst-full-target-type&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By default the &lt;code&gt;gstreamer-full&lt;/code&gt; will be built as a &lt;em&gt;shared library&lt;/em&gt; as before.&lt;/p&gt;
&lt;p&gt;By passing &lt;code&gt;gst-full-target-type=static&lt;/code&gt;, only static object will be generated and a package config file will be generated for &lt;code&gt;gstreamer-full&lt;/code&gt; allowing the application to avoid to know what static library it needs to add the link line.
The GStreamer build system will take care of enabling/disabling the features/libraries you (do/don’t) need.&lt;/p&gt;
&lt;h2 id=&quot;initialize-the-plugins-features-automatically&quot; tabindex=&quot;-1&quot;&gt;Initialize the plugins/features automatically &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To avoid multiple call necessary to initialize GStreamer, it was also necessary to call the &lt;code&gt;gst_init_static_plugins&lt;/code&gt; along with &lt;code&gt;gst_init&lt;/code&gt; only in full-static mode but it was leading to a build issue.&lt;/p&gt;
&lt;p&gt;Indeed most of tools/examples/tests are linking with &lt;code&gt;libgstreamer-1.0&lt;/code&gt; which owns &lt;code&gt;gst_init ()&lt;/code&gt; but to facilitate the plugins registration, it was necessary to move all the tools build after the &lt;code&gt;gstreamer-full&lt;/code&gt; stage. A first &lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1581&quot;&gt;MR&lt;/a&gt; has been performed to let gstreamer tools be built against gstreamer-full
but additional work was necessary for some core tools or helpers such as &lt;code&gt;gst-transcoder&lt;/code&gt; or &lt;code&gt;gst-plugin-scanner&lt;/code&gt; to avoid a linking issue.&lt;/p&gt;
&lt;h2 id=&quot;disable-tests-and-examples&quot; tabindex=&quot;-1&quot;&gt;Disable tests and examples &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In a future work all the tools/examples/tests should support the &lt;code&gt;full-static&lt;/code&gt; mode but as GStreamer aims to be a shared object framework, we decided to leave this work for later and disable all the examples/tests in full static mode as most of the application using a tailor build won’t need the examples and tests.&lt;/p&gt;
&lt;h2 id=&quot;windows-support&quot; tabindex=&quot;-1&quot;&gt;Windows support &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the goal of this work was to provide a Windows library to the Vulkan CTS free of dependency, which has been achieved but some additional work might be necessary to support
all of the use case, the GStreamer framework offer, especially on supporting library-dependent plugins.&lt;/p&gt;
&lt;h2 id=&quot;give-me-an-example&quot; tabindex=&quot;-1&quot;&gt;Give me an example … &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the &lt;a href=&quot;https://github.com/Igalia/GstVkVideoParser&quot;&gt;GstVkVideoParser project&lt;/a&gt;, various jobs are building Linux and Windows versions generating a library without any GStreamer/glib dependencie, everything is embedded inside the library, as you can see in this &lt;a href=&quot;https://github.com/Igalia/GstVkVideoParser/actions&quot;&gt;GitHub’ Actions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this project, GStreamer is used as a meson subproject/wrap which allows to build GStreamer along of GstVkVideoParser. This can be possible easily by adding the following file to your meson project&lt;/p&gt;
&lt;p&gt;&lt;em&gt;subprojects/gstreamer-1.0.wrap&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[wrap-git]
directory=gstreamer-1.0
url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git
revision=main

[provide]
dependency_names = gstreamer-1.0, gstreamer-base-1.0, gstreamer-video-1.0, gstreamer-audio-1.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and then add the following lines to your &lt;code&gt;meson.build&lt;/code&gt; to depend on &lt;code&gt;gstreamer-full&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;meson.build&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gstreamer_full_dep = dependency(&#39;gstreamer-full-1.0&#39;, fallback: [&#39;gstreamer-1.0&#39;], required :true)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In order to build a project, library or application which is using a tailored version of GStreamer you can follow this &lt;a href=&quot;https://github.com/Igalia/GstVkVideoParser/blob/main/configure_gst_full.py&quot;&gt;configure example&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ meson buildfull-static --default-library=static --force-fallback-for=gstreamer-1.0,glib,libffi,pcre2 -Dauto_features=disabled -Dglib:tests=false -Djson-glib:tests=false -Dpcre2:test=false -Dvkparser_standalone=enabled -Dgstreamer-1.0:libav=disabled -Dgstreamer-1.0:ugly=disabled -Dgstreamer-1.0:ges=disabled -Dgstreamer-1.0:devtools=disabled -Dgstreamer-1.0:default_library=static -Dgstreamer-1.0:rtsp_server=disabled -Dgstreamer-1.0:gst-full-target-type=static_library -Dgstreamer-1.0:gst-full-libraries=gstreamer-video-1.0, gstreamer-audio-1.0, gstreamer-app-1.0, gstreamer-codecparsers-1.0 -Dgst-plugins-base:playback=enabled -Dgst-plugins-base:app=enabled -Dgst-plugins-bad:videoparsers=enabled -Dgst-plugins-base:typefind=enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case we are disabling everything in GStreamer by using &lt;code&gt;-Dauto_features=disabled&lt;/code&gt; and some enabled features such as &lt;code&gt;ges&lt;/code&gt;, &lt;code&gt;libav&lt;/code&gt;, etc. and enable only what we need as plugins, &lt;code&gt;playback&lt;/code&gt;, &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;videoparsers&lt;/code&gt; and &lt;code&gt;typefind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And finally we are enabling the static build with &lt;code&gt;--default-library=static&lt;/code&gt; and &lt;code&gt;-Dgstreamer-1.0:gst-full-target-type=static_library&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;next&quot; tabindex=&quot;-1&quot;&gt;Next … &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/discover-gstreamer-full-static-mode/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you can see, it’s quite easy now to build an application and depends on &lt;code&gt;gstreamer-full&lt;/code&gt; static build, but there is still some issues to address such as the plugins dependencies which might be not static and some other platform specific issue such as the &lt;code&gt;gstreamer-full&lt;/code&gt; symbols export on Windows.&lt;/p&gt;
&lt;p&gt;You can follow some open issues such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1629&quot;&gt;static build is failing on Windows platform&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2104&quot;&gt;gstfull: Build only static library on Windows&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As usual, if you would like to learn more about Vulkan Video, GStreamer or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>ESExtractor: how to integrate a dependency-free library to the Khronos CTS</title>
		<link href="https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/"/>
		<updated>2023-04-19T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/</id>
		<content type="html">&lt;h1 id=&quot;esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts&quot; tabindex=&quot;-1&quot;&gt;ESExtractor, how to integrate a dependency-free library to the Khronos CTS &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Since the &lt;a href=&quot;https://github.com/KhronosGroup/VK-GL-CTS&quot;&gt;Vulkan CTS&lt;/a&gt; is now able to test and check &lt;a href=&quot;https://www.khronos.org/news/press/vulkan-sdk-is-vulkan-video-ready&quot;&gt;Vulkan Video support&lt;/a&gt;
including video decoding, it was necessary to define the kind of media container to be used inside the test cases and the library
to extract the necessary encoded data.&lt;/p&gt;
&lt;p&gt;In a first attempt, the &lt;a href=&quot;https://ffmpeg.org/&quot;&gt;FFmpeg media toolkit&lt;/a&gt; had been chosen to extract the video packets from the A/V ISO base media
format chosen as a container reference. This library was provided as a binary package and loaded dynamically at each
test run.&lt;/p&gt;
&lt;p&gt;As Vulkan video aims to test only &lt;em&gt;video&lt;/em&gt; contents, it was not necessary to choose a complex media container,
so first all the videos were converted to the elementary stream format for
H264 and H265 contents.
This is a very elementary format based on MPEG start codes and NAL unit identification.&lt;/p&gt;
&lt;p&gt;To avoid an extra multimedia solution integrable only with binaries, a first attempt to replace FFmpeg was,
to use GStreamer and an in-house helper library called &lt;a href=&quot;https://github.com/Igalia/GstVkVideoParser/tree/main/lib/demuxeres&quot;&gt;demuxeres&lt;/a&gt;.
It was smaller but needed to be a binary still to avoid the glib/gstreamer system dependencies (self contained library).
it was a no-go still because the binary package would be awkward to support on the various platforms targetted by the the Khronos CTS.&lt;/p&gt;
&lt;p&gt;So at &lt;a href=&quot;https://www.igalia.com/&quot;&gt;Igalia&lt;/a&gt;, we decided to implement a minimal, dependency-free, custom library, written in C++
to be compliant with the Khronos CTS and simple to integrate into any build system.&lt;/p&gt;
&lt;p&gt;This library is called &lt;a href=&quot;https://github.com/Igalia/ESExtractor&quot;&gt;ESExtractor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A proposed change :) please close&lt;/p&gt;
&lt;h2 id=&quot;what-is-esextractor&quot; tabindex=&quot;-1&quot;&gt;What is ESExtractor ? &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ESExtractor aims to be a simple elementary stream extractor. For the first revision it was able to extract video data from
a file in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Network_Abstraction_Layer&quot;&gt;NAL standard&lt;/a&gt;.
The first official release was &lt;a href=&quot;https://github.com/Igalia/ESExtractor/releases/tag/release-v0.2.4&quot;&gt;0.2.4&lt;/a&gt;. In this release,
only the NAL was supported with both the H264 and H265 streams supported.&lt;/p&gt;
&lt;p&gt;As Vulkan Video aims to support more than H264 and H265 including format such as AV1 or VP9, the ESExtractor had to support multiple format.
A redesign has been started to support multiple format and is now available in the version 0.3.2.&lt;/p&gt;
&lt;h2 id=&quot;how-esextractor-works&quot; tabindex=&quot;-1&quot;&gt;How ESExtractor works &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A simple C interface is provided to maximise portability and use by other languages.&lt;/p&gt;
&lt;h3 id=&quot;es-extractor-new&quot; tabindex=&quot;-1&quot;&gt;es_extractor_new &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ESExtractor extractor = es_extractor_new(filePath, &amp;quot;options&amp;quot;));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This interface returns the main object which will give you access to the packets according to the file path and the options given in the arguments.
This interface returns a ready to use object where the stream has been initially parsed to determine the kind of video during
the object creation.&lt;/p&gt;
&lt;p&gt;Then you can check the video format with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ESEVideoFormat eVideoFormat = es_extractor_video_format(extractor);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or the video codec with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ESEVideoCodec eVideoCodec = es_extractor_video_codec(extractor);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It supports H264, H265, AV1 and VP9 for now.&lt;/p&gt;
&lt;h3 id=&quot;es-extractor-read-packet&quot; tabindex=&quot;-1&quot;&gt;es_extractor_read_packet &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This API is the main function to retrieve the available packets from the file. Each time this API is called,
the library will return the next available packet according to the format and the specific alignment (ie NAL) and
a status to let the application decide what to do next. The packet should be freed using &lt;code&gt;es_extractor_clear_packet&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;has-ci-powered-by-github&quot; tabindex=&quot;-1&quot;&gt;Has CI powered by github &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/esextractor-how-to-integrate-a-dependency-free-library-to-the-khronos-cts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To test the library usage, we have implementing a testing framework in addition to a CI infrastructure
As github offers a very powerful worklow, we decided to use this platform to test the library on various architectures and platforms.
The &lt;a href=&quot;https://github.com/Igalia/ESExtractor/actions&quot;&gt;CI&lt;/a&gt; is now configured to release packages for 64 and 32 bits on Linux and Windows.&lt;/p&gt;
&lt;p&gt;As usual, if you would like to learn more about Vulkan Video, ESExtractor or any other open multimedia framework, please contact &lt;a href=&quot;https://www.igalia.com/&quot;&gt;us&lt;/a&gt;!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>This is a post without header.</title>
		<link href="https://blogs.igalia.com/scerveau/this-is-a-post-without-header/"/>
		<updated>2023-02-09T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/this-is-a-post-without-header/</id>
		<content type="html">&lt;p&gt;Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.
Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/IdthKOzqFA-350.avif 350w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/scerveau/img/IdthKOzqFA-350.webp 350w&quot; sizes=&quot;(max-width: 1000px) 100vw, 1200px&quot;&gt;&lt;img alt=&quot;A possum parent and two possum kids hanging from the iconic red balloon&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/scerveau/img/IdthKOzqFA-350.png&quot; width=&quot;350&quot; height=&quot;685&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;section-header&quot; tabindex=&quot;-1&quot;&gt;Section Header &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/this-is-a-post-without-header/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>This is a post with a header picture.</title>
		<link href="https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/"/>
		<updated>2023-02-08T00:00:00Z</updated>
		<id>https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/</id>
		<content type="html">&lt;p&gt;Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;list item&lt;/li&gt;
&lt;li&gt;list item 2&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;numbered list&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;code&quot; tabindex=&quot;-1&quot;&gt;Code &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;styled-with-syntax&quot; tabindex=&quot;-1&quot;&gt;Styled (with Syntax) &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// this is a command&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;myCommand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; counter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;	counter&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;// Test with a line break above this line.&lt;/span&gt;&lt;br&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Test&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;unstyled&quot; tabindex=&quot;-1&quot;&gt;Unstyled &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// this is a command
function myCommand() {
	let counter = 0;
	counter++;
}

// Test with a line break above this line.
console.log(&#39;Test&#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;section-header&quot; tabindex=&quot;-1&quot;&gt;Section Header &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/scerveau/this-is-a-post-with-a-header-picture/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.&lt;/p&gt;
</content>
	</entry>
</feed>
