Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-av for openSUSE:Factory checked in at 2026-10-26 10:00:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-av (Old) and /work/SRC/openSUSE:Factory/.python-av.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-av" Mon Oct 26 10:00:36 2026 rev:21 rq:1392404 version:19.0.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-av/python-av.changes 2026-08-22 21:37:54.515005864 +0200 +++ /work/SRC/openSUSE:Factory/.python-av.new.2252680/python-av.changes 2026-10-26 10:01:41.040945348 +0100 @@ -1,0 +2,186 @@ +Sun Oct 25 12:15:59 UTC 2026 - Dirk Müller <[email protected]> + +- update to 19.0.2: + * Pass thread_count to the audio encode resampler + * Update hwcontext_cuda definitions + * Pass output options so protocol uses them + * Deep copy AVChannelLayout to fix double free, fixes #2444 +- update to 19.0.1: + * Fix #2425 + * Stop side data holding its frame in a reference cycle + * Build filter pads on access instead of caching them + * **Full Changelog**: https://github.com/PyAV- + Org/PyAV/compare/v19.0.0...v19.0.1 +- update to 19.0.0: + * ## Major + * Drop support for Python 3.11. Binary wheels are now built for + Python 3.12 and later. + * Remove the undocumented `CodecContext.hwaccel` attribute. It + held the `HWAccel` settings object passed in, not the live + device context; use `CodecContext.is_hwaccel` to check + whether hardware acceleration is in use. + * Rational attributes (`time_base`, `average_rate`, + `base_rate`, `guessed_rate`, `framerate`, `rate`, + `sample_aspect_ratio`, and `display_aspect_ratio`) now return + `av.AVRational` rather than `fractions.Fraction`, and are + never `None`: an unset value is the falsy `AVRational(0, 1)`. + Test them with `if not stream.time_base:` instead of `is + None`. Setters still accept a `fractions.Fraction`. + * Closing an `OutputContainer` now frees its context, so using + one afterwards raises `Container is not open` instead of + continuing against a finished file. Muxing has no + `avformat_close_input()` to do this for it, so + `add_stream()`, `mux()`, `start_encoding()` and the rest kept + working after `close()`, and streams held from it stayed + readable. + * Remove `Capabilities.hwaccel`, `Capabilities.hwaccel_vdpau`, + and `Capabilities.neg_linesizes`, none of which FFmpeg + defines any more. + * Remove the `metadata_encoding` and `metadata_errors` + arguments to `av.open`, and the matching attributes. Metadata + is now always read and written as UTF-8 with + `surrogateescape`, which is byte exact: a tag in another + encoding survives as surrogates and is recovered per key with + `value.encode("utf-8", "surrogateescape").decode("cp1251")`. + Previously one encoding had to be chosen for a whole + container, so a file mixing encodings across tags could not + be represented at all. + * Remove the `stream_options` argument to `av.open` and the + matching attribute. They only ever reached + `avformat_find_stream_info()`, and only for formats that + expose their streams before it runs, so they raised for MPEG + and friends; output containers rejected them outright. Pass + `options` for every stream, set + `stream.codec_context.options` for one, and + `Container.add_stream(..., options={})` when writing. + * ## Features + * `av.dump_codecs()` now lists every codec FFmpeg knows of + rather than only those with an encoder or a decoder, so data + and attachment codecs appear, matching `ffmpeg -codecs`. Its + legend gains the `..D...` and `..T...` media types. + * `ContainerFormat.fixed_framesize` reports whether a format + wants fixed size audio frames. + * `CodecContext` exposes more of `AVCodecContext`: + `pkt_timebase`, `frame_num`, `active_thread_type`, + `bits_per_raw_sample`, `compression_level`, `rc_buffer_size`, + `min_bit_rate`, a setter for `max_bit_rate`, the audio + `initial_padding`, `trailing_padding`, and `seek_preroll`, + and `stats_in`/`stats_out` for two-pass encoding. + `VideoCodecContext` gains `chroma_sample_location`, `refs`, + and `mb_decision`; `AudioCodecContext` gains `block_align`. + * `CodecContext.coded_side_data` and + `CodecContext.decoded_side_data` expose the context's global + side data as dicts of `bytes`, keyed by packet side data name + and `Type` respectively. Stream wide HDR metadata, such as + mastering display and content light level, arrives in + `decoded_side_data` once a frame has been decoded. + * `VideoFrame.chroma_location` exposes + `AVFrame.chroma_location`, the position of the chroma samples + relative to the luma samples, and the new `ChromaLocation` + enum names its values. Only the codec context side of the + field was wrapped, as + `VideoCodecContext.chroma_sample_location`, so the siting a + decoder actually reported per frame could not be read at all. + Each property mirrors its C field name, which FFmpeg spells + differently on the two structs. + * Enums gained the members FFmpeg has since added: + `Properties.FIELDS`, `Properties.ENHANCEMENT`, + `PixFmtLoss.EXCESS_RESOLUTION`, `PixFmtLoss.EXCESS_DEPTH`, + `Flags2.icc_profiles`, `format.Flags.experimental`, + `Interpolation.STRICT`, `Interpolation.UNSTABLE`, + `ColorTrc.V_LOG`, `ColorPrimaries.V_GAMUT`, the `LCEVC`, + `VIEW_ID`, `THREE_D_REFERENCE_DISPLAYS`, and `EXIF` members + of `sidedata.Type`, and the `exif`, + `dynamic_hdr_smpte_2094_app5`, and `hevc_conf` packet side + data names. + * ## Fixes + * `Frame.side_data` and `PacketSideData.data_type` no longer + raise on side data types FFmpeg has added since PyAV last + listed them. The packet side data names were missing three, + so reading, say, the `AV_PKT_DATA_HEVC_CONF` an HEVC stream + in MP4 or Matroska carries raised `IndexError`. A frame side + data type that no `sidedata.Type` member names, which is + anything a newer FFmpeg than PyAV was built against added, + now becomes an `UNKNOWN_` member rather than raising + `ValueError`. + * `CodecContext.bit_rate_tolerance` returns its value instead + of always `None`; the getter was missing its `return`. + * A rejected `add_stream()` or `add_mux_stream()` no longer + breaks the container. + * `InputContainer.size` returns `None` when the size cannot be + determined rather than the negative `AVERROR` it was passing + through, which read as a plausible byte count. A non-seekable + input, such as a pipe, reported `-78`. + * `av.dump_codecs()` no longer drops the canonical names + `h264`, `hevc`, `av1`, `dirac`, and `ilbc`, each of which was + overwritten by the row of whichever encoder it resolved to. + * `FilterLink.input` and `FilterLink.output` now follow the + filters the graph auto-inserts while configuring. They cached + the pad they first resolved, so reading one before + `Graph.configure()` reported the filter the link no longer + pointed at. + * Fix a segfault when a `FilterLink` outlives its `Graph`. It + held the graph by weak reference and dereferenced + `AVFilterLink` before consulting it, so `link.input` and + `link.output` read freed memory. It now holds the graph, as a + `FilterContext` already did. + * Reading a `Stream` or its `index_entries` after the container + is closed now raises instead of reading freed memory, since + `avformat_close_input()` frees the underlying `AVStream`. + Holding an `index_entries` also keeps its container alive, + and an `IndexEntry` is a copy, so it stays readable after the + close and is unaffected by the demuxer reallocating the + index. + * Attaching one object to the `opaque` of more than one frame + or packet no longer loses it. The objects were keyed by + `id()`, so every holder shared an entry and whichever was + freed first took it away from the rest. + * `Frame.side_data` now satisfies the `Mapping` protocol it + advertises: iteration yields `Type` keys, so `items()`, + `keys()`, and `values()` work instead of raising `KeyError`. + Values remain reachable positionally by an integer or, for + the first time, a slice. Its type stub was a `TypedDict` with + a single literal key, and is now `SideDataContainer`. + * Fix crashes from indexes that were turned into C pointer + arithmetic without being range checked. `MotionVectors[i]` + only checked the upper bound, so a negative index read off + the front of the buffer (`mvs[-1]` now returns the last + vector, as with any sequence); `VideoFormatComponent` and + `AudioPlane` accepted any index at all; and + `BitmapSubtitlePlane` and `VideoBlockParams` were missing + their lower bounds. + * Frames returned by flushing a codec context directly + (`CodecContext.decode()` with no packet) now carry the + stream's `time_base` instead of `None`. + * `VideoFrame.reformat()` (and so `to_ndarray(format=...)`, + `to_rgb()`, `to_image()`) now shares one `SwsContext` per + thread instead of allocating one per frame. FFmpeg 8's + swscale retains megabytes of graph state per context, which + showed up as large RSS growth when many frames were alive at + once. + * Writing to a network URL no longer blocks every other Python + thread, and `timeout` now applies to opening an output + container. `avio_open()`, `avformat_write_header()`, + `av_write_trailer()`, and `avio_closep()` held the GIL, so an + unreachable RTMP server froze the whole process, and the + interrupt callback was only installed for demuxing, so + nothing could end the wait. `OutputContainer.close` now + raises rather than freeing a context another thread is still + muxing or closing. By @adrianrfreedman in (#2412). + * `timeout` now applies to muxing and closing an output + container, not just to opening it. Only opening armed the + interrupt callback, so a peer that accepted the connection + and then stopped reading left `av_interleaved_write_frame()` + and `av_write_trailer()` blocked forever. Each mux gets the + full timeout, and a close shares one across writing the + trailer and flushing, so neither can outlast it. Only + unseekable outputs are covered: writing a seekable file takes + as long as the file is big, so a deadline meant for a peer + would abandon it part-written. By @adrianrfreedman in + (#2414). + * `HWAccel.create` now passes `flags` on to the context it + creates. They were dropped, so `av_hwdevice_ctx_create()` + always got `0` and CUDA's `AV_CUDA_USE_PRIMARY_CONTEXT` could + not be requested through them. + +------------------------------------------------------------------- Old: ---- av-18.1.0.tar.gz New: ---- av-19.0.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-av.spec ++++++ --- /var/tmp/diff_new_pack.qUb117/_old 2026-10-26 10:01:41.804977403 +0100 +++ /var/tmp/diff_new_pack.qUb117/_new 2026-10-26 10:01:41.806977487 +0100 @@ -18,24 +18,24 @@ %{?sle15_python_module_pythons} Name: python-av -Version: 18.1.0 +Version: 19.0.2 Release: 0 Summary: Python bindings for FFmpeg's libraries License: BSD-3-Clause URL: https://github.com/PyAV-Org/PyAV Source: https://files.pythonhosted.org/packages/source/a/av/av-%{version}.tar.gz -BuildRequires: %{python_module Cython >= 3.1.0} -BuildRequires: %{python_module devel >= 3.10} +BuildRequires: %{python_module Cython >= 3.3.0} +BuildRequires: %{python_module devel >= 3.12} BuildRequires: %{python_module numpy} BuildRequires: %{python_module pip} -BuildRequires: %{python_module setuptools >= 77.0} +BuildRequires: %{python_module setuptools >= 78.0} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: pkgconfig BuildRequires: python-rpm-macros -BuildRequires: pkgconfig(libavdevice) -BuildRequires: pkgconfig(libavfilter) -BuildRequires: pkgconfig(libavutil) +BuildRequires: pkgconfig(libavdevice) >= 8 +BuildRequires: pkgconfig(libavfilter) >= 8 +BuildRequires: pkgconfig(libavutil) >= 8 Requires: python-numpy Requires(post): update-alternatives Requires(postun): update-alternatives ++++++ av-18.1.0.tar.gz -> av-19.0.2.tar.gz ++++++ ++++ 668453 lines of diff (skipped)
