{"id":18376942,"url":"https://github.com/bbc/gst-quic-transport","last_synced_at":"2025-08-10T15:06:47.780Z","repository":{"id":213723287,"uuid":"733983833","full_name":"bbc/gst-quic-transport","owner":"bbc","description":"Core QUIC Transport elements for GStreamer","archived":false,"fork":false,"pushed_at":"2024-12-20T10:30:01.000Z","size":1143,"stargazers_count":17,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-06T20:36:23.664Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bbc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-20T15:29:09.000Z","updated_at":"2025-04-05T04:26:42.000Z","dependencies_parsed_at":"2024-07-25T16:28:06.598Z","dependency_job_id":"c954e350-a0a2-49d4-92aa-b374290bf524","html_url":"https://github.com/bbc/gst-quic-transport","commit_stats":null,"previous_names":["bbc/gst-quic-transport"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bbc/gst-quic-transport","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbc%2Fgst-quic-transport","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbc%2Fgst-quic-transport/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbc%2Fgst-quic-transport/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbc%2Fgst-quic-transport/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bbc","download_url":"https://codeload.github.com/bbc/gst-quic-transport/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbc%2Fgst-quic-transport/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269740336,"owners_count":24467754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-10T02:00:08.965Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T00:25:32.304Z","updated_at":"2025-08-10T15:06:47.743Z","avatar_url":"https://github.com/bbc.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Core QUIC Transport elements for GStreamer\n\nThis repository contains an implementation of QUIC Transport for GStreamer. It \nuses the ngtcp2 library which provides the QUIC transport implementation.\n\nThe motivation behind this project was to develop a set of GStreamer plugins to\nallow media pipelines to use QUIC transport for signalling and media transport,\nsuch as [RTP-over-QUIC](https://datatracker.ietf.org/doc/draft-ietf-avtcore-rtp-over-quic/),\n [Media-over-QUIC](https://datatracker.ietf.org/group/moq/about/), and\n[SIP-over-QUIC](https://datatracker.ietf.org/doc/draft-hurst-sip-quic/).\n\n## Architecture\n\n![A diagram showing the plugin architecture](/docs/GstSipQuic-quic-transport-no-roq-architecture.png)\n\nThis repository contains the \"core\" plugins to enable QUIC transport within a\nGStreamer pipeline. These include a \"quicsrc\" and \"quicsink\" element for\ncarrying QUIC transport data into and out of a GStreamer pipeline, which are\nintended to be paired with the included \"quicdemux\" and \"quicmux\" elements\nrespectively which expose the QUIC stream and QUIC datagram flows on a series\nof dynamically allocated src and sink pads.\n\nThe elements in this repository are not that useful on their own, as they are\ndesigned to be augmented by application-specific muxers and demuxers of their\nown. Examples of these can be found in the accompanying \n[gst-roq repository](https://github.com/bbc/gst-roq) which implement the IETF\nRTP-over-QUIC draft.\n\n### Common QUIC transport\n\nThe same QUIC transport connection can be shared between multiple \"quicsrc\" and\n\"quicsink\" elements in a pipeline. As long as the peer properties on each\nelement match, they will use the same underlying QUIC transport connection.\nThis way, it is possible to have full bidirectional communication over QUIC\ntransport.\n\nThe plugins acheive this by utilising the same common \"quiclib\" library. The\n`GstQuicLibCommon` class is a singleton instance which checks whether an\nexisting connection created by another instance of a QUIC element matches. If\nno match is found, then it creates a new `GstQuicLibServerContext` or\n`GstQuicLibTransportConnection`. If there is a match, then it increments\nthe refcount on the object and returns that instance.\n\n### Streams\n\nFor each bidirectional or unidirectional QUIC stream, the \"quicdemux\" element\ncreates a new src pad. The element remembers peers that have previously\nlinked against those pads and sends an element query to them with\ninformation about those new stream (in order of first to last seen peer\nelement) and allows downstream elements to declare an interest in a given QUIC\nstream.\n\nSimilarly, to open a new bidirectional or unidirectional QUIC stream, an\nupstream element simply needs to request a new sink pad from the \"quicmux\"\nelement. This element then queries its \"quicsink\" peer and, if there is an\nappropriate QUIC connection established, opens a new QUIC stream.\n\nIf the QUIC transport connection negotiates it, then there are additional\ndatagram pads available on both the \"quicdemux\" and \"quicmux\" elements for\nreceiving and sending QUIC datagram payloads.\n\n## Getting started\n\nThis project depends on:\n\n- GSstreamer (\u003e=1.20)\n- GStreamer-plugins-base (\u003e=1.20)\n- GLib w/Gio\n- ngtcp2\n- QuicTLS (OpenSSL)\n\nThis project has only been tested on Linux x86\\_64 so far (Ubuntu 22.04 and\nFedora 39).\n\n### Building the dependencies\n\nThe following guides will install the QuicTLS and ngtcp2 dependencies somewhere\nother than /usr. This is probably helpful, as it's unlikely you'll find QuicTLS\nor ngtcp2 in your distribution's package manager, and QuicTLS will likely clash\nwith your distribution's provided version of OpenSSL.\n\nFor this to work, you should set:\n* `$SOME_LOCAL_PREFIX` to your desired install location\n* Add `$SOME_LOCAL_PREFIX/bin` to your `$PATH`\n* Add`$SOME_LOCAL_PREFIX/lib`, `$SOME_LOCAL_PREFIX/lib64`,\n`$SOME_LOCAL_PREFIX/lib/x86_64-linux-gnu` and\n`$SOME_LOCAL_PREFIX/lib/x86_64-linux-gnu/gstreamer-1.0` to your\n`$LD_LIBRARY_PATH`\n* Add `$SOME_LOCAL_PREFIX/lib/x86_64-linux-gnu/pkgconfig`,\n`$SOME_LOCAL_PREFIX/lib64/pkgconfig` and `$SOME_LOCAL_PREFIX/lib/pkgconfig` to\nyour `$PKG_CONFIG_PATH`.\n\nThe ngtcp2 project can use multiple SSL backend libraries. It may be possible\nto use ngtcp2 with a different SSL back-end than QuicTLS, but this has not been\ntested. This project will still require some flavour of OpenSSL to perform\nvarious functions, be it regular OpenSSL, BoringSSL or QuicTLS.\n\n#### QuicTLS\n\n```\n$ git clone https://github.com/quictls/openssl\n$ cd openssl\n$ ./config --prefix=$SOME_LOCAL_PREFIX\n$ make\n$ make test\n$ make install\n```\n\n#### ngtcp2\n\n```\n$ git clone https://github.com/ngtcp2/ngtcp2\n$ cd ngtcp2\n$ autoreconf -i\n$ ./configure --prefix=$SOME_LOCAL_PREFIX\n$ make\n$ make install\n```\n\n### Building gst-quic-transport\n\nThis repository uses the [Meson Build system](https://mesonbuild.com/). As a\nquic start guide, the elements and libraries contained in this repository can\nbe installed using the following commands:\n\n```\nmeson setup --prefix $SOME_LOCAL_PREFIX build\nmeson compile -C build\nmeson install -C build\n```\n\nThe above commands will create a `build` directory in your source tree, which\nis where the compiled objects will be stored before install.\n\n# Debugging\n\nIf you want to debug what's going on inside QUIC packets, you can get the TLS\nkeys by specifying the `GST_QUICLIB_TLS_EXPORT_DIR` environment variable with\nthe path to an extant directory (it will not be created for you). These keys\ncan then be provided to your packet tracing tool of choice, i.e. Wireshark.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbc%2Fgst-quic-transport","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbbc%2Fgst-quic-transport","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbc%2Fgst-quic-transport/lists"}