Skip to content

v1.28.8

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:21
· 112 commits to main since this release

A gap-closing release. Managed code can author a buffer metadata implementation
of its own now, two attach functions the gir could not describe are bound by
hand, the frame and state fields a subclass writes in C have take-and-replace
setters, the GES asynchronous requests accept a GCancellable the caller
already holds and can run on the application's own GLib main context, and four
GES signals whose shapes the generator used to refuse are emitted. Nothing that
shipped changed behaviour. All eighteen packages ship as one version, 1.28.8,
generated from the GStreamer 1.28.6 .gir files, 33 commits after 1.28.7.

Added

  • A metadata implementation written in C#. Gst.Meta.Register<T>(api, impl, …)
    registers an implementation whose item is the GstMeta header followed by one
    unmanaged T, with optional init, free, transform, serialize, deserialize and
    clear delegates — Gst.MetaInitFunction, MetaFreeFunction,
    MetaTransformFunction, MetaSerializeFunction, MetaDeserializeFunction and
    MetaClearFunction, mirroring the C callbacks including the serialisation,
    deserialisation and clear ones that arrived in 1.24. The payload of such an
    item is reached as a ref T through the item's Payload<T>(), and
    Gst.ByteArrayInterface.AppendData(ReadOnlySpan<byte>) is the sink a
    serialize delegate writes through. A registration lives for the rest of the
    process, and the delegates are rooted for that long. docs/ownership.md
    gains an "Authoring a metadata implementation" section.
  • Two attach functions that were not introspectable.
    Gst.Audio.AudioGlobal.BufferAddAudioDownmixMeta takes the downmix matrix as
    one row-major ReadOnlySpan<float> and builds the row table the C function
    wants; a shared buffer throws InvalidOperationException.
    Gst.Video.VideoGlobal.BufferAddVideoGLTextureUploadMeta attaches a managed
    upload function, the new Gst.Video.VideoGLTextureUpload delegate, which stays
    reachable for as long as any buffer carries the item — every copy takes a
    handle of its own to the same delegate; the upload is invoked through
    VideoGLTextureUploadMeta.Upload(ReadOnlySpan<uint>), and a shared buffer
    answers null the way BufferAddVideoMeta does.
  • Take-and-replace setters for the fields a subclass owns.
    Gst.Base.BaseParseFrame.SetBuffer(Buffer?),
    Gst.Video.VideoCodecFrame.SetInputBuffer(Buffer?) and SetOutputBuffer(Buffer?),
    Gst.Video.VideoCodecState.SetCaps(Caps?) and SetAllocationCaps(Caps?) — the
    same shape as the shipped BaseParseFrame.SetOutBuffer: the wrapper's reference
    is taken over, the replaced value is released, and null clears the field.
  • A GCancellable the caller already holds. GES.Asset.RequestAsync and
    GES.UriClipAsset.NewAsync gained overloads taking a Gst.Gio.Cancellable.
    The binding borrows it — it never cancels, resets or disposes it — and a
    cancelled result surfaces as a canceled Task carrying no token.
  • GstSharp.GioAsyncContext. A static MainContext?, null by default. An
    application that runs its own GLib main loop can host the binding's
    asynchronous Gio operations on that context instead of on the binding's
    background thread: the application iterates the context, the value is read once
    when an operation starts, and the binding pushes the context thread-default
    around the native _async call so the callback lands on it. docs/gio-async.md
    describes it.
  • Four GES signals. GES.Layer.ActiveChanged (Active, and Tracks as a
    GES.Track[] snapshot), GES.Timeline.GroupRemoved (Group, and Children as
    a GES.Container[] snapshot), GES.Timeline.SelectTracksForObject — whose
    handler answers GES.Track[]?, where null and an empty array both mean the
    element joins no track, and connecting a handler replaces the timeline's default
    track selection — and the notify-meta signal of GESMetaContainer, connected
    through GES.MetaContainerExtensions.AddNotifyMetaHandler and
    RemoveNotifyMetaHandler on GES.IMetaContainer, whose arguments carry Key,
    HasValue and Value, a ValueView lent for the emission only; reading it once
    the emission has ended throws InvalidOperationException. The generator rules
    behind them are narrow — a GPtrArray of GObject-class elements, and a const
    GValue argument on a signal — and docs/ownership.md states the ownership of
    the lent value and of the answered array.

