Skip to content

buffer: store sequence number for metas

Tim-Philipp Müller requested to merge tpm/gstreamer:meta-seq into master

For metas where order might be significant if multiple metas are attached to the same buffer, so store a sequence number with the meta when adding it to the buffer. This allows users of the meta to make sure metas are processed in the right order.

Specific use cases in which this was used is various scenarios where metadata is received e.g. in RTP header extensions or otherwise attached to buffers and either transported through the pipeline or saved to file to be replayed and streamed out again. In those cases it was important to preserve the global ordering of the metas as they are attached to the buffers in the various places, and across buffer transformations.

We need a 64-bit integer for the sequence number here in the API, a 32-bit one might overflow too easily with high packet/buffer rates. We could do it rtp-seqnum style of course, but that's a bit of a pain.

We could also make it so that gst_buffer_add_meta() just keeps metas in order or rely on the order we add the metas in, but that seems too fragile overall, when buffers (incl. metas) get merged or split.

Also add a compare function for easier sorting.

We store the seqnum in the MetaItem struct here and not in the GstMeta struct since there's no padding in the GstMeta struct. We could add a private struct to GstMeta before the start of GstMeta, but that's what MetaItem effectively is implementation-wise. We can still change this later if we want, since it's all private.

Fixes #262 (closed)

Merge request reports