<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw" -->

---
title: Hacking on the PipeWire GStreamer elements | daily.dev
description: A Collabora engineer recounts work done at the GStreamer Spring Hackfest in Thessaloniki, focusing on improving the PipeWire GStreamer elements (pipewiresrc...
canonical: https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Hacking on the PipeWire GStreamer elements | daily.dev
og:description: A Collabora engineer recounts work done at the GStreamer Spring Hackfest in Thessaloniki, focusing on improving the PipeWire GStreamer elements (pipewiresrc...
og:url: https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw
og:image: https://api.daily.dev/og/posts/xpMNxgAAW.png
og:image:alt: Hacking on the PipeWire GStreamer elements
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Hacking on the PipeWire GStreamer elements

**[Collabora Blog](https://daily.dev/sources/collabora)** · 5 min read · 0 upvotes · 0 comments

## Summary

A Collabora engineer recounts work done at the GStreamer Spring Hackfest in Thessaloniki, focusing on improving the PipeWire GStreamer elements (pipewiresrc and pipewiresink). The post explains the historical roots of these elements in PulseVideo, why they have accumulated technical debt, and describes a specific bug fix: detecting when PipeWire forcibly removes shared buffers after a linked node disconnects, causing pipewiresink to hang. The fix posts an element error on the GStreamer bus to cleanly stop the pipeline. The author also began a broader buffer pool refactoring effort that will be pushed upstream, with more improvements planned.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.collabora.com/news-and-blog/blog/2024/06/05/hacking-on-the-pipewire-gstreamer-elements>

## Questions this post answers

### Why does pipewiresink hang when a connected pipewiresrc disconnects in GStreamer?

When a pipewiresrc node is destroyed from the PipeWire graph, PipeWire forcibly removes and deallocates the shared buffer set that both elements were using. The pipewiresink pipeline is left with no buffers and hangs. The fix adds a detection mechanism for buffer removal that posts an element error on the GStreamer bus, allowing the application to cleanly stop the pipeline.

_Developers debugging GStreamer pipeline hangs with PipeWire track fixes like this on daily.dev._

### Why are pulsesrc and pulsesink still recommended over pipewiresrc and pipewiresink for audio in GStreamer?

The PipeWire GStreamer elements originated in PulseVideo, a predecessor project focused solely on video capture. Audio support was added later without careful attention to detail as development priorities lay elsewhere in the PipeWire core and session management. This left the codebase with unused code paths, commented-out hacks, and reliability issues, making pulsesrc and pulsesink the more stable choice for audio.

_Teams choosing between GStreamer audio backends find the trade-offs covered on daily.dev._

## Similar posts on daily.dev

- [Introducing GstPipelineStudio 0.6.0](https://daily.dev/posts/introducing-gstpipelinestudio-0-6-0-ofhghxgo9) · Planet Igalia · 0 upvotes · 0 comments

---

[View this post on daily.dev](https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Hacking on the PipeWire GStreamer elements","url":"https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw"},"datePublished":"2026-08-11T08:54:58.153Z","dateModified":"2026-08-11T09:25:32.885Z","description":"A Collabora engineer recounts work done at the GStreamer Spring Hackfest in Thessaloniki, focusing on improving the PipeWire GStreamer elements (pipewiresrc...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/8ccdfbbec7e1121f09e6a0f295b2746d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/8ccdfbbec7e1121f09e6a0f295b2746d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collabora Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collabora Blog","logo":"https://media.daily.dev/image/upload/s--ZGZ0FjqS--/f_auto,q_auto/v1786438306/logos/collabora?_a=BAMAMicg0","url":"https://daily.dev/sources/collabora"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"","timeRequired":"PT5M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collabora Blog","item":"https://daily.dev/sources/collabora"},{"@type":"ListItem","position":3,"name":"Hacking on the PipeWire GStreamer elements"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/hacking-on-the-pipewire-gstreamer-elements-xpmnxgaaw#faq","mainEntity":[{"@type":"Question","name":"Why does pipewiresink hang when a connected pipewiresrc disconnects in GStreamer?","acceptedAnswer":{"@type":"Answer","text":"When a pipewiresrc node is destroyed from the PipeWire graph, PipeWire forcibly removes and deallocates the shared buffer set that both elements were using. The pipewiresink pipeline is left with no buffers and hangs. The fix adds a detection mechanism for buffer removal that posts an element error on the GStreamer bus, allowing the application to cleanly stop the pipeline. Developers debugging GStreamer pipeline hangs with PipeWire track fixes like this on daily.dev."}},{"@type":"Question","name":"Why are pulsesrc and pulsesink still recommended over pipewiresrc and pipewiresink for audio in GStreamer?","acceptedAnswer":{"@type":"Answer","text":"The PipeWire GStreamer elements originated in PulseVideo, a predecessor project focused solely on video capture. Audio support was added later without careful attention to detail as development priorities lay elsewhere in the PipeWire core and session management. This left the codebase with unused code paths, commented-out hacks, and reliability issues, making pulsesrc and pulsesink the more stable choice for audio. Teams choosing between GStreamer audio backends find the trade-offs covered on daily.dev."}}]}
```

