QUIC Transport architecture for GStreamer
Sanchayan Maity
sanchayan at sanchayanmaity.net
Fri Feb 17 04:21:29 UTC 2023
Hello,
Won't comment on the architecture bits, will leave that to the more
experienced folks than me.
Have posted a MR for a quicsrc/sink to gst-plugins-rs which might interest
you.
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1036
It is pretty basic right now but will be happy to work on improvements to
perhaps enable some of the below use cases.
On 23-02-16 14:55:49, Samuel Hurst via gstreamer-devel wrote:
> Hello all,
>
> TL;DR: How best to implement a bidirectional transport src/sink in
> GStreamer?
>
> I've been looking at media transport over QUIC transport [1] for quite some
> time, and I would like to start implementing some things in GStreamer,
> however I'm unsure as to exactly what architecture I should go with and
> would appreciate some advice from some GStreamer experts.
>
> My initial thoughts involved writing a quicsrc/quicsink element that would
> itself sit between the rest of the pipeline and a pair of udpsrc and
> dynudpsink elements. QUIC Datagrams can be passed on sometimes pads, with
> more request pads created dynamically for each QUIC stream and announced via
> named signals.
>
> In the example below, an rtpquicdemux element would manage the QUIC datagram
> and stream flows to enable reception of RTP over QUIC [2], passing regular
> RTP packets down to existing GStreamer RTP elements:
>
> +--------+ +---------+ +---------+
> | udpsrc +--> | | | +-------------+ +-----------+
> +--------+ | | | +-> rtp...depay +-> decodebin +->
> | quicsrc +----> rtpquic | +-------------+ +-----------+
> +--------+ | +----> demux | +-------------+ +-----------+
> | dynudp <--+ | | +-> rtp...depay +-> decodebin +->
> | sink | | | | | +-------------+ +-----------+
> +--------+ +---------+ +---------+
>
> However, in the case where you need to send and receive on the same QUIC
> transport connection, this model seems to conceptually break down, as the
> quicsrc and quicsink elements wouldn't be able to share the QUIC transport
> connection, which doesn't make sense for a bidirectional media session such
> as a video call:
>
> +--------+ +---------+ +----------+ +--------+
> | udpsrc +--> | | +-> dynudp |
> +--------+ | +-> | | | sink |
> | quicsrc | ... --> quicsink | +--------+
> +--------+ | +-> | | +--------+
> | dynudp <--+ | --> <-+ udpsrc |
> | sink | | | | | +--------+
> +--------+ +---------+ +----------+
Was wondering if something like the socket property on udpsink/src or agent on
nicesrc/sink could work here.
>
> In addition, any bidirectional streams would need sink pads on the quicsrc
> element to pass messages back, which sounds quite messy to me.
Hmm not sure about this with the above approach.
>
> Instead, I wondered whether or not trying to incorporate the udpsrc and
> dynudpsink elements was just over-complicating it for myself, and instead I
> should just have the quicsrc and quicsink elements be standalone, with a
> shared QUIC library (not element, but difficult to show the difference in
> asciiart) between them managing the socket and the QUIC transport connection
> transparently?
>
> +---------+
> | sockets |
> +----^----+
> |
> +----v----+
> +------------------> quiclib <-------------------+
> | +---------+ |
> +----v----+ +-------+ +-----+ +------+ +-----+ |
> | +-->rtpquic+-> rtp +->decode+->audio| +----v-----+
> | | | demux | |depay| | bin | |sink | | |
> | quicsrc | +-----+-+ +----++ +--+-+-+ +---+-+ | |
> | | +-----+ +-+----+ ++--+ +-+-+---+ | quicsink |
> | | |audio+->encode+->rtp+->rtpquic+--> |
> +---------+ | src | | bin | |pay| | mux | | |
> +-----+ +------+ +---+ +-------+ +----------+
>
> The above architecture is what happens in things like the httpsrc elements
> which own the socket internally. I'd imagine the "quiclib" would effectively
> be a singleton instance that would mediate all QUIC transport connections in
> a given pipeline, in case there are multiple sources/sinks, such as in an
> RTP mixer. However, this has challenges of its own in terms of which element
> "owns" each connection, but that's a problem for later on.
>
> What would you suggest is most inkeeping with the intended GStreamer design
> ethos, and isn't going to risk me tripping myself up down the line?
>
> Best regards,
> Sam
>
> --
> [1]: https://www.rfc-editor.org/rfc/rfc9000.html
> [2]: https://datatracker.ietf.org/doc/draft-ietf-avtcore-rtp-over-quic/
--
Regards,
Sanchayan.
More information about the gstreamer-devel
mailing list