Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-gst for openSUSE:Factory checked in at 2025-12-10 15:30:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-gst (Old) and /work/SRC/openSUSE:Factory/.python-gst.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-gst" Wed Dec 10 15:30:54 2025 rev:72 rq:1321738 version:1.26.9 Changes: -------- --- /work/SRC/openSUSE:Factory/python-gst/python-gst.changes 2025-11-13 17:27:21.687090386 +0100 +++ /work/SRC/openSUSE:Factory/.python-gst.new.1939/python-gst.changes 2025-12-10 15:31:39.245095253 +0100 @@ -1,0 +2,7 @@ +Sun Dec 7 08:27:49 UTC 2025 - Bjørn Lie <[email protected]> + +- Update to version 1.26.9: + + gst-python: fix cross-compiling + + python: Add some typing annotation to overrides + +------------------------------------------------------------------- Old: ---- gst-python-1.26.8.obscpio New: ---- gst-python-1.26.9.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-gst.spec ++++++ --- /var/tmp/diff_new_pack.mypgjn/_old 2025-12-10 15:31:40.045128983 +0100 +++ /var/tmp/diff_new_pack.mypgjn/_new 2025-12-10 15:31:40.045128983 +0100 @@ -21,7 +21,7 @@ %{?sle15_python_module_pythons} Name: python-gst -Version: 1.26.8 +Version: 1.26.9 Release: 0 Summary: Python Bindings for GStreamer License: LGPL-2.1-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.mypgjn/_old 2025-12-10 15:31:40.077130333 +0100 +++ /var/tmp/diff_new_pack.mypgjn/_new 2025-12-10 15:31:40.081130501 +0100 @@ -5,7 +5,7 @@ <param name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param> <param name="subdir">subprojects/gst-python</param> <param name="filename">gst-python</param> - <param name="revision">1.26.8</param> + <param name="revision">1.26.9</param> <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param> <param name="versionrewrite-pattern">v?(.*)\+0</param> <param name="versionrewrite-replacement">\1</param> ++++++ gst-python-1.26.8.obscpio -> gst-python-1.26.9.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/NEWS new/gst-python-1.26.9/NEWS --- old/gst-python-1.26.8/NEWS 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/NEWS 2025-12-01 18:27:07.000000000 +0100 @@ -2,11 +2,11 @@ GStreamer 1.26.0 was originally released on 11 March 2025. -The latest bug-fix release in the stable 1.26 series is 1.26.8 and was released on 10 November 2025. +The latest bug-fix release in the stable 1.26 series is 1.26.9 and was released on 01 December 2025. See https://gstreamer.freedesktop.org/releases/1.26/ for the latest version of this document. -Last updated: Monday 10 November 2025, 17:00 UTC (log) +Last updated: Monday 01 December 2025, 17:00 UTC (log) ## Introduction @@ -2940,12 +2940,192 @@ - List of Merge Requests applied in 1.26.8 - List of Issues fixed in 1.26.8 +1.26.9 + +The ninth 1.26 bug-fix release (1.26.9) was released on 01 December 2025. + +This release only contains bugfixes and it should be safe to update from 1.26.x. + +Highlighted bugfixes in 1.26.9 + +- playback: playbin3 and decodebin3 stability fixes +- Ancillary metadata handling fixes for AJA playout and Blackmagic Decklink capture cards +- HLS and DASH adaptive streaming clients stability improvements +- gst-play-1.0 will now print details of any missing plugins again +- gtk4paintablesink: Add property to fine-tune reconfiguration behaviour on window-resize +- macOS device monitoring: fix potential crash when probing for audio devices +- macOS video decoder stability improvements +- NDI source: fix audio corruption for non-interleaved audio with stride padding +- Add SMPTE ST291-1 ancillary metadata RTP payloader and depayloader +- Add ST-2038 metadata combiner and extractor +- webrtcsink: support hardware-accelerated encoders from the va VA-API plugin +- spotifysrc: fix the Spotify integration by using Spotify’s extended metadata endpoint +- Python bindings cross compilation fixes +- cerbero: add Visual Studio 2026 support, fix building on drives other than C:, and ship svtjpegxs plugin on Windows +- Various bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements + +gstreamer + +- info: Force comparison to same types +- queue: Use GST_PTR_FORMAT everywhere +- streamcollection: Fix race condition between disconnecting notify proxy and notifications +- value: Fix GstAllocationParams string serialisation on 32-bit architectures + +gst-plugins-base + +- allocators: drmdumb: Keep dmabuf mapped +- alsadeviceprovider: Fix device name leak +- audiovisualizer: Use break instead of goto for escape logic +- decodebin3: Clear previous collection on input +- decodebin3: Consider certain meta caps in decodebin3 as raw format to avoid warnings +- decodebin3: Protect again NULL dereference if input slot can’t be mapped +- glbasesrc: Add unlock handling for non-negotiated cases +- glcolorconvert: Fix memory leak in _create_shader +- gldownload: Keep dmabuf mapped +- glfiltershader: Add missing unlock +- glstereosplit: Add missing unlock for exceptional case +- pbutils: Fix bit shifting when generate hevc mime codec string +- rtpbaseaudiopay: Consider RESYNC flag as discontinuity too +- rtpbasedepayload: Add missing unlock in error code path +- uridecodebin3: Add null check of play items in purge +- urisourcebin: Add missing unlock +- urisourcebin: Fix initial values of min_byte_level and min_time_level variables +- videoencoder: fix warning of uninitialized buffer + +Tools: + +- gst-play-1.0: fix printing of missing plugin details +- gst-play-1.0: Add missing unlock for invalid track type + +gst-plugins-good + +- adaptivedemux2: Fix a crash on rapid state changes, and startup busy waiting +- hlsdemux2: Keep streams with different names +- hlsdemux2: error out instead of asserting on negative stream time +- hlsdemux2: Not all subtitles are present in track/collection. Usage of FORCE EXT-X-MEDIA field +- osxaudio: Remove unnecessary if, add comment about GstDevice lifetime +- osxaudio: Various fixes, incl a potential crash when probing +- v4l2allocator: Add KEEP_MAPPED flag to the allocated buffers +- v4l2videoenc: Fix codec frame leak on error + +gst-plugins-bad + +- Add missing G_DECLS symbols to gstvkqueue and gstvkcommandqueue +- ajasink, decklinkvideosrc: Fix some GstAncillaryMeta handling bugs +- analyticsmeta: Initialize span to avoid undefined behavior +- GstPlay: Fixed wrong initial position update interval configuration +- id3tag: Fix resource leak +- mpegtsmux: Avoid infinite recursion writing PCR packets +- mxfdemux: Fix typo on mxf_ffv1_create_caps +- mxfmux: Fix memset usage +- mpegtsmux: segfaults when bitrate is configured lower than bitrate that’s coming in +- osxaudio: Various fixes, incl a potential crash when probing +- scte-section: fix missing cleanup on splice component parse failure +- tsdemux: expose audio GstStream for DTS +- va, unixfdsrc: keep dmabufs mapped +- vkh265dec: Fix a typo +- vkvideo-private: Replace GstBuffer with GstMemory array for video sessions +- vtdec: Fix race condition in decoder draining. Fluster runs were unstable + +gst-plugins-ugly + +- rmdemux: Remove unnecessary condition + +GStreamer Rust plugins + +- analytics splitter/combiner: Remove the separate fields to events and buffer +- audiornnoise: copy input metadatas to ouput buffer +- closedcaption: cctost2038anc: Support alignment +- closedcaption: st2038ancdemux: Support alignment +- closedcaption: st2038ancmux: Support frame alignment +- closedcaption: st2038: Forward frame rate in caps where available +- closedcaption: Add ST-2038 combiner and extractor element +- closedcaption: st2038extractor: Some fixes +- closedcaption: st2038combiner: Some fixes +- gif: Update to gif 0.14 +- gtk4: Add property to control reconfigure on window-resize behavior +- gtk4: Fix compile warning +- fmp4, mp4: Implement GstChildProxy for MP4Mux and FMP4Mux +- fmp4: Update to dash-mpd 0.19 +- ndisrcdemux: fix audio corruption with non-interleaved stride padding +- net/quinn: Update web-transport-quinn and fix flaky QUIC test +- rtp: Add SMPTE ST291-1 (ANC) RTP payloader and depayloader +- spotify: bump librespot 0.8.0 +- webrtcsink: Don’t let recalculate_latency block tokio worker thread +- webrtcsink: support va encoders +- Update dependencies +- meson: fix build when GTK is not present + +gst-libav + +- No changes + +gst-rtsp-server + +- No changes + +gstreamer-vaapi + +- No changes + +gstreamer-sharp + +- No changes + +gst-python + +- gst-python: fix cross-compiling +- python: Add some typing annotation to overrides + +gst-editing-services + +- No changes + +gst-devtools, gst-validate + gst-integration-testsuites + +- debug-viewer: Make 0x prefix optional thread ID regexes + +gst-examples + +- No changes + +gstreamer-docs + +- No changes + +Development build environment + +- libsoup wrap: remove fallback gio-unix on windows build +- webrtc-audio-processing wrap: Fix build with abseil-cpp 202508 + +Cerbero build tool and packaging changes in 1.26.9 + +- Add support for Visual Studio 2026 (Insiders) +- Fix extraction on Windows when building on a different drive than C:, bump pixman and pygobject +- cookbook: List all the dependencies when listed in reverse +- gst-plugins-bad: actually build svtjpegxs plugin on 64-bit Windows + +Contributors to 1.26.9 + +Artem Martus, Chengfa Wang, Dominique Leroux, Dongjoo Kim, Doug Nazar, Edward Hervey, Gang Zhao, Hyunjun Ko, Jaehoon Lee, Jakub +Adam, Jan Schmidt, Jeongmin Kwak, Jerome Colle, Jihoon Lee, Jordan Yelloz, L. E. Segovia, Matthew Semeniuk, Max Goltzsche, +Michael Olbrich, Monty C, Nicolas Dufresne, Nirbheek Chauhan, Olivier Crête, Philippe Normand, Pratik Pachange, Qian Hu (胡骞), +Robert Mader, Ruben Gonzalez, Sanchayan Maity, Santiago Carot-Nemesio, Sebastian Dröge, Seungha Yang, Stéphane Cerveau, +Tim-Philipp Müller, Xavier Claessens, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.26.9 + +- List of Merge Requests applied in 1.26.9 +- List of Issues fixed in 1.26.9 + Schedule for 1.28 Our next major feature release will be 1.28, and 1.27 will be the unstable development version leading up to the stable 1.28 release. The development of 1.27/1.28 will happen in the git main branch of the GStreamer mono repository. -The schedule for 1.28 is yet to be decided, but we’re aiming for a release towards the end of 2025. +For 1.28 we’re aiming for feature freeze in December 2025 and then the new stable 1.28.0 release in January 2026. 1.28 will be backwards-compatible to the stable 1.26, 1.24, 1.22, 1.20, 1.18, 1.16, 1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/RELEASE new/gst-python-1.26.9/RELEASE --- old/gst-python-1.26.8/RELEASE 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/RELEASE 2025-12-01 18:27:07.000000000 +0100 @@ -1,4 +1,4 @@ -This is GStreamer gst-python 1.26.8. +This is GStreamer gst-python 1.26.9. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/gi/overrides/Gst.py new/gst-python-1.26.9/gi/overrides/Gst.py --- old/gst-python-1.26.8/gi/overrides/Gst.py 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/gi/overrides/Gst.py 2025-12-01 18:27:07.000000000 +0100 @@ -22,20 +22,37 @@ # # SPDX-License-Identifier: LGPL-2.0-or-later -import sys +from __future__ import annotations + import inspect import itertools import weakref -from ..overrides import override -from ..module import get_introspection_module +import typing +from gi.overrides import override from gi.repository import GLib, GObject - -Gst = get_introspection_module('Gst') +# Typing relies on https://github.com/pygobject/pygobject-stubs. +if typing.TYPE_CHECKING: + # Import stubs for type checking this file. + # + # This causes some weirdness because stubs contains overridden APIs + # signatures. For example when using Gst.Bin.add() here, we mean to call the + # g-i generated API which does not have the same signature as our override + # Bin.add(). The type checker will use signature from stubs which is our + # override signature. + # + # For similar reason, make sure the type of arguments and return values + # are e.g. `Element` and not `Gst.Element`. Once copied into stubs, + # `Gst.Element` would not be defined, Gst module cannot refer to itself. + from gi.repository import Gst +else: + from gi.module import get_introspection_module + Gst = get_introspection_module('Gst') __all__ = [] + if Gst._version == '0.10': import warnings warn_msg = "You have imported the Gst 0.10 module. Because Gst 0.10 \ @@ -54,13 +71,13 @@ pass -URIHandler = override(URIHandler) +override(URIHandler) __all__.append('URIHandler') class Element(Gst.Element): @staticmethod - def link_many(*args): + def link_many(*args: Element) -> None: # type: ignore[override] ''' @raises: Gst.LinkError ''' @@ -70,20 +87,20 @@ 'Failed to link {} and {}'.format(pair[0], pair[1])) -Element = override(Element) +override(Element) __all__.append('Element') class Bin(Gst.Bin): - def __init__(self, name=None): + def __init__(self, name: typing.Optional[str] = None): Gst.Bin.__init__(self, name=name) - def add(self, *args): + def add(self, *args: Element) -> None: # type: ignore[override] for arg in args: - if not Gst.Bin.add(self, arg): + if not Gst.Bin.add(self, arg): # type: ignore[func-returns-value] raise AddError(arg) - def make_and_add(self, factoryname, name=None): + def make_and_add(self, factoryname: str, name: typing.Optional[str] = None) -> Element: ''' @raises: Gst.AddError ''' @@ -91,11 +108,12 @@ if not elem: raise AddError( 'No such element: {}'.format(factoryname)) + assert isinstance(elem, Element) # Tell mypy we actually have our override subclass self.add(elem) return elem -Bin = override(Bin) +override(Bin) __all__.append('Bin') @@ -107,18 +125,18 @@ class MiniObject: - def make_writable(self): + def make_writable(self) -> MiniObject: return _gi_gst.mini_object_make_writable(self) - def is_writable(self): + def is_writable(self) -> bool: return _gi_gst.mini_object_is_writable(self) @property - def flags(self): + def flags(self) -> Gst.MiniObjectFlags: return _gi_gst.mini_object_flags(self) @flags.setter - def flags(self, flags): + def flags(self, flags: Gst.MiniObjectFlags) -> None: _gi_gst.mini_object_set_flags(self, flags) @@ -130,15 +148,15 @@ class Query(MiniObject, Gst.Query): - def get_structure(self): + def get_structure(self) -> typing.Optional[Structure]: s = _gi_gst.query_get_structure(self) return s._set_parent(self) if s is not None else None - def writable_structure(self): + def writable_structure(self) -> StructureWrapper: return StructureWrapper(_gi_gst.query_writable_structure(self)._set_parent(self)) -Query = override(Query) +override(Query) __all__.append('Query') @@ -150,15 +168,15 @@ class Event(MiniObject, Gst.Event): - def get_structure(self): + def get_structure(self) -> typing.Optional[Structure]: s = _gi_gst.event_get_structure(self) return s._set_parent(self) if s is not None else None - def writable_structure(self): + def writable_structure(self) -> StructureWrapper: return StructureWrapper(_gi_gst.event_writable_structure(self)._set_parent(self)) -Event = override(Event) +override(Event) __all__.append('Event') @@ -170,15 +188,15 @@ class Context(MiniObject, Gst.Context): - def get_structure(self): + def get_structure(self) -> typing.Optional[Structure]: s = _gi_gst.context_get_structure(self) return s._set_parent(self) if s is not None else None - def writable_structure(self): + def writable_structure(self) -> StructureWrapper: return StructureWrapper(_gi_gst.context_writable_structure(self)._set_parent(self)) -Context = override(Context) +override(Context) __all__.append('Context') @@ -239,20 +257,20 @@ def __len__(self): return self.get_size() - def get_structure(self, index): + def get_structure(self, index: int) -> typing.Optional[Structure]: s = _gi_gst.caps_get_structure(self, index) return s._set_parent(self) if s is not None else None - def writable_structure(self, index): + def writable_structure(self, index: int) -> StructureWrapper: return StructureWrapper(_gi_gst.caps_writable_structure(self, index)._set_parent(self)) -Caps = override(Caps) +override(Caps) __all__.append('Caps') class PadFunc: - def __init__(self, func): + def __init__(self, func: typing.Callable[..., Gst.FlowReturn]): self.func = func def __call__(self, pad, parent, obj): @@ -277,19 +295,19 @@ def __init__(self, *args, **kwargs): super(Gst.Pad, self).__init__(*args, **kwargs) - def set_chain_function(self, func): + def set_chain_function(self, func: typing.Callable[..., Gst.FlowReturn]) -> None: self.set_chain_function_full(PadFunc(func), None) - def set_event_function(self, func): + def set_event_function(self, func: typing.Callable[..., Gst.FlowReturn]) -> None: self.set_event_function_full(PadFunc(func), None) - def set_query_function(self, func): + def set_query_function(self, func: typing.Callable[..., Gst.FlowReturn]) -> None: self.set_query_function_full(PadFunc(func), None) def query_caps(self, filter=None): return Gst.Pad.query_caps(self, filter) - def set_caps(self, caps): + def set_caps(self, caps: Gst.Caps) -> bool: if not isinstance(caps, Gst.Caps): raise TypeError("%s is not a Gst.Caps." % (type(caps))) @@ -305,19 +323,19 @@ return res - def link(self, pad): + def link(self, pad: Gst.Pad) -> Gst.PadLinkReturn: ret = Gst.Pad.link(self, pad) if ret != Gst.PadLinkReturn.OK: raise LinkError(ret) return ret -Pad = override(Pad) +override(Pad) __all__.append('Pad') class GhostPad(Gst.GhostPad): - def __init__(self, name, target=None, direction=None): + def __init__(self, name: str, target: typing.Optional[Gst.Pad] = None, direction: typing.Optional[Gst.PadDirection] = None): if direction is None: if target is None: raise TypeError('you must pass at least one of target ' @@ -329,11 +347,11 @@ if target is not None: self.set_target(target) - def query_caps(self, filter=None): + def query_caps(self, filter: typing.Optional[Gst.Caps] = None) -> Gst.Caps: return Gst.GhostPad.query_caps(self, filter) -GhostPad = override(GhostPad) +override(GhostPad) __all__.append('GhostPad') @@ -378,33 +396,35 @@ yield value -Iterator = override(Iterator) +override(Iterator) __all__.append('Iterator') class ElementFactory(Gst.ElementFactory): # ElementFactory - def get_longname(self): + def get_longname(self) -> typing.Optional[str]: return self.get_metadata("long-name") - def get_description(self): + def get_description(self) -> typing.Optional[str]: return self.get_metadata("description") - def get_klass(self): + def get_klass(self) -> typing.Optional[str]: return self.get_metadata("klass") - @classmethod - def make(cls, factoryname, name=None): - return Gst.ElementFactory.make(factoryname, name) + @staticmethod + def make(factoryname: str, name: typing.Optional[str] = None) -> typing.Optional[Element]: # type: ignore[override] + elem = Gst.ElementFactory.make(factoryname, name) + assert elem is None or isinstance(elem, Element) # Tell mypy we actually have our override subclass + return elem class Pipeline(Gst.Pipeline): - def __init__(self, name=None): + def __init__(self, name: typing.Optional[str] = None): Gst.Pipeline.__init__(self, name=name) -Pipeline = override(Pipeline) +override(Pipeline) __all__.append('Pipeline') @@ -442,7 +462,7 @@ def __getitem__(self, key): return self.get_value(key) - def keys(self): + def keys(self) -> set[str]: keys = set() def foreach(fid, value, unused1, udata): @@ -455,7 +475,7 @@ def __setitem__(self, key, value): return self.set_value(key, value) - def set_value(self, key, value): + def set_value(self, key: str, value: typing.Any) -> bool: if not _gi_gst.structure_is_writable(self): raise NotWritableStructure("Trying to write to a not writable structure." " Make sure to use the right APIs to have access to structure" @@ -463,7 +483,7 @@ return Gst.Structure.set_value(self, key, value) - def __str__(self): + def __str__(self) -> str: return self.to_string() def _set_parent(self, parent): @@ -477,15 +497,15 @@ self._set_parent(None) -Structure = override(Structure) +override(Structure) __all__.append('Structure') -ElementFactory = override(ElementFactory) +override(ElementFactory) __all__.append('ElementFactory') class Fraction(Gst.Fraction): - def __init__(self, num, denom=1): + def __init__(self, num: int, denom: int = 1): def __gcd(a, b): while b != 0: tmp = a @@ -566,7 +586,7 @@ return '%d/%d' % (self.num, self.denom) -Fraction = override(Fraction) +override(Fraction) __all__.append('Fraction') @@ -605,9 +625,8 @@ return False -if sys.version_info >= (3, 0): - IntRange = override(IntRange) - __all__.append('IntRange') +override(IntRange) +__all__.append('IntRange') class Int64Range(Gst.Int64Range): @@ -646,7 +665,7 @@ class Bitmask(Gst.Bitmask): - def __init__(self, v): + def __init__(self, v: int) -> None: if not isinstance(v, int): raise TypeError("%s is not an int." % (type(v))) @@ -659,17 +678,16 @@ return self.v == other -Bitmask = override(Bitmask) +override(Bitmask) __all__.append('Bitmask') -if sys.version_info >= (3, 0): - Int64Range = override(Int64Range) - __all__.append('Int64Range') +override(Int64Range) +__all__.append('Int64Range') class DoubleRange(Gst.DoubleRange): - def __init__(self, start, stop): + def __init__(self, start: int | float, stop: int | float): self.start = float(start) self.stop = float(stop) @@ -683,16 +701,16 @@ return '(double)[%s,%s]' % (str(self.range.start), str(self.range.stop)) -DoubleRange = override(DoubleRange) +override(DoubleRange) __all__.append('DoubleRange') class FractionRange(Gst.FractionRange): - def __init__(self, start, stop): - if not isinstance(start, Gst.Fraction): + def __init__(self, start: Fraction, stop: Fraction): + if not isinstance(start, Fraction): raise TypeError("%s is not a Gst.Fraction." % (type(start))) - if not isinstance(stop, Gst.Fraction): + if not isinstance(stop, Fraction): raise TypeError("%s is not a Gst.Fraction." % (type(stop))) if (float(start) >= float(stop)): @@ -709,7 +727,7 @@ return '(fraction)[%s,%s]' % (str(self.start), str(self.stop)) -FractionRange = override(FractionRange) +override(FractionRange) __all__.append('FractionRange') @@ -733,7 +751,7 @@ return '<Gst.ValueArray %s>' % (str(self)) -ValueArray = override(ValueArray) +override(ValueArray) __all__.append('ValueArray') @@ -757,7 +775,7 @@ return '<Gst.ValueList %s>' % (str(self)) -ValueList = override(ValueList) +override(ValueList) __all__.append('ValueList') @@ -801,13 +819,13 @@ return '<Gst.TagList %s>' % (str(self)) -TagList = override(TagList) +override(TagList) __all__.append('TagList') # From https://docs.python.org/3/library/itertools.html -def pairwise(iterable): +def pairwise(iterable: typing.Iterable[Element]) -> typing.Iterator[tuple[Element, Element]]: a, b = itertools.tee(iterable) next(b, None) return zip(a, b) @@ -816,10 +834,10 @@ class StructureWrapper: """A Gst.Structure wrapper to force usage of a context manager. """ - def __init__(self, structure): + def __init__(self, structure: Structure): self.__structure = structure - def __enter__(self): + def __enter__(self) -> Structure: return self.__structure def __exit__(self, _type, _value, _tb): @@ -857,96 +875,96 @@ class Buffer(MiniObject, Gst.Buffer): - @property - def flags(self): + @property # type: ignore[override] + def flags(self) -> Gst.BufferFlags: return _gi_gst.mini_object_flags(self) @flags.setter - def flags(self, flags): + def flags(self, flags: Gst.BufferFlags) -> None: _gi_gst.mini_object_set_flags(self, flags) @property - def dts(self): + def dts(self) -> int: return _gi_gst.buffer_get_dts(self) @dts.setter - def dts(self, dts): + def dts(self, dts: int) -> None: _gi_gst.buffer_set_dts(self, dts) @property - def pts(self): + def pts(self) -> int: return _gi_gst.buffer_get_pts(self) @pts.setter - def pts(self, pts): + def pts(self, pts: int) -> None: _gi_gst.buffer_set_pts(self, pts) @property - def duration(self): + def duration(self) -> int: return _gi_gst.buffer_get_duration(self) @duration.setter - def duration(self, duration): + def duration(self, duration: int) -> None: _gi_gst.buffer_set_duration(self, duration) @property - def offset(self): + def offset(self) -> int: return _gi_gst.buffer_get_offset(self) @offset.setter - def offset(self, offset): + def offset(self, offset: int) -> None: _gi_gst.buffer_set_offset(self, offset) @property - def offset_end(self): + def offset_end(self) -> int: return _gi_gst.buffer_get_offset_end(self) @offset_end.setter - def offset_end(self, offset_end): + def offset_end(self, offset_end: int) -> None: _gi_gst.buffer_set_offset_end(self, offset_end) - def map_range(self, idx, length, flags): + def map_range(self, idx: int, length: int, flags: Gst.MapFlags) -> MapInfo: # type: ignore[override] mapinfo = MapInfo() if (_gi_gst.buffer_override_map_range(self, mapinfo, idx, length, int(flags))): mapinfo.__parent__ = self return mapinfo - def map(self, flags): + def map(self, flags: Gst.MapFlags) -> MapInfo: # type: ignore[override] mapinfo = MapInfo() if _gi_gst.buffer_override_map(self, mapinfo, int(flags)): mapinfo.__parent__ = self return mapinfo - def unmap(self, mapinfo): + def unmap(self, mapinfo: MapInfo) -> bool: # type: ignore[override] mapinfo.__parent__ = None return _gi_gst.buffer_override_unmap(self, mapinfo) -Buffer = override(Buffer) +override(Buffer) __all__.append('Buffer') class Memory(Gst.Memory): - def map(self, flags): + def map(self, flags: Gst.MapFlags) -> MapInfo: # type: ignore[override] mapinfo = MapInfo() if (_gi_gst.memory_override_map(self, mapinfo, int(flags))): mapinfo.__parent__ = self return mapinfo - def unmap(self, mapinfo): + def unmap(self, mapinfo: MapInfo) -> bool: # type: ignore[override] mapinfo.__parent__ = None return _gi_gst.memory_override_unmap(self, mapinfo) -Memory = override(Memory) +override(Memory) __all__.append('Memory') -def TIME_ARGS(time): +def TIME_ARGS(time: int) -> str: if time == Gst.CLOCK_TIME_NONE: return "CLOCK_TIME_NONE" @@ -958,7 +976,7 @@ __all__.append('TIME_ARGS') -from gi.overrides import _gi_gst +from gi.overrides import _gi_gst # type: ignore[attr-defined] _gi_gst # maybe more python and less C some day if core turns a bit more introspection @@ -1035,11 +1053,11 @@ real_init = Gst.init -def init(argv=None): +def init(argv: typing.Optional[list[str]] = None) -> None: init_pygst() if Gst.is_initialized(): - return True + return return real_init(argv) @@ -1049,10 +1067,10 @@ real_init_check = Gst.init_check -def init_check(argv): +def init_check(argv: typing.Optional[list[str]] = None) -> typing.Tuple[bool, typing.Optional[list[str]]]: init_pygst() if Gst.is_initialized(): - return True + return True, argv return real_init_check(argv) @@ -1062,9 +1080,9 @@ real_deinit = Gst.deinit -def deinit(): +def deinit() -> None: deinit_pygst() - return real_deinit() + real_deinit() def init_python(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/gi/overrides/GstApp.py new/gst-python-1.26.9/gi/overrides/GstApp.py --- old/gst-python-1.26.8/gi/overrides/GstApp.py 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/gi/overrides/GstApp.py 2025-12-01 18:27:07.000000000 +0100 @@ -17,24 +17,32 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import typing from gi.overrides import _gi_gst -from ..overrides import override -from ..module import get_introspection_module +from gi.overrides import override +from gi.repository import Gst + + +if typing.TYPE_CHECKING: + # Import from pygobject-stubs + from gi.repository import GstApp +else: + from gi.module import get_introspection_module + GstApp = get_introspection_module('GstApp') -GstApp = get_introspection_module('GstApp') __all__ = [] class AppSink(GstApp.AppSink): - def pull_object(self): + def pull_object(self) -> Gst.MiniObject: obj = super().pull_object() - return _gi_gst.mini_object_to_subclass(obj) if obj else None + return _gi_gst.mini_object_to_subclass(obj) - def try_pull_object(self, timeout): + def try_pull_object(self, timeout: int) -> typing.Optional[Gst.MiniObject]: obj = super().try_pull_object(timeout) return _gi_gst.mini_object_to_subclass(obj) if obj else None -AppSink = override(AppSink) +override(AppSink) __all__.append('AppSink') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/gst-python.doap new/gst-python-1.26.9/gst-python.doap --- old/gst-python-1.26.8/gst-python.doap 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/gst-python.doap 2025-12-01 18:27:07.000000000 +0100 @@ -32,6 +32,16 @@ <release> <Version> + <revision>1.26.9</revision> + <branch>1.26</branch> + <name></name> + <created>2025-12-01</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-python/gst-python-1.26.9.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.26.8</revision> <branch>1.26</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-python-1.26.8/meson.build new/gst-python-1.26.9/meson.build --- old/gst-python-1.26.8/meson.build 2025-11-10 18:22:05.000000000 +0100 +++ new/gst-python-1.26.9/meson.build 2025-12-01 18:27:07.000000000 +0100 @@ -1,5 +1,5 @@ project('gst-python', 'c', - version : '1.26.8', + version : '1.26.9', meson_version : '>= 1.4', default_options : [ 'warning_level=1', 'buildtype=debugoptimized' ]) @@ -88,17 +88,21 @@ endif endif pylib_fname = '' -foreach loc: pylib_locs - foreach fname: pylib_fnames - fpath = loc / fname - debug(f'Looking for Python library at: @fpath@') - if fsmod.exists(fpath) - pylib_fname = fname - message(f'PY_LIB_FNAME = @fname@ (@loc@)') - break - endif +if meson.is_cross_build() + pylib_fname = pylib_locs[0] / pylib_fnames[0] +else + foreach loc: pylib_locs + foreach fname: pylib_fnames + fpath = loc / fname + debug(f'Looking for Python library at: @fpath@') + if fsmod.exists(fpath) + pylib_fname = fname + message(f'PY_LIB_FNAME = @fname@ (@loc@)') + break + endif + endforeach endforeach -endforeach +endif if pylib_fname == '' message('Could not find python library to load, will try loading at runtime') endif ++++++ gst-python.obsinfo ++++++ --- /var/tmp/diff_new_pack.mypgjn/_old 2025-12-10 15:31:40.373142813 +0100 +++ /var/tmp/diff_new_pack.mypgjn/_new 2025-12-10 15:31:40.381143150 +0100 @@ -1,5 +1,5 @@ name: gst-python -version: 1.26.8 -mtime: 1762795325 -commit: 16d77e12ad213ef24e76a8cc34d347b8221c9975 +version: 1.26.9 +mtime: 1764610027 +commit: f313fae193089408e278c0dd3450145e5a12307b