Samples

  • samples/GstPlay gained gst-play-1.0's --shuffle option and its d key,
    which flips the playback direction. Trick modes stay out because GstPlay
    offers no seek-flag API; the header comment says so.
  • samples/GesLaunch ports the last four ges-launch-1.0 branches:
    --container-profile, which re-parents the encoding profile under a bare muxer
    profile; --profile-from <clip name>, which rebuilds every track from the named
    URI clip's discoverer streams; the profile pick --smart-rendering makes when
    no --format is given, taken from the URI-clip assets and faithfully the
    least common qualifying one, because the C tool sorts its candidates
    ascending; and --embed-nesteds, which embeds nested .xges
    projects into the saved project. The sample prints which path chose the encoding
    profile and how many nested projects were embedded, and four Linux-only CI steps
    exercise them.

Tooling

  • The generator no longer counts what it refuses to ship: a slot rejected by
    GEN0040 (a return type collision) or GEN0047 (a borrowed return with no
    documented owner) is left out of the census as well as out of the file. The
    generator also takes --report-dir, which defaults to the --gir-dir
    directory; a run that writes its sources elsewhere passes it as well, so that
    the committed girs/skip-report.md is left alone.

Compatibility

This release is additive: every entry above is new surface, and nothing that
shipped changed behaviour, which is what the 1.28.x promise allows. The
binding is generated from the GStreamer 1.28.6 .gir files and the run-time
floor is still GStreamer 1.24 — neither moved. The census counts did move,
and only where the new surface says they should: the four GES signals leave
UnsupportedSignature and are counted as emitted, so GES counts 39 signals
rather than 35 and 8 unsupported signatures rather than 12; and six symbols move
into the hand-bound ledger from the reasons that used to keep them out — the
three registration entry points behind Gst.Meta.Register<T>, the
gst_buffer_iterate_meta_filtered that Gst.Buffer.IterateMeta already
implemented in managed code, and the two attach functions above.

PackageValidationBaselineVersion in src/Directory.Build.props is 1.28.7, and
GstSharp.Net.RtspServer no longer opts out of the gate: with the package now
published, all eighteen are packed against a baseline on nuget.org rather than
seventeen of them.

Source note. A literal default in the cancellation position of
GES.Asset.RequestAsync or GES.UriClipAsset.NewAsync is now ambiguous
(CS0121) between CancellationToken and Gst.Gio.Cancellable. Omit the
argument, or write default(CancellationToken).

Changes

  • Gate the smart rendering step on the profile pick alone
  • Gate the nested project embedding on the Linux leg
  • Give the rebuilt tracks back to the timeline that owns them
  • Gate the three new profile paths of GesLaunch on Linux
  • Embed the nested timelines into the saved project
  • Pick the smart rendering profile out of the clips of the timeline
  • Build the tracks and the profile from a named clip
  • Re-parent the encoding profile into --container-profile
  • State the ownership of the ungroup call the test makes
  • Say what the pointer array rules and the ungroup call really do
  • Cover the four GES container and value signals against the library
  • Show a signal handler the GValue an emission lends it
  • Let a signal handler answer with a GPtrArray of objects
  • Read a GPtrArray signal argument out into an array of wrappers
  • Port shuffle and the direction key to the GstPlay sample
  • Take the reference on a borrowed GCancellable where it is released
  • Let an application host the Gio async operations on its own loop
  • Let a caller bring the GCancellable an async request watches
  • Let subclasses write the frame and state fields they own
  • Take back only the entry the refused registration filed
  • Close the two windows a metadata registration leaves open
  • Say what each refusal of a metadata registration means
  • File the metadata authorship entry points under HandBound
  • Let managed code author a fixed-layout metadata implementation
  • Say which half of the upload pair leaks and which double-frees
  • Say what the copy of a texture upload item takes with it
  • Attach a managed OpenGL texture upload to a buffer
  • Attach a downmix matrix to a buffer from managed code
  • Name the report-dir test and the CONTRIBUTING sentence for what they check
  • Let a run say where the skip report belongs
  • Leave a refused slot out of the count as well as the file
  • Validate the RTSP server package against its published surface
  • Move the version and the validation baseline to 1.28.7

Full Changelog: v1.28.7...v1.28.8