v1.28.8
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 theGstMetaheader followed by one
unmanagedT, with optional init, free, transform, serialize, deserialize and
clear delegates —Gst.MetaInitFunction,MetaFreeFunction,
MetaTransformFunction,MetaSerializeFunction,MetaDeserializeFunctionand
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 aref Tthrough the item'sPayload<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.BufferAddAudioDownmixMetatakes the downmix matrix as
one row-majorReadOnlySpan<float>and builds the row table the C function
wants; a shared buffer throwsInvalidOperationException.
Gst.Video.VideoGlobal.BufferAddVideoGLTextureUploadMetaattaches a managed
upload function, the newGst.Video.VideoGLTextureUploaddelegate, 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
answersnullthe wayBufferAddVideoMetadoes. - Take-and-replace setters for the fields a subclass owns.
Gst.Base.BaseParseFrame.SetBuffer(Buffer?),
Gst.Video.VideoCodecFrame.SetInputBuffer(Buffer?)andSetOutputBuffer(Buffer?),
Gst.Video.VideoCodecState.SetCaps(Caps?)andSetAllocationCaps(Caps?)— the
same shape as the shippedBaseParseFrame.SetOutBuffer: the wrapper's reference
is taken over, the replaced value is released, andnullclears the field. - A
GCancellablethe caller already holds.GES.Asset.RequestAsyncand
GES.UriClipAsset.NewAsyncgained overloads taking aGst.Gio.Cancellable.
The binding borrows it — it never cancels, resets or disposes it — and a
cancelled result surfaces as a canceledTaskcarrying no token. GstSharp.GioAsyncContext. A staticMainContext?, 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_asynccall so the callback lands on it.docs/gio-async.md
describes it.- Four GES signals.
GES.Layer.ActiveChanged(Active, andTracksas a
GES.Track[]snapshot),GES.Timeline.GroupRemoved(Group, andChildrenas
aGES.Container[]snapshot),GES.Timeline.SelectTracksForObject— whose
handler answersGES.Track[]?, wherenulland an empty array both mean the
element joins no track, and connecting a handler replaces the timeline's default
track selection — and thenotify-metasignal ofGESMetaContainer, connected
throughGES.MetaContainerExtensions.AddNotifyMetaHandlerand
RemoveNotifyMetaHandleronGES.IMetaContainer, whose arguments carryKey,
HasValueandValue, aValueViewlent for the emission only; reading it once
the emission has ended throwsInvalidOperationException. The generator rules
behind them are narrow — aGPtrArrayof GObject-class elements, and a const
GValueargument on a signal — anddocs/ownership.mdstates the ownership of
the lent value and of the answered array.
Samples
samples/GstPlaygainedgst-play-1.0's--shuffleoption and itsdkey,
which flips the playback direction. Trick modes stay out becauseGstPlay
offers no seek-flag API; the header comment says so.samples/GesLaunchports the last fourges-launch-1.0branches:
--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-renderingmakes when
no--formatis 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) orGEN0047(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 committedgirs/skip-report.mdis 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