<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gstreamer on Thibault Saunier</title><link>https://blog.thibaultsaunier.com/</link><description>Thibault Saunier's blog: GStreamer, multimedia, open source.</description><language>en</language><lastBuildDate>Mon, 02 Nov 2026 17:51:09 +0000</lastBuildDate><atom:link href="https://blog.thibaultsaunier.com/tags/gstreamer/" rel="self" type="application/rss+xml"/><item><title>gst-dots-viewer: A New Tool for GStreamer Pipeline Visualization</title><link>https://blog.thibaultsaunier.com/2025/05/gst-dots-viewer-a-new-tool-for-gstreamer-pipeline-visualization/</link><pubDate>Fri, 16 May 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">https://blogs.gnome.org/tsaunier/2025/05/16/gst-dots-viewer-a-new-tool-for-gstreamer-pipeline-visualization/</guid><description>&lt;p&gt;We’re happy to have released &lt;code&gt;gst-dots-viewer&lt;/code&gt;, a new development tool that makes it easier to visualize and debug GStreamer pipelines. This tool,  included in GStreamer 1.26, provides a web-based interface for viewing pipeline graphs in real-time as your application runs and allows to easily request all pipelines to be dumped at any time.&lt;/p&gt;&#10;&lt;h2 id="what-is-gst-dots-viewer"&gt;What is gst-dots-viewer?&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;gst-dots-viewer&lt;/code&gt; is a server application that monitors a directory for &lt;code&gt;.dot&lt;/code&gt; files generated by GStreamer’s pipeline visualization system and displays them in your web browser. It automatically updates the visualization whenever new &lt;code&gt;.dot&lt;/code&gt; files are created, making it simpler to debug complex applications and understand the evolution of the pipelines at runtime.&lt;/p&gt;&#10;&lt;h2 id="key-features"&gt;Key Features&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Real-time Updates: Watch your pipelines evolve as your application runs&lt;/li&gt;&#10;&lt;li&gt;Interactive Visualization:&#10;&lt;ul&gt;&#10;&lt;li&gt;Click nodes to highlight pipeline elements&lt;/li&gt;&#10;&lt;li&gt;Use Shift-Ctrl-scroll or w/s keys to zoom&lt;/li&gt;&#10;&lt;li&gt;Drag-scroll support for easy navigation&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Easily deployable in cloud based environments&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="how-to-use-it"&gt;How to Use It&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Start the viewer server:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gst-dots-viewer&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Open your browser at &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Enable the dots tracer in your GStreamer application:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GST_TRACERS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dots your-gstreamer-application&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;The web page will automatically update whenever new pipeline are dumped, and you will be able to dump all pipelines from the web page.&lt;/p&gt;&#10;&lt;h2 id="new-dots-tracer"&gt;New Dots Tracer&lt;/h2&gt;&#10;&lt;p&gt;As part of this release, we’ve also introduced a new &lt;code&gt;dots&lt;/code&gt; tracer that replaces the previous manual approach to specify where to dump pipelines. The tracer can be activated simply by setting the &lt;code&gt;GST_TRACERS=dots&lt;/code&gt; environment variable.&lt;/p&gt;&#10;&lt;h2 id="interactive-pipeline-dumps"&gt;Interactive Pipeline Dumps&lt;/h2&gt;&#10;&lt;p&gt;The &lt;code&gt;dots&lt;/code&gt; tracer integrates with the &lt;a href="https://gstreamer.freedesktop.org/documentation/rstracers/pipeline-snapshot.html?gi-language=c" class="external" target="_blank" rel="noopener"&gt;&lt;code&gt;pipeline-snapshot&lt;/code&gt;&lt;/a&gt; tracer to provide real-time pipeline visualization control. Through a WebSocket connection, the web interface allows you to trigger pipeline dumps. This means you can dump pipelines exactly when you need them during debugging or development, from your browser.&lt;/p&gt;&#10;&lt;h2 id="future-improvements"&gt;Future Improvements&lt;/h2&gt;&#10;&lt;p&gt;We plan on adding more feature and  have this list of possibilities:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Additional interactive features in the web interface&lt;/li&gt;&#10;&lt;li&gt;Enhanced visualization options&lt;/li&gt;&#10;&lt;li&gt;Integration with more GStreamer tracers to provide comprehensive debugging information. For example, we could integrate the newly released &lt;a href="https://gstreamer.freedesktop.org/documentation/rstracers/memory-tracer.html?gi-language=c#memorytracer-page" class="external"&gt;memory-tracer&lt;/a&gt; and &lt;a href="https://gstreamer.freedesktop.org/documentation/rstracers/memory-tracer.html?gi-language=c#memorytracer-page" class="external"&gt;queue-level&lt;/a&gt; tracers so to plot graphs about memory usage at any time.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This could transform gst-dots-viewer into a more complete debugging and monitoring dashboard for GStreamer applications.&lt;/p&gt;&#10;&lt;h2 id="demo"&gt;Demo&lt;/h2&gt;&#10;&lt;div class="video"&gt;&lt;iframe src="https://www.youtube-nocookie.com/embed/bk9Vy44RtfU" title="YouTube video" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&lt;/div&gt;&#10;</description></item><item><title>GStreamer: one repository to rule them all</title><link>https://blog.thibaultsaunier.com/2021/09/gstreamer-one-repository-to-rule-them-all/</link><pubDate>Wed, 29 Sep 2021 00:00:00 +0000</pubDate><guid isPermaLink="false">https://blogs.gnome.org/tsaunier/2021/09/29/gstreamer-one-repository-to-rule-them-all/</guid><description>&lt;p&gt;For the last years, the &lt;a href="https://gstreamer.freedesktop.org/" class="external" target="_blank" rel="noopener"&gt;GStreamer&lt;/a&gt; community has been &lt;a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/474" class="external"&gt;analysing and discussing&lt;/a&gt; the idea of merging all &lt;a href="https://gstreamer.freedesktop.org/documentation/additional/splitup.html" class="external" target="_blank" rel="noopener"&gt;the modules&lt;/a&gt; into one single repository. Since all the official modules are released in sync and the code evolves simultaneously between those repositories, having the code split was a burden and several core GStreamer developers believed that it was worth making the effort to consolidate them into a single repository. As &lt;a href="https://lists.freedesktop.org/archives/gstreamer-devel/2020-November/076754.html" class="external" target="_blank" rel="noopener"&gt;announced&lt;/a&gt; a while back this is now effective and this post is about explaining the technical choices and implications of that change.&lt;/p&gt;&#10;&lt;p&gt;You can also check out our &lt;a href="https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/mono-repository.html" class="external" target="_blank" rel="noopener"&gt;Monorepo FAQ&lt;/a&gt; for a list of questions and answers.&lt;/p&gt;&#10;&lt;h2 id="technicall-details-of-the-unification"&gt;Technicall details of the unification&lt;/h2&gt;&#10;&lt;p&gt;Since we moved to &lt;a href="https://mesonbuild.com/" class="external" target="_blank" rel="noopener"&gt;meson&lt;/a&gt; as a build system a few years ago we implemented &lt;a href="https://gitlab.freedesktop.org/gstreamer/gst-build/-/tree/29352ad0f82c38649424801c97473e33d75caf41" class="external" target="_blank" rel="noopener"&gt;gst-build&lt;/a&gt; which leverages the &lt;a href="https://mesonbuild.com/Subprojects.html" class="external"&gt;meson subproject&lt;/a&gt; feature to build all GStreamer modules as one single project. This greatly enhanced the development experience of the GStreamer framework but we considered that we could improve it even more by having all GStreamer code in a single repository that looks the same as &lt;code&gt;gst-build&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;This is what the new unified git repository looks like, &lt;code&gt;gst-build&lt;/code&gt; in the main &lt;code&gt;gstreamer&lt;/code&gt; repository, except that all the code from the GStreamer modules located in the &lt;code&gt;subprojects/&lt;/code&gt; directory are checked in.&lt;/p&gt;&#10;&lt;p&gt;This new setup now lives in the &lt;code&gt;main&lt;/code&gt; default branch of &lt;a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/tree/main" class="external" target="_blank" rel="noopener"&gt;the gstreamer repository&lt;/a&gt;, the &lt;code&gt;master&lt;/code&gt; branches for all the other modules repositories are now retired and frozen, no new merge request or code change will be accepted there.&lt;/p&gt;&#10;&lt;p&gt;This is only the first step and we will consider reorganizing the repository in the future, but the goal is to minimize disruptions.&lt;/p&gt;&#10;&lt;p&gt;The technical process for merging the repositories looks like:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;foreach GSTREAMER_MODULE&#10; git remote add GSTREAMER_MODULE.name GSTREAMER_MODULE.url&#10; git fetch GSTREAMER_MODULE.name&#10; git merge GSTREAMER_MODULE.name/master&#10; git mv list_all_files_from_merged_gstreamer_module() GSTREAMER_MODULE.shortname&#10; git commit -m &amp;quot;Moved all files from &amp;quot; + GSTREAMER_MODULE.name&#10;endforeach&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;This allows us to keep the exact same history (and checksum of each commit) for all the old gstreamer modules in the new repository which guarantees that the code is still exactly the same as before.&lt;/p&gt;&#10;&lt;h2 id="releases-with-the-new-setup"&gt;Releases with the new setup&lt;/h2&gt;&#10;&lt;p&gt;In the same spirit of avoiding disruption, releases will look &lt;strong&gt;exactly the same&lt;/strong&gt; as before. In the new unique &lt;code&gt;gstreamer&lt;/code&gt; repository we still have meson subprojects for each GStreamer modules and they will have their own release tarballs. In practice, this means that not much (nothing?) should change for distribution packagers and consumers of GStreamer tarballs.&lt;/p&gt;&#10;&lt;h2 id="what-should-i-do-with-my-pending-mrs-in-old-modules-repositories"&gt;What should I do with my pending MRs in old modules repositories?&lt;/h2&gt;&#10;&lt;p&gt;Since we can not create new merge requests in your name on gitlab, we wrote a &lt;a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/scripts/move_mrs_to_monorepo.py" class="external" target="_blank" rel="noopener"&gt;move_mrs_to_monorepo&lt;/a&gt; script that you can run yourself. The script is located in &lt;a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/tree/main" class="external" target="_blank" rel="noopener"&gt;the gstreamer repository&lt;/a&gt; and you can start moving all your pending MRs by simply calling it (&lt;code&gt;scripts/move_mrs_to_monorepo.py&lt;/code&gt; and follow the instructions).&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;You can also check out our &lt;a href="https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/mono-repository.html" class="external" target="_blank" rel="noopener"&gt;Monorepo FAQ&lt;/a&gt; for a list of questions and answers.&lt;/p&gt;&#10;&lt;p&gt;Thanks to everyone in the community for providing us with all the feedback and thanks to &lt;a href="https://blogs.gnome.org/xclaesse/" target="_blank" rel="noopener"&gt;Xavier Claessens&lt;/a&gt; for co-leading the effort.&lt;/p&gt;&#10;&lt;p&gt;We are still working on ensuring the transition as smoothly as possible and if you have any question don’t hesitate to come talk to us in #gstreamer on the oftc IRC network.&lt;/p&gt;&#10;&lt;p&gt;Happy GStreamer hacking!&lt;/p&gt;&#10;</description></item><item><title>GStreamer Editing Services OpenTimelineIO support</title><link>https://blog.thibaultsaunier.com/2019/04/gstreamer-editing-services-opentimelineio-support/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid isPermaLink="false">https://blogs.gnome.org/tsaunier/2019/04/22/gstreamer-editing-services-opentimelineio-support/</guid><description>&lt;h1 id="gstreamer-editing-services-opentimelineio-support"&gt;GStreamer Editing Services OpenTimelineIO support&lt;/h1&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/PixarAnimationStudios/OpenTimelineIO" class="external"&gt;OpenTimelineIO&lt;/a&gt; is an Open Source API and interchange format for editorial timeline information, it basically allows some form of interoperability between the different post production Video Editing tools. It is being developed by &lt;a href="http://graphics.pixar.com/" class="external"&gt;Pixar&lt;/a&gt; and several other studios are contributing to the project allowing it to &lt;a href="https://github.com/PixarAnimationStudios/OpenTimelineIO/commits/master" class="external"&gt;evolve quickly&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;We, at &lt;a href="https://igalia.com" class="external"&gt;Igalia&lt;/a&gt;, recently &lt;a href="https://github.com/PixarAnimationStudios/OpenTimelineIO/pull/41" class="external"&gt;landed&lt;/a&gt; support for the &lt;a href="https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-editing-services/html/ges-architecture.html" class="external"&gt;GStreamer Editing Services&lt;/a&gt; (GES) serialization format in OpenTimelineIO, making it possible to convert GES timelines to any format supported by the library. This is extremely useful to integrate GES into existing Post production workflow as it allows projects in any &lt;a href="https://opentimelineio.readthedocs.io/en/latest/tutorials/adapters.html" class="external"&gt;format supported by OpentTimelineIO&lt;/a&gt; to be used in the GStreamer Editing Services and vice versa.&lt;/p&gt;&#10;&lt;p&gt;On top of that we are building a &lt;a href="https://gitlab.freedesktop.org/gstreamer/gst-editing-services/merge_requests/67" class="external"&gt;GESFormatter&lt;/a&gt; that allows us to transparently handle any file format supported by OpenTimelineIO. In practice it will be possible to use cuts produced by other video editing tools in any project using GES, for instance &lt;a href="http://www.pitivi.org" class="external"&gt;Pitivi&lt;/a&gt;:&lt;/p&gt;&#10;&lt;p&gt;&lt;video controls preload="metadata" width="512"&gt;&lt;source src="screencast.mov" type="video/mp4"&gt;&lt;source src="screencast.webm" type="video/webm"&gt;&lt;/video&gt;&lt;/p&gt;&#10;&lt;p&gt;At &lt;a href="https://igalia.com" class="external"&gt;Igalia&lt;/a&gt; we are aiming at making GStreamer ready to be used in existing Video post production pipelines and this work is one step in that direction. We are working on additional features in GES to fill the gaps toward that goal, for instance we are now implementing &lt;a href="https://gitlab.freedesktop.org/gstreamer/gst-editing-services/issues/60" class="external"&gt;nested timeline&lt;/a&gt; support and &lt;a href="https://gitlab.freedesktop.org/gstreamer/gst-editing-services/issues/61" class="external"&gt;framerate based timestamps&lt;/a&gt; in GES. Once we implement them, those features will enhance compatibility of Video Editing projects created from other NLE softwares through OpenTimelineIO. Stay tuned for more information!&lt;/p&gt;&#10;</description></item><item><title>WebKitGTK and WPE gain WebRTC support back!</title><link>https://blog.thibaultsaunier.com/2018/07/webkitgtk-and-wpe-gains-webrtc-support-back/</link><pubDate>Tue, 31 Jul 2018 00:00:00 +0000</pubDate><guid isPermaLink="false">https://blogs.gnome.org/tsaunier/2018/07/31/webkitgtk-and-wpe-gains-webrtc-support-back/</guid><description>&lt;p&gt;&lt;a href="https://www.w3.org/TR/webrtc/" class="external"&gt;WebRTC&lt;/a&gt; is a w3c draft protocol that “enables rich, high-quality RTP applications to be developed for the browser, mobile platforms, and IoT devices, and allow them all to communicate via a common set of protocols”. The protocol is mainly used to provide video conferencing systems from within web browsers.&lt;/p&gt;&#10;&lt;figure&gt;&#10;&lt;img src="c43863-appr.tc-screenshort-1.png" decoding="async" alt="https://appr.tc running in WebKitGTK" /&gt;&#10;&lt;figcaption aria-hidden="true"&gt;https://appr.tc running in WebKitGTK&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="a-brief-history"&gt;A brief history&lt;/h2&gt;&#10;&lt;p&gt;At the very beginning of the WebRTC protocol, before 2013, Google was still using WebKit in chrome and they started to implement support using &lt;a href="https://webrtc.org/" class="external"&gt;LibWebRTC&lt;/a&gt; but when they &lt;a href="https://blog.chromium.org/2013/04/blink-rendering-engine-for-chromium.html" class="external"&gt;started the blink fork&lt;/a&gt; the implementation stopped in WebKit.&lt;/p&gt;&#10;&lt;p&gt;Around 2015/2016 &lt;a href="https://www.ericsson.com/research-blog/" class="external"&gt;Ericsson&lt;/a&gt; and &lt;a href="https://www.igalia.com/" class="external"&gt;Igalia&lt;/a&gt; (later sponsored by &lt;a href="https://www.metrological.com/" class="external"&gt;Metrological&lt;/a&gt;) implemented &lt;a href="https://blogs.igalia.com/xrcalvar/2016/10/03/webrtc-in-webkitwpe/" class="external"&gt;WebRTC support into WebKit&lt;/a&gt;, but instead of using &lt;a href="https://webrtc.org/" class="external"&gt;LibWebRTC&lt;/a&gt; from google, &lt;a href="https://www.openwebrtc.org/" class="external"&gt;OpenWebRTC&lt;/a&gt; was used. This had the advantage of being implemented on top of the &lt;a href="https://gstreamer.freedesktop.org/" class="external"&gt;GStreamer framework&lt;/a&gt; which happens to be used for the Multimedia processing inside WebKitGTK and WebKitWPE. At that point in time, the standardization of the WebRTC protocol was still moving fast, mostly pushed by Google itself, and it was hard to be interoperable with the rest of the world. Despite of that, the WebKit/GTK/WPE WebRTC implementation started to be usable with website like &lt;a href="https://appr.tc" class="external"&gt;appr.tc&lt;/a&gt; at the end of 2016.&lt;/p&gt;&#10;&lt;p&gt;Meanwhile, in late 2016, Apple decided to implement WebRTC support on top of google LibWebRTC in their ports of WebKit which led to &lt;a href="https://webkit.org/blog/7726/announcing-webrtc-and-media-capture/" class="external"&gt;WebRTC support in WebKit announcement&lt;/a&gt; in June 2017.&lt;/p&gt;&#10;&lt;p&gt;Later in 2017 the OpenWebRTC project lost momentum and as it was considered unmaintained, we, at &lt;a href="https://www.igalia.com/" class="external"&gt;Igalia&lt;/a&gt;, decided to use LibWebRTC for WebKitGTK and WebKitWPE too. At that point, the OpenWebRTC backend was &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=177868" class="external"&gt;completely removed&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="gstreamerlibwebrtc-implementation"&gt;GStreamer/LibWebRTC implementation&lt;/h2&gt;&#10;&lt;p&gt;Given that Apple had implemented a LibWebRTC based backend in WebKit, and because this library is being used by the two main web browsers (Chrome and Firefox), we decided to reuse Apple’s work to implement support in our ports based on LibWebRTC at the end of 2017. A that point, the two main APIs required to allow video conferencing with WebRTC needed to be implemented:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia" class="external"&gt;MediaDevices.GetUserMedia&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaStream" class="external"&gt;MediaStream&lt;/a&gt;: Allows to retrieve Audio and Video streams from the user Cameras and Microphones (potentially more than that but those are the main use cases we cared about).&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection" class="external"&gt;RTCPeerConnection&lt;/a&gt;: Represents a WebRTC connection between the local computer and a remote peer.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;As WeKit/GTK/WPE heavily relies on GStreamer for the multimedia processing, and given its flexibility, we made sure that our implementation of those APIs leverage the power of the framework and the existing integration of GStreamer in our WebKit ports.&lt;/p&gt;&#10;&lt;p&gt;Note that the whole implementation is reusing (after refactoring) big parts of the infrastructure introduced during the previously described history of WebRTC support in WebKit.&lt;/p&gt;&#10;&lt;h3 id="getusermediamediastream"&gt;GetUserMedia/MediaStream&lt;/h3&gt;&#10;&lt;p&gt;To implement that part of the API the following main components were developed:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;RealtimeMediaSourceCenterLibWebRTC: Main entry point for our GStreamer based LibWebRTC backend.&lt;/li&gt;&#10;&lt;li&gt;GStreamerCaptureDeviceManager: A class to list and manage local Video/Audio devices using the &lt;a href="https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstDeviceMonitor.html" class="external"&gt;GstDeviceMonitor&lt;/a&gt; API.&lt;/li&gt;&#10;&lt;li&gt;GStreamerCaptureDevice: Implementation of WebKit abstraction for capture devices, basically wrapping GstDevices.&lt;/li&gt;&#10;&lt;li&gt;GStreamerMediaStreamSource: A &lt;a href="https://gstreamer.freedesktop.org/documentation/application-development/basics/elements.html#source-elements" class="external"&gt;GStreamer Source element&lt;/a&gt; which wraps WebKit abstraction of MediaStreams to be used directly in a &lt;a href="https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-playbin3.html" class="external"&gt;playbin3&lt;/a&gt; pipeline (through a custom &lt;code&gt;mediastream://&lt;/code&gt; protocol). This implementation leverages latest &lt;a href="https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStream.html" class="external"&gt;GstStream&lt;/a&gt; APIs so it is already one foot into the future.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The main commit can be found &lt;a href="https://trac.webkit.org/changeset/232589" class="external"&gt;here&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="rtcpeerconnection"&gt;RTCPeerConnection&lt;/h3&gt;&#10;&lt;p&gt;Enabling the PeerConnection API meant bridging previously implemented APIs and the LibWebRTC backend developed by Apple:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;RealtimeOutgoing/Video/Audio/SourceLibWebRTC: Passing local stream (basically from microphone or camera) to LibWebRTC to be sent to the peer.&lt;/li&gt;&#10;&lt;li&gt;RealtimeIncoming/Video/Audio/SourceLibWebRTC: Passing remote stream (from a remote peer) to the MediaStream object and in turn to the GStreamerMediaStreamSource element.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;On top of that and to leverage GStreamer Memory management and negotiation capabilities we implemented encoders and decoder for LibWebRTC (namely GStreamerVideoEncoder and GStreamerVideoDecoders). This brings us a huge number of Hardware accelerated encoders and decoders implementations, especially on embedded devices, which is a big advantage in particular for WPE which is tuned for those platforms.&lt;/p&gt;&#10;&lt;p&gt;The main commit can be found &lt;a href="https://trac.webkit.org/changeset/234138" class="external"&gt;here&lt;/a&gt;&lt;/p&gt;&#10;&lt;img src="615f6a-webkitwpe_webrtc_media_dataflow.png" decoding="async" alt="WebKitWebRTC dataflow diagram" /&gt;&#10;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;&#10;&lt;p&gt;While we were able to make GStreamer and LibWebRTC work well together in that implementation, using the new &lt;a href="http://blog.nirbheek.in/2018/02/gstreamer-webrtc.html" class="external"&gt;GstWebRTC&lt;/a&gt; component (that is now in upstream GStreamer) as a WebRTC backend would be cleaner. Many pieces of the current implementation could be reused and it would allow us to have a simpler infrastructure and avoid having several RTP stack in the WebKitGTK and WebKitWPE ports.&lt;/p&gt;&#10;&lt;p&gt;Most of the required APIs and features have been implemented, but a few are still under development (namely &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices" class="external"&gt;MediaDevices.enumerateDevices&lt;/a&gt;, &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=169811" class="external"&gt;canvas captureStream&lt;/a&gt; and &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=186933" class="external"&gt;WebAudio and MediaStream bridging&lt;/a&gt;) meaning that many Web applications using WebRTC already work, but some don’t yet, we are working on those!&lt;/p&gt;&#10;&lt;p&gt;A big thanks to my employer &lt;a href="https://www.igalia.com/" class="external"&gt;Igalia&lt;/a&gt; and &lt;a href="https://www.metrological.com/" class="external"&gt;Metrological&lt;/a&gt; for sponsoring our work on that!&lt;/p&gt;&#10;</description></item><item><title>gst-validate: A suite of tools to run integration tests for GStreamer</title><link>https://blog.thibaultsaunier.com/2014/04/gst-validate-a-suite-of-tools-to-run-integration-tests-for-gstreamer/</link><pubDate>Mon, 21 Apr 2014 00:00:00 +0000</pubDate><guid isPermaLink="false">https://blogs.gnome.org/tsaunier/2014/04/21/gst-validate-a-suite-of-tools-to-run-integration-tests-for-gstreamer-2/</guid><description>&lt;p&gt;&lt;a href="http://www.collabora.com/" class="external"&gt;Collabora ltd.&lt;/a&gt; has been developing a tool that allows GStreamer developers to check that the GstElements they write behave the way they are supposed to: GstValidate. The tool was started first to provide plug-ins developers with a tool to check that they use the framework the proper way. Since the beginning, it has been available in &lt;a href="http://cgit.freedesktop.org/gstreamer/gst-devtools/" class="external"&gt;gst-devtools&lt;/a&gt;, a gst module where we collect a set of tools to facilitate GStreamer development and usage.&lt;/p&gt;&#10;&lt;h1 id="well-what-is-it-about"&gt;Well, what is it about?&lt;/h1&gt;&#10;&lt;h2 id="the-gstvalidatemonitor"&gt;The GstValidateMonitor&lt;/h2&gt;&#10;&lt;p&gt;Basically gst-validate allows us to monitor everything that is happening inside a &lt;a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html" class="external"&gt;GstPipeline&lt;/a&gt;. For example if you want to check that every component of a pipeline is properly behaving, you can create a GstValidatePipelineMonitor that will track that pipeline. Then each time a GstElement is added to the pipeline, a GstValidateElementMonitor will be instantiated and start tracking that element. Then when a GstPad is added to that GstElement a GstValidatePadMonitor will be monitoring that pad.&lt;/p&gt;&#10;&lt;p&gt;This monitoring logic allows us to check that what those elements do respect some rules GStreamer components have to follow so all the elements of a pipeline can properly interact together. For example, a GstValidatePadMonitor will make sure that if we receive a GstSegment from upstream, an equivalent segment is sent downstream before any buffer gets out. You can find the whole list of tests currently implemented &lt;a href="http://cgit.freedesktop.org/gstreamer/gst-devtools/tree/validate/gst/validate/gst-validate-report.c#n87" class="external"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="the-gstvalidaterunner"&gt;The GstValidateRunner&lt;/h2&gt;&#10;&lt;p&gt;Then there is an issue reporting system so that each issue found during the execution of the pipeline is reported with as much details as possible so that users understand what the detected misbehaviour is about and can fix it efficiently.&lt;/p&gt;&#10;&lt;p&gt;In term of code the only thing to do in order to get a pipeline monitored is:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;int&#10;main (int argc, gchar ** argv)&#10;{&#10; GstElement *pipeline;&#10; GstValidateRunner *runner;&#10; GstValidateMonitor *monitor;&#10;&#10; gboolean ret = 0;&#10;&#10; /* Initialize GStreamer and GstValidate */&#10; gst_init (&amp;amp;argc, &amp;amp;argv);&#10; gst_validate_init ();&#10;&#10; /* Create the pipeline and make sure it is&#10; * monitored */&#10; pipeline = gst_pipeline_new (&#10; &amp;quot;monitored-pipeline&amp;quot;);&#10; runner = gst_validate_runner_new ();&#10; monitor = gst_validate_monitor_factory_create (&#10; GST_OBJECT (pipeline),&#10; runner,&#10; NULL);&#10;&#10; /* HERE you can do anything you want with that&#10; * monitored pipeline */&#10;&#10; /* Now print the errors on stdout.&#10; * The return value of that function&#10; * is != 0 if if critical errors occured&#10; * during the execution of the pipeline */&#10; ret = gst_validate_runner_printf (runner);&#10;&#10; /* Cleanup */&#10; gst_object_unref (pipeline);&#10; gst_object_unref (monitor);&#10; gst_object_unref (runner);&#10;&#10; return ret;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;The result of gst_validate_runner_printf will look something like:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;issue : buffer is out of the segment range Detected on theoradec0.srcpad at 0:00:00.096556426&#10; &#10;Details : buffer is out of segment and shouldn't be pushed. Timestamp: 0:00:25.000 - duration: 0:00:00.040 Range: 0:00:00.000 - 0:00:04.520&#10;Description : buffer being pushed is out of the current segment's start-stop range. Meaning it is going to be discarded downstream without any use&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;Here we can see that an issue occurred on the src pad of theoradec as it outputted a buffer that was not inside the segment it last pushed. This is an interesting piece of information and clearly shows an error in the element. (Note: This issue does not actually exist)&lt;/p&gt;&#10;&lt;h1 id="how-should-it-be-used"&gt;How should it be used?&lt;/h1&gt;&#10;&lt;h2 id="gstvalidate-command-line-tools"&gt;GstValidate command line tools&lt;/h2&gt;&#10;&lt;p&gt;In order to make gst-validate usage simple, we created command line tools that allow plugin developers test there elements in many use cases from a high level perspective.&lt;/p&gt;&#10;&lt;h3 id="the-gst-validate-pipeline-launcher"&gt;The gst-validate pipeline launcher&lt;/h3&gt;&#10;&lt;p&gt;This is a command line pipeline launcher similar to gst-launch. That tool uses the gst-launch pipeline description syntax and make sure that the pipeline is monitored and that the users will have all the reported information from the GstValidate infrastructure. As you can expect, you can monitor the playback of a media file using &lt;a href="gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-playbin.html"&gt;playbin&lt;/a&gt; as follow:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;gst-validate-1.0 playbin uri=file:///.../file.ogg&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;You will then be able to see all the issues GstValidate found.&lt;/p&gt;&#10;&lt;h3 id="the-gst-validate-transcoding-tool"&gt;The gst-validate-transcoding tool&lt;/h3&gt;&#10;&lt;p&gt;A command line tool allowing to test media files transcoding with a straight forward syntax. You can for example transcode any media file to vorbis vp8 in webm doing:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;gst-validate-transcoding-1.0 &#10; file:///./file.ogg &#10; file:///.../transcoded.webm &#10; -o 'video/webm:video/x-vp8:audio/x-vorbis'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;It will report what issues happened during the execution of that pipeline.&lt;/p&gt;&#10;&lt;h3 id="the-gst-validate-media-check-tool"&gt;The gst-validate-media-check tool&lt;/h3&gt;&#10;&lt;p&gt;A command line tool checking that media files discovering works properly with &lt;a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstdiscoverer.html" class="external"&gt;gst-discoverer&lt;/a&gt;. Basically it needs a reference text file containing valid information about a media file (which can be generated with the same tool) and then it will be able to check that those informations correspond to what is reported by gst-discoverer over new runs.  For example, given that we have a valid reference.media_info file, we can run:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;gst-validate-media-check-1.0 &#10; file:///./file.ogv &#10; --expected-results reference.media_info&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;That will then output found errors if any and return an exist code different from 0 if an error was found.&lt;/p&gt;&#10;&lt;h3 id="gstvalidatescenarios"&gt;GstValidateScenarios&lt;/h3&gt;&#10;&lt;p&gt;As you can notice, those tools let us test static pipelines execution and not that the pipeline reacts properly during execution of actions from the end user such as seeking, or changing the pipeline state, etc… In order to make that possible and easy to use we introduced the concept of scenarios.&lt;/p&gt;&#10;&lt;p&gt;A scenario is a set of actions to be executed on the monitored pipeline serialized in a text file. An  action (GstValidateAction) is just a function call executed at a precise time (usually based on the playback position of the pipeline).&lt;/p&gt;&#10;&lt;p&gt;An example of scenario:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# Just some metadatas describing the scenario&#10;# The format is the GstStructure serialization &#10;# synthax&#10;description, seek=true, duration=3.0&#10;&#10;# When the pipeline reaches 1.0 second of&#10;# playback it launches an accurate flushing&#10;# seek to 10.0 seconds&#10;seek, playback_time=1.0, start=10.0, &#10;flags=accurate+flush&#10;&#10;# Send EOS to the pipeline&#10;# so it stops and the application&#10;# knows about it.&#10;eos, playback_time=12.0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;You can find more examples of scenarios &lt;a href="http://cgit.freedesktop.org/gstreamer/gst-devtools/tree/validate/data" class="external"&gt;here&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="gst-validate-launcher"&gt;gst-validate-launcher&lt;/h2&gt;&#10;&lt;p&gt;This looks all right but shouldn’t those tests be executed automatically on a large number of samples and with the various existing scenarios? This is where gst-validate-launcher comes into play. It is basically a python application that launches the tools described above with the proper parameters. It then monitors them, check their results and serializes those results into a junit xml file (more formatter could obviously be implemented). That tools is pretty simple and it is only a matter of setting the media samples to run the tests on and set what scenarios you want to run.&lt;/p&gt;&#10;&lt;h1 id="where-is-it-used"&gt;Where is it used?&lt;/h1&gt;&#10;&lt;h2 id="gstreamer-editing-services"&gt;GStreamer Editing Services&lt;/h2&gt;&#10;&lt;p&gt;As part of the &lt;a href="http://wiki.pitivi.org/wiki/GES" class="external"&gt;GStreamer Editing Services&lt;/a&gt; project, I have made sure that ges-launch (a command line tool that launches timelines, video editing projects etc…) works with GstValidate, if compiled against it. This means that we can launch scenarios and test GES sharing the same infrastructure as the rest of GStreamer. It is also very interesting to be able to monitor dynamic pipeline (within GES the GstPipeline changes very dynamically) to discover elements misbehavior in that stressful use case. For the time being we do not have many GES specific GstValidateActions implemented, but we will implement more as needed (mostly implementing timeline edition actions, ie. moving clips around the timeline, changing effect properties, etc…) As part of the &lt;a href="http://fundraiser.pitivi.org" class="external"&gt;Pitvi fundraiser&lt;/a&gt;, we are also investigating how to serialize users action in &lt;a href="http://pitivi.org" class="external"&gt;Pitivi&lt;/a&gt; so that we could easily reproduce users issues outside of the application (and thus outside the python interpreter).&lt;/p&gt;&#10;&lt;h2 id="the-gstreamer-jenkins-integration-server"&gt;The GStreamer jenkins integration server&lt;/h2&gt;&#10;&lt;p&gt;On the &lt;a href="https://jenkins.arracacha.collabora.co.uk" class="external"&gt;GStreamer continuous integration&lt;/a&gt; server, we are &lt;a href="https://jenkins.arracacha.collabora.co.uk/view/pitivi/job/gst-validate-tests/" class="external"&gt;running gst-validate-launcher&lt;/a&gt; on a set of media sample in major formats after (almost) each commit on any of the component of the GStreamer stack. This is just the beginning and we are slowly adding more tests there making sure they pass and tracking regressions.&lt;/p&gt;&#10;&lt;p&gt;A lot of work has been done around that tool. We still need to clean up some part, review the few APIs we have, and a particular effort as to be made around the documentation. But now that good basis are there, we should just keep adding more tests to detect regressions in GStreamer as soon as possible. If you are interested in using that tool please come talk to us in #gstreamer on freenode!&lt;/p&gt;&#10;</description></item><item><title>Pitivi master finaly gets effects!</title><link>https://blog.thibaultsaunier.com/2010/09/pitivi-master-finaly-gets-effects/</link><pubDate>Wed, 22 Sep 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/09/pitivi-master-finaly-gets-effects.html</guid><description>&lt;p&gt;So as suggested by the title, the work I did during the Google Summer Of Code has been Merged! It means that the next Pitivi release which should arrive quite soon will gain effects.&lt;/p&gt;&#10;&lt;p&gt;I haven&amp;rsquo;t been blogging for a long while so sorry about not telling you what was happening but I did it in order to make a surprise :P&lt;/p&gt;&#10;&lt;p&gt;Now that it is merged, you are very welcome to test it and report all the bugs you will find so we have a great release soon to propose the world&amp;hellip;. with effects!&lt;/p&gt;&#10;&lt;p&gt;Sorry for not making a screencast but as you can test it quite easily, it shouldn&amp;rsquo;t matter so much ;) (and &lt;a href="http://jeff.ecchi.ca/blog/"&gt;nekohayo&lt;/a&gt; is telling me he should make one soon)&lt;/p&gt;&#10;&lt;p&gt;As I enjoyed a LOT working in the pitivi community during this summer, I am going to keep working on it in my free time fixing the bugs you are going to report. And of course I am planing to enhance effects support and add features such as keyframes handling&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;And just a little screenshot so you can have an idea about how the UI looks like now:&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="a0f296-Capture-_Nouveau_projet_PiTiVi.png"&gt;&lt;img src="88de0a-Capture-_Nouveau_projet_PiTiVi.png" id="BLOGGER_PHOTO_ID_5519848785366740450" style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 317px; height: 167px;" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Pitivi get effects, part 6</title><link>https://blog.thibaultsaunier.com/2010/08/pitivi-get-effects-part-6/</link><pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/08/pitivi-get-effects-part-6.html</guid><description>&lt;p&gt;Sorry for not blogging in such a long time!&lt;/p&gt;&#10;&lt;p&gt;Now that I am back in chile afer the GUADEC, I have finally been able to hack again on Pitivi. So has I said during my presentation of my project during the GUADEC, I implemented everything I wanted to. So I am now working on debugging everything, cleaning code, and even if I have a few remaining critical bugs (which could probably be bugs in gnonlin), you can use it for testing purposes.&lt;/p&gt;&#10;&lt;p&gt;I also started to work on a new branch[0] in order to save the undocked windows state, but since I found new bugs on the effect implementations, I am working on them.&lt;/p&gt;&#10;&lt;p&gt;So for now I don&amp;rsquo;t have a screencast, but I promise I will make one when I can show everything working smoothly.&lt;/p&gt;&#10;&lt;p&gt;You can give it a try if you have the latest gstreamer from git using my git repo[1]&lt;/p&gt;&#10;&lt;p&gt;[0]: &lt;a href="http://github.com/thiblahute/Pitivi/commits/save_undock_windows_state"&gt;http://github.com/thiblahute/Pitivi/commits/save_undock_windows_state&lt;/a&gt;&lt;br&gt;&#10;[1]: &lt;a href="http://github.com/thiblahute/Pitivi"&gt;http://github.com/thiblahute/Pitivi&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Pitivi get effects, part 5</title><link>https://blog.thibaultsaunier.com/2010/07/pitivi-get-effects-part-5/</link><pubDate>Mon, 12 Jul 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/07/pitivi-get-effects-part-5.html</guid><description>&lt;p&gt;I didn&amp;rsquo;t blog for almost 3 weeks but it doesn&amp;rsquo;t mean I didn&amp;rsquo;t progress with this project. I thing it actually means more that I prefer to spend my time on coding than on blogging!&lt;/p&gt;&#10;&lt;p&gt;Last week was pretty full because of the end of the semester but tomorrow I have my last examen for university. Next week I am planning to go skiing so it may not be the week I will be hacking the most, but anyway, I will code!&lt;/p&gt;&#10;&lt;p&gt;The UI is almost the same as &lt;a href="http://lh6.ggpht.com/_3mLd5CtlHo4/TCIk1jYJH3I/AAAAAAAAHSw/J_ELnMPOmQE/s1152/Capture-3.png"&gt;the mockup&lt;/a&gt; I showed you last time apart from the key-frame thing since I am not sure I want to do it this way, and because I want to have effects stable before implementing this feature.&lt;/p&gt;&#10;&lt;p&gt;So for now the UI looks exactly like:&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="eeac19-Capture-14.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="3a8eea-Capture-14.png" id="BLOGGER_PHOTO_ID_5493547493669533394" style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 200px;" data-border="0" /&gt;&lt;/a&gt;&lt;br&gt;&#10;What is working:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Adding effects&lt;/li&gt;&#10;&lt;li&gt;Configuring effects, the UI is generated automatically depending on the effect property so all effects are configurable. But there is also a system which will permit to create a special UI for more complicated effects.&lt;/li&gt;&#10;&lt;li&gt;Enabling/disabling effects even if a few bugs still remain concerning it&lt;/li&gt;&#10;&lt;li&gt;Removing effects&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;What doesn&amp;rsquo;t work:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Seeking, right now when I add an effect and try to seek, it always go to the first frame of the video. It is a pretty critical bug on which I am actively working, and that&amp;rsquo;s the reason why I didn&amp;rsquo;t do a screen-cast (sorry about that). When this is solved, I will make a screen-cast and post it here for sure.&lt;/li&gt;&#10;&lt;li&gt;Drag&amp;rsquo;n drop directly to the effects list. This is almost nothing but I want to fix the first issue before implementing it.&lt;/li&gt;&#10;&lt;li&gt;Keyframe based effect configuration&lt;/li&gt;&#10;&lt;li&gt;Saving/opening projects containing effects. I have already started this work but it is still not working. It should be done quite easily.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;So I don&amp;rsquo;t miss so many things to complete the plan I had made for this Google Summer of Code, but the idea is to get something almost bug free and merge and release it (something I have been told should be possible quite soon&amp;hellip; I hope :))&lt;/p&gt;&#10;&lt;p&gt;I also wanted to talk about &lt;a href="http://bicyclerepair.sourceforge.net/"&gt;a tool&lt;/a&gt; I use for refactoring python code called &amp;lsquo;Bicycle repair man&amp;rsquo;. It permits to rename variable/classes very easily and this through all python files of the project, cut functions into several ones and make the proper calls, and probably much more but those are the two features I actually use and abuse. I use it inside vim and noticed a real gain of productivity and style.&lt;/p&gt;&#10;&lt;p&gt;The code is still available in my GIT repository here: &lt;a href="http://github.com/thiblahute/Pitivi"&gt;http://github.com/thiblahute/Pitivi&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Hoping I can show you a screencast of all that and tell you that I need tester soon.&lt;/p&gt;&#10;</description></item><item><title>Pitivi get effects, part 4</title><link>https://blog.thibaultsaunier.com/2010/06/pitivi-get-effects-part-4/</link><pubDate>Tue, 22 Jun 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/06/pitivi-get-effects-part-4.html</guid><description>&lt;div style="text-align: justify;"&gt;&#10;&lt;p&gt;I didn&amp;rsquo;t blog for almost 2 weeks now because I wanted to have something interesting to say before saying it!&lt;/p&gt;&#10;&lt;p&gt;So the last 2 weeks I started an &lt;a href="http://github.com/thiblahute/Pitivi/tree/experimental-timeline-based"&gt;experimental branch&lt;/a&gt; to handle effects in the timeline and of course corrected all the bugs I found during this time. Then I rethought this design with &lt;a href="http://jeff.ecchi.ca/blog/"&gt;nekohayo&lt;/a&gt; and got this pretty cool mockup from him:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_3mLd5CtlHo4/TCIk1jYJH3I/AAAAAAAAHSw/J_ELnMPOmQE/s1152/Capture-3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="35cecb-Capture-3.png" style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 460px; height: 288px;" data-border="0" /&gt;&lt;/a&gt; So as you can expect, I am now implementing that. I already rewrite the effect list and it looks the same as you can see in the mockup. And I am working on making effects being per clip or per track instead of being considered as clips themselves. This should actually be pushed by the end of the week.&lt;/p&gt;&#10;&lt;p&gt;So afterward I am going to work on this new middle section for clips properties and effect configurations. I think I will get it working in the next two weeks. I am quite in advanced on the planning I proposed for the postulation but this is a good thing because I am still at university and may have to spend more time for it in the coming weeks.&lt;/p&gt;&#10;&lt;p&gt;You still can grab my latest code &lt;a href="http://github.com/thiblahute/Pitivi"&gt;here&lt;/a&gt; and play with it!&lt;/p&gt;&#10;</description></item><item><title>Pitivi gets effects, Part 3</title><link>https://blog.thibaultsaunier.com/2010/06/pitivi-gets-effects-part-3/</link><pubDate>Fri, 04 Jun 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/06/pitivi-gets-effects-part-3.html</guid><description>&lt;p&gt;This week I have been debugging everything and I final (Thanks to my mentor Edward Hervey) got effects working!&lt;/p&gt;&#10;&lt;p&gt;So better show you how it works for now. It is still quite buggy, and not really ergonomic, but it is the beginning!&lt;/p&gt;&#10;&lt;p&gt;Here is the video (of course edited in Pitivi and using effects). The original host (people.collabora.co.uk) is gone, so the video is no longer available:&lt;/p&gt;&#10;&lt;p&gt;You need a modern browser to see this video (chromium, firefox, epiphnay, midori&amp;hellip;)&lt;/p&gt;&#10;&lt;p&gt;You can grab the code &lt;a href="http://www.github.com/thiblahute/pitivi"&gt;here&lt;/a&gt; if you want to give it a try even if it&amp;rsquo;s not ready for production&amp;hellip;&lt;br&gt;&#10;So next week I am going to clean up the code and of course fix the bugs I find. If I have time, I will start working on the UI part.&lt;/p&gt;&#10;&lt;div&gt;&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10;&lt;p&gt;[Edit] I tried &lt;a href="http://tinyvid.tv/"&gt;the only&lt;/a&gt; website I found that permits to upload ogv files in order to use it with the video tag, but it seems no to work well. So you can find the video &lt;a href="http://openvideo.dailymotion.com/video/xdk5ek_demo-effects-in-pitivi_tech"&gt;here&lt;/a&gt; and in better quality &lt;a href="http://ubuntuone.com/p/64O/"&gt;here&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Pitivi is getting effects, Part 2</title><link>https://blog.thibaultsaunier.com/2010/05/pitivi-is-getting-effects-part-2/</link><pubDate>Thu, 27 May 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/05/pitivi-is-getting-effects-part-2.html</guid><description>&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-style: normal"&gt;Here is my second report about the implementation of effects in Pitivi. I am going quite well with this project, and I now have almost everything ready to be able to add effects to videos. The dragging of effects to the timeline is almost ready, but I need to work on it a bit more to be able to show you a screen-cast! I hope it can be done next week.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-style: normal"&gt;Sorry for this kind of useless post, but I just wanted to tell you I make good progress, and I should be able to show you more soon!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-style: normal"&gt;You still can have a look at my &lt;a href="http://github.com/thiblahute/pitivi"&gt;git repository&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;</description></item><item><title>Pitivi is getting effects, Part 1</title><link>https://blog.thibaultsaunier.com/2010/05/pitivi-is-getting-effects-part-1/</link><pubDate>Fri, 14 May 2010 00:00:00 +0000</pubDate><guid isPermaLink="false">https://thiblahute.blogspot.com/2010/05/pitivi-is-getting-effects-part-1.html</guid><description>&lt;p&gt;&lt;span class="Apple-style-span" style="font-family:'DejaVu Sans', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family:'DejaVu Sans', sans-serif;"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-style: normal"&gt;Here is the first report about &lt;a href="http://thiblahute.blogspot.com/2010/04/i-have-been-accepetd-for-google-summer.html"&gt;my Google summer of code project&lt;/a&gt;. I have been working quite a lot on it for the last 2 weeks! So here is the summary of what have been done so far:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal"&gt;&lt;span style="font-weight: normal"&gt;&lt;span style="background: transparent"&gt;Code reading, analyze of Pitivi architecture (Thanks to the &lt;a href="http://wiki.pitivi.org/wiki/Main_Page"&gt;pitivi wiki&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal"&gt;&lt;span style="font-weight: normal"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;Some reading about Gstreamer to understand better the way it works&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;Creation of &lt;a href="http://github.com/thiblahute/pitivi"&gt;my git branch&lt;/a&gt; to start working on effects implementation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;Implementation of the core Pitivi modifications to be able to create effects (With unit tests)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal"&gt;&lt;span style="font-weight: normal"&gt;&lt;span style="background: transparent"&gt;See how I can implement &lt;a href="http://live.gnome.org/AppIntegration/GstreamerVisualEffects"&gt;effect files&lt;/a&gt; as &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal"&gt;&lt;span style="font-weight: normal"&gt;described in my Gsoc application, and discussions about it in the Pitivi community. We actually didn&amp;rsquo;t take a fixed decision about this for now.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal"&gt;&lt;span style="font-weight: normal"&gt;&lt;span style="background: transparent"&gt;Creation of the UI to show the list of effects detected thanks to the &lt;a href="http://www.gstreamer.net/data/doc/gstreamer/head/gstreamer/html/GstRegistry.html"&gt;gstreamer registry&lt;/a&gt; (the list was already retrieved in Pitivi)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;&lt;span style="font-style: normal"&gt;Some talking to know how this UI should be done. I will need to talk more about that to the Pitivi community to take a good decision about how it should look like. For now, it looks like:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a href="9cea4b-first_screenshot.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="ced6d2-first_screenshot.png" id="BLOGGER_PHOTO_ID_5471340830349008834" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;I am now working on drag&amp;rsquo;n droping effects to the timeline.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:DejaVu Sans, sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="background: transparent"&gt;That is all for now, and I will give you frequent news about how things are going.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#10;</description></item></channel></rss>