Projects
home:zaitor:branches:Essentials
gstreamer-plugins-bad-codecs
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 2
View file
gstreamer-plugins-bad-codecs.spec
Changed
@@ -7,7 +7,7 @@ %define _version 1.28.0 Name: gstreamer-plugins-bad-codecs -Version: 1.28.0 +Version: 1.28.1 Release: 0 Summary: Codecs/plugins for gstreamer-plugins-bad License: LGPL-2.1-or-later
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/NEWS
Deleted
@@ -1,1096 +0,0 @@ -GStreamer 1.28 Release Notes - -GStreamer 1.28.0 was originally released on 27 January 2026. - -See https://gstreamer.freedesktop.org/releases/1.28/ for the latest version of this document. - -Last updated: Tuesday 27 January 2026, 17:00 UTC (log) - -## Introduction - -The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite -cross-platform multimedia framework! - -As always, this release is again packed with many new features, bug fixes, and other improvements. - -## Highlights - -- AMD HIP plugin and integration helper library -- Vulkan Video AV1 and VP9 decoding, H.264 encoding, and 10-bit support for H.265 decoder -- waylandsink: Parse and set the HDR10 metadata and other color management improvements -- Audio source separation element based on demucs in Rust -- Analytics combiner and splitter elements plus batch meta to batch buffers from one or more streams -- LiteRT inference element; move modelinfo to analytics lib; add script to help with modelinfo generation and upgrade -- Add general classifier tensor-decoder, facedetector, and more analytics convenience API -- New tensordecodebin element to auto-plug compatible tensor decoders based on their caps and many other additions and - improvements -- Add a burn-based YOLOX inference element and a YOLOX tensor decoder in Rust -- applemedia: VideoToolbox VP9 and AV1 hardware-accelerated decoding support, and 10-bit HEVC encoding -- Add new GIF decoder element in Rust with looping support -- input-selector: implements a two-phase sinkpad switch now to avoid races when switching input pads -- The inter wormhole sink and source elements gained a way to forward upstream events to the producer as well as new - fine-tuning properties -- webrtcsink: add renegotiation support and support for va hardware encoders -- webrtc WHEP client and server signaller -- New ST-2038 ancillary data combiner and extractor elements -- fallbacksrc gained support for encoded streams -- flv: enhanced rtmp H.265 video support, and support for multitrack audio -- glupload: Implement udmabuf uploader to share buffers between software decoders/sources and GPUs, display engines (wayland), - and other dma devices -- video: Add crop, scale, rotate, flip, shear and more GstMeta transformation -- New task pool GstContext to share a thread pool amongst elements for better resource management and performance, especially - for video conversion and compositing -- New Deepgram speech-to-text transcription plugin and many other translation and transcription improvements -- Speech synthesizers: expose new “compress” overflow mode that can speed up audio while preserving pitch -- ElevenLabs voice cloning element and support for Speechmatics speaker identification API -- textaccumulate: new element for speech synthesis or translation preprocessing -- New vmaf element to calculate perceptual video quality assessment scores using Netflix’s VMAF framework -- decodebin3: expose KLV, ID3 PES and ST-2038 ancillary data streams with new metadata GstStream type -- New MPEG-H audio decoding plugin plus MP4 demuxing support -- LCEVC: Add autoplugging decoding support for LCEVC H265 and H266 video streams and LCEVC H.265 and H.266 encoders -- RTP “robust MPEG audio”, raw audio (L8, L16, L24), and SMPTE ST291 ancillary metadata payloaders/depayloaders in Rust -- Add a Rust-based icecastsink element with AAC support -- The Windows IPC plugin gained support for passing generic data in addition to raw audio/video, and various properties -- New D3D12 interlace and overlay compositor elements, plus many other D3D12 improvements -- Blackmagic Decklink elements gained support for capturing and outputting all types of VANC via GstAncillaryMeta -- GstLogContext API to reduce log spam in several components and GST_DEBUG_ONCE (etc) convenience macros to log things only - once -- hlssink3, hlscmafsink: Support the use of a single media file, plus I-frame only playlist support -- Webkit: New wpe2 plugin making use of the “WPE Platform API” -- MPEG-TS demuxer can now disable skew corrections -- New Qt6 QML render source element -- qml6gloverlay: support directly passing a QQuickItem for QML the render tree -- unifxfdsink: Add a property to allow copying to make sink usable with more upstream elements -- dots-viewer: Improve dot file generation and interactivity -- Python bindings: more syntactic sugar, analytics API improvements and type annotations -- cerbero: add support for Python wheel packaging, Windows ARM64, new iOS xcframework, Gtk4 on macOS and Windows, and more - plugins -- Smaller binary sizes of Rust plugins in Windows and Android binary packages -- Peel: New C++ bindings for GStreamer -- Lots of new plugins, features, performance improvements and bug fixes -- Countless bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements - -## Major new features and changes - -### AMD HIP plugin and integration library - -- HIP (formerly known as Heterogeneous-computing Interface for Portability) is AMD’s GPU programming API that enables - portable, CUDA-like development across both AMD and NVIDIA platforms: - - - On AMD GPUs, HIP runs natively via the ROCm stack. - - On NVIDIA GPUs, HIP operates as a thin translation layer over the CUDA runtime and driver APIs. - - This allows developers to maintain a single codebase that can target multiple GPU vendors with minimal effort. - -- The new HIP plugin provides the following elements: - - - hipcompositor: a HIP-based video mixer/compositor - - hipconvert: Converts video from one colorspace to another using HIP - - hipconvertscale: Resizes video and allow color conversion using HIP - - hipscale: Resize video using HIP - - hipdownload: Downloads HIP device memory into system memory - - hipupload: Uploads system memory into HIP device memory - -- The GStreamer HIP integration helper library provides HIP integration functionality to applications and other HIP users. - -- Watch the Bringing AMD HIP into GStreamer talk from last year’s GStreamer Conference for more details or read Seungha’s - devlog post on the subject. - -### Low Complexity Enhancement Video Coding (LCEVC) support for H.265 and H.266 - -- LCEVC is a codec that provides an enhancement layer on top of another codec such as H.264 for example. It is standardised as - MPEG-5 Part 2. - -- LCEVC H.265 and H.266 encoder and decoder elements based on V-Nova’s SDK libraries were added in this cycle - -- Autoplugging support for LCEVC H265 and H266 video streams, so these can be decoded automatically in a decodebin3 or - playbin3 scenario. - -### Closed captions and text handling improvements - -- cea708overlay: suport non-relative positioning for streams with CCs that do not have relative positions. Instead of - displaying them at the top, they are positioned relatively. - -- cea708mux: expose “discarded-services” property on sink pads. This can be useful when muxing in an original caption stream - with a newly-created one (e.g. transcription / translation), in which case one might wish to discard select services from - the original stream in order to avoid garbled captions. - -- sccparse: Better handling of streams with more byte tuples in the SCC field. - -- tttocea608: expose “speaker-prefix” property - -- Miscellaneous improvements and spec compliance fixes - -- Also see SMPTE ST-2038 metadata section below. - -### Speech to Text, Translation and Speech Synthesis - -- New audio source separation element based on demucs in Rust. This is useful to separate speech from background audio before - running speech to text transcription, but could also be used to separate vocals from music for karaoke. - -- New Deepgram speech-to-text transcription plugin in Rust. - -- The Speechmatics transcriber has seen a major refactoring for better timings, gap and discontinuity handling and has gained - support for the new Speechmatics speaker identification API as well as a new property to mask profanities. - -- New ElevenLabs voice cloning element. The new element can operate in two modes: - - - In single speaker mode, the element will directly clone a single voice from its input, without storing any samples. - - Otherwise, the element will store a backlog of samples, and wait to receive certain events from a transcriber on its - source pad before draining them to create potentially multiple voices. - -- New “compress” overflow mode for speech synthesizers that can speed up the audio while preserving pitch. This may be needed - to keep or regain audio/video synchronisation if translated speech output has been consistently longer in duration than the - original and there hasn’t been a sufficient amount of silence that could be filled in to make up the difference. - -- awstranslate: new “brevity-on” property for turning brevity on. - -- The awstranscriber2 has been refactored to match the speechmatics transcriber design and gained a “show-speaker-label” - property that defines whether to partition speakers in the transcription output. - -- New textaccumulate element for speech synthesis or translation preprocessing that can be used to accumulate words and - punctuation into complete sentences (or sentence fragments) for synthesis and / or translation by further elements - downstream. - -### HLS DASH adaptive streaming improvements - -- Reverse playback, seeking and stream selection fixes in the HLS/DASH clients. - -- hlscmafsink can generate I-frame only playlists now - -- Both hlssink3 and hlscmafsink gained support for use of a single media file, in which case the media playlist will use byte - range tags for each chunk whilst always referencing the same single media file. This can be useful for VOD use cases. - -### decodebin3 and playbin3 improvements - -- decodebin3 now has a separate pad template for metadata streams and considers KLV, ID3 PES streams and ST-2038 ancillary - streams as raw formats for meta streams. This comes also with a new dedicated GST_STREAM_TYPE_METADATA stream type in the - stream collection. - -### Enhanced RTMP and multitrack audio/video support in FLV - -- The FLV container used for RTMP streaming is fairly old and limited in terms of features: It only supports one audio and one - video track, and also only a very limited number of audio and video codecs, most of which are by now quite long in the - tooth. - -- The Enhanced RTMP (V2) specification seeks to remedy this and adds support for modern video codecs such H.265 and AV1 as - well as support for more than one audio and video track inside the container. - -- Both H.265 video and multiple audio/video tracks are now supported for FLV in GStreamer. - -- Support for this comes in form of a new eflvmux muxer element, which is needed to accommodate both the need of backwards - compatibility in the existing FLV muxer and the requirements of the new format. See Tarun’s blog post for more details. - -### MPEG-TS container format improvements - -- The MPEG-TS demuxer gained a “skew-corrections” property that allows disabling of skew corrections, which are done by - default for live inputs to make sure downstream consumes data at the same rate as it comes in if the local clock and the - sender clock drift apart (as they usually do). Disabling skew corrections is useful if the input stream has already been - clock-corrected (for example with mpegtslivesrc) or where the output doesn’t require synchronisation against a clock, - e.g. when it’s re-encoded and/or remuxed and written to file (incl. HLS/DASH output) where it’s desirable to maintain the - original timestamps and frame spacings. - - It is also useful for cases where we want to refer to the PCR stream to figure out global positioning, gap detection and - wrapover correction. - -- tsdemux now also supports demuxing of ID3 tags in MPEG-TS as specified in the Apple Timed Metadata for HTTP Live Streaming - specification. These timed ID3 tags have a media type of meta/x-id3 which is different from the one used to tag audio files, - and an id3metaparse element is needed to properly frame the PES data coming out of the demuxer. - -- The MPEG-TS muxer now also reads prog-mapPMT_ORDER_<PID> for PMT order key in addition to prog-mapPMT_%d, which fixes a - wart in the API and provides an unambiguous way to specify ordering keys. - -### Matroska container format improvements - -- matroskademux now supports relative position cues in the seek table and also had its maximum block size restrictions updated - so that it can support uncompressed video frames also in 4k UHD resolution and higher bit depths. - -### ISO MP4 container format improvements - -- mp4mux now supports E-AC3 muxing - -- qtdemux, the MP4 demuxer, has seen countless fixes for various advanced use cases (with lots more in the pipeline for - 1.28.1). - -- The isomp4mux from the Rust plugins set now support caps changes and has also gained support for raw audio as per ISO/IEC - 23003-5. Plus improved brand selection. - -- The isomp4mux, isofmp4mux and related elements were merged into a single isobmff plugin, which allows sharing more code. As - part of this, codec support was consolidated between the two. - -### MXF container format improvements - -- The MXF muxer and demuxer gained support for non-closed-caption VANC ancillary metdata: - - - Extends mxfdemux with support for outputting VANC (ST436M) essence tracks as ST2038 streams instead of extracting closed - captions internally. - - - Extends mxfmux with support for consuming ST2038 streams for outputting VANC (ST436M) essence tracks instead of only - supporting closed captions. - -To support ST2038 instead of the earlier closed captions, we introduce a breaking change to the caps handling on the pad. This -was deemed the cleanest way and should hopefully not cause too much breakage in the real world, as it is likely not something -that was used much in practice in this form. The st2038anctocc element can be used to convert a ST2038 stream to plain closed -captions. - -We also now support both 8 and 10-bit VANC data when reading from MXF. - -### MPEG-H audio support - -- New MPEG-H audio decoding plugin based on the Fraunhofer MPEG-H decoder implementation plus MP4 demuxing support - -SMPTE 2038 ancillary data stream handling improvements - -- New ST-2038 ancillary data combiner and extractor elements in the rsclosedcaption Rust plugin that extract ST-3028 metadata - streams from GstAncillaryMetas on video frames or converts ST-2038 metadata streams to GstAncillaryMeta and combines it with - a given video stream. - -- The MXF demuxer and muxer gained support for muxing and demuxing generic ancillary metadata in ST-2038 format (see below). - -- decodebin3 now treats ST-2038 metadata streams as a “raw metadata format” and exposes those streams as - GST_STREAM_TYPE_METADATA. - -### Analytics - -This release introduces a major improvement in how analytics pipelines are built, moving away from manual configuration toward a -fully negotiated analytics pipeline. - -- Robust Tensor Negotiation & Smart Selection: All inference and tensor decoder elements adopt the tensor capability - negotiation mechanism. This provides informative error handling by validating the pipeline during the setup phase and - providing descriptive error messages for configuration mismatches before processing begins. Complementing this, the new - tensordecodebin acts as an intelligent proxy that abstracts decoder selection by auto-plugging the correct tensor decoder. - This simplifies the use of existing tensor decoders and allows new tensor decoders to be utilized instantly without - requiring changes to pipeline definitions. - -- Simplified Model Integration with modelinfo: The modelinfo library, configuration files, and the modelinfo-generator.py - script work together to make using any ML model inside a GStreamer pipeline very simple. The new utility script helps you - quickly generate or upgrade metadata files for existing models. Combined with tensor negotiation and tensordecodebin, these - tools facilitate the seamless utilization of new models within the analytics chain. - -- analyticsoverlay: New “expire-overlay” property added to objectdetectionoverlay and can also show tracking-id; New - ‘segmentationoverlay’ to visualize segmented regions. - -- Add LiteRT inference element - -- Analytics: add general classifier tensor-decoder, facedetector, YOLOv8 (detection), YOLOv8segmentation tensor decoders and - more convenience API. - -- onnx: Add Verisilicon provider support - -- New IoU based tracker - -- Add GstAnalyticsBatchMeta representing a batch of buffers from one or more streams together with the relevant events to be - able to interpret the buffers and to be able to reconstruct the original streams. - -- New analyticscombiner and analyticssplitter elements in the Rust plugin set which batch buffers from one or more streams - into a single stream via the new GstAnalyticsBatchMeta and allow splitting that single stream into the individual ones again - later. - -- Add a burn-based YOLOX inference element and a YOLOX tensor decoder in Rust. - -### Vulkan integration enhancements - -- The Vulkan Video encoders and decoders now dynamically generate their pad template caps at runtime instead of hardcoding - them, so they more accurately reflect the actual capabilities of the hardware and drivers. - -- New Vulkan AV1 and VP9 video decoding support - -- New Vulkan H.264 encoding support - -- The Vulkan H.265 decoder now also supports 10-bit depth - -### OpenGL integration enhancements - -- Implement keyboard, mouse, and scroll wheel navigation event handling for the OpenGL Cocoa backend. - -- Added support for the NV24 and Y444_12 pixel formats. The latter is used by certain HEVC decoders for 12-bit non-subsampled - profiles. - -### udmabuf allocator with glupload support - -- Implement a udmabuf-based memory allocator for user-space mappable dmabufs. - -- glupload: add udmabuf uploader to share buffers between software decoders/sources and GPUs, display engines (wayland), and - other dma devices. This can help reduce memory copies and can massively improve performance in video players like Showtime - or Totem for software-decoded video such as AV1 with dav1ddec. - -- gtk4paintablesink: Similar to glupload, this now proposes the udmabuf memory allocator to upstream which can reduce memory - copies and improve performance with certain software decoders. - -### Wayland integration - -- Added basic colorimetry support - -- waylandsink: - - - Parse and set the HDR10 metadata and other color management improvements - - - udmabuf support (see above) - - - video crop meta support - - - New “fullscreen-output” and “force-aspect-ratio” properties - -### Qt5 + Qt6 QML integration improvements - -- New Qt6 QML qml6 render source element - -- qml6gloverlay: support directly passing a QQuickItem for QML the render tree - -### GTK4 integration improvements - -- gtk4paintablesink: Added YCbCr memory texture formats and improve color-state fallbacks. The sink will also propose a - udmabuf buffer pool and allocator now if upstream asks for sysmem, which would allow direct imports of the memory by - GL/Vulkan or the compositor. Plus many other improvements which have also been backported into the 0.14 branch. - -### CUDA / NVCODEC integration and feature additions - -- cudacompositor, cudaconvert and its variants gained crop meta support - -- nvencoder: interlaced video handling improvements and “emit-frame-stats” property which if enabled makes the encoder emit - the “frame-stats” signal for each encoded frame, allowing applications to monitor things like the average QP per frame. - -- nvjpegenc: Add an autogpu mode element (nvautogpunvenc) similar to nvautogpu{h264,h265,av1}enc. - -- nvh264enc, nvh265enc gained a new “num-slices” property which is conditionally available based on device support for dynamic - slice mode - -- nvdsdewarp: performance improvements and support for output resizing support, along with a new “add-borders” property. - -### Capture and playout cards support - -- Blackmagic Decklink elements gained support for capturing and outputting all types of VANC via GstAncillaryMeta - -### RTP and RTSP stack improvements - -- rtspsrc now sends RTSP keepalives also in TCP/interleaved modes. This fixes problems with some cameras that don’t see the - RTCP traffic as sufficient proof of liveness, when using TCP/HTTP tunnelled modes. - -- New Rust RTP mparobust depayloader for “robust mp3” audio**, a more loss-tolerant RTP payload format for MP3 audio (RFC - 5219) - -- New Rust RTP L8/L16/L24 raw audio payloader and depayloader, which offer more correct timestamp handling compared to the old - payloader and depayloader and more correctly implements multichannel support. - -- New Rust RTP SMTPE ST291 ancillary data payloader and depayloader for sending or receiving ancillary data over RTP. This is - also the payload format used by ST2110-40. - -- Various performance improvements and fixes for rtprecv / rtpsend (“rtpbin2”). - -- Support for “multi-time aggregation packets” (MTAP) in the H264 RTP depayloader rtph264depay. - -### WebRTC improvements - -- webrtcbin and GstWebRTC library improvements: - - - Add support for getting the selected ICE candidate pairs - - - Improve spec compliance for ICE candidate stats by filling the foundation, related-address, related-port, - username-fragment and tcp-type fields of stats. - - - improve compatibility with LiveKit - -- webrtcsink and webrtcsrc enhancements: - - - webrtcsink gained renegotiation support, and support for va hardware encoders - -- Added a WHEP client signaller and server signaller to the Rust webrtc plugin, including support for server side offers for - the WHEP client. - -- webrtc-api: Set default bundle policy to max-bundle. - -- The dtls plugin now uses a ECDSA private key for the default certificate. ECDSA is widely used in browsers and SFUs, and - some servers such as the ones using BouncyCastle only accept certificates signed with ECDSA. - -### New GStreamer C++ bindings - -The old GStreamer C++ bindings (gstreamermm and qt-gstreamer) have been unmaintained for a long time, leaving C++ developers -only with the option to use the GStreamer C API. - -In recent years, a new approach for C++ bindings was developed by the GNOME community: peel. While initially developed for GTK, -with various GObject Introspection and API fixes included in GStreamer 1.28, this is now also usable for GStreamer. - -Compared to gstreamermm this offers a much lower overhead, headers-only C++ binding that just depends on the C libraries and not -even the C++ STL, and provides a modern C++ API top of the GStreamer C API. Compared to qt-gstreamer there is no dependency on -Qt. - -It’s still in active development and various MRs for improving the GStreamer development experience are not merged yet, but it’s -already usable and a great improvement over using the plain C API from C++. - -Various GStreamer examples can be found in Sebastian’s GStreamer peel examples repository. - -## New elements and plugins - -- Many exciting new Rust elements, see Rust section below. - -- New D3D12 interlace, overlay compositor, fish eye dewarp and uv coordinate remapping elements - -- VMAF: New element to calculate perceptual video quality assessment scores using Netflix’s VMAF framework - -- Webkit: New wpe2 plugin that makes use of the “WPE Platform API” with support for rendering into GL and SHM buffers and - navigation events (but not audio yet). - -- Many other new elements mentioned in other sections (e.g. CUDA, NVCODEC, D3D12, Speech, AMD HIP, Rust etc.) - -## New element features and additions - -- The AWS S3 sink and source elements now support S3 compatible URI schemes. - -- clocksync: new “rate” property and “resync” action signal so that clocksync can synchronise buffer running time against the - pipeline clock with a specified rate factor. This can be useful if one wants to throttle pipeline throughput such as e.g. in - a non-realtime transcoding pipeline where the pipeline’s CPU and/or hardware resource consumption needs to be limited. - -- fallbacksrc is able to support encoded outputs now, not just uncompressed audio/video. As part of this it supports stream - selection via the GstStream API now. - -- h265parse now automatically inserts AUDs where needed if it outputs byte-stream format, which helps fix decoding artefacts - for multi-slice HEVC streams with some hardware decoders. - -- input-selector now implements a two-phase sinkpad switch to avoid races when switching input pads. Extensive tests have been - added to avoid regressions. - -- The inter plugin wormhole sink and source elements for sending data between pipelines within the same application process - gained new properties to fine tune the inner elements. intersrc can now also be configured to forward upstream events to the - producer pipeline via the new “event-types” property. - -- The quinn plugin supports sharing of the QUIC/WebTransport connection/session with an element upstream or downstream. This - is required for supporting Media over QUIC (MoQ) later, for which an MR is already pending. - -- replaygain will use EBU-R128 gain tags now if available. - -- threadshare: many improvements to the various threadshare elements, plus examples and a new benchmark program. The plugin - was also relicensed to MPL-2.0. - -- The unixfdsink element for zero-copy 1:N IPC on Linux can now also copy the input data if needed, which makes it usable with - more upstream elements. Before it would only work with elements that made use of the special memory allocator it advertised. - This (copy if needed) is enabled by default, but can be disabled by setting the new “min-memory-size” property to -1. - - There’s also a new “num-clients” property that gets notified when the number of clients (unixfdsrc elements tapping the same - unixfdsink) changes. - -- videorate and imagefreeze now also support JPEG XS. - -- videorate’s formerly defunct “new-pref” property was revived for better control which frame to prefer for output in case of - caps changes. - -## Plugin and library moves and renames - -- The y4mdec plugin moved from gst-plugins-bad into gst-plugins-good and was merged with the existing y4menc there into a - single y4m plugin containing both a YUV4MPEG encoder and decoder. - -- The fmp4 and mp4 plugins in the Rust plugins set were merged into a single isobmff plugin. - -## Plugin and element deprecations - -- The old librtmp-based rtmpsrc and rtmpsink elements are deprecated are scheduled for removal in the next release cycle. Use - the rtmp2src and rtmp2sink elements instead (which will likely also be registered under the old names after removal of the - old rtmp plugin). - -- Deprecate the webrtchttp plugin in the Rust plugins set along with its whipsink and whepsrc elements, in favour of the - whipclientsink and whepclientsrc elements from the webrtc plugin in the Rust plugins set. - -- The libmpeg2-based mpeg2dec element is deprecated and scheduled for removal in the next release cycle, as libmpeg2 has been - unmaintained for a very long time. The libavcodec-based decoder has had a higher rank for many years already and is also - more performant. We would recommend that distros that also ship the FFmpeg-based decoder out of the box stop shipping the - mpeg2dec plugin now or reduce its rank to GST_RANK_NONE. - -## Plugin and element removals - -- The cc708overlay element has been removed. It is replaced by the cea708overlay element from the rsclosedcaption plugin in - the Rust plugins module. - -- Drop registration of rusotos3src and rusotos3sink in the AWS plugin in the Rust plugins set. These were legacy names that - were renamed to awss3src and awss3sink in 2022, but had been kept around for a while so applications had time to move to the - new name space. - -## Miscellaneous API additions - -### GStreamer Core - -- gst_call_async() and gst_object_call_async() are more generic and convenient replacements for gst_element_call_async() - -- gst_check_version() is a new convenience function to check for a minimum GStreamer core version at runtime. - -- GstClock: Add gst_clock_is_system_monotonic() utility function - -- GstController: gst_timed_value_control_source_list_control_points() is a thread-safe method to retrieve the list of control - points, replacing gst_timed_value_control_source_get_all(). - -- GstCpuId: gst_cpuid_supports_x86_avx() and friends can be used to check which SIMD instruction sets are supported on the - current machine’s CPU without relying on liborc for that. This is useful for plugins that rely on an external library that - wants to be told which SIMD code paths to use. - -- gst_object_get_toplevel() can be used to get the toplevel parent of an object, e.g. the pipeline an element is in. - -- New API for tensor caps descriptions: - - - GstUniqueList is a new unordered, unique container value type for GValues similar to GstValueList but guaranteed to have - unique values. Can only be queried and manipulated via the gst_value_* API same as GstValueList and GstValueArray. - - - gst_structure_get_caps() gets a GstCaps from a structure - -- More accessor functions for GstPadProbeInfo fields and the GstMapInfo data field, as well as a generic gst_map_info_clear() - which is useful for language bindings. - -- New EBU-R128 variants of the replay gain tags: GST_TAG_TRACK_GAIN_R128 and GST_TAG_ALBUM_GAIN_R128 - -- GstReferenceTimestampMeta: additional information about the timestamp can be provided via the new optional info - GstStructure. This should only be used for information about the timestamp and not for information about the clock source. - This is used in an implementation of the TAI timestamp functionality described in ISO/IEC 23001-17 Amendment 1 in the Rust - MP4 muxer. - -- GstValue: add gst_value_hash() and support 0b / 0B prefix for bitmasks when deserialising. - -- Add missing _take() and _steal() functions for some mini objects: - - - gst_buffer_take(), gst_buffer_steal() - - gst_buffer_list_steal() - - gst_caps_steal() - - gst_memory_take(), gst_memory_replace(), gst_memory_steal() - - gst_message_steal() - - gst_query_steal() - -- GstElement: Deprecate gst_element_state_*() API and provide gst_state_*() replacements with the right namespace - -#### GstMetaFactory to dynamically register metas - -- gst_meta_factory_register() allows to dynamically register metas and store them in the registry by name. This is useful in - combination with the GstMeta serialisation and deserialisation functionality introduced in GStreamer 1.24, for metas that - are not provided by GStreamer core. If an element comes across a meta name that is not registered yet with GStreamer, it can - check the registry and load the right plugin which will in turn register the meta with GStreamer. This is similar to how - flag and enum types can be stored in the registry so that if during caps deserialisation an unknown enum or flag type is - encountered, it can be loaded dynamically and registered with the type system before deserialisation continues. - - The pbtypes plugin in gst-plugins-base registers GstAudioMeta and GstVideoMeta in the registry so that e.g. unixfdsrc and - other elements can make sure they get pulled in and registered with GStreamer before deserialising them. - -### App Sink and Source Library - -- appsrc and appsink gained support for a more bindings-friendly “simple callbacks” API that can be used instead of GObject - signals (which have considerable overhead) or the normal callbacks API (which couldn’t be used from most bindings). - -### Audio Library - -- added support for 20-bit PCM audio stored in 32-bit containers, both signed (S20_32) and unsigned (U20_32), each in - little-endian and big-endian variants. - -### Plugins Base Utils Library - -- Many minor improvements. - -### Tag Library - -- Vorbis comments: parse EBU R128 tags - -### Video Library and OpenGL Library - -- Add DRM equivalents for various 10/12/16 bit SW-decoders formats - -- New GstVideoMetaTransformMatrix that adds crop, scale, rotate, flip, shear and more meta transformations. The current - “scaling” transformation doesn’t work if either the input buffer is cropped or if any kinds of borders are added. And it - completely falls down with more complex transformations like compositor. - -- GstVideoOverlayCompositionMeta: handling of multiple video overlay composition metas on a single buffer has been fixed in - lots of places (overlays and sinks). Many elements assumed there would only ever be a single overlay composition meta per - buffer. For that reason gst_buffer_get_video_overlay_composition_meta() has been deprecated, so that elements have to - iterate over the metas and handle multiple occurences of it. - -New Raw Video Formats - -- Add more 10bit RGB formats commonly used on ARM SoCs in GStreamer Video, OpenGL and Wayland, as well as in deinterlace and - gdkpixbufoverlay: - - BGR10x2_LE: packed 4:4:4 RGB (B-G-R-x), 10 bits for R/G/B channel and MSB 2 bits for padding - - RGB10x2_LE: packed 4:4:4 RGB (R-G-B-x), 10 bits for R/G/B channel and MSB 2 bits for padding -- Add 10-bit 4:2:2 NV16_10LE40 format, which is a fully-packed variant of NV16_10LE32 and also known as NV20 and is produced - by Rockchip rkvdec decoders. - -### GstPlay Library - -- GstPlay: Add support for gapless looping - -## Miscellaneous performance, latency and memory optimisations - -- New task pool GstContext to share a thread pool amongst elements in a pipeline for better resource management and - performance, especially for video conversion and compositing. This is currently only made use of automatically in the - GStreamer Editing Services library. - -- glupload: Implement udmabuf uploader to share buffers between software decoders/sources and GPUs, display engines (wayland), - and other dma devices (see above). - -- GstDeviceMonitor now starts device providers in a separate thread. This avoids blocking the application when - gst_device_monitor_start() is called, which avoids each app having to spawn a separate thread just to start device - monitoring. This is especially important on Windows, where device probing can take several seconds or on macOS where device - access can block on user input. A new GST_MESSAGE_DEVICE_MONITOR_STARTED is posted on the bus to signal to the application - that the device monitor has completed its async startup. - -- On Windows audioresample now has SIMD optimisations enabled also for the MSVC build. - -- audiomixmatrix / audioconvert: sparse matrix LUT optimisation which uses precomputed LUTs for non-zero coefficients instead - of blindly traversing all input/output channel combinations. - -- As always there have been plenty of performance, latency and memory optimisations all over the place. - -## Miscellaneous other changes and enhancements - -- The ALSA device provider now supports enumerating virtual PCM sinks - -- The ASIO device monitor can now detect dynamically added and removed devices by monitoring USB events. - -## Tracing framework and debugging improvements - -- There are new hooks to track when buffers are queued or dequeued from buffer pools in the tracing system. - -- The pad-push-timings tracer gained a new “write-log” action signal - -Dot tracer/viewer - -- Enhanced dots-viewer: Major refactoring with modular JavaScript architecture, bundled dependencies (no more CDN), clickable - pipeline references for navigation between related dot files, download SVG button, and improved UI/UX with better text - handling and zoom fixes. - -Dot file pipeline graphs - -- Dot file dumps of pipeline graphs now show the list of active tracers at the bottom along with the tracer configuration. - -Debug logging system improvements - -GstLogContext to fine-tune logging output and reduce log message spam - -- GstLogContext is a new API to control logging behavior, particularly for implementing “log once” functionality and periodic - logging. This helps avoid spamming logs with repetitive messages. This comes with a whole suite of new GST_CTX_* debug log - macros that take a context argument in addition to the usual arguments. - -- A number of GST_{MEMDUMP,TRACE,LOG,DEBUG,INFO,WARNING,ERROR}_ONCE convenience macros for logging something only once. - -- The source code of elements and plugins has to be updated to make use of this new feature, so if there are any particular - log messages in certain elements that you feel are particularly spammy, please feel free to file an issue in GitLab so we - can see if it would make sense to use the new API there. - -## Tools - -- gst-inspect-1.0 now shows the type of each field when it prints caps and also pretty-prints tensor caps. - -## GStreamer FFmpeg wrapper - -- The avdec video decoders have seen many improvements and fixes for their buffer pool and allocation query handling. - -## GStreamer RTSP server - -- rtsp-client: Add a “pre-closed” signal which provides a way for an application to be notified when a connection is closed, - before the client’s sessions are cleaned up. This is useful when a client terminates its session improperly, for example, by - sending a TCP RST. - -- rtsp-stream-transport: expose new “timed-out” property. Upon RTCP timeout, rtpsession emits a signal that we can catch and - then also expose the timed out state a property of the transport in order for users (such as rtspclientsink) to get notified - about it. - -- rtspclientsink now errors out on timeout. - -## VA-API integration - -VA plugin for Hardware-Accelerated Video Encoding and Decoding on Intel/AMD - -- vaav1enc: Enable intrablock copy and palette mode. - -- Lots of other improvements and bug fixes. - -GStreamer-VAAPI has been removed in favour of the va plugin - -- gstreamer-vaapi has been removed and is no longer updated going forward Users who relied on gstreamer-vaapi are encouraged - to migrate to the va plugin’s elements at the earliest opportunity. It should still be possible to build old versions of - gstreamer-vaapi against newer versions of GStreamer. - -## GStreamer Editing Services and NLE - -- Task Pool Context Support: GESPipeline now supports task pool context handling for better resource management. It - automatically creates and manages a GstSharedTaskPool with threads set to the number of processors, also allowing - applications to provide their own shared task pool via context negotiation. - -- MT-Safe Controller API: New gst_timed_value_control_source_list_control_points() function provides thread-safe access to - control points, addressing use-after-free bugs in the previous API which returned references to internal structures. - -- OTIO Formatter Migration: The OpenTimelineIO formatter has been moved from embedded GLib resources to a standalone Python - plugin located in gst-python, simplifying the implementation and avoiding duplicated code. - -- Framepositioner Z-order Enhancements: The z-order property is now controllable and exposed for manipulation, enabling - dynamic adjustment of layer stacking order during timeline editing. - -- Clip Layer Movement Detection: New ges_clip_is_moving_between_layers() API distinguishes actual layer moves from other - operations like split/ungroup, with separate flags for track element freezing and layer movement. - -- GES Error Domain: Added ges_error_quark() function for proper GError domain support, enabling automatic ErrorDomain - implementation generation in language bindings. - -- Timeline Error Reporting: Added GError parameter to ges_base_bin_set_timeline() for proper error reporting when timeline - setup fails. - -- Various bug fixes for memory leaks, frame position calculations with non-square pixel aspect ratios, and control binding - handling. - -GStreamer validate - -- New check-last-frame-qrcode action type: New action type (from the Rust validate plugin) to validate QR code content in - video frames. Supports exact string matching for single or multiple QR codes, and JSON field validation. - -- Override Severity Levels: New overrides parameter in the meta action type allows changing issue severity levels during test - execution. Tests can now pass when encountering known issues by downgrading severity from critical to warning/issue/ignore. - -- Enhanced dots-viewer (see dots-viewer section above) - -- SSIM Validation Improvements: Changed validation to check all images before reporting errors instead of stopping at the - first error. - -- Reverse Playback Validation: Changed segment.time mismatch from critical to warning for reverse playback scenarios, - acknowledging the additional complexity demuxers face during reverse playback. - -- Launcher Improvements: Log files for passing tests are now removed by default to reduce storage usage (with option to keep - them), and debug log colors are now supported when redirected to files. - -- Python 3.14 Compatibility: Fixed file:/// URI generation for Python 3.14 with proper RFC 8089 compliance. - -- Various bug fixes for scenario handling, memory leaks, and improved backward compatibility with GLib 2.64. - -## GStreamer Python Bindings - -gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject, -and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more -pythonic; as well as support for APIs that aren’t available through the regular gobject-introspection based bindings, such as -e.g. GStreamer’s fundamental GLib types such as Gst.Fraction, Gst.IntRange etc. - -- More pythonic API for analytics - -- Type annotations have been updated in PyGObject-stubs. - -- Writability of Gst.Structure, Gst.Caps and other objects has been improved. - - - caps.writable_structure() now returns a ContextManager inside of which the returned Gst.Structure can be modified. - - obj.make_writable() makes any MiniObject writable. - - Pad probe callbacks now has info.writable_object() and info.set_object() to modify objects inside the callback. - -## GStreamer C# Bindings - -- The C# bindings have been updated for the latest GStreamer 1.28 APIs. - -## GStreamer Rust Bindings and Rust Plugins - -The GStreamer Rust bindings and plugins are released separately with a different release cadence that’s tied to the gtk-rs -release cycle. - -The latest release of the bindings (0.24) has already been updated for the new GStreamer 1.28 APIs, and works with any GStreamer -version starting from 1.14. - -gst-plugins-rs, the module containing GStreamer plugins written in Rust, has also seen lots of activity with many new elements -and plugins. - -The GStreamer 1.28 binaries will be tracking the main branch of gst-plugins-rs for starters and then track the 0.15 branch once -that has been released (around the end of February 2026). After that, fixes from newer versions will be backported as needed -into the new 0.15 branch for future 1.28.x bugfix releases. - -Rust plugins can be used from any programming language. To applications, they look just like a plugin written in C or C++. - -### New Rust elements - -- New icecastsink element with AAC support that is similar in functionality to the existing shout2send element but also - supports AAC, which upstream libshout is not planning to support. - -- New audio source separation element based on demucs (see above). - -- New Deepgram speech-to-text transcription plugin, ElevenLabs voice cloning element and textaccumulate element. See Speech to - Text, Translation and Speech Synthesis section above. - -- New analytics combiner and splitter elements for batch metas (see above). - -- New mpa robust RTP depayloader, L8/L16/L24 raw audio payloaders and depayloaders and SMPTE ST291 ancillary data payloader - and depayloader. - -- New GIF decoder element that supports looping. - -- New ST-2038 ancillary data combiner and extractor elements (see above) - -- Added a burn-based YOLOX inference element and a YOLOX tensor decoder - -- s302mparse: Add new S302M audio parser - -- New Rust validate plugin with a check-last-frame-qrcode action. - -For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.14 (shipped with GStreamer -1.26) and current main (soon 0.15) branch (shipped with GStreamer 1.28). - -Note that at the time of GStreamer 1.28.0 gst-plugins-rs 0.15 was not released yet and the git main branch was included instead -(see above). - -## Build and Dependencies - -- Meson >= 1.4 is now required for all modules - -- liborc >= 0.4.42 is strongly recommended - -- libnice >= 0.1.23 is now required for the WebRTC library. - -- The closedcaption plugin in gst-plugins-bad no longer depends on pangocairo after removal of the cc708overlay element (see - above). - -- Please also note plugin removals and deprecations. - -Monorepo build - -- Updated wraps, incl. glib: cairo, directxmath, expat, fdk-aac, ffmpeg, flac, freetype2, gdk-pixbuf, gtest, harfbuzz, - json-glib, lame, libjpeg-turbo, libnice, libopenjp2, libpng, libsrtp2, libxml2, nghttp2, ogg, pango, pcre2, pygobject, - soundtoch, sqlite3, wayland-protocols, zlib. - -- Added wraps: librsvg, svtjpegxs - -Development environment - -- Local pre-commit checks via git hooks have been moved over to pre-commit, including the code indentation check. - -- Code indentation checking no longer relies on a locally installed copy of GNU indent (which had different outcomes depending - on the exact version installed). Instead, pre-commit will automatically install the gst-indent-1.0 indentation tool through - pip, which also works on Windows and macOS. - -- A pre-commit hook has been added to check documentation cache updates and since tags. - -- Many meson wrap updates, including to FFmpeg 7.1 (FFmpeg 8.0 is pending) - -- The uninstalled development environment should work better on macOS now, also in combination with homebrew (e.g. when - libsoup comes from homebrew). - -- New python-exe Meson build option to override the target Python installation to use. This will be picked up by the - gst-python and gst-editing-sevices subprojects. - -## Platform-specific changes and improvements - -### Android - -- Overhaul hw-accelerated video codecs detection: - - - Android 10 (API 29) added support for isHardwareAccelerated() to MediaCodecInfo to detect whether a particular - MediaCodec is backed by hardware or not. We can now use that to ensure that the video hw-codec is rank PRIMARY+1 on - Android, since using a software codec for video is simply not feasible most of the time. - - - If we’re not able to detect isHardwareAccelerated(), perhaps because the Android API version is too old, we try to use - the codec name as a fallback and also rank as PRIMARY+1 the c2.android, c2.exynos and c2.amlogic audio codecs alongside - OMX.google, because they are known-good. - -### Apple macOS and iOS - -- VP9 and AV1 hardware-accelerated video decoding support - -- Support for 10-bit HEVC encoding - -- Implement keyboard, mouse, and scroll wheel navigation event handling for the OpenGL Cocoa backend. - -### Windows - -#### GStreamer Direct3D12 integration - -- New elements: - - - d3d12interlace: A Direct3D12 based interlacing element - - d3d12overlaycompositor: A Direct3D12-based overlay composing element - - d3d12fisheyedewarp: A Direct3D12-based fisheye dewarping element - - d3d12remap: A Direct3D12-based UV coordinate remapping element - -- Upload/download optimisations via a staging memory implementation - -- d3d12swapchainsink improvements: - - - added a “last-rendered-sample” action signal to retrieve the last rendered frame - - added “uv-remap” and “redraw” action signals - -#### Windows inter process communication - -- The Windows IPC plugin gained support for passing generic data in addition to raw audio/video, and various new properties. - It also serialises metas now where that is supported. - -#### Windows audio - -- wasapi2: add support for dynamic audio device switching, exclusive mode and format negotiation, in addition to device - provider improvements and latency enhancements. - -- Disable all audio device providers except wasapi2 by default (by setting the others’ rank to NONE). We had too many device - providers outputting duplicate device entries, and it wasn’t clear to people what they should be using. After the recent - device switching work done on WASAPI2, there is no reason to use directsound anymore. - -### Cerbero - -Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily -available, such as Windows, Android, iOS, and macOS. It is also used to create the GStreamer Python Wheels. - -General improvements - -- New features: - - - Support for generating Python wheels for macOS and Windows - - These will be uploaded to PyPI, currently blocked on PyPI - - Support for iPhone Simulator on ARM64 macOS, via the new iOS xcframework - - Inno Setup is now used for Windows installers, which also bundle the MSVC runtime - - An installer is now shipped for Windows ARM64, built using MSVC - - GTK4 is now shipped on macOS and Windows (MSVC and MinGW) - - Smaller binary sizes of Rust plugins on all platforms except macOS and iOS - - Linux builds now integrate better with system dependencies - - Debuginfo is now correctly shipped on Windows and macOS - -- API/ABI changes: - - - Android NDK r25 is now used, targeting API level 24 (Android 7.0) - - Merge modules are no longer shipped for Windows - - Windows installers are no longer MSIs - - The legacy iOS framework with iPhone ARM64 and iPhoneSimulator x86_64 binaries is now deprecated. It will be removed in - the next release. Please use the new iOS xcframework which supports iPhone ARM64 and iPhoneSimulator ARM64+x86_64. - -- Plugins added: - - - pbtypes is now shipped on all platforms - - curl is now shipped on all platforms except iOS and Android - - lcevcdec is now shipped on all platforms except Windows ARM64 and Windows 32-bit x86 - - svtjpegxs is now shipped on Linux and Windows, only on 64-bit - - unixfd is now shipped on all platforms except Windows - - mediafoundation is now shipped additionally on MinGW - - wasapi2 is now shipped additionally on MinGW - - New Rust plugins on all platforms except Windows ARM64: - - analytics - - audioparsers - - burn - - demucs - - elevenlabs - - gopbuffer - - hlsmultivariantsink - - icecastsink - - mpegtslive - - raptorq - - speechmatics - - streamgrouper - - vvdec - -- Plugins changed: - - - mp4 and fmp4 plugins have been merged into isobmff - -- Development improvements: - - - Debuginfo is now correctly shipped on Windows and macOS - - Support for iPhone Simulator on ARM64 macOS, via the new iOS xcframework - -- Known issues: - - - cerbero: Rust plugins fail to link with Xcode 26 on macOS - - cerbero: Rust plugins are not shipped in the Windows ARM64 installer - - cerbero: Android devices with API level >= 30 cannot play tutorials 4 or 5 – Fix aimed for 1.28.1 - - cerbero: Missing pkg-config for macOS in the Android release - -## Documentation improvements - -- Added a Windows section to “building from source” page - -- New Python tutorials for dynamic pipelines and time handling - -- The Android tutorials were updated: provided projects were updated to Gradle 8.11 and API level 24 - -- Updates of the Machine Learning and Analytics design documentation and the GstMeta design docs - -## Possibly Breaking Changes - -- The MXF muxer and demuxer used to have direct support for standalone closed caption streams (closedcaption/x-cea-708) as - ancillary data, but that was removed in favour of more generic ST 2038 ancillary metadata which is a better fit for how the - data is stored internally and also supports generic ancillary metadata. Closed captions can still be stored or extracted by - using the ST 2038 elements from the Rust plugins module. Also see the MXF section above. - -- Analytics: Previously it was guaranteed that there is only ever up to one GstTensorMeta per buffer. This is no longer true - and code working with GstTensorMeta must be able to handle multiple GstTensorMeta now (after this Merge Request, which was - apparently backported into 1.26 as well). - -- The thread ID reported in debug logs is no longer prefixed with a 0x on Windows, Linux and FreeBSD platforms. This change - can potentially break log parsers. GstDebugViewer was adapted accordingly. - -## Known Issues - -- There are some open issues with the Apple hardware-accelerated AV1 decoding, which we hope will be fixed in due course. - Please let us know if you run into them and can test patches. - -- Autoplugging LCEVC H.264/H.265/H.266 streams is currently disabled until an issue with decodebin3 and non-LCEVC streams has - been resolved. It is still possible to re-enable this locally by overriding the rank of lcevch26*decodebin using the - GST_PLUGIN_FEATURE_RANK environment variable. - -## Statistics - -- 3548 commits - -- 1765 Merge requests merged - -- 476 Issues closed - -- 190+ Contributors - -- more than 35% of all commits and Merge Requests were in Rust modules/code - -- 5430 files changed - -- 395856 lines added - -- 249844 lines deleted - -- 146012 lines added (net) - -Contributors - -Aaron Boxer, Abd Razak, Adrian Perez de Castro, Adrien Plazas, Albert Sjolund, Aleix Pol, Alexander Slobodeniuk, Alicia Boya -García, Alyssa Ross, Amotz Terem, Amy Ko, Andoni Morales Alastruey, Andrew Yooeun Chun, Andrey Khamukhin, anonymix007, Arnout -Engelen, Artem Martus, Arun Raghavan, Ben Butterworth, Biswapriyo Nath, Brad Hards, Brad Reitmeyer, Branko Subasic, Camilo Celis -Guzman, Carlos Bentzen, Carlos Falgueras García, Carlos Rafael Giani, César Alejandro Torrealba Vázquez, Changyong Ahn, Chengfa -Wang, Christian Gräfe, Christo Joseph, Christopher Degawa, Christoph Reiter, Daniel Almeida, Daniel Morin, David Maseda Neira, -David Monge, David Smitmanis, Denis Shimizu, Derek Foreman, Detlev Casanova, Devon Sookhoo, Diego Nieto, Dominique Leroux, -DongJoo Kim, Dongyun Seo, Doug Nazar, Edward Hervey, Ekwang Lee, eipachte, Eli Mallon, Elliot Chen, Enock Gomes Neto, Enrique -Ocaña González, Eric, Eva Pace, F. Duncanh, François Laignel, Gang Zhao, Glyn Davies, Guillaume Desmottes, Gustav Fahlen, -Haejung Hwang, Haihua Hu, Havard Graff, Hanna Weiß, He Junyan, Hou Qi, Hyunjun Ko, Ian Napier, Inbok Kim, Jaehoon Lee, Jakub -Adam, James Cowgill, Jan Alexander Steffens (heftig), Jan Schmidt, Jan Tojnar, Jan Vermaete, Jaslo Ziska, Jeehyun Lee, Jeffery -Wilson, jeongmin kwak, Jeongmin Kwak, Jerome Colle, Jiayin Zhang, Jihoon Lee, Jochen Henneberg, Johan Sternerup, Jonathan Lui, -Jordan Petridis, Jordan Yelloz, Jorge Zapata, Julian Bouzas, Kevin Scott, Kevin Wolf, L. E. Segovia, Linus Svensson, Loïc Le -Page, Manuel Torres, Marc-André Lureau, Marc Leeman, Marek Olejnik, Mark Nauwelaerts, Marko Kohtala, Markus Hofstaetter, Mathieu -Duponchelle, Matteo Bruni, Matthew Semeniuk, Matthew Waters, Max Goltzsche, Mazdak Farzone, Michael Grzeschik, Michael Olbrich, -Michiel Westerbeek, Monty C, Muhammad Azizul Hazim, Nicholas Jin, Nicolas Dufresne, Nirbheek Chauhan, Norbert Hańderek, Ognyan -Tonchev, Ola Fornander, Olivier Blin, Olivier Crête, Oz Donner, Pablo García, Patricia Muscalu, Patrick Fischer, Paul Fee, Paweł -Kotiuk, Paxton Hare, Peter Stensson, pfee, Philippe Normand, Piotr Brzeziński, Piotr Brzeziński, Pratik Pachange, Qian Hu -(胡骞), r4v3n6101Rafael Caricio, Raghavendra Rao, Rares Branici, Ratchanan Srirattanamet, Razvan Grigore, Rick Ye, Rinat Zeh, -Robert Ayrapetyan, Robert Mader, Ross Burton, Ruben Gonzalez, Ruben Sanchez, Samuel Thibault, Sanchayan Maity, Santiago -Carot-Nemesio, Santosh Mahto, Sebastian Dröge, Seungha Yang, Shengqi Yu (喻盛琪), Sjoerd Simons, Slava Sokolovsky, Stefan -Andersson, Stefan Dangl, Stéphane Cerveau, stevn, Sven Püschel, Sylvain Garrigues, Taruntej Kanakamalla, Teus Groenewoud, Théo -Maillart, Thibault Saunier, Tim-Philipp Müller, Tjitte de Wert, Tobias Schlager, Tobias Koenig, Tomasz Mikolajczyk, Tulio -Beloqui, Val Packett, Vasiliy Doylov, Víctor Manuel Jáquez Leal, Vincent Beng Keat Cheah, Vineet Suryan, Vivia Nikolaidou, -Vivian Lee, Vivienne Watermeier, Wilhelm Bartel, William Wedler, Wim Taymans, Xavier Claessens, Yun Liu, - -… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! - -Stable 1.28 branch - -After the 1.28.0 release there will be several 1.28.x bug-fix releases which will contain bug fixes which have been deemed -suitable for a stable branch, but no new features or intrusive changes will be added to a bug-fix release usually. The 1.28.x -bug-fix releases will be made from the git 1.28 branch, which is a stable release series branch. - -1.28.1 - -The first 1.28 bug-fix release (1.28.1) is expected to be released in February 2026. - -Schedule for 1.30 - -Our next major feature release will be 1.30, and 1.29 will be the unstable development version leading up to the stable 1.30 -release. The development of 1.29/1.30 will happen in the git main branch of the GStreamer mono repository. - -The schedule for 1.30 is still to be determined, but it will likely be in Q4/2026. - -1.30 will be backwards-compatible to the stable 1.28, 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. - -## 1.27 pre-releases (superseded by 1.28) - -- 1.27.1 development snapshot release notes -- 1.27.2 development snapshot release notes -- 1.27.50 development snapshot release notes -- 1.27.90 pre-release release notes - --------------------------------------------------------------------------------------------------------------------------------- - -These release notes have been prepared by Tim-Philipp Müller with contributions from Daniel Morin, Nirbheek Chauhan, Philippe -Normand, Sebastian Dröge, Thibault Saunier, Víctor Manuel Jáquez Leal, and Xavier Claessens - -License: CC BY-SA 4.0
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/helpers.c
Deleted
@@ -1,94 +0,0 @@ -/* - * Copyright (C) 2023 Nirbheek Chauhan <nirbheek@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <CoreVideo/CVPixelBuffer.h> -#include "helpers.h" - -GstVideoFormat -gst_video_format_from_cvpixelformat (int fmt) -{ - /* Note that video and full-range color values map to the same format */ - switch (fmt) { - /* YUV */ - case kCVPixelFormatType_420YpCbCr8Planar: - case kCVPixelFormatType_420YpCbCr8PlanarFullRange: - return GST_VIDEO_FORMAT_I420; - case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: - case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: - return GST_VIDEO_FORMAT_NV12; - case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: - case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: - return GST_VIDEO_FORMAT_P010_10LE; - case kCVPixelFormatType_422YpCbCr8: - return GST_VIDEO_FORMAT_UYVY; - case kCVPixelFormatType_422YpCbCr8_yuvs: - return GST_VIDEO_FORMAT_YUY2; - /* Alpha YUV */ - case kCVPixelFormatType_4444AYpCbCr16: - return GST_VIDEO_FORMAT_AYUV64; - /* RGB formats */ - case kCVPixelFormatType_32ARGB: - return GST_VIDEO_FORMAT_ARGB; - case kCVPixelFormatType_32BGRA: - return GST_VIDEO_FORMAT_BGRA; - case kCVPixelFormatType_64ARGB: - return GST_VIDEO_FORMAT_ARGB64_BE; - case kCVPixelFormatType_64RGBALE: - return GST_VIDEO_FORMAT_RGBA64_LE; - default: - return GST_VIDEO_FORMAT_UNKNOWN; - } -} - -int -gst_video_format_to_cvpixelformat (GstVideoFormat fmt) -{ - switch (fmt) { - /* YUV */ - case GST_VIDEO_FORMAT_I420: - return kCVPixelFormatType_420YpCbCr8Planar; - case GST_VIDEO_FORMAT_NV12: - return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; - case GST_VIDEO_FORMAT_P010_10LE: - return kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange; - case GST_VIDEO_FORMAT_UYVY: - return kCVPixelFormatType_422YpCbCr8; - case GST_VIDEO_FORMAT_YUY2: - return kCVPixelFormatType_422YpCbCr8_yuvs; - /* Alpha YUV */ - case GST_VIDEO_FORMAT_AYUV64: -/* This is fine for now because Apple only ships LE devices */ -#if G_BYTE_ORDER != G_LITTLE_ENDIAN -#error "AYUV64 is NE but kCVPixelFormatType_4444AYpCbCr16 is LE" -#endif - return kCVPixelFormatType_4444AYpCbCr16; - /* RGB formats */ - case GST_VIDEO_FORMAT_ARGB: - return kCVPixelFormatType_32ARGB; - case GST_VIDEO_FORMAT_BGRA: - return kCVPixelFormatType_32BGRA; - case GST_VIDEO_FORMAT_ARGB64_BE: - return kCVPixelFormatType_64ARGB; - case GST_VIDEO_FORMAT_RGBA64_LE: - return kCVPixelFormatType_64RGBALE; - default: - g_assert_not_reached (); - return -1; - } -}
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ChangeLog -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ChangeLog
Changed
@@ -1,3 +1,1156 @@ +=== release 1.28.1 === + +2026-02-26 01:44:06 +0000 Tim-Philipp Müller <tim@centricular.com> + + * gst-plugins-bad.doap: + * meson.build: + Release 1.28.1 + +2026-02-23 13:21:25 +0100 Carlos Bentzen <cadubentzen@igalia.com> + + * gst-libs/gst/codecparsers/gsth265parser.c: + h265parser: Validate num_decoding_units_minus1 in pic_timing SEI + Fixes GST-SA-2026-0012. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10904> + +2026-02-20 13:34:50 +0100 Carlos Bentzen <cadubentzen@igalia.com> + + * gst-libs/gst/codecparsers/gsth266parser.c: + * gst-libs/gst/codecparsers/gsth266parser.h: + h266parser: Fix out of bounds write when parsing pic_timing SEI + Validate num_decoding_units_minus1 against the array bounds in + GstH266PicTiming using READ_UE_MAX. + Fixes ZDI-CAN-28839, CVE-2026-3081, GST-SA-2026-0010. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4898 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10901> + +2026-02-20 17:40:24 +0100 Carlos Bentzen <cadubentzen@igalia.com> + + * gst-libs/gst/codecparsers/gsth266parser.c: + h266parser: Fix APS ID bounds check in APS parsing + Use GST_H266_MAX_APS_COUNT - 1 as the upper bound to match the spec + constraint and array size. + Fixes ZDI-CAN-28911, CVE-2026-3086, GST-SA-2026-0009. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4904 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10899> + +2026-02-20 17:10:04 +0100 Carlos Bentzen <cadubentzen@igalia.com> + + * gst-libs/gst/codecparsers/gsth266parser.c: + h266parser: Validate tile index bounds in picture partition parsing + Ensure computed tile_idx stays within valid range before using it + as an array index to prevent out-of-bounds reads. + Fixes ZDI-CAN-28910, CVE-2026-3084, SA-2026-0011. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4902 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10898> + +2026-02-11 22:07:49 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/codecparsers/gstjpegparser.c: + libs: jpegparser: boundary checks before copying it + READ_BYTES macro reads data from a byte reader and then copy it to a storage + variable. This patch adds a validation that the length to read cannot be bigger + than the storage size. + This macro right now is used only for storage variables of guint8 arrays. + We have validated in the specification (sections F.1.2.1.2 and F.1.2.2.1 in ITU + T.81) that Huffman tables (both AC and DC) aren't bigger than 256. + Fixes SA-2026-0003, CVE-2026-3082, ZDI-CAN-28840. + Fixes: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4899> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10896> + +2026-02-12 09:50:23 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/dvbsuboverlay/dvb-sub.c: + dvbsuboverlay: Avoid integer overflows and unreasonably large displays/regions + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10894> + +2026-02-11 20:45:12 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/dvbsuboverlay/dvb-sub.c: + dvbsuboverlay: Add missing bounds checks to the parser everywhere + Fixes SA-2026-0007, ZDI-CAN-28838, CVE-2026-2923. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4897 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10894> + +2026-02-25 17:22:52 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/dvbsuboverlay/dvb-sub.c: + * gst/dvbsuboverlay/dvb-sub.h: + dvbsuboverlay: Mark parsed byte array as const + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10894> + +2026-02-22 02:50:20 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/meson.build: + applemedia: Small simplifications to the vulkan checks + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-22 02:49:34 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/avfvideosrc.h: + avfvideosrc: Small fixes to the plugin header + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-22 02:45:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + * sys/applemedia/meson.build: + * sys/applemedia/plugin.m: + applemedia: Get rid of AVFoundation-related defines + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-22 00:41:33 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + * sys/applemedia/meson.build: + * sys/applemedia/plugin.m: + applemedia: Remove outdated HAVE_VIDEOTOOLBOX define + All platform versions we support have VideoToolbox now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-22 00:38:33 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + * sys/applemedia/vtenc.c: + applemedia: Fix broken HAVE_VIDEOTOOLBOX_10_9_6 define + We now use VTCompressionSessionPrepareToEncodeFrames() correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-22 00:55:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/meson.build: + applemedia: Sort sources list, fix indentation + No functional changes. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10874> + +2026-02-20 13:23:06 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtenc.c: + * sys/applemedia/vtenc.h: + vtdec: Calculate DTS offset correctly + Previous method was too simple and didn't offset DTS enough. + videotestsrc ! vtenc_h264 ! qtmux ! fakesink with GST_DEBUG=2 showed + qtmux complaining about DTS > PTS right away, on latest macOS at least. + If we only ever get one frame from upstream, it'll get pushed out when + drain() is called. Otherwise, it goes out as soon as the second frame + arrives and we can calculate the offset. Of course in some cases we know + right away that DTS offset won't be needed and then this is all + bypassed. + If incoming frames don't have PTS set, we don't set a DTS offset at all. + This is because VideoToolbox, according to its docs, simply requires PTS + to be provided alongside the frame being submitted to the encoder. From + my testing, when PTS is invalid, VT will just not set DTS at all on the + output buffers, so we don't need the offset. + 1st PTS minus 2nd PTS should always give us enough offset while being + more precise than e.g. using the DBP size instead. Similar logic is + already used in other encoders such as vah26*enc or svthevcenc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10873> + +2026-02-20 16:05:14 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix wrong DPB size check in the output loop + The condition was always slightly wrong, but rather harmless. However + after my 'fix' in 30b213a86fd5ed8f654572bd35dff31af5a36334 it became + possible that with dpb_size=0 we end up busy looping because obviously + the queue length could not be <0, so the loop would never sleep... + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10863> + +2026-02-19 16:47:12 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtenc.c: + * sys/applemedia/vtenc.h: + vtenc: Make sure draining actually drains all frames, port fixes from vtdec, unify naming + This commit mostly ports existing fixes from vtdec to vtenc. Also makes + them use the same naming to follow/compare the logic easier. + vtenc was missing the is_draining flag that we already have in vtdec. + It's mostly useful to make sure the output loop outputs all the frames + from the queue before it pauses when draining. Without it, it's possible + for some frames to end up being flushed instead of drained. + Additionally, if we're draining or flushing, the output callback will + now always push to the output queue no matter if it goes over the size + limit. This is already present in vtdec and reduces the risk of the VT + thread getting stuck when the output loop stops and won't actively + consume buffers. + I also renamed a few functions to make them match vtdec and make more + sense. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10860> + +2026-02-19 16:30:07 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + * sys/applemedia/vtdec.h: + vtdec: Make sure VT thread won't get stuck after a downstream error + Without this, if output loop stops because of an error we might end up + stuck because the VT thread can't push out the remaning frames. + This is already present in vtenc and is also needed here in vtdec. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10860> + +2026-02-19 16:27:45 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix return value in flush() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10860> + +2026-02-20 14:19:42 -0500 Daniel Morin <daniel.morin@collabora.com> + + * ext/onnx/gstonnxinference.c: + onnx: set dims_order on GstTensor + - set dims_order on GstTensor + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10862> + +2026-02-20 14:18:03 -0500 Daniel Morin <daniel.morin@collabora.com> + + * gst/tensordecoders/gstyolosegtensordecoder.c: + * gst/tensordecoders/gstyolotensordecoder.c: + tensordecoders: fix wrong dims_order check + - Use correct DIM_ORDER on GstTensor check for YOLO tensor decoders + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10862> + +2026-02-13 13:07:15 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvavp8enc.c: + vavp8enc: set color format chroma + With the refactor of the encoder helper open methods, a hidden bug in vp8 + encoder appeared, because the rt_format was never assigned, relying on a default + value that were removed. + This patch sets the format's chroma before opening the encoder helper object. + Fixes: #4906 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10806> + +2026-02-12 19:24:41 -0500 Monty C <montyc1999@gmail.com> + + * sys/decklink/meson.build: + meson: Explicitly use cpp_std=c++11 for decklink + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10804> + +2026-02-17 17:01:48 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * docs/libs/codecparsers/sitemap.txt: + doc: codecparsers: Switch to gi-index + The since marker comment are not working when using the c-index. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 15:09:09 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecparsers/gstav1bitwriter.c: + * gst-libs/gst/codecparsers/gstav1parser.c: + * gst-libs/gst/codecparsers/gsth264bitwriter.c: + * gst-libs/gst/codecparsers/gsth264parser.c: + * gst-libs/gst/codecparsers/gsth264parser.h: + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + * gst-libs/gst/codecparsers/gsth266parser.c: + * gst-libs/gst/codecparsers/gsth266parser.h: + * gst-libs/gst/codecparsers/gstjpeg2000sampling.h: + * gst-libs/gst/codecparsers/gstjpegbitwriter.c: + * gst-libs/gst/codecparsers/gstjpegparser.c: + * gst-libs/gst/codecparsers/gstmpegvideometa.c: + * gst-libs/gst/codecparsers/gstmpegvideoparser.c: + * gst-libs/gst/codecparsers/gstvc1parser.c: + * gst-libs/gst/codecparsers/gstvc1parser.h: + * gst-libs/gst/codecparsers/gstvp9bitwriter.c: + * gst-libs/gst/codecparsers/gstvp9parser.c: + * gst-libs/gst/codecparsers/gstvp9parser.h: + codecparsers: Fix annotation warnings reported at GIR constructions + This fixes all the minor warning emited buy the GIR generator. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 15:06:18 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecparsers/gsth265parser.h: + * gst-libs/gst/codecparsers/gstvc1parser.c: + * gst-libs/gst/codecparsers/gstvc1parser.h: + * tests/check/libs/h265parser.c: + codecparsers: h265/vc1: Add missing namespace to some defines + This is effectively an API break, but I think its fair break considering the + risk of clash. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 15:04:37 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecs/meson.build: + build: codecs: Add gir dependency to the new GstCodecParsers gir + This fixes warning when structures from the parsers are exposed through the + codecs library API. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 15:01:07 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265decoder.h: + * sys/v4l2codecs/gstv4l2codech265dec.c: + codec: h265decoder: Fix annotation and constify return value + gst_h265_decoder_get_sps_ext() return a bare pointer inside an array own by the + base class. Fix the annotation and constify the return value. Fix its single + usage in v4l2 codecs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 13:32:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * docs/meson.build: + * gst-libs/gst/codecparsers/meson.build: + build: codecparsers: Create a GIR file needed for since marking + Without a GIR file, despite the absence of GObject in this library, the + documentation script cannot resolved the since marker. Forcing hacks to ignore + newly introduce symbols. This also prevented a lot of annotation error + from being reported. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 13:29:41 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecparsers/meson.build: + build: codecparsers: Install some newly introduce API headers + This notably install the bitwriter headers included in the API but with their + headers not being installed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 13:28:23 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecs/meson.build: + build: codecs: Small style improvement + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-17 13:26:59 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/codecs/meson.build: + build: codecs: Add AV1 decoder to the GIR includes + Add missing AV1 decoder header to the GIR include flags. Since there + is no central header for this library, we need to pass every codec + headers to the GIR so all the symbols are resolved. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-18 19:49:25 -0500 Detlev Casanova <detlev.casanova@collabora.com> + + * sys/v4l2codecs/gstv4l2codech265dec.c: + v4l2codecs: Set long and short term RPS controls + Some hardware need that information to decode HEVC frames (e.g.: + Rockchip rk3588 SoC). + Those controls were added in linux 6.20 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-01-26 11:56:44 -0500 Detlev Casanova <detlev.casanova@collabora.com> + + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265decoder.h: + codecs: h265dec: Parse extended SPS information + This extra information allow notably parsing of the + slices headers inside the accelerator. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-01-26 11:53:02 -0500 Detlev Casanova <detlev.casanova@collabora.com> + + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + h265parser: Store raw short/long term RPS sets + In order to support the new V4L2 HEVC stateless controls the raw values + from the long and short term RPS sets need to be kept. + The raw values are used in those controls so that they are kept + compatible with the Vulkan API. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2025-06-27 11:24:04 -0400 Detlev Casanova <detlev.casanova@collabora.com> + + * sys/v4l2codecs/linux/v4l2-controls.h: + * sys/v4l2codecs/linux/videodev2.h: + v4l2codecs: Add short and long term controls in linux headers + Add the new V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS and + V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS controls in the linux kernel header. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851> + +2026-02-12 16:04:04 +0100 Hyunjun Ko <zzoon@igalia.com> + + * ext/vulkan/vkav1dec.c: + vkav1dec: fix to set SavedOrderHints properly + This fixes to play AV1 correctly on hardwares that require + SavedOrderHints, eg. ANV. + Otherwise the params is going to be reset to 0 during initialization. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10846> + +2026-02-19 17:22:59 +0900 Seungha Yang <seungha@centricular.com> + + * gst/closedcaption/gstccconverter.c: + ccconverter: Reset counters on flush-stop + ... instead of flush-start. flush-start event can happen + at arbitrary points while the element is processing data + in streaming thread, which may cause races. Reset counters + on flush-stop to ensure that the reset happens after + the streaming thread no longer processing data + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10845> + +2026-02-19 15:43:13 +0900 Seungha Yang <seungha@centricular.com> + + * gst/closedcaption/gsth264ccextractor.c: + * gst/closedcaption/gsth265ccextractor.c: + h264,h265ccextractor: Fix framerate in initial caps + Update framerate in set_format() as well so that + the input framerate is copied to the initial output caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10841> + +2026-02-09 12:33:41 -0500 Dominique Leroux <dominique.p.leroux@gmail.com> + + * sys/applemedia/avfassetsrc.h: + * sys/applemedia/avfassetsrc.m: + * sys/applemedia/avfdeviceprovider.h: + * sys/applemedia/avfdeviceprovider.m: + * sys/applemedia/avfvideosrc.h: + * sys/applemedia/avfvideosrc.m: + * sys/applemedia/avsamplevideosink.h: + * sys/applemedia/avsamplevideosink.m: + * sys/applemedia/helpers.h: + * sys/applemedia/helpers.m: + * sys/applemedia/iosassetsrc.h: + * sys/applemedia/iosassetsrc.m: + * sys/applemedia/meson.build: + * sys/applemedia/plugin.m: + * sys/applemedia/vtdec.c: + * sys/applemedia/vtdec.h: + * sys/applemedia/vtenc.c: + * sys/applemedia/vtenc.h: + applemedia: elements can now be individually registered with gst-full + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10828> + +2026-02-17 17:41:41 +0900 Seungha Yang <seungha@centricular.com> + + * sys/asio/gstasioringbuffer.cpp: + asiosink: Fill silence when paused + Due to the ASIO API design, it's not possible to pause a specific + ASIO device channel. Fill silence instead to avoid garbage noise + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4909 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10830> + +2026-02-12 03:12:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix GstVideoCodecState leak + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-02-11 19:26:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * ext/ladspa/gstladspa.c: + * gst/frei0r/gstfrei0r.c: + frie0r, ladspa: Stop using G_MODULE_SUFFIX + And define GST_EXTRA_MODULE_SUFFIX inside the plugin sources, since it + is no longer set in config.h + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-02-11 19:25:09 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * ext/lv2/gstlv2.c: + * meson.build: + * sys/shm/shmpipe.c: + macos: Stop using HAVE_OSX, use built-in macros instead + The host_system == 'darwin' check is incorrect for this anyway. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-02-02 21:37:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtdec.c: + * sys/applemedia/vtdec.h: + vtdec: Check for AV1 and VP9 support once + And don't warn if they aren't supported. Prevents spammy warnings when + playing an fmp4 stream which reconfigures every segment. + Ensure that we check it dynamically during caps negotiation, so that + we do not enable this supplemental support if not necessary, since it + is process-wide and (likely) reserves resources. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 16:58:03 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + * sys/applemedia/meson.build: + * sys/applemedia/plugin.m: + applemedia: Disable avfvideosrc and avfdeviceprovider on tvOS/watchOS + AVCaptureDevice isn't available on watchOS, and it's only available on + tvOS 17.0+. It's not clear how to make an entire element dynamically + available via __builtin_available() so just disable it for now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 15:53:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtenc.c: + vtenc: Fix build with tvOS + https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_constantbitrate + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 14:41:03 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Add support for newer iOS 17+ APIs + The orientation property is deprecated, and has been replaced with + videoRotationAngle. Coincidentally, this is also the only way to do + rotation on tvOS. + Left TODOs for some of the features that are also available on newer + macOS now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 14:04:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Software decoders are now more widely available + When software decoders are available, we now register a separate + vtdec_hw, similar to macOS. + http://developer.apple.com/documentation/videotoolbox/kvtvideodecoderspecification_enablehardwareacceleratedvideodecoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 14:00:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: VTRegisterSupplementalVideoDecoderIfAvailable is widely available + It's also available on tvOS and visionOS. + https://developer.apple.com/documentation/videotoolbox/vtregistersupplementalvideodecoderifavailable(_:) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 14:04:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/meson.build: + * sys/applemedia/plugin.m: + * sys/applemedia/videotexturecache-gl.h: + * sys/applemedia/videotexturecache-gl.m: + * sys/applemedia/vtdec.c: + applemedia: Enable EAGL support on tvOS too + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 13:58:16 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/avfdeviceprovider.m: + avfdeviceprovider: AVCaptureDevice manufacturer is more widely available + https://developer.apple.com/documentation/avfoundation/avcapturedevice/manufacturer + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 13:45:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + * sys/applemedia/avfdeviceprovider.m: + * sys/applemedia/avfvideosrc.m: + * sys/applemedia/corevideobuffer.c: + * sys/applemedia/plugin.m: + * sys/applemedia/videotexturecache-gl.h: + * sys/applemedia/videotexturecache-gl.m: + * sys/applemedia/videotexturecache-vulkan.mm: + * sys/applemedia/videotexturecache.m: + * sys/applemedia/vtdec.c: + * sys/applemedia/vtenc.c: + applemedia: Stop using HAVE_IOS, use TARGET_OS_* macros instead + HAVE_IOS is being used incorrectly, because iOS vs macOS are not the + only two choices. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 11:45:20 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * ext/sctp/usrsctp/meson.build: + * gst-libs/gst/vulkan/meson.build: + * meson.build: + * sys/applemedia/meson.build: + * sys/decklink/meson.build: + * sys/shm/meson.build: + * tests/examples/avsamplesink/meson.build: + meson: Deprecate `system = 'ios'` in cross files, use subsystem + Since we require Meson 1.4.0, we can now use subsystem names (added in + 1.2.0). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-01-28 11:40:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * ext/ladspa/gstladspa.c: + ladspa: Fix macOS detection + The macOS ifdefs were also incorrectly enabled for iOS. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807> + +2026-02-16 17:17:07 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Avoid busy looping when queue length is smaller than DPB size + The check for whether the output loop should sleep was wrong. If we had + something in the queue but not enough to push frames out (depending on + the DPB size), we'd busy loop until that changed. If the input data + happened to stop at that point, vtdec would busy loop until EOS arrives, + which doesn't always happen instantly. This just makes sure we're + checking for the same thing in both places, eliminating this weirdness. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10827> + +2023-04-02 16:53:45 +0100 Tim-Philipp Müller <tim@centricular.com> + + * meson.build: + * scripts/dist-common-files.py: + modules: dist common files from monorepo root + Less noise when making releases, and just need to maintain one copy. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10822> + +2026-02-15 17:45:19 +0000 Tim-Philipp Müller <tim@centricular.com> + + * README.md: + modules: remove subproject README.md from git + Will be added to the tarballs based on the monorepo README on dist. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10822> + +2026-02-15 17:20:59 +0000 Tim-Philipp Müller <tim@centricular.com> + + * RELEASE: + modules: remove RELEASE from git, will be generated from template on dist + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10822> + +2026-02-15 15:02:07 +0000 Tim-Philipp Müller <tim@centricular.com> + + * NEWS: + modules: Remove NEWS from git which is generated from full release notes + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10822> + +2026-02-16 10:51:53 +0800 Xi Ruoyao <xry111@xry111.site> + + * ext/zxing/gstzxing.cpp: + zxing: Fix version check for zxing-cpp 3.0.1 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10813> + +2026-02-12 14:40:40 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabasetransform.c: + vabasetransform: copy buffer's metadata at copy when import buffer + When downstream doesn't support video meta, the buffer needs to be imported to a + VA surface by copying the frame data. But buffer's metadata weren't copied. This + patch fixes it by calling base class copy_metadata() virtual method. + Original-patch-by: carol-lim <carol.lim@intel.com> + Fixes: #4866 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10810> + +2026-02-11 09:59:53 +0000 axxel <awagger@gmail.com> + + * ext/zxing/gstzxing.cpp: + zxing: Minimal support for compiling with zxing-cpp 3.x + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10799> + +2026-02-12 02:25:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix CM memory leak due to incorrect unref + The GstMemory was being leaked for each frame because + gst_memory_unmap() was setting info->memory to NULL, making the unref + a no-op. We need to store a separate ref to the memory. + This broke in 9baf4701f04ee238db6282f4f348a43ca5a299a9, where + info->memory now starts to get cleared on unmap. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10795> + +2026-02-10 22:12:56 +0100 Sjoerd Simons <sjoerd@collabora.com> + + * gst-libs/gst/wayland/gstwlwindow.c: + waylandsink: make gst_wl_window_commit_buffer handle NULL buffers + gst_wl_window_commit_buffer is meant to clear the various surfaces when passed + a NULL buffer. In 130e093d5c ("wayland: window: Add the ability to offload + cropping"), this case was broken. Correct that. + Fixes: 130e093d5c ("wayland: window: Add the ability to offload cropping") + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10793> + +2026-02-06 13:09:02 +0100 Stéphane Cerveau <scerveau@igalia.com> + + * gst-libs/gst/vulkan/gstvkdecoder-private.c: + * gst-libs/gst/vulkan/gstvkencoder-private.c: + * gst-libs/gst/vulkan/gstvkvideo-private.c: + * gst-libs/gst/vulkan/gstvkvideo-private.h: + vulkan: load video function pointers conditionally based on codec operation + Split GST_VULKAN_DEVICE_VIDEO_FN_LIST into COMMON, DECODE, and ENCODE + sub-lists so that gst_vulkan_video_get_vk_functions() only loads the + function pointers relevant to the codec operation being used. + Previously, both decoder and encoder would attempt to load all Vulkan + Video function pointers unconditionally, causing initialization to fail + on drivers that only support one direction (e.g. decode-only drivers + would fail to find vkCmdEncodeVideoKHR). + Now the decoder only requires CmdDecodeVideo while the encoder only + requires CmdEncodeVideo, GetEncodedVideoSessionParameters, and + GetPhysicalDeviceVideoEncodeQualityLevelProperties. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10773> + +2026-02-04 16:32:01 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * gst-libs/gst/vulkan/meson.build: + * sys/applemedia/meson.build: + meson: Add a subproject for providing the LunarG MoltenVK SDK + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10752> + +2026-02-04 16:38:21 +0200 Sebastian Dröge <sebastian@centricular.com> + + * sys/aja/gstajasinkcombiner.cpp: + ajasinkcombiner: Only forward the segment events from the video sinkpad + It's the video buffers with their timestamps that are forwarded, not the audio + ones, and if both segments are different then this won't work. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10748> + +2026-01-23 12:13:09 +0100 Stéphane Cerveau <scerveau@igalia.com> + + * ext/openh264/gstopenh264enc.cpp: + openh264enc: remove broken drain and simplify handle_frame + OpenH264 encoder does not support B-frames for any profile, or other + advanced encoding + feature which could require frame buffering, so there + are no potential frames to drain. The drain code was also broken as + EncodeFrame() rejects NULL input with cmInitParaError. + Remove the non-functional drain loop and clean up handle_frame() by + removing dead code paths that were only needed for the broken drain. + Add defensive NULL frame check with error logging. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10739> + +2026-01-22 14:39:46 +0100 Stéphane Cerveau <scerveau@igalia.com> + + * ext/openh264/gstopenh264enc.cpp: + * ext/openh264/gstopenh264enc.h: + openh264enc: skip drain for baseline profile + Baseline profile doesn't use B-frames, so there are no buffered frames + to drain at EOS. Attempting to drain by calling EncodeFrame with NULL + input causes openh264 to return cmInitParaError and log a spurious + error message. + Store the profile when initializing the encoder and check it in finish() + to skip the unnecessary drain call for baseline profile. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10739> + +2025-12-30 18:22:47 +0100 Mathieu Duponchelle <mathieu@centricular.com> + + * gst/mpegtsmux/tsmux/tsmux.c: + * gst/mpegtsmux/tsmux/tsmuxcommon.h: + tsmux: reduce noise for DEBUG log level + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10736> + +2026-01-06 21:35:50 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/frei0r/gstfrei0rsrc.c: + frei0r-src: adapt klass "Src" to "Source" + use recommended "Source" instead of "Src" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-06 21:28:10 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/rtp/gstrtpsrc.c: + rtpsrc: adapt klass "Src" to "Source" + use recommended "Source" instead of "Src" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-06 21:25:37 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * ext/avtp/gstavtpsrc.c: + avtpsrc: adapt klass "Src" to "Source" + use recommended "Source" instead of "Src" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-06 21:21:08 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/unixfd/gstunixfdsrc.c: + unixfdsrc: adapt klass "Src" to "Source" + use recommended "Source" instead of "Src" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-06 21:15:08 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gstvideocodectestsink.c: + videocodectestsink: fix typo in klass + use "Video" instead of "video" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-06 09:59:21 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + gst: also adapt author names in the gst_plugins_cache.json files + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 19:25:58 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * ext/webp/gstwebpdec.c: + * ext/webrtcdsp/gstwebrtcechoprobe.cpp: + * gst/videoparsers/gstmpegvideoparse.c: + gst-plugins: fix author name: correct incomplete or wrong emails + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 19:02:19 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * gst/debugutils/gstvideocodectestsink.c: + * gst/rist/gstristrtpdeext.c: + * gst/rist/gstristrtpext.c: + * gst/rist/gstristsink.c: + * gst/rist/gstristsrc.c: + * gst/rist/gstroundrobin.c: + * sys/ipcpipeline/gstipcslavepipeline.c: + gst: fix author name: add missing closing angle bracket + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 18:51:07 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * ext/dtls/gstdtlsdec.c: + * ext/dtls/gstdtlsenc.c: + * ext/dtls/gstdtlssrtpdec.c: + * ext/dtls/gstdtlssrtpdemux.c: + * ext/dtls/gstdtlssrtpenc.c: + dtls: fix author name: add missing angle brackets + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 19:59:13 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/fieldanalysis/gstfieldanalysis.c: + fieldanalysis: adapt klass to recommendation + - use recommended "Analyzer" instead of "Analysis" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 19:54:15 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/videofilters/gstzebrastripe.c: + zebrastripe: adapt klass to recommendation + - use "Video" as the element operates on base type video + - use recommendated "Analyzer" instead of "Analysis" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 21:21:41 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * docs/plugins/gst_plugins_cache.json: + gst-plugins-bad: remove trailing spaces: update gst_plugins_cache.json + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 14:31:05 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * ext/smoothstreaming/gstsmoothstreaming-plugin.c: + smoothstreaming: remove trailing space from desc + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 14:24:47 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * ext/openni2/gstopenni2src.cpp: + openni2src: remove trailing space from desc + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-04 14:15:07 +0100 Christian Gräfe <cgraefe83@gmail.com> + + * gst/siren/gstsirendec.c: + * gst/siren/gstsirenenc.c: + siren: remove trailing space from klass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729> + +2026-01-30 16:55:11 +0100 Mathieu Duponchelle <mathieu@centricular.com> + + * gst/closedcaption/gstcea608mux.c: + cea608mux: fix overflow when calculating output PTS + In the presence of a 60000 / 1001 framerate, the previous method of calculation + would overflow after 10 hours. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10726> + +2026-01-11 20:44:46 -0500 Daniel Morin <daniel.morin@collabora.com> + + * ext/analyticsoverlay/gstobjectdetectionoverlay.c: + objectdetectionoverlay: add support for rotated bounding boxes + - Use angle from GstAnalyticsODMtd + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10671> + +2026-01-21 16:24:50 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/wayland/gstwlwindow.c: + wayland: Fix CLAMP operation of maxFALL and maxCLL + The CLAMP operation was simply called the wrong way, which resulted in returning + the original value without clipping. This fixes !9353. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10685> + +2026-01-30 16:09:30 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix race condition when negotiating during playback + Follow up to 376eee3bb1250cdf0f4aeab9f362c01f291dfd55 - this change + should have the same intended effect but removes a rare race condition. + After the above commit it became possible for the output loop to be + active in two threads at once and attempt to push frames from both, + possibly out of order. That's because both the thread that calls + set_format() and the normal output loop thread would eventually end up + calling drain_decoder(). When that happened, the srcpad task loop would + quit correctly, but the manual call to the output loop function in + drain_decoder() could get stuck due to the drain/flush flags being reset + from the other thread. + This change makes sure we never call the output loop from anywhere else + than the srcpad task. Instead of that, the output loop will not pause + while drain/flush is active as long as there are any frames in the + output queue. This makes sure that in drain_decoder(), when we request + the loop to pause, all frames will be out by the time that call returns. + At the same time, a pause requested from change_state() won't be + affected. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10715> + +2026-01-30 16:08:41 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Add more debug logging + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10715> + +2026-01-30 16:26:36 +0100 François Laignel <francois@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: fix reverse playback + Problem found rendering an F32 stream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10712> + +2026-01-29 16:49:26 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Don't re-create session if only the framerate changed + Playing back some fMP4 files can trigger caps events at fragment + boundaries where only the framerate changes. We shouldn't re-create the + decoder session in this case, because the new fragment may still depend + on reference frames from the previous fragment. Re-creating the session + makes VT unable to decode a part of the new fragment, resulting in + missing frames for a while. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10702> + +2026-01-23 13:13:08 +0100 Rinat Zeh <rinat.zeh@i-rz.de> + + * ext/mpeghdec/gstmpeghdec.c: + mpeghdec: memory leak fix in MPEG-H Audio decoder plugin + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10687> + +2026-01-23 20:06:11 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + * gst/audiobuffersplit/gstaudiobuffersplit.h: + audiobuffersplit: Implement negative rates correctly + Change segments with negative rates to segments with positive rate and negated + applied rate, and accordingly adjust timestamps and reverse all samples in every + buffer before passing to the adapter. + This makes sure that chunking of output buffers is still done correctly while + keeping all samples in order. Previously each buffer would be output with + samples in positive order, but there would be discontinuities with jumps + backward at every input buffer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-23 15:40:01 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Convert gap events to silence buffers + Otherwise they would potentially pass ahead of previous buffers that are still + in the adapter, or otherwise cause inconsistent output. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-20 13:12:28 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Handle SEGMENT_DONE the same way as EOS + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-20 13:13:48 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Send any pending segment before EOS/SEGMENT_DONE + This is still not entirely correct but at least makes sure that a pending segment is sent downstream at all. + See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6019 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-16 18:19:08 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Log if an input buffer has the discont flag set or not + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-16 18:18:40 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Don't use floating point divisions unnecessarily + Also rename variables for clarity. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-16 18:17:42 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Use the output segment for output related calculations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-16 18:17:00 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Correctly calculate adapter start/end running time for negative rates + Running time still increases normally. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670> + +2026-01-19 03:03:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: + vulkan/ios: Fix scaling and resizing with UIView + * layoutSubviews was misspelled, so it was never being called + * Vulkan wants the size in pixels, and the CGRect is in points, so it + must be scaled + * Update drawable size when the window object changes + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10669> + +2025-12-04 10:55:18 -0800 Deepa Guthyappa Madivalara <deepa.madivalara@oss.qualcomm.com> + + * sys/v4l2codecs/linux/videodev2.h: + v4l2: Add support for AV1 V4l2 decoder + Introduce support for new pixelformat V4L2_PIX_FMT_AV1 + mapping to AV01. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10664> + +2026-01-28 13:31:14 +0000 freedesktop <andreas.campagna@ac-cloud.eu> + + * gst-libs/gst/play/gstplay.c: + gstplay: fix reference counting + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10660> + +2026-01-28 11:51:07 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst/tensordecoders/gstclassifiertensordecoder.c: + classifiertensordecoder: Fix uninitialized variable compiler warning + And also remove some dead code: self->class_quark is always set at this point. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4871 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10656> + +2026-01-28 11:50:10 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst-libs/gst/va/gstvadisplay.c: + vadisplay: Fix a couple of new const-ness warnings around strstr() usage + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4871 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10656> + +2026-01-28 10:22:21 +0000 Philippe Normand <philn@igalia.com> + + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Check the presence of encoding-name fields in answer caps + The caps returned by `gst_sdp_media_get_caps_from_media()` can potentially be + incomplete if the input SDP has been altered by a third party, so in those cases + skip to the next payload when processing answer caps. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10662> + +2026-01-27 17:36:15 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Implement drain() to allow reverse playback + Outputs what it can output and then flushes the leftovers in case there was an error when + pushing frames downstream. Matches v4l2dec's behaviour. + Without this `gst_video_decoder_drain_out()` would do nothing and reverse playback + would just get stuck. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10654> + +2026-01-27 17:22:47 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Make sure to reset last flow return when flushing + Otherwise if we hit e.g. an EOS before a flush, it could stick around + and cause any following frames to be ignored in handle_frame(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10654> + +2026-01-27 16:40:29 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix a very slight race in handle_frame() when flushing + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10654> + +2026-01-21 11:12:52 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Always reset flushing flag in flush() + Previous version assumed that flush-stop would always be received after a flush() call, but the base video decoder class + will just simply use that function in reverse playback without sending any events, causing the flag to be stuck. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10654> + +2026-01-22 16:32:27 +0900 Seungha Yang <seungha@centricular.com> + + * gst/codectimestamper/gstcodectimestamper.c: + codectimestamper: Fix latency query handling + Add missing max latency value update + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10653> + +2026-01-20 14:25:52 +0100 François Laignel <francois@centricular.com> + + * gst/mxf/mxfdemux.c: + mxfdemux: always send a segment before sending eos or segment-done + When a seek was requested past the end of the stream an eos or segment-done + event was sent without the segment event. + The segment event is sent before the first buffer is pushed and it takes care + of adjusting the segment with regard to the max_temporal_offset + (see in `gst_mxf_demux_handle_generic_container_essence_element ()`). If no + buffer can be sent, the segment is not sent. + This commit makes sure a segment is sent before pushing any eos or + segment-done event. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10650> + +2025-12-11 15:51:03 +0100 Edward Hervey <edward@centricular.com> + + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Simplify initial packet handling + * If there's no payload, we don't care about it + * If we have a non-PUSI packet and we are empty, return early + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10643> + +2025-11-14 16:04:04 +0100 Edward Hervey <edward@centricular.com> + + tsdemux: Fix Continuity Counter handling + If a stream has a continuity counter issue we need to immediately: + * Drop all pending data, **NOT** flush it downstream (it's incomplete) + * Not use that packet, even if it's a PUSI. + This avoids two issues with PES: + * Processing: a PES Header .. which might come from a misordered packet, + introducing bogus timing observations. + * Sending: half-complete PES payload downstream when discontinuity happens, + which can confuse several bytestream-based codecs/parsers (which rely on a + bytecode sequence to detect boundaries, and not a specific payload size). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10643> + +2026-01-13 16:01:28 +0100 François Laignel <francois@centricular.com> + + * gst/mxf/mxfdemux.c: + mxfdemux: fix gst_mxf_demux_pad_get_stream_time () + `gst_mxf_demux_pad_get_stream_time ()` was only considering the `material_track` + edit rate while other time related functions such as + `gst_mxf_demux_pad_get_current_time ()` use the `material_track` edit rate when + summing the duration of all the previous essence track, then use current + essence track edit rate for the essence track position. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10633> + +2025-11-14 15:15:53 +0100 Edward Hervey <edward@centricular.com> + + * gst/mpegtsdemux/mpegtspacketizer.c: + mpegtspacketizer: Handle clock change/resets without skew correction + While we don't want to calculate and apply a skew correction, we still need to + detect whether upstream clock changed + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10635> + +2026-01-09 17:05:35 +0200 Sebastian Dröge <sebastian@centricular.com> + + * sys/aja/gstajasinkcombiner.cpp: + ajasink: Only allow 6 / 8 / 16 audio channels + Any other value is rejected by the SDK and driver, see implementation of + `CNTV2Card::SetNumberAudioChannels()`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10624> + +2026-01-14 14:06:04 +0100 Xabier Rodriguez Calvar <calvaris@igalia.com> + + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/transportstream.c: + * gst-libs/gst/webrtc/nice/nicestream.c: + webrtc: sink floating refs of ICE transports + We should be returning full refs instead of floating refs when get them queried + from properties and we were not because references were not sunk after creation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10627> + +2026-01-05 19:15:10 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudamemorycopy.c: + cudaupload, cudadownload: Fix CUDA/GL interop copy path + Avoid requiring an element-owned GL context when copying between + CUDA and GL memory, since the GL context is already owned by + the GLMemory object + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10620> + +2026-01-27 18:25:19 +0100 Piotr Brzeziński <piotr@centricular.com> + + * ext/dash/meson.build: + * ext/smoothstreaming/meson.build: + * ext/ttml/meson.build: + meson: Fix libxml2 not building due to wrong option type + 'python' was moved from a boolean to a feature a few months ago and + 4f4260dbe3489699aba0a724a3d55020666a0d6a pulled that in on our side. + Notably, this was causing adaptivedemux2 to not build on my system. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10618> + +2026-01-27 17:10:54 +0000 Tim-Philipp Müller <tim@centricular.com> + + * meson.build: + Back to development after 1.28.0 + === release 1.28.0 === 2026-01-27 17:02:33 +0000 Tim-Philipp Müller <tim@centricular.com>
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/README.md -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/README.md
Changed
@@ -1,12 +1,8 @@ -GStreamer 1.28.x stable series - -WHAT IT IS ----------- +# GStreamer This is GStreamer, a framework for streaming media. -WHERE TO START --------------- +## Where to start We have a website at @@ -28,169 +24,598 @@ https://matrix.to/#/#gstreamer:gstreamer.org -GStreamer 1.0 series --------------------- +This repository contains all official modules supported by the GStreamer +community which can be found in the `subprojects/` directory. + +## Getting started + +### Install git and python 3.8+ + +If you're on Linux, you probably already have these. On macOS, new versions of +Xcode ship Python 3 already. If you're on an older Xcode, you can use the +official Python installer(https://www.python.org/downloads/mac-osx/). + +You can find instructions for Windows below(#windows-prerequisites-setup). + +### Install meson and ninja + +Meson 1.1 or newer is required. + +On Linux and macOS you can get meson through your package manager or using: + +``` +$ pip3 install --user meson +``` + +This will install meson into `~/.local/bin` which may or may not be included +automatically in your PATH by default. + +You should get `ninja` using your package manager or download the official +release(https://github.com/ninja-build/ninja/releases) and put the `ninja` +binary in your PATH. + +You can find instructions for Windows below(#windows-prerequisites-setup). + + +If you used the official Python installer on macOS instead of the Python +3 shipped with Xcode, you might need to execute "Install Certificates.command" +from the Python folder in the user Applications folder: + +``` +$ /Applications/Python\ 3.*/Install\ Certificates.command +``` + +Otherwise you will get this error when downloading meson wraps: + +``` +urllib.error.URLError: urlopen error SSL: CERTIFICATE_VERIFY_FAILED certificate verify failed +``` + +### Build GStreamer and its modules + +You can get all GStreamer built running: + +``` +meson setup builddir +meson compile -C builddir +``` + +This will automatically create the `builddir` directory and build everything +inside it. + +NOTE: On Windows, meson will automatically detect and use the latest Visual +Studio if GCC, clang, etc are not available in `PATH`. Use the `--vsenv` +argument to force the use of Visual Studio. + +NOTE: Meson will not update subprojects automatically once a subproject has +been fetched. Remember to update subprojects if wrap files are updated. + +``` +meson subprojects update +``` + +### External dependencies + +All mandatory dependencies of GStreamer are included as meson subprojects(https://mesonbuild.com/Subprojects.html): +libintl, zlib, libffi, glib. Some optional dependencies are also included as +subprojects, such as ffmpeg, x264, json-glib, graphene, openh264, orc, etc. + +Mandatory dependencies will be automatically built if meson cannot find them on +your system using pkg-config. The same is true for optional dependencies that +are included as subprojects. You can find a full list by looking at the +`subprojects` directory. + +Plugins that need optional dependencies that aren't included can only be built +if they are provided by the system. Instructions on how to build some common +ones such as Qt5/QML are listed below. If you do not know how to provide an +optional dependency needed by a plugin, you should use Cerbero(https://gitlab.freedesktop.org/gstreamer/cerbero/#description) +which handles this for you automatically. + +Plugins will be automatically enabled if possible, but you can ensure that +a particular plugin (especially if it has external dependencies) is built by +enabling the gstreamer repository that ships it and the plugin inside it. For +example, to enable the Qt5 plugin in the gst-plugins-good repository, you need +to run meson as follows: + +``` +meson -Dgood=enabled -Dgst-plugins-good:qt5=enabled builddir +``` + +This will cause Meson to error out if the plugin could not be enabled. You can +also flip the default and disable all plugins except those explicitly enabled +like so: + +``` +meson -Dauto_features=disabled -Dgstreamer:tools=enabled -Dbad=enabled -Dgst-plugins-bad:openh264=enabled +``` + +This will disable all optional features and then enable the `openh264` plugin +and the tools that ship with the core gstreamer repository: `gst-inspect-1.0`, +`gst-launch-1.0`, etc. As usual, you can change these values on a builddir that +has already been setup with `meson configure -Doption=value`. + +### Building the Qt5 QML plugin + +If `qmake` is not in `PATH` and pkgconfig files are not available, you can +point the `QMAKE` env var to the Qt5 installation of your choosing before +running `meson` as shown above. + +The plugin will be automatically enabled if possible, but you can ensure that +it is built by passing `-Dgood=enabled -Dgst-plugins-good:qt5=enabled` to `meson`. + +### Building the Intel MSDK plugin + +On Linux, you need to have development files for `libmfx` installed. On +Windows, if you have the Intel Media SDK(https://software.intel.com/en-us/media-sdk), +it will set the `INTELMEDIASDKROOT` environment variable, which will be used by +the build files to find `libmfx`. + +The plugin will be automatically enabled if possible, but you can ensure it by +passing `-Dbad=enabled -Dgst-plugins-bad:msdk=enabled` to `meson`. + +### Building plugins with (A)GPL-licensed dependencies + +Some plugins have GPL- or AGPL-licensed dependencies and will only be built +if you have explicitly opted in to allow (A)GPL-licensed dependencies by +passing `-Dgpl=enabled` to Meson. + +List of plugins with (A)GPL-licensed dependencies (non-exhaustive) in gst-plugins-bad: + - dts (DTS audio decoder plugin) + - faad (Free AAC audio decoder plugin) + - iqa (Image quality assessment plugin based on dssim-c) + - mpeg2enc (MPEG-2 video encoder plugin) + - mplex (audio/video multiplexer plugin) + - ofa (Open Fingerprint Architecture library plugin) + - resindvd (Resin DVD playback plugin) + - x265 (HEVC/H.265 video encoder plugin) + +List of plugins with (A)GPL-licensed dependencies (non-exhaustive) in gst-plugins-ugly: + - a52dec (Dolby Digital (AC-3) audio decoder plugin) + - cdio (CD audio source plugin based on libcdio) + - dvdread (DVD video source plugin based on libdvdread) + - mpeg2dec (MPEG-2 video decoder plugin based on libmpeg2) + - sidplay (Commodore 64 audio decoder plugin based on libsidplay) + - x264 (H.264 video encoder plugin based on libx264) + +### Static build + +Since *1.18.0*, when doing a static build using `--default-library=static`, +a shared library `gstreamer-full-1.0`, in addition to a package config file, +will be produced and includes all enabled GStreamer plugins and libraries. +A list of libraries that needs to be exposed in `gstreamer-full-1.0` +ABI can be set using `gst-full-libraries` option. +glib-2.0, gobject-2.0 and gstreamer-1.0 are always included. + +``` +meson setup --default-library=static -Dgst-full-libraries=gstreamer-app-1.0,gstreamer-video-1.0 builddir +``` + +GStreamer *1.18* requires applications using gstreamer-full-1.0 to initialize +static plugins by calling `gst_init_static_plugins()` after `gst_init()`. That +function is defined in `gst/gstinitstaticplugins.h` header file. + +Since *1.20.0*, `gst_init_static_plugins()` is called automatically by +`gst_init()` and applications don't have to call it manually any more. +The header file has been removed from public API. + +One can use the `gst-full-version-script` option to pass a +version script(https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html) +to the linker. This can be used to control the exact symbols that are exported by +the `gstreamer-full` library, allowing the linker to garbage collect unused code +and so, reduce the total library size. A default script +`gstreamer-full-default.map` declares only glib/gstreamer symbols as public. + +One can use the `gst-full-plugins` option to pass a list of plugins to be +registered in the `gstreamer-full` library. The default value is '*' +which means that all the plugins selected during the build process will be +registered statically. +An empty value will prevent any plugins to be registered. + +One can select a specific set of features with `gst-full-elements`, +`gst-full-typefind-functions`, `gst-full-device-providers` +or `gst-full-dynamic-types` to select specific feature from a plugin. +When a feature has been listed in one of those options, the other features from +its plugin will no longer be automatically included, even if the plugin +is listed in `gst-full-plugins`. + +The user must insure that all selected plugins and features (element, +typefind, etc.) have been enabled during the build configuration. + +To register features, the syntax is the following: +plugins are separated by ';' and features from a plugin starts after ':' +and are ',' separated. + +As an example: + + * `-Dgst-full-plugins=coreelements;typefindfunctions;alsa;pbtypes`: + Enable only `coreelements`, `typefindfunctions`, `alsa`, `pbtypes` plugins. + * `-Dgst-full-elements=coreelements:filesrc,fakesink,identity;alsa:alsasrc`: + Enable only `filesrc`, `identity` and `fakesink` elements from `coreelements` + plugin and `alsasrc` element from `alsa` plugin. + * `-Dgst-full-typefind-functions=typefindfunctions:wav,flv`: + Enable only typefind func `wav` and `flv` from `typefindfunctions` + * `-Dgst-full-device-providers=alsa:alsadeviceprovider`: + Enable `alsadeviceprovider` from `alsa` plugin. + * `-Dgst-full-dynamic-types=pbtypes:video_multiview_flagset`: + Enable `video_multiview_flagset` from `pbtypes`. + +All features from the `playback` plugin will be enabled and the other plugins +will be restricted to the specific features requested. + +All the selected features will be registered into a dedicated `NULL` +plugin name. + +This will cause the features/plugins that are not registered to not be included +in the final gstreamer-full library. + +This is an experimental feature, backward incompatible changes could still be +made in the future. +Only linux-like platforms are currently well supported when Windows, MSVC +and MinGW, should be considered as *experimental* as the symbols export +is still under discussion. + +Since 1.24.7, it is possible to disable the `gstreamer-full` library by passing +`-Dgst-full=disabled`. This can be useful in cases where you want a static +build of gstreamer, but you do not want to use gst-full, since linking the +static executables associated with it can be quite CPU/RAM intensive. + + +#### Full-static build + +Since *1.24.0*, it is also possible to link an application with GStreamer +statically. It means that all the gstreamer libraries will be linked within +your library or application. However, it is important to note that even though +the `gstreamer-full` library can be statically built into the application, +it does not contain all of the code (core libraries and plugins). +Instead, it relies on all the other static libraries. Hence, while the +`gstreamer-full` library provides a cohesive access point, the actual +functionality is distributed across various static libraries. +You can enable this option using `-Dgst-full-target-type=static_library` which +is by default set to `shared_library`. The buildsystem will produce a set of +archives depending on your `gstreamer-full` configuration as explained above. +Your application can now check the `gstreamer-full` dependency within meson or +with the package config file. +In both case, the application can rely on the `gstreamer-full-1.0.pc` file +generated during the build process to retrieve all its dependencies. +In that configuration, the *features* selected during the build configuration +will be automatically registered during the call of `gst_init()`. + + +### Building documentation + +Documentation is not built by default because it is slow to generate. To build +the documentation, first ensure that `hotdoc` is installed and `doc` option is +enabled. For API documentation, gobject introspection must also be enabled. +The special target `gst-doc` can then be used to (re)generate the documentation. + +```sh +$ pip install hotdoc +$ meson setup -Ddoc=enabled -Dintrospection=enabled builddir +$ meson compile -C builddir gst-doc +``` + +NOTE: To visualize the documentation, `devhelp` can be run inside the development +environment (see below). + +# Development environment + +## Development environment target + +GStreamer ships a script that drops you into a development environment where +all the plugins, libraries, and tools you just built are available: + +``` +./gst-env.py +``` + +Or with a custom builddir (i.e., not `build`, `_build` or `builddir`): + +``` +./gst-env.py --builddir <BUILDDIR> +``` + +You can also use `ninja devenv` inside your build directory to achieve the same +effect. However, this may not work on Windows if meson has auto-detected the +visual studio environment. + +Alternatively, if you'd rather not start a shell in your workflow, you +can mutate the current environment into a suitable state like so: + +``` +./gst-env.py --only-environment +``` + +This will print output suitable for an sh-compatible `eval` function, +just like `ssh-agent -s`. + +An external script can be run in development environment with: + +``` +./gst-env.py external_script.sh +``` + +NOTE: In the development environment, a fully usable prefix is also configured +in `gstreamer/prefix` where you can install any extra dependency/project. + +For more extensive documentation about the development environment go to the +documentation(https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-meson.html). + +## Windows Development Environment + +### Prerequisites + +- **Visual Studio Community 2022** (or later) with: + - Desktop development with C++ workload + - Windows SDK +- **Python 3.8+** (required for build system and gst-env.py) +- **Meson 0.59.0+** (install via pip: `pip install meson`) + +It is recommended to use Visual Studio Community 2022 and PowerShell terminal. + +Meson 0.59.0+ automatically detects and activates the Visual Studio toolchain when no other compilers are found. GStreamer should be built in a PowerShell environment for a complete user experience. + +NOTE: If you have other toolchains (MinGW, Clang, etc.) in your PATH, Meson may detect those instead of Visual Studio. To ensure Visual Studio is used: +- Remove conflicting toolchains from your Windows PATH, or +- Use the `--vsenv` flag: `meson setup --vsenv builddir`, or +- Run from a Developer PowerShell for VS 2022 which pre-configures the environment + +### Building with Visual Studio + +```powershell +meson setup builddir +meson compile -C builddir +``` + +NOTE: You should verify that Visual Studio is being detected. Look for output similar to: + +```powershell +... +Activating VS 17.x.x +... +``` + +### Using the Development Environment in PowerShell + +```powershell +python.exe gst-env.py +``` + +Or with a custom build directory: + +```powershell +python.exe gst-env.py --builddir builddir +``` + +You can also use ninja directly: + +```powershell +ninja -C builddir devenv +``` + +The development environment will configure all necessary paths (PATH, GST_PLUGIN_PATH, etc.) so you can immediately use GStreamer tools and test your changes: + +```powershell +gst-inspect-1.0.exe coreelements +gst-launch-1.0.exe videotestsrc ! autovideosink +``` + +## Custom subprojects + +We also added a meson option, `custom_subprojects`, that allows the user +to provide a comma-separated list of meson subprojects that should be built +alongside the default ones. + +To use it: + +```sh +# Clone into the subprojects directory +$ git -C subprojects clone my_subproject +# Wipe dependency detection state, in case you have an existing build dir +$ meson setup --wipe builddir -Dcustom_subprojects=my_subproject +$ meson compile -C builddir +``` + +## Run tests + +You can easily run the test of all the components: + +``` +meson test -C builddir +``` + +To list all available tests: + +``` +meson test -C builddir --list +``` + +To run all the tests of a specific component: + +``` +meson test -C builddir --suite gst-plugins-base +``` + +Or to run a specific test file: + +``` +meson test -C builddir --suite gstreamer gst_gstbuffer +``` + +Run a specific test from a specific test file: + +``` +GST_CHECKS=test_subbuffer meson test -C builddir --suite gstreamer gst_gstbuffer +``` + +## Optional Installation + +You can also install everything that is built into a predetermined prefix like +so: + +``` +meson setup --prefix=/path/to/install/prefix builddir +meson compile -C builddir +meson install -C builddir +``` + +Note that the installed files have `RPATH` stripped, so you will need to set +`LD_LIBRARY_PATH`, `DYLD_LIBRARY_PATH`, or `PATH` as appropriate for your +platform for things to work. + + +## Add information about GStreamer development environment in your prompt line + +### Bash prompt + +We automatically handle `bash` and set `$PS1` accordingly. + +If the automatic `$PS1` override is not desired (maybe you have a fancy custom +prompt), set the `$GST_BUILD_DISABLE_PS1_OVERRIDE` environment variable to +`TRUE` and use `$GST_ENV` when setting the custom prompt, for example with a +snippet like the following: + +```bash +... +if -n "${GST_ENV-}" ; +then + PS1+=" ${GST_ENV} " +fi +... +``` + +### Using powerline + +In your powerline theme configuration file (by default in +`{POWERLINE INSTALLATION DIR}/config_files/themes/shell/default.json`) +you should add a new environment segment as follow: + +``` +{ + "function": "powerline.segments.common.env.environment", + "args": { "variable": "GST_ENV" }, + "priority": 50 +}, +``` + +## Windows Prerequisites Setup + +On Windows, some of the components may require special care. + +### Git for Windows + +Use the Git for Windows(https://gitforwindows.org/) installer. It will +install a `bash` prompt with basic shell utils and up-to-date git binaries. + +During installation, when prompted about `PATH`, you should select the +following option: + +!Select "Git from the command line and also from 3rd-party software"(/data/images/git-installer-PATH.png) + +### Python 3.8+ on Windows + +Use the official Python installer(https://www.python.org/downloads/windows/). +You must ensure that Python is installed into `PATH`: + +!Enable Add Python to PATH, then click Customize Installation(/data/images/py-installer-page1.png) + +You may also want to customize the installation and install it into +a system-wide location such as `C:\PythonXY`, but this is not required. + +### Ninja on Windows -Starring +If you are using Visual Studio 2019 or newer, Ninja is already provided. - GSTREAMER +In other cases, the easiest way to install Ninja on Windows is with `pip3`, +which will download the compiled binary and place it into the `Scripts` +directory inside your Python installation: -The core around which all other modules revolve. Base functionality and -libraries, some essential elements, documentation, and testing. +``` +pip3 install ninja +``` - BASE +You can also download the official release(https://github.com/ninja-build/ninja/releases) +and place it into `PATH`, or use MSYS2. -A well-groomed and well-maintained collection of GStreamer plug-ins and -elements, spanning the range of possible types of elements one would want -to write for GStreamer. +### Meson on Windows -And introducing, for the first time ever, on the development screen ... +**IMPORTANT**: Do not use the Meson MSI installer since it is experimental and known to not +work with `GStreamer`. - THE GOOD +You can use `pip3` to install Meson, same as Ninja above: - --- "Such ingratitude. After all the times I've saved your life." +``` +pip3 install meson +``` -A collection of plug-ins you'd want to have right next to you on the -battlefield. Shooting sharp and making no mistakes, these plug-ins have it -all: good looks, good code, and good licensing. Documented and dressed up -in tests. If you're looking for a role model to base your own plug-in on, -here it is. +Note that Meson is written entirely in Python, so you can also run it as-is +from the git repository(https://github.com/mesonbuild/meson/) if you want to +use the latest master branch for some reason. -If you find a plot hole or a badly lip-synced line of code in them, -let us know - it is a matter of honour for us to ensure Blondie doesn't look -like he's been walking 100 miles through the desert without water. +### Running Meson on Windows - THE UGLY +Since version 0.59.0, Meson automatically activates the Visual Studio +environment on Windows if no other compilers (gcc, clang, etc) are found. To +force the use of Visual Studio in such cases, you can use: - --- "When you have to shoot, shoot. Don't talk." +``` +meson setup --vsenv builddir +``` -There are times when the world needs a color between black and white. -Quality code to match the good's, but two-timing, backstabbing and ready to -sell your freedom down the river. These plug-ins might have a patent noose -around their neck, or a lock-up license, or any other problem that makes you -think twice about shipping them. +### Setup a mingw/wine based development environment on linux -We don't call them ugly because we like them less. Does a mother love her -son less because he's not as pretty as the other ones ? No - she commends -him on his great personality. These plug-ins are the life of the party. -And we'll still step in and set them straight if you report any unacceptable -behaviour - because there are two kinds of people in the world, my friend: -those with a rope around their neck and the people who do the cutting. +#### Install wine and mingw - THE BAD +##### On fedora x64 - --- "That an accusation?" +``` sh +sudo dnf install mingw64-gcc mingw64-gcc-c++ mingw64-pkg-config mingw64-winpthreads wine +``` -No perfectly groomed moustache or any amount of fine clothing is going to -cover up the truth - these plug-ins are Bad with a capital B. -They look fine on the outside, and might even appear to get the job done, but -at the end of the day they're a black sheep. Without a golden-haired angel -to watch over them, they'll probably land in an unmarked grave at the final -showdown. +FIXME: Figure out what needs to be installed on other distros -Don't bug us about their quality - exercise your Free Software rights, -patch up the offender and send us the patch on the fastest steed you can -steal from the Confederates. Because you see, in this world, there's two -kinds of people, my friend: those with loaded guns and those who dig. -You dig. +#### Get meson from git -The Lowdown ------------ +This simplifies the process and allows us to use the cross files +defined in meson itself. - --- "I've never seen so many plug-ins wasted so badly." +``` sh +git clone https://github.com/mesonbuild/meson.git +``` -GStreamer Plug-ins has grown so big that it's hard to separate the wheat from -the chaff. Also, distributors have brought up issues about the legal status -of some of the plug-ins we ship. To remedy this, we've divided the previous -set of available plug-ins into four modules: +#### Build and install -- gst-plugins-base: a small and fixed set of plug-ins, covering a wide range - of possible types of elements; these are continuously kept up-to-date - with any core changes during the development series. +``` +BUILDDIR=$PWD/winebuild/ +export WINEPREFIX=$BUILDDIR/wine-prefix/ && mkdir -p $WINEPREFIX +# Setting the prefix is mandatory as it is used to setup symlinks within the development environment +meson/meson.py $BUILDDIR --cross-file meson/cross/linux-mingw-w64-64bit.txt -Dgst-plugins-bad:vulkan=disabled -Dorc:gtk_doc=disabled --prefix=$BUILDDIR/wininstall/ -Djson-glib:gtk_doc=disabled +meson/meson.py install -C $BUILDDIR/ +``` - - We believe distributors can safely ship these plug-ins. - - People writing elements should base their code on these elements. - - These elements come with examples, documentation, and regression tests. +> __NOTE__: You should use `meson install -C $BUILDDIR` each time you make a change +> instead of the usual `meson compile -C $BUILDDIR` as this is not in the +> development environment. -- gst-plugins-good: a set of plug-ins that we consider to have good quality - code, correct functionality, our preferred license (LGPL for the plug-in - code, LGPL or LGPL-compatible for the supporting library). +Alternatively, you can also use `mingw64-meson` on Fedora, which is a wrapper +script that sets things up to use Fedora's cross files and settings. However, +the wrapper script can be buggy in some cases. - - We believe distributors can safely ship these plug-ins. - - People writing elements should base their code on these elements. - -- gst-plugins-ugly: a set of plug-ins that have good quality and correct - functionality, but distributing them might pose problems. The license - on either the plug-ins or the supporting libraries might not be how we'd - like. The code might be widely known to present patent problems. +#### cross-mingw development environment - - Distributors should check if they want/can ship these plug-ins. - - People writing elements should base their code on these elements. +You can get into the development environment as usual with the gst-env.py +script: -- gst-plugins-bad: a set of plug-ins that aren't up to par compared to the - rest. They might be close to being good quality, but they're missing - something - be it a good code review, some documentation, a set of tests, - a real live maintainer, or some actual wide use. - If the blanks are filled in they might be upgraded to become part of - either gst-plugins-good or gst-plugins-ugly, depending on the other factors. +``` +./gst-env.py +``` - - If the plug-ins break, you can't complain - instead, you can fix the - problem and send us a patch, or bribe someone into fixing them for you. - - New contributors can start here for things to work on. +See above(#development-environment) for more details. -PLATFORMS ---------- +After setting up binfmt to use wine for windows binaries, +you can run GStreamer tools under wine by running: -- Linux is of course fully supported -- FreeBSD is reported to work; other BSDs should work too; same for Solaris -- MacOS works, binary 1.x packages can be built using the cerbero build tool -- Windows works; binary 1.x packages can be built using the cerbero build tool - - MSys/MinGW builds - - Microsoft Visual Studio builds are also available and supported -- Android works, binary 1.x packages can be built using the cerbero build tool -- iOS works - -INSTALLING FROM PACKAGES ------------------------- - -You should always prefer installing from packages first. GStreamer is -well-maintained for a number of distributions, including Fedora, Debian, -Ubuntu, Mandrake, Arch Linux, Gentoo, ... - -Only in cases where you: - - - want to hack on GStreamer - - want to verify that a bug has been fixed - - do not have a sane distribution - -should you choose to build from source tarballs or git. - -Find more information about the various packages at - - https://gstreamer.freedesktop.org/download/ - -For in-depth instructions about building GStreamer visit: -getting-started(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/README.md#getting-started). - -PLUG-IN DEPENDENCIES AND LICENSES ---------------------------------- - -GStreamer is developed under the terms of the LGPL (see COPYING file for -details). Some of our plug-ins however rely on libraries which are available -under other licenses. This means that if you are distributing an application -which has a non-GPL compatible license (for instance a closed-source -application) with GStreamer, you have to make sure not to distribute GPL-linked -plug-ins. - -When using GPL-linked plug-ins, GStreamer is for all practical reasons -under the GPL itself. - -HISTORY -------- +``` +gst-launch-1.0.exe videotestsrc ! glimagesink +``` -The fundamental design comes from the video pipeline at Oregon Graduate -Institute, as well as some ideas from DirectMedia. It's based on plug-ins that -will provide the various codec and other functionality. The interface -hopefully is generic enough for various companies (ahem, Apple) to release -binary codecs for Linux, until such time as they get a clue and release the -source. +binfmt: http://man7.org/linux/man-pages/man5/binfmt.d.5.html
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/RELEASE -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/RELEASE
Changed
@@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-bad 1.28.0. +This is GStreamer gst-plugins-bad 1.28.1 The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework!
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/docs/libs/codecparsers/sitemap.txt -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/docs/libs/codecparsers/sitemap.txt
Changed
@@ -1,1 +1,1 @@ -c-index +gi-index
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/docs/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/docs/meson.build
Changed
@@ -118,6 +118,7 @@ 'webrtc': webrtc_gir0.full_path(), 'audio': audio_gir0.full_path(), 'transcoder': transcoder_gir0.full_path(), + 'codecparsers': codecparsers_gir0.full_path(), 'codecs': codecs_gir0.full_path(), 'dxva': dxva_gir0.full_path(), 'mse': mse_gir0.full_path(), @@ -133,6 +134,7 @@ webrtc_gir0, audio_gir0, transcoder_gir0, + codecparsers_gir0, codecs_gir0, dxva_gir0, mse_gir0,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/docs/plugins/gst_plugins_cache.json -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/docs/plugins/gst_plugins_cache.json
Changed
@@ -7383,7 +7383,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Network", + "klass": "Source/Network", "long-name": "Audio/Video Transport Protocol (AVTP) Source", "pad-templates": { "src": { @@ -19675,7 +19675,7 @@ "signals": {} }, "videocodectestsink": { - "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com", + "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "description": "Sink to test video CODEC conformance", "hierarchy": "GstVideoCodecTestSink", @@ -19685,7 +19685,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Debug/video/Sink", + "klass": "Debug/Video/Sink", "long-name": "Video CODEC Test Sink", "pad-templates": { "sink": { @@ -22517,7 +22517,7 @@ "description": "DTLS decoder and encoder plugins", "elements": { "dtlsdec": { - "author": "Patrik Oldsberg patrik.oldsberg@ericsson.com", + "author": "Patrik Oldsberg <patrik.oldsberg@ericsson.com>", "description": "Decodes DTLS packets", "hierarchy": "GstDtlsDec", @@ -22639,7 +22639,7 @@ } }, "dtlsenc": { - "author": "Patrik Oldsberg patrik.oldsberg@ericsson.com", + "author": "Patrik Oldsberg <patrik.oldsberg@ericsson.com>", "description": "Encodes packets with DTLS", "hierarchy": "GstDtlsEnc", @@ -22749,7 +22749,7 @@ } }, "dtlssrtpdec": { - "author": "Patrik Oldsberg patrik.oldsberg@ericsson.com", + "author": "Patrik Oldsberg <patrik.oldsberg@ericsson.com>", "description": "Decodes SRTP packets with a key received from DTLS", "hierarchy": "GstDtlsSrtpDec", @@ -22828,7 +22828,7 @@ "rank": "none" }, "dtlssrtpdemux": { - "author": "Patrik Oldsberg patrik.oldsberg@ericsson.com", + "author": "Patrik Oldsberg <patrik.oldsberg@ericsson.com>", "description": "Demultiplexes DTLS and SRTP packets", "hierarchy": "GstDtlsSrtpDemux", @@ -22859,7 +22859,7 @@ "rank": "none" }, "dtlssrtpenc": { - "author": "Patrik Oldsberg patrik.oldsberg@ericsson.com", + "author": "Patrik Oldsberg <patrik.oldsberg@ericsson.com>", "description": "Encodes SRTP packets with a key received from DTLS", "hierarchy": "GstDtlsSrtpEnc", @@ -26866,7 +26866,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Filter/Analysis/Video", + "klass": "Filter/Analyzer/Video", "long-name": "Video field analysis", "pad-templates": { "sink": { @@ -37969,7 +37969,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "Ising0r", "pad-templates": { "src": { @@ -38036,7 +38036,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "Lissajous0r", "pad-templates": { "src": { @@ -38089,7 +38089,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "Nois0r", "pad-templates": { "src": { @@ -38113,7 +38113,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "onecol0r", "pad-templates": { "src": { @@ -38180,7 +38180,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "Partik0l", "pad-templates": { "src": { @@ -38233,7 +38233,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "Plasma", "pad-templates": { "src": { @@ -38342,7 +38342,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_B", "pad-templates": { "src": { @@ -38409,7 +38409,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_C", "pad-templates": { "src": { @@ -38488,7 +38488,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_G", "pad-templates": { "src": { @@ -38595,7 +38595,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_I", "pad-templates": { "src": { @@ -38702,7 +38702,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_L", "pad-templates": { "src": { @@ -38755,7 +38755,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src/Video", + "klass": "Source/Video", "long-name": "test_pat_R", "pad-templates": { "src": { @@ -42359,7 +42359,7 @@ } }, "ipcslavepipeline": { - "author": "Vincent Penquerc'h <vincent.penquerch@collabora.co.uk", + "author": "Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>", "description": "Contains the slave part of an inter-process pipeline", "hierarchy": "GstIpcSlavePipeline", @@ -243171,7 +243171,7 @@ "description": "Source and Sink for RIST TR-06-1 streaming specification", "elements": { "ristrtpdeext": { - "author": "Olivier Crete <olivier.crete@collabora.com", + "author": "Olivier Crete <olivier.crete@collabora.com>", "description": "Removes RIST TR-06-2 RTP Header extension", "hierarchy": "GstRistRtpDeext", @@ -243225,7 +243225,7 @@ "rank": "none" }, "ristrtpext": { - "author": "Olivier Crete <olivier.crete@collabora.com", + "author": "Olivier Crete <olivier.crete@collabora.com>", "description": "Adds RIST TR-06-2 RTP Header extension", "hierarchy": "GstRistRtpExt", @@ -243417,7 +243417,7 @@ "rank": "none" }, "ristsink": { - "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com", + "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "description": "Sink that implements RIST TR-06-1 streaming specification", "hierarchy": "GstRistSink", @@ -243647,7 +243647,7 @@ "rank": "primary" }, "ristsrc": { - "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com", + "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "description": "Source that implements RIST TR-06-1 streaming specification", "hierarchy": "GstRistSrc", @@ -243882,7 +243882,7 @@ "rank": "primary" }, "roundrobin": { - "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com", + "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "description": "A round robin dispatcher element.", "hierarchy": "GstRoundRobin", @@ -244826,7 +244826,7 @@ "GstChildProxy", "GstURIHandler" , - "klass": "Generic/Bin/Src", + "klass": "Generic/Bin/Source", "long-name": "RTP Source element", "pad-templates": { "src_%%u": { @@ -245849,7 +245849,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Codec/Decoder/Audio ", + "klass": "Codec/Decoder/Audio", "long-name": "Siren Decoder element", "pad-templates": { "sink": { @@ -245880,7 +245880,7 @@ "interfaces": "GstPreset" , - "klass": "Codec/Encoder/Audio ", + "klass": "Codec/Encoder/Audio", "long-name": "Siren Encoder element", "pad-templates": { "sink": { @@ -246001,7 +246001,7 @@ "url": "Unknown package origin" }, "smoothstreaming": { - "description": "Microsoft's Smooth Streaming format support ", + "description": "Microsoft's Smooth Streaming format support", "elements": { "mssdemux": { "author": "Thiago Santos <thiago.sousa.santos@collabora.com>", @@ -251097,7 +251097,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Src", + "klass": "Source", "pad-templates": { "src": { "caps": "ANY", @@ -254963,7 +254963,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Filter/Analysis", + "klass": "Video/Filter/Analyzer", "long-name": "Zebra stripe overlay", "pad-templates": { "sink": { @@ -255362,7 +255362,7 @@ "rank": "primary + 1" }, "mpegvideoparse": { - "author": "Wim Taymans <wim.taymans@ccollabora.co.uk>, Jan Schmidt <thaytan@mad.scientist.com>, Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>", + "author": "Wim Taymans <wim.taymans@collabora.co.uk>, Jan Schmidt <thaytan@mad.scientist.com>, Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>", "description": "Parses and frames MPEG-1 and MPEG-2 elementary video streams", "hierarchy": "GstMpegvParse", @@ -257820,7 +257820,7 @@ "description": "WebP plugin", "elements": { "webpdec": { - "author": "Sreerenj Balachandran <sreerenj.balachandrn@intel.com>", + "author": "Sreerenj Balachandran <sreerenj.balachandran@intel.com>", "description": "Decode images from WebP format", "hierarchy": "GstWebPDec", @@ -258912,7 +258912,7 @@ "rank": "none" }, "webrtcechoprobe": { - "author": "Nicolas Dufresne <nicolas.dufrsesne@collabora.com>", + "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "description": "Gathers playback buffers for webrtcdsp", "hierarchy": "GstWebrtcEchoProbe",
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/analyticsoverlay/gstobjectdetectionoverlay.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/analyticsoverlay/gstobjectdetectionoverlay.c
Changed
@@ -52,6 +52,7 @@ #include <gst/video/video.h> #include <gst/analytics/analytics.h> #include <pango/pangocairo.h> +#include <math.h> #include "gstobjectdetectionoverlay.h" @@ -95,6 +96,7 @@ #define MINIMUM_TEXT_OUTLINE_OFFSET 1.0 +#define ROTATION_EPSILON 0.001f /* Threshold to consider there's a rotation */ GST_DEBUG_CATEGORY_STATIC (objectdetectionoverlay_debug); #define GST_CAT_DEFAULT objectdetectionoverlay_debug @@ -1011,6 +1013,7 @@ GstAnalyticsRelationMeta * rmeta, GstAnalyticsODMtd * od_mtd) { gint x, y, w, h; + gfloat r = 0.0f; gfloat _dummy; gint maxw = GST_VIDEO_INFO_WIDTH (overlay->in_info) - 1; gint maxh = GST_VIDEO_INFO_HEIGHT (overlay->in_info) - 1; @@ -1018,7 +1021,8 @@ guint32 color; cairo_save (ctx->cr); - gst_analytics_od_mtd_get_location (od_mtd, &x, &y, &w, &h, &_dummy); + gst_analytics_od_mtd_get_oriented_location (od_mtd, &x, &y, &w, &h, &r, + &_dummy); x = CLAMP (x, 0, maxw); y = CLAMP (y, 0, maxh); @@ -1046,7 +1050,38 @@ cairo_set_line_width (ctx->cr, overlay->od_outline_stroke_width); /* draw bounding box */ - cairo_rectangle (ctx->cr, x, y, w, h); + if (fabsf (r) < ROTATION_EPSILON) { + /* Fast path: axis-aligned rectangle */ + cairo_rectangle (ctx->cr, x, y, w, h); + } else { + /* Rotated path: calculate 4 corners and draw */ + gfloat xc = x + w / 2.0f; + gfloat yc = y + h / 2.0f; + gfloat cos_r = cosf (r); + gfloat sin_r = sinf (r); + + /* Corner offsets (pre-rotation, relative to center) */ + gfloat corners42 = { + {-w / 2.0f, -h / 2.0f}, /* top-left */ + {w / 2.0f, -h / 2.0f}, /* top-right */ + {w / 2.0f, h / 2.0f}, /* bottom-right */ + {-w / 2.0f, h / 2.0f} /* bottom-left */ + }; + + /* Draw rotated box */ + for (int i = 0; i < 4; i++) { + gfloat dx = cornersi0; + gfloat dy = cornersi1; + gfloat rx = dx * cos_r - dy * sin_r + xc; + gfloat ry = dx * sin_r + dy * cos_r + yc; + + if (i == 0) + cairo_move_to (ctx->cr, rx, ry); + else + cairo_line_to (ctx->cr, rx, ry); + } + cairo_close_path (ctx->cr); + } if (overlay->filled_box == FALSE) cairo_stroke (ctx->cr);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/avtp/gstavtpsrc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/avtp/gstavtpsrc.c
Changed
@@ -118,7 +118,7 @@ gst_element_class_set_static_metadata (element_class, "Audio/Video Transport Protocol (AVTP) Source", - "Src/Network", "Receive AVTPDUs from the network", + "Source/Network", "Receive AVTPDUs from the network", "Andre Guedes <andre.guedes@intel.com>"); basesrc_class->start = GST_DEBUG_FUNCPTR (gst_avtp_src_start);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dash/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dash/meson.build
Changed
@@ -80,7 +80,7 @@ xml2_dep = dependency('libxml-2.0', version : '>= 2.8', required : get_option('dash'), - default_options: {'python': false}, + default_options: {'python': 'disabled'}, ) if xml2_dep.found()
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dtls/gstdtlsdec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dtls/gstdtlsdec.c
Changed
@@ -199,7 +199,7 @@ gst_element_class_set_static_metadata (element_class, "DTLS Decoder", "Decoder/Network/DTLS", - "Decodes DTLS packets", "Patrik Oldsberg patrik.oldsberg@ericsson.com"); + "Decodes DTLS packets", "Patrik Oldsberg <patrik.oldsberg@ericsson.com>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dtls/gstdtlsenc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dtls/gstdtlsenc.c
Changed
@@ -179,7 +179,7 @@ "DTLS Encoder", "Encoder/Network/DTLS", "Encodes packets with DTLS", - "Patrik Oldsberg patrik.oldsberg@ericsson.com"); + "Patrik Oldsberg <patrik.oldsberg@ericsson.com>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dtls/gstdtlssrtpdec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dtls/gstdtlssrtpdec.c
Changed
@@ -164,7 +164,7 @@ "DTLS-SRTP Decoder", "Decoder/Network/DTLS/SRTP", "Decodes SRTP packets with a key received from DTLS", - "Patrik Oldsberg patrik.oldsberg@ericsson.com"); + "Patrik Oldsberg <patrik.oldsberg@ericsson.com>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dtls/gstdtlssrtpdemux.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dtls/gstdtlssrtpdemux.c
Changed
@@ -81,7 +81,7 @@ "DTLS SRTP Demultiplexer", "DTLS/SRTP/Demux", "Demultiplexes DTLS and SRTP packets", - "Patrik Oldsberg patrik.oldsberg@ericsson.com"); + "Patrik Oldsberg <patrik.oldsberg@ericsson.com>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/dtls/gstdtlssrtpenc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/dtls/gstdtlssrtpenc.c
Changed
@@ -170,7 +170,7 @@ "DTLS-SRTP Encoder", "Encoder/Network/DTLS/SRTP", "Encodes SRTP packets with a key received from DTLS", - "Patrik Oldsberg patrik.oldsberg@ericsson.com"); + "Patrik Oldsberg <patrik.oldsberg@ericsson.com>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/ladspa/gstladspa.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/ladspa/gstladspa.c
Changed
@@ -137,10 +137,17 @@ #if defined (G_OS_WIN32) #define GST_LADSPA_ENVVARS "APPDATA/LADSPA:COMMONPROGRAMFILES/LADSPA" #define GST_LADSPA_DEFAULT_PATH "" -#elif defined (HAVE_OSX) +#define GST_MODULE_SUFFIX ".dll" +#elif defined (__APPLE__) +#include <TargetConditionals.h> +#if TARGET_OS_OSX #define GST_LADSPA_ENVVARS "HOME/Library/Audio/Plug-Ins/LADSPA:HOME/.ladspa" #define GST_LADSPA_DEFAULT_PATH \ "/usr/local/lib/ladspa:/usr/lib/ladspa:/Library/Audio/Plug-Ins/LADSPA" +#endif +#define GST_MODULE_SUFFIX ".so" +#define GST_EXTRA_MODULE_SUFFIX ".dylib" +// No default paths on non-macOS #elif defined (G_OS_UNIX) #define GST_LADSPA_ENVVARS "HOME/.ladspa" #define GST_LADSPA_DEFAULT_PATH \ @@ -149,6 +156,7 @@ "/usr/local/lib/ladspa:" \ "/usr/local/lib64/ladspa:" \ LIBDIR "/ladspa" +#define GST_MODULE_SUFFIX ".so" #else #error "Unsupported OS" #endif @@ -305,7 +313,7 @@ while ((entry_name = g_dir_read_name (dir))) { /* Only attempt to open files with the module suffixes */ - if (!g_str_has_suffix (entry_name, "." G_MODULE_SUFFIX) + if (!g_str_has_suffix (entry_name, GST_MODULE_SUFFIX) #ifdef GST_EXTRA_MODULE_SUFFIX && !g_str_has_suffix (entry_name, GST_EXTRA_MODULE_SUFFIX) #endif @@ -355,12 +363,18 @@ ladspa_path = g_string_new (NULL); search_path = g_getenv ("LADSPA_PATH"); + +#ifdef GST_LADSPA_DEFAULT_PATH if (search_path) { g_string_append_printf (ladspa_path, "%s" G_SEARCHPATH_SEPARATOR_S GST_LADSPA_DEFAULT_PATH, search_path); } else { g_string_append (ladspa_path, GST_LADSPA_DEFAULT_PATH); } +#else + if (search_path) + g_string_append (ladspa_path, search_path); +#endif #ifdef G_OS_WIN32 path = g_getenv ("APPDATA"); @@ -393,7 +407,7 @@ else g_string_append_printf (ladspa_path, "%s/.ladspa", path); -#if defined (HAVE_IOS) || defined (HAVE_OSX) +#if defined (__APPLE__) && defined (TARGET_OS_OSX) g_string_append_printf (ladspa_path, ":%s/Library/Audio/Plug-Ins/LADSPA", path); #endif @@ -463,9 +477,11 @@ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif +#if defined(GST_LADSPA_ENVVARS) && defined(GST_LADSPA_DEFAULT_PATH) gst_plugin_add_dependency_simple (plugin, "LADSPA_PATH:" GST_LADSPA_ENVVARS, GST_LADSPA_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE); +#endif #ifdef HAVE_LRDF lrdf_init ();
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/lv2/gstlv2.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/lv2/gstlv2.c
Changed
@@ -53,10 +53,14 @@ #if defined (G_OS_WIN32) #define GST_LV2_ENVVARS "APPDATA/LV2:COMMONPROGRAMFILES/LV2" #define GST_LV2_DEFAULT_PATH NULL -#elif defined (HAVE_OSX) +#elif defined (__APPLE__) +#include <TargetConditionals.h> +#if TARGET_OS_OSX #define GST_LV2_ENVVARS "HOME/Library/Audio/Plug-Ins/LV2:HOME/.lv2" #define GST_LV2_DEFAULT_PATH \ "/usr/local/lib/lv2:/usr/lib/lv2:/Library/Audio/Plug-Ins/LV2" +#endif +// No defaults paths on non-macOS #elif defined (G_OS_UNIX) #define GST_LV2_ENVVARS "HOME/.lv2" #define GST_LV2_DEFAULT_PATH \ @@ -323,9 +327,11 @@ gst_lv2_side_right_role_node = lilv_new_uri (gst_lv2_world_node, LV2_PORT_GROUPS__sideRight); +#ifdef GST_LV2_DEFAULT_PATH gst_plugin_add_dependency_simple (plugin, "LV2_PATH:" GST_LV2_ENVVARS, GST_LV2_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_RECURSE); +#endif /* ensure GstAudioChannelPosition type is registered */ if (!gst_audio_channel_position_get_type ())
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/mpeghdec/gstmpeghdec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/mpeghdec/gstmpeghdec.c
Changed
@@ -730,6 +730,8 @@ gst_buffer_unmap (inbuf, &imap); if (err != MPEGH_DEC_OK) { GST_ERROR_OBJECT (self, "mpeghdecoder_process failed with %d", err); + GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL), + ("Call to mpeghdecoder_process failed with %d.", err), ret); goto out; } } else { @@ -737,6 +739,8 @@ err = mpeghdecoder_flushAndGet (self->dec); if (err != MPEGH_DEC_OK) { GST_ERROR_OBJECT (self, "mpeghdecoder_flushAndGet failed with %d", err); + GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL), + ("Call to mpeghdecoder_flushAndGet failed with %d.", err), ret); goto out; } } @@ -756,13 +760,17 @@ MAX_OUTBUF_SIZE, &out_info); gst_buffer_unmap (outbuf, &omap); if (err != MPEGH_DEC_OK && err != MPEGH_DEC_FEED_DATA) { + gst_buffer_unref (outbuf); GST_ERROR_OBJECT (self, "mpeghdecoder_getSamples failed with %d", err); + GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL), + ("Call to mpeghdecoder_getSamples failed with %d.", err), ret); goto out; } else { out_samples_per_channel = out_info.numSamplesPerChannel; out_samplerate = out_info.sampleRate; out_channels = out_info.numChannels; if (err == MPEGH_DEC_FEED_DATA) { + gst_buffer_unref (outbuf); continue; } } @@ -771,6 +779,7 @@ out_samples_per_channel * out_channels * sizeof (gint32)); if (!gst_mpeghdec_update_info (self, out_channels, out_samplerate)) { + gst_buffer_unref (outbuf); ret = GST_FLOW_NOT_NEGOTIATED; goto out; } @@ -803,7 +812,8 @@ MPEGH_DECODER_ERROR err; err = mpeghdecoder_flush (self->dec); if (err != MPEGH_DEC_OK) { - GST_ERROR_OBJECT (self, "flushing error: %d", err); + GST_ERROR_OBJECT (self, "Call to mpeghdecoder_flush failed with %d.", + err); } } }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/onnx/gstonnxinference.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/onnx/gstonnxinference.c
Changed
@@ -112,6 +112,7 @@ size_t output_count; gchar **output_names; GQuark *output_ids; + GstTensorDimOrder *output_dims_orders; GstTensorDataType input_data_type; bool fixedInputImageSize; double *scales; @@ -1104,6 +1105,7 @@ g_value_init (&v_tensors_set, GST_TYPE_UNIQUE_LIST); self->output_ids = g_new0 (GQuark, self->output_count); + self->output_dims_orders = g_new0 (GstTensorDimOrder, self->output_count); for (i = 0; i < self->output_count; i++) { OrtTypeInfo *output_type_info = NULL; @@ -1228,6 +1230,7 @@ /* Get dims-order from modelinfo (defaults to row-major if not specified) */ GstTensorDimOrder dims_order = gst_analytics_modelinfo_get_dims_order (modelinfo, tensor_name); + self->output_dims_ordersi = dims_order; const gchar *dims_order_str = dims_order == GST_TENSOR_DIM_ORDER_COL_MAJOR ? "col-major" : "row-major"; @@ -1351,6 +1354,8 @@ g_free (self->output_ids); self->output_ids = NULL; + g_free (self->output_dims_orders); + self->output_dims_orders = NULL; self->output_count = 0; if (self->memory_info) @@ -1731,6 +1736,7 @@ GstTensor *tensor = gst_tensor_alloc (num_dims); tmeta->tensorsi = tensor; tensor->id = self->output_idsi; + tensor->dims_order = self->output_dims_ordersi; for (j = 0; j < num_dims; ++j) tensor->dimsj = shapej;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/openh264/gstopenh264enc.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/openh264/gstopenh264enc.cpp
Changed
@@ -157,7 +157,6 @@ GstVideoCodecState * state); static GstFlowReturn gst_openh264enc_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame); -static GstFlowReturn gst_openh264enc_finish (GstVideoEncoder * encoder); static gboolean gst_openh264enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query); static void gst_openh264enc_set_usage_type (GstOpenh264Enc * openh264enc, @@ -265,7 +264,6 @@ GST_DEBUG_FUNCPTR (gst_openh264enc_handle_frame); video_encoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_openh264enc_propose_allocation); - video_encoder_class->finish = GST_DEBUG_FUNCPTR (gst_openh264enc_finish); /* define properties */ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_USAGE_TYPE, @@ -406,6 +404,7 @@ openh264enc->complexity = DEFAULT_COMPLEXITY; openh264enc->bitrate_changed = FALSE; openh264enc->max_bitrate_changed = FALSE; + openh264enc->profile = PRO_BASELINE; gst_openh264enc_set_usage_type (openh264enc, CAMERA_VIDEO_REAL_TIME); gst_openh264enc_set_rate_control (openh264enc, RC_QUALITY_MODE); } @@ -807,7 +806,8 @@ enc_params.bPrefixNalAddingCtrl = 0; enc_params.fMaxFrameRate = fps_n * 1.0 / fps_d; enc_params.iLoopFilterDisableIdc = openh264enc->deblocking_mode; - enc_params.sSpatialLayers0.uiProfileIdc = gst_openh264enc_get_profile_from_caps (outcaps, allowed_caps); + openh264enc->profile = gst_openh264enc_get_profile_from_caps (outcaps, allowed_caps); + enc_params.sSpatialLayers0.uiProfileIdc = openh264enc->profile; enc_params.sSpatialLayers0.uiLevelIdc = (ELevelIdc) gst_openh264enc_get_level_from_caps (outcaps, allowed_caps); enc_params.sSpatialLayers0.iVideoWidth = enc_params.iPicWidth; enc_params.sSpatialLayers0.iVideoHeight = enc_params.iPicHeight; @@ -921,100 +921,66 @@ GST_OBJECT_UNLOCK (openh264enc); - if (frame) { - src_pic = g_new0 (SSourcePicture, 1); - - if (src_pic == NULL) { - if (frame) - gst_video_codec_frame_unref (frame); - return GST_FLOW_ERROR; - } - //fill default src_pic - src_pic->iColorFormat = videoFormatI420; - src_pic->uiTimeStamp = frame->pts / GST_MSECOND; + src_pic = g_new0 (SSourcePicture, 1); + if (src_pic == NULL) { + gst_video_codec_frame_unref (frame); + return GST_FLOW_ERROR; } + src_pic->iColorFormat = videoFormatI420; + src_pic->uiTimeStamp = frame->pts / GST_MSECOND; + openh264enc->frame_count++; - if (frame) { - if (G_UNLIKELY (openh264enc->frame_count == 1)) { - openh264enc->time_per_frame = (GST_SECOND / openh264enc->framerate); - openh264enc->previous_timestamp = frame->pts; - } else { - openh264enc->time_per_frame = (guint64) - (openh264enc->time_per_frame * 0.8 + (frame->pts - - openh264enc->previous_timestamp) * 0.2); - openh264enc->previous_timestamp = frame->pts; - if (openh264enc->frame_count % 10 == 0) { - fps = GST_SECOND / (gdouble) openh264enc->time_per_frame; - openh264enc->encoder->SetOption (ENCODER_OPTION_FRAME_RATE, &fps); - } + if (G_UNLIKELY (openh264enc->frame_count == 1)) { + openh264enc->time_per_frame = (GST_SECOND / openh264enc->framerate); + openh264enc->previous_timestamp = frame->pts; + } else { + openh264enc->time_per_frame = (guint64) + (openh264enc->time_per_frame * 0.8 + (frame->pts - + openh264enc->previous_timestamp) * 0.2); + openh264enc->previous_timestamp = frame->pts; + if (openh264enc->frame_count % 10 == 0) { + fps = GST_SECOND / (gdouble) openh264enc->time_per_frame; + openh264enc->encoder->SetOption (ENCODER_OPTION_FRAME_RATE, &fps); } } - if (frame) { - gst_video_frame_map (&video_frame, &openh264enc->input_state->info, - frame->input_buffer, GST_MAP_READ); - src_pic->iPicWidth = GST_VIDEO_FRAME_WIDTH (&video_frame); - src_pic->iPicHeight = GST_VIDEO_FRAME_HEIGHT (&video_frame); - src_pic->iStride0 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 0); - src_pic->iStride1 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 1); - src_pic->iStride2 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 2); - src_pic->pData0 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 0); - src_pic->pData1 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 1); - src_pic->pData2 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 2); - - force_keyframe = GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame); - if (force_keyframe) { - openh264enc->encoder->ForceIntraFrame (true); - GST_DEBUG_OBJECT (openh264enc, - "Got force key unit event, next frame coded as intra picture"); - } + gst_video_frame_map (&video_frame, &openh264enc->input_state->info, + frame->input_buffer, GST_MAP_READ); + src_pic->iPicWidth = GST_VIDEO_FRAME_WIDTH (&video_frame); + src_pic->iPicHeight = GST_VIDEO_FRAME_HEIGHT (&video_frame); + src_pic->iStride0 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 0); + src_pic->iStride1 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 1); + src_pic->iStride2 = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, 2); + src_pic->pData0 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 0); + src_pic->pData1 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 1); + src_pic->pData2 = GST_VIDEO_FRAME_COMP_DATA (&video_frame, 2); + + force_keyframe = GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame); + if (force_keyframe) { + openh264enc->encoder->ForceIntraFrame (true); + GST_DEBUG_OBJECT (openh264enc, + "Got force key unit event, next frame coded as intra picture"); } memset (&frame_info, 0, sizeof (SFrameBSInfo)); ret = openh264enc->encoder->EncodeFrame (src_pic, &frame_info); if (ret != cmResultSuccess) { - if (frame) { - gst_video_frame_unmap (&video_frame); - gst_video_codec_frame_unref (frame); - g_free (src_pic); - GST_ELEMENT_ERROR (openh264enc, STREAM, ENCODE, - ("Could not encode frame"), ("Openh264 returned %d", ret)); - return GST_FLOW_ERROR; - } else { - return GST_FLOW_EOS; - } - } - - if (videoFrameTypeSkip == frame_info.eFrameType) { - if (frame) { - gst_video_frame_unmap (&video_frame); - gst_video_encoder_finish_frame (encoder, frame); - g_free (src_pic); - } - - return GST_FLOW_OK; - } - - if (frame) { gst_video_frame_unmap (&video_frame); gst_video_codec_frame_unref (frame); g_free (src_pic); - src_pic = NULL; - frame = NULL; - } - - /* FIXME: openh264 has no way for us to get a connection - * between the input and output frames, we just have to - * guess based on the input */ - frame = gst_video_encoder_get_oldest_frame (encoder); - if (!frame) { GST_ELEMENT_ERROR (openh264enc, STREAM, ENCODE, - ("Could not encode frame"), ("openh264enc returned %d", ret)); - gst_video_codec_frame_unref (frame); + ("Could not encode frame"), ("Openh264 returned %d", ret)); return GST_FLOW_ERROR; } + gst_video_frame_unmap (&video_frame); + g_free (src_pic); + + if (videoFrameTypeSkip == frame_info.eFrameType) { + return gst_video_encoder_finish_frame (encoder, frame); + } + if (videoFrameTypeIDR == frame_info.eFrameType) { GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); } else { @@ -1030,37 +996,22 @@ frame->output_buffer = gst_video_encoder_allocate_output_buffer (encoder, buf_length); - buf_length = 0; for (i = 0; i < frame_info.iLayerNum; i++) { gsize layer_size = 0; for (j = 0; j < frame_info.sLayerInfoi.iNalCount; j++) { layer_size += frame_info.sLayerInfoi.pNalLengthInBytej; } - gst_buffer_fill (frame->output_buffer, buf_length, frame_info.sLayerInfoi.pBsBuf, layer_size); + gst_buffer_fill (frame->output_buffer, buf_length, + frame_info.sLayerInfoi.pBsBuf, layer_size); buf_length += layer_size; } - GST_LOG_OBJECT (openh264enc, "openh264 picture %scoded OK!", - (ret != cmResultSuccess) ? "NOT " : ""); + GST_LOG_OBJECT (openh264enc, "openh264 picture coded OK!"); return gst_video_encoder_finish_frame (encoder, frame); } -static GstFlowReturn -gst_openh264enc_finish (GstVideoEncoder * encoder) -{ - GstOpenh264Enc *openh264enc = GST_OPENH264ENC (encoder); - - if (openh264enc->frame_count == 0) - return GST_FLOW_OK; - - /* Drain encoder */ - while ((gst_openh264enc_handle_frame (encoder, NULL)) == GST_FLOW_OK); - - return GST_FLOW_OK; -} - static gboolean openh264enc_element_init (GstPlugin * plugin) {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/openh264/gstopenh264enc.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/openh264/gstopenh264enc.h
Changed
@@ -93,6 +93,7 @@ ECOMPLEXITY_MODE complexity; gboolean bitrate_changed; gboolean max_bitrate_changed; + EProfileIdc profile; }; struct _GstOpenh264EncClass
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/openni2/gstopenni2src.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/openni2/gstopenni2src.cpp
Changed
@@ -156,7 +156,7 @@ gst_element_class_set_static_metadata (element_class, "Openni2 client source", "Source/Video", - "Extract readings from an OpenNI supported device (Kinect etc). ", + "Extract readings from an OpenNI supported device (Kinect etc.)", "Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>"); element_class->change_state = gst_openni2_src_change_state;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/sctp/usrsctp/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/sctp/usrsctp/meson.build
Changed
@@ -64,7 +64,7 @@ compile_args += compiler.get_supported_arguments( '-Wno-address-of-packed-member', ) -elif system in 'darwin', 'ios' +elif host_system == 'darwin' compile_args += '-D__APPLE_USE_RFC_2292', + compiler.get_supported_arguments(
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/smoothstreaming/gstsmoothstreaming-plugin.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/smoothstreaming/gstsmoothstreaming-plugin.c
Changed
@@ -37,5 +37,5 @@ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, smoothstreaming, - "Microsoft's Smooth Streaming format support ", + "Microsoft's Smooth Streaming format support", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/smoothstreaming/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/smoothstreaming/meson.build
Changed
@@ -21,7 +21,7 @@ } xml28_dep = dependency('libxml-2.0', version: '>= 2.8', required: get_option('smoothstreaming'), - default_options: {'python': false}) + default_options: {'python': 'disabled'}) if xml28_dep.found() gstmss = library('gstsmoothstreaming',
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/ttml/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/ttml/meson.build
Changed
@@ -1,5 +1,5 @@ libxml_dep = dependency('libxml-2.0', version : '>= 2.9.2', required : get_option('ttml'), - default_options: {'python': false}) + default_options: {'python': 'disabled'}) pango_dep = dependency('pango', required : get_option('ttml')) cairo_dep = dependency('cairo', required : get_option('ttml')) pangocairo_dep = dependency('pangocairo', required : get_option('ttml'))
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/vulkan/vkav1dec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/vulkan/vkav1dec.c
Changed
@@ -806,11 +806,6 @@ guint8 ref_frame_sign_bias = 0; guint8 i; - for (i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; i++) { - ref_frame_sign_bias |= (fh->ref_frame_sign_biasi <= 0) << i; - stdav1_ref->SavedOrderHintsi = fh->order_hintsi; - } - /* *INDENT-OFF* */ *stdav1_ref = (StdVideoDecodeAV1ReferenceInfo) { .flags = (StdVideoDecodeAV1ReferenceInfoFlags) { @@ -818,10 +813,15 @@ .segmentation_enabled = fh->segmentation_params.segmentation_enabled, }, .frame_type = (StdVideoAV1FrameType)fh->frame_type, - .RefFrameSignBias = ref_frame_sign_bias, .OrderHint = fh->order_hint, }; + for (i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; i++) { + ref_frame_sign_bias |= (fh->ref_frame_sign_biasi <= 0) << i; + stdav1_ref->SavedOrderHintsi = fh->order_hintsi; + } + stdav1_ref->RefFrameSignBias = ref_frame_sign_bias; + *vkav1_slot = (VkVideoDecodeAV1DpbSlotInfoKHR) { .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR, .pStdReferenceInfo = stdav1_ref,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/webp/gstwebpdec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/webp/gstwebpdec.c
Changed
@@ -104,7 +104,7 @@ &gst_webp_dec_sink_pad_template); gst_element_class_set_static_metadata (element_class, "WebP image decoder", "Codec/Decoder/Image", "Decode images from WebP format", - "Sreerenj Balachandran <sreerenj.balachandrn@intel.com>"); + "Sreerenj Balachandran <sreerenj.balachandran@intel.com>"); g_object_class_install_property (gobject_class, PROP_BYPASS_FILTERING, g_param_spec_boolean ("bypass-filtering", "Bypass Filtering",
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/webrtc/gstwebrtcbin.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/webrtc/gstwebrtcbin.c
Changed
@@ -2864,6 +2864,7 @@ if (!(sctp_transport = webrtc->priv->sctp_transport)) { sctp_transport = webrtc_sctp_transport_new (); + gst_object_ref_sink (sctp_transport); sctp_transport->transport = g_object_ref (webrtc->priv->data_channel_transport->transport); sctp_transport->webrtcbin = webrtc; @@ -4714,12 +4715,23 @@ guint answer_caps_size = gst_caps_get_size (answer_caps); for (guint l = 0; l < answer_caps_size; l++) { const GstStructure *s = gst_caps_get_structure (answer_caps, l); - const gchar *enc_name = gst_structure_get_string (s, "encoding-name"); - gchar *tmp = g_ascii_strdown (enc_name, -1); + const gchar *enc_name = NULL; + gchar *tmp = NULL; gint target_pt = -1; gint original_target_pt = -1; guint target_ssrc = 0; + enc_name = gst_structure_get_string (s, "encoding-name"); + + /* The SDP might have been munged and we have no guarantee that + * gst_sdp_media_get_caps_from_media() adds an encoding-name field to all caps. */ + if (!enc_name) { + GST_WARNING_OBJECT (webrtc, + "encoding-name missing in %" GST_PTR_FORMAT, s); + continue; + } + + tmp = g_ascii_strdown (enc_name, -1); if (g_strv_contains (disallowed_payloads, tmp)) { g_free (tmp); continue;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/webrtc/transportstream.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/webrtc/transportstream.c
Changed
@@ -229,7 +229,8 @@ GstWebRTCBin *webrtc; GstWebRTCICETransport *ice_trans; - stream->transport = gst_webrtc_dtls_transport_new (stream->session_id); + stream->transport = + gst_object_ref_sink (gst_webrtc_dtls_transport_new (stream->session_id)); webrtc = GST_WEBRTC_BIN (gst_object_get_parent (GST_OBJECT (object)));
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/webrtcdsp/gstwebrtcechoprobe.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/webrtcdsp/gstwebrtcechoprobe.cpp
Changed
@@ -265,7 +265,7 @@ "Acoustic Echo Canceller probe", "Generic/Audio", "Gathers playback buffers for webrtcdsp", - "Nicolas Dufresne <nicolas.dufrsesne@collabora.com>"); + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/ext/zxing/gstzxing.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/ext/zxing/gstzxing.cpp
Changed
@@ -62,9 +62,12 @@ #include <gst/video/video.h> -#include "ReadBarcode.h" -#include "TextUtfEncoding.h" -#include "ZXVersion.h" +#if __has_include("ZXing/WriteBarcode.h") /* only available in version >= 3.x */ +#include "ZXing/ZXingCpp.h" /* future proof one-stop-shop header */ +#else +#include "ZXing/ReadBarcode.h" +#include "ZXing/ZXVersion.h" +#endif using namespace ZXing; @@ -139,7 +142,7 @@ {BARCODE_FORMAT_CODE_39, "CODE_39", "code_39"}, {BARCODE_FORMAT_CODE_93, "CODE_93", "code_93"}, {BARCODE_FORMAT_CODE_128, "CODE_128", "code_128"}, - {BARCODE_FORMAT_DATA_MATRIX, "PNG", "png"}, + {BARCODE_FORMAT_DATA_MATRIX, "DATA_MATRIX", "data_matrix"}, {BARCODE_FORMAT_EAN_8, "EAN_8", "ean_8"}, {BARCODE_FORMAT_EAN_13, "EAN_13", "ean_13"}, {BARCODE_FORMAT_ITF, "ITF", "itf"}, @@ -392,7 +395,11 @@ switch (in_info->finfo->format) { case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xRGB: + #if ZXING_VERSION_MAJOR >= 3 + zxing->image_format = ImageFormat::ARGB; + #else zxing->image_format = ImageFormat::XRGB; + #endif break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: @@ -415,7 +422,8 @@ GstZXing *zxing = GST_ZXING (vfilter); gpointer data; gint height, width; - #if ZXING_VERSION_MAJOR >= 2 && ZXING_VERSION_MINOR >= 2 + #if ZXING_VERSION_MAJOR >= 3 || \ + (ZXING_VERSION_MAJOR >= 2 && ZXING_VERSION_MINOR >= 2) ReaderOptions hints; #else DecodeHints hints; @@ -423,7 +431,12 @@ hints.setTryRotate(zxing->rotate); hints.setTryHarder(!zxing->faster); - hints.setFormats(BarcodeFormatFromString (barcode_formatszxing->barcode_format.value_name)); + try { + hints.setFormats(BarcodeFormatFromString (barcode_formatszxing->barcode_format.value_name)); + } catch (const std::invalid_argument&) { + /* since 3.0 zxing-cpp throws if BarcodeFormatFromString() can't parse the string. + * see https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4893#note_3325953 */ + } /* all formats we support start with an 8-bit Y plane. zxing doesn't need * to know about the chroma plane(s) */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstav1bitwriter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstav1bitwriter.c
Changed
@@ -18,6 +18,14 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:gstav1bitwriter + * @title: GstAV1BitWriter + * @short_description: Functions for writing bitstream headers + * + * Since: 1.28 + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c
Changed
@@ -21,6 +21,7 @@ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ + /** * SECTION:gstav1parser * @title: GstAV1Parser @@ -67,7 +68,7 @@ * should call gst_av1_parser_reference_frame_update() to update the parser's inside * state(such as reference information, global segmentation information, etc). * - * @since: 1.18.00 + * Since: 1.18 */ #ifdef HAVE_CONFIG_H @@ -4668,7 +4669,7 @@ } /** - * gst_av1_parser_new: + * gst_av1_parser_new: (skip) * * Allocates a new #GstAV1Parser, *
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.c
Changed
@@ -18,6 +18,14 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:gsth264bitwriter + * @title: GstH264BitWriter + * @short_description: Functions for writing bitstream headers + * + * Since: 1.28 + */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -1405,7 +1413,7 @@ /** * gst_h264_bit_writer_sei: - * @sei_messages: An array of #GstH264SEIMessage to write + * @sei_messages: (element-type GstH264SEIMessage): An array of #GstH264SEIMessage to write * @start_code: whether adding the nal start code * @data: (out): the bit stream generated by the sei messages * @size: (inout): the size in bytes of the input and output
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth264parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth264parser.c
Changed
@@ -1414,7 +1414,7 @@ /******** API *************/ /** - * gst_h264_nal_parser_new: + * gst_h264_nal_parser_new: (skip) * * Creates a new #GstH264NalParser. It should be freed with * gst_h264_nal_parser_free after use. @@ -1650,7 +1650,7 @@ * @offset: the offset in @data from which to parse the NAL unit * @size: the size of @data * @nal_length_size: the size in bytes of the AVC nal length prefix. - * @nalus: a caller allocated GArray of #GstH264NalUnit where to store parsed nal headers + * @nalus: (element-type GstH264NalUnit): a caller allocated GArray of #GstH264NalUnit where to store parsed nal headers * @consumed: (out): the size of consumed bytes * * Parses @data for packetized (e.g., avc/avc3) bitstream and @@ -2709,7 +2709,7 @@ * gst_h264_parser_parse_sei: * @nalparser: a #GstH264NalParser * @nalu: The %GST_H264_NAL_SEI #GstH264NalUnit to parse - * @messages: The GArray of #GstH264SEIMessage to fill. The caller must free it when done. + * @messages: (element-type GstH264SEIMessage): The GArray of #GstH264SEIMessage to fill. The caller must free it when done. * * Parses @nalu containing one or more Supplementary Enhancement Information messages, * and allocates and fills the @messages array. @@ -3485,7 +3485,7 @@ /** * gst_h264_create_sei_memory: * @start_code_prefix_length: a length of start code prefix, must be 3 or 4 - * @messages: (transfer none): a GArray of #GstH264SEIMessage + * @messages: (element-type GstH264SEIMessage) (transfer none): a GArray of #GstH264SEIMessage * * Creates raw byte-stream format (a.k.a Annex B type) SEI nal unit data * from @messages @@ -3509,7 +3509,7 @@ /** * gst_h264_create_sei_memory_avc: * @nal_length_size: a size of nal length field, allowed range is 1, 4 - * @messages: (transfer none): a GArray of #GstH264SEIMessage + * @messages: (element-type GstH264SEIMessage) (transfer none): a GArray of #GstH264SEIMessage * * Creates raw packetized format SEI nal unit data from @messages * @@ -3913,7 +3913,7 @@ /** * gst_h264_profile_from_string: - * @string: the descriptive name for #GstH264Profile + * @profile: the descriptive name for #GstH264Profile * * Returns a #GstH264Profile for the @string. *
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth264parser.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth264parser.h
Changed
@@ -1321,11 +1321,12 @@ }; /** - * _GstH264SEIMessage.payload.user_data_unregistered: + * GstH264SEIMessage: + * @payloadType: #GstH264SEIPayloadType + * @payload: union of all possible SEI message data types * - * User Data Unregistered - * - * Since: 1.22 + * Constains information about SEI message. The content depends on the + * @payloadType. */ struct _GstH264SEIMessage { @@ -1341,6 +1342,14 @@ GstH264MasteringDisplayColourVolume mastering_display_colour_volume; GstH264ContentLightLevel content_light_level; GstH264SEIUnhandledPayload unhandled_payload; + + /** + * GstH264SEIMessage.user_data_unregistered: + * + * User Data Unregistered + * + * Since: 1.22 + */ GstH264UserDataUnregistered user_data_unregistered; /* ... could implement more */ } payload;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.c
Changed
@@ -18,6 +18,14 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:gsth265bitwriter + * @title: GstH265BitWriter + * @short_description: Functions for writing bitstream headers + * + * Since: 1.28 + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c
Changed
@@ -72,6 +72,9 @@ #define MAX_DPB_SIZE 16 +/* ITU-T H.265 (V10) (07/2024) A.4.2, Table A.8: MaxSliceSegmentsPerPicture */ +#define GST_H265_MAX_SLICE_SEGMENTS_PER_PICTURE 1800 + #ifndef GST_DISABLE_GST_DEBUG #define GST_CAT_DEFAULT gst_h265_debug_category_get() static GstDebugCategory * @@ -770,24 +773,24 @@ static gboolean gst_h265_parser_parse_short_term_ref_pic_sets (GstH265ShortTermRefPicSet * - stRPS, NalReader * nr, guint8 stRpsIdx, GstH265SPS * sps) + stRPS, NalReader * nr, guint8 stRpsIdx, GstH265SPS * sps, + GstH265SPSEXT * sps_ext) { guint8 num_short_term_ref_pic_sets; guint8 RefRpsIdx = 0; gint16 deltaRps = 0; - guint8 use_delta_flag16 = { 0 }; - guint8 used_by_curr_pic_flag16 = { 0 }; - guint32 delta_poc_s0_minus116 = { 0 }; - guint32 delta_poc_s1_minus116 = { 0 }; gint j, i = 0; gint dPoc; + GstH265ShortTermRefPicSetExt *stRPSEXT = + &sps_ext->short_term_ref_pic_set_extstRpsIdx; + GST_DEBUG ("parsing \"ShortTermRefPicSetParameters\""); /* set default values for fields that might not be present in the bitstream and have valid defaults */ for (j = 0; j < 16; j++) - use_delta_flagj = 1; + stRPSEXT->use_delta_flagj = 1; num_short_term_ref_pic_sets = sps->num_short_term_ref_pic_sets; @@ -810,30 +813,31 @@ stRPS->NumDeltaPocsOfRefRpsIdx = RefRPS->NumDeltaPocs; for (j = 0; j <= RefRPS->NumDeltaPocs; j++) { - READ_UINT8 (nr, used_by_curr_pic_flagj, 1); - if (!used_by_curr_pic_flagj) - READ_UINT8 (nr, use_delta_flagj, 1); + READ_UINT8 (nr, stRPSEXT->used_by_curr_pic_flagj, 1); + if (!stRPSEXT->used_by_curr_pic_flagj) + READ_UINT8 (nr, stRPSEXT->use_delta_flagj, 1); } /* 7-47: calculate NumNegativePics, DeltaPocS0 and UsedByCurrPicS0 */ i = 0; for (j = (RefRPS->NumPositivePics - 1); j >= 0; j--) { dPoc = RefRPS->DeltaPocS1j + deltaRps; - if (dPoc < 0 && use_delta_flagRefRPS->NumNegativePics + j) { + if (dPoc < 0 && stRPSEXT->use_delta_flagRefRPS->NumNegativePics + j) { stRPS->DeltaPocS0i = dPoc; stRPS->UsedByCurrPicS0i++ = - used_by_curr_pic_flagRefRPS->NumNegativePics + j; + stRPSEXT->used_by_curr_pic_flagRefRPS->NumNegativePics + j; } } - if (deltaRps < 0 && use_delta_flagRefRPS->NumDeltaPocs) { + if (deltaRps < 0 && stRPSEXT->use_delta_flagRefRPS->NumDeltaPocs) { stRPS->DeltaPocS0i = deltaRps; - stRPS->UsedByCurrPicS0i++ = used_by_curr_pic_flagRefRPS->NumDeltaPocs; + stRPS->UsedByCurrPicS0i++ = + stRPSEXT->used_by_curr_pic_flagRefRPS->NumDeltaPocs; } for (j = 0; j < RefRPS->NumNegativePics; j++) { dPoc = RefRPS->DeltaPocS0j + deltaRps; - if (dPoc < 0 && use_delta_flagj) { + if (dPoc < 0 && stRPSEXT->use_delta_flagj) { stRPS->DeltaPocS0i = dPoc; - stRPS->UsedByCurrPicS0i++ = used_by_curr_pic_flagj; + stRPS->UsedByCurrPicS0i++ = stRPSEXT->used_by_curr_pic_flagj; } } stRPS->NumNegativePics = i; @@ -842,21 +846,22 @@ i = 0; for (j = (RefRPS->NumNegativePics - 1); j >= 0; j--) { dPoc = RefRPS->DeltaPocS0j + deltaRps; - if (dPoc > 0 && use_delta_flagj) { + if (dPoc > 0 && stRPSEXT->use_delta_flagj) { stRPS->DeltaPocS1i = dPoc; - stRPS->UsedByCurrPicS1i++ = used_by_curr_pic_flagj; + stRPS->UsedByCurrPicS1i++ = stRPSEXT->used_by_curr_pic_flagj; } } - if (deltaRps > 0 && use_delta_flagRefRPS->NumDeltaPocs) { + if (deltaRps > 0 && stRPSEXT->use_delta_flagRefRPS->NumDeltaPocs) { stRPS->DeltaPocS1i = deltaRps; - stRPS->UsedByCurrPicS1i++ = used_by_curr_pic_flagRefRPS->NumDeltaPocs; + stRPS->UsedByCurrPicS1i++ = + stRPSEXT->used_by_curr_pic_flagRefRPS->NumDeltaPocs; } for (j = 0; j < RefRPS->NumPositivePics; j++) { dPoc = RefRPS->DeltaPocS1j + deltaRps; - if (dPoc > 0 && use_delta_flagRefRPS->NumNegativePics + j) { + if (dPoc > 0 && stRPSEXT->use_delta_flagRefRPS->NumNegativePics + j) { stRPS->DeltaPocS1i = dPoc; stRPS->UsedByCurrPicS1i++ = - used_by_curr_pic_flagRefRPS->NumNegativePics + j; + stRPSEXT->used_by_curr_pic_flagRefRPS->NumNegativePics + j; } } stRPS->NumPositivePics = i; @@ -872,33 +877,35 @@ stRPS->NumNegativePics)); for (i = 0; i < stRPS->NumNegativePics; i++) { - READ_UE_MAX (nr, delta_poc_s0_minus1i, 32767); + READ_UE_MAX (nr, stRPSEXT->delta_poc_s0_minus1i, 32767); /* 7-51 */ READ_UINT8 (nr, stRPS->UsedByCurrPicS0i, 1); + stRPSEXT->used_by_curr_pic_flagi = stRPS->UsedByCurrPicS0i; if (i == 0) { /* 7-53 */ - stRPS->DeltaPocS0i = -(delta_poc_s0_minus1i + 1); + stRPS->DeltaPocS0i = -(stRPSEXT->delta_poc_s0_minus1i + 1); } else { /* 7-55 */ stRPS->DeltaPocS0i = - stRPS->DeltaPocS0i - 1 - (delta_poc_s0_minus1i + 1); + stRPS->DeltaPocS0i - 1 - (stRPSEXT->delta_poc_s0_minus1i + 1); } } for (j = 0; j < stRPS->NumPositivePics; j++) { - READ_UE_MAX (nr, delta_poc_s1_minus1j, 32767); + READ_UE_MAX (nr, stRPSEXT->delta_poc_s1_minus1j, 32767); /* 7-52 */ READ_UINT8 (nr, stRPS->UsedByCurrPicS1j, 1); + stRPSEXT->used_by_curr_pic_flagi + j = stRPS->UsedByCurrPicS1j; if (j == 0) { /* 7-54 */ - stRPS->DeltaPocS1j = delta_poc_s1_minus1j + 1; + stRPS->DeltaPocS1j = stRPSEXT->delta_poc_s1_minus1j + 1; } else { /* 7-56 */ stRPS->DeltaPocS1j = - stRPS->DeltaPocS1j - 1 + (delta_poc_s1_minus1j + 1); + stRPS->DeltaPocS1j - 1 + (stRPSEXT->delta_poc_s1_minus1j + 1); } } @@ -1136,7 +1143,8 @@ if (hrd->sub_pic_hrd_params_present_flag && hrd->sub_pic_cpb_params_in_pic_timing_sei_flag) { - READ_UE (nr, tim->num_decoding_units_minus1); + READ_UE_MAX (nr, tim->num_decoding_units_minus1, + GST_H265_MAX_SLICE_SEGMENTS_PER_PICTURE - 1); READ_UINT8 (nr, tim->du_common_cpb_removal_delay_flag, 1); if (tim->du_common_cpb_removal_delay_flag) @@ -1381,7 +1389,7 @@ /******** API *************/ /** - * gst_h265_parser_new: + * gst_h265_parser_new: (skip) * * Creates a new #GstH265Parser. It should be freed with * gst_h265_parser_free after use. @@ -1625,7 +1633,7 @@ * @offset: the offset from which to parse @data * @size: the size of @data * @nal_length_size: the size in bytes of the HEVC nal length prefix. - * @nalus: a caller allocated GArray of #GstH265NalUnit where to store parsed nal headers + * @nalus: (element-type GstH265NalUnit): a caller allocated GArray of #GstH265NalUnit where to store parsed nal headers * @consumed: the size of consumed bytes * * Parses @data for packetized (e.g., hvc1/hev1) bitstream and @@ -1852,7 +1860,7 @@ /** * gst_h265_parse_vps: * @nalu: The %GST_H265_NAL_VPS #GstH265NalUnit to parse - * @sps: The #GstH265VPS to fill. + * @vps: The #GstH265VPS to fill. * * Parses @data, and fills the @vps structure. * @@ -1994,22 +2002,25 @@ } /** - * gst_h265_parser_parse_sps: + * gst_h265_parser_parse_sps_ext: * @parser: a #GstH265Parser * @nalu: The %GST_H265_NAL_SPS #GstH265NalUnit to parse * @sps: The #GstH265SPS to fill. + * @sps_ext: The #GstH265SPSEXT matching the #GstH265SPS to fill. * @parse_vui_params: Whether to parse the vui_params or not * * Parses @data, and fills the @sps structure. * * Returns: a #GstH265ParserResult + * + * Since: 1.28 */ GstH265ParserResult -gst_h265_parser_parse_sps (GstH265Parser * parser, GstH265NalUnit * nalu, - GstH265SPS * sps, gboolean parse_vui_params) +gst_h265_parser_parse_sps_ext (GstH265Parser * parser, GstH265NalUnit * nalu, + GstH265SPS * sps, GstH265SPSEXT * sps_ext, gboolean parse_vui_params) { GstH265ParserResult res = - gst_h265_parse_sps (parser, nalu, sps, parse_vui_params); + gst_h265_parse_sps_ext (parser, nalu, sps, sps_ext, parse_vui_params); if (res == GST_H265_PARSER_OK) { GST_DEBUG ("adding sequence parameter set with id: %d to array", sps->id); @@ -2022,8 +2033,8 @@ } /** - * gst_h265_parse_sps: - * parser: The #GstH265Parser + * gst_h265_parser_parse_sps: + * @parser: a #GstH265Parser * @nalu: The %GST_H265_NAL_SPS #GstH265NalUnit to parse * @sps: The #GstH265SPS to fill. * @parse_vui_params: Whether to parse the vui_params or not @@ -2033,9 +2044,33 @@ * Returns: a #GstH265ParserResult */ GstH265ParserResult -gst_h265_parse_sps (GstH265Parser * parser, GstH265NalUnit * nalu, +gst_h265_parser_parse_sps (GstH265Parser * parser, GstH265NalUnit * nalu, GstH265SPS * sps, gboolean parse_vui_params) { + GstH265SPSEXT sps_ext; + + return gst_h265_parser_parse_sps_ext (parser, nalu, sps, &sps_ext, + parse_vui_params); +} + +/** + * gst_h265_parse_sps_ext: + * parser: The #GstH265Parser + * @nalu: The %GST_H265_NAL_SPS #GstH265NalUnit to parse + * @sps: The #GstH265SPS to fill. + * @sps_ext: The #GstH265SPSEXT matching the #GstH265SPS to fill. + * @parse_vui_params: Whether to parse the vui_params or not + * + * Parses @data, and fills the @sps structure. + * + * Returns: a #GstH265ParserResult + * + * Since: 1.28 + */ +GstH265ParserResult +gst_h265_parse_sps_ext (GstH265Parser * parser, GstH265NalUnit * nalu, + GstH265SPS * sps, GstH265SPSEXT * sps_ext, gboolean parse_vui_params) +{ NalReader nr; guint i; guint subwc = { 1, 2, 2, 1, 1 }; @@ -2133,7 +2168,7 @@ READ_UE_MAX (&nr, sps->num_short_term_ref_pic_sets, 64); for (i = 0; i < sps->num_short_term_ref_pic_sets; i++) if (!gst_h265_parser_parse_short_term_ref_pic_sets - (&sps->short_term_ref_pic_seti, &nr, i, sps)) + (&sps->short_term_ref_pic_seti, &nr, i, sps, sps_ext)) goto error; READ_UINT8 (&nr, sps->long_term_ref_pics_present_flag, 1); @@ -2285,6 +2320,26 @@ } /** + * gst_h265_parse_sps: + * parser: The #GstH265Parser + * @nalu: The %GST_H265_NAL_SPS #GstH265NalUnit to parse + * @sps: The #GstH265SPS to fill. + * @parse_vui_params: Whether to parse the vui_params or not + * + * Parses @data, and fills the @sps structure. + * + * Returns: a #GstH265ParserResult + */ + +GstH265ParserResult +gst_h265_parse_sps (GstH265Parser * parser, GstH265NalUnit * nalu, + GstH265SPS * sps, gboolean parse_vui_params) +{ + GstH265SPSEXT sps_ext = { 0 }; + return gst_h265_parse_sps_ext (parser, nalu, sps, &sps_ext, parse_vui_params); +} + +/** * gst_h265_parse_pps: * @parser: a #GstH265Parser * @nalu: The %GST_H265_NAL_PPS #GstH265NalUnit to parse @@ -2707,20 +2762,23 @@ } /** - * gst_h265_parser_parse_slice_hdr: + * gst_h265_parser_parse_slice_hdr_ext: * @parser: a #GstH265Parser * @nalu: The `GST_H265_NAL_SLICE` #GstH265NalUnit to parse * @slice: The #GstH265SliceHdr to fill. + * @sps_ext: The #GstH265SPSEXT to fill. * * Parses @data, and fills the @slice structure. * The resulting @slice_hdr structure shall be deallocated with * gst_h265_slice_hdr_free() when it is no longer needed * * Returns: a #GstH265ParserResult + * + * Since: 1.28 */ GstH265ParserResult -gst_h265_parser_parse_slice_hdr (GstH265Parser * parser, - GstH265NalUnit * nalu, GstH265SliceHdr * slice) +gst_h265_parser_parse_slice_hdr_ext (GstH265Parser * parser, + GstH265NalUnit * nalu, GstH265SliceHdr * slice, GstH265SPSEXT * sps_ext) { NalReader nr; gint pps_id; @@ -2819,7 +2877,7 @@ if (!gst_h265_parser_parse_short_term_ref_pic_sets (&slice->short_term_ref_pic_sets, &nr, - sps->num_short_term_ref_pic_sets, sps)) + sps->num_short_term_ref_pic_sets, sps, sps_ext)) goto error; slice->short_term_ref_pic_set_size = @@ -3076,6 +3134,27 @@ return GST_H265_PARSER_ERROR; } +/** + * gst_h265_parser_parse_slice_hdr: + * @parser: a #GstH265Parser + * @nalu: The `GST_H265_NAL_SLICE` #GstH265NalUnit to parse + * @slice: The #GstH265SliceHdr to fill. + * + * Parses @data, and fills the @slice structure. + * The resulting @slice_hdr structure shall be deallocated with + * gst_h265_slice_hdr_free() when it is no longer needed + * + * Returns: a #GstH265ParserResult + */ +GstH265ParserResult +gst_h265_parser_parse_slice_hdr (GstH265Parser * parser, + GstH265NalUnit * nalu, GstH265SliceHdr * slice) +{ + GstH265SPSEXT sps_ext; + + return gst_h265_parser_parse_slice_hdr_ext (parser, nalu, slice, &sps_ext); +} + static gboolean nal_reader_has_more_data_in_payload (NalReader * nr, guint32 payload_start_pos_bit, guint32 payloadSize) @@ -3256,7 +3335,7 @@ /** * gst_h265_sei_copy: - * @dst_sei: The destination #GstH265SEIMessage to copy into + * @dest_sei: The destination #GstH265SEIMessage to copy into * @src_sei: The source #GstH265SEIMessage to copy from * * Copies @src_sei into @dst_sei @@ -3349,9 +3428,9 @@ /** * gst_h265_parser_parse_sei: - * @nalparser: a #GstH265Parser + * @parser: a #GstH265Parser * @nalu: The `GST_H265_NAL_*_SEI` #GstH265NalUnit to parse - * @messages: The GArray of #GstH265SEIMessage to fill. The caller must free it when done. + * @messages: (element-type GstH265SEIMessage): The GArray of #GstH265SEIMessage to fill. The caller must free it when done. * * Parses @data, create and fills the @messages array. * @@ -4515,7 +4594,7 @@ * @layer_id: a nal unit layer id * @temporal_id_plus1: a nal unit temporal identifier * @start_code_prefix_length: a length of start code prefix, must be 3 or 4 - * @messages: (transfer none): a GArray of #GstH265SEIMessage + * @messages: (element-type GstH265SEIMessage) (transfer none): a GArray of #GstH265SEIMessage * * Creates raw byte-stream format (a.k.a Annex B type) SEI nal unit data * from @messages @@ -4542,7 +4621,7 @@ * @layer_id: a nal unit layer id * @temporal_id_plus1: a nal unit temporal identifier * @nal_length_size: a size of nal length field, allowed range is 1, 4 - * @messages: (transfer none): a GArray of #GstH265SEIMessage + * @messages: (element-type GstH265SEIMessage) (transfer none): a GArray of #GstH265SEIMessage * * Creates raw packetized format SEI nal unit data from @messages *
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth265parser.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth265parser.h
Changed
@@ -62,7 +62,7 @@ * Since: 1.18 */ #define GST_H265_IS_NAL_TYPE_IRAP(nal_type) \ - ((nal_type) >= GST_H265_NAL_SLICE_BLA_W_LP && (nal_type) <= RESERVED_IRAP_NAL_TYPE_MAX) + ((nal_type) >= GST_H265_NAL_SLICE_BLA_W_LP && (nal_type) <= GST_H265_RESERVED_IRAP_NAL_TYPE_MAX) /** * GST_H265_IS_NAL_TYPE_BLA: @@ -299,20 +299,20 @@ GST_H265_NAL_SUFFIX_SEI = 40 } GstH265NalUnitType; -#define RESERVED_NON_IRAP_SUBLAYER_NAL_TYPE_MIN 10 -#define RESERVED_NON_IRAP_SUBLAYER_NAL_TYPE_MAX 15 +#define GST_H265_RESERVED_NON_IRAP_SUBLAYER_NAL_TYPE_MIN 10 +#define GST_H265_RESERVED_NON_IRAP_SUBLAYER_NAL_TYPE_MAX 15 -#define RESERVED_IRAP_NAL_TYPE_MIN 22 -#define RESERVED_IRAP_NAL_TYPE_MAX 23 +#define GST_H265_RESERVED_IRAP_NAL_TYPE_MIN 22 +#define GST_H265_RESERVED_IRAP_NAL_TYPE_MAX 23 -#define RESERVED_NON_IRAP_NAL_TYPE_MIN 24 -#define RESERVED_NON_IRAP_NAL_TYPE_MAX 31 +#define GST_H265_RESERVED_NON_IRAP_NAL_TYPE_MIN 24 +#define GST_H265_RESERVED_NON_IRAP_NAL_TYPE_MAX 31 -#define RESERVED_NON_VCL_NAL_TYPE_MIN 41 -#define RESERVED_NON_VCL_NAL_TYPE_MAX 47 +#define GST_H265_RESERVED_NON_VCL_NAL_TYPE_MIN 41 +#define GST_H265_RESERVED_NON_VCL_NAL_TYPE_MAX 47 -#define UNSPECIFIED_NON_VCL_NAL_TYPE_MIN 48 -#define UNSPECIFIED_NON_VCL_NAL_TYPE_MAX 63 +#define GST_H265_UNSPECIFIED_NON_VCL_NAL_TYPE_MIN 48 +#define GST_H265_UNSPECIFIED_NON_VCL_NAL_TYPE_MAX 63 /** * GstH265ParserResult: @@ -474,6 +474,7 @@ typedef struct _GstH265VPS GstH265VPS; typedef struct _GstH265SPS GstH265SPS; +typedef struct _GstH265SPSEXT GstH265SPSEXT; typedef struct _GstH265PPS GstH265PPS; typedef struct _GstH265ProfileTierLevel GstH265ProfileTierLevel; typedef struct _GstH265SubLayerHRDParams GstH265SubLayerHRDParams; @@ -488,6 +489,7 @@ typedef struct _GstH265RefPicListModification GstH265RefPicListModification; typedef struct _GstH265PredWeightTable GstH265PredWeightTable; typedef struct _GstH265ShortTermRefPicSet GstH265ShortTermRefPicSet; +typedef struct _GstH265ShortTermRefPicSetExt GstH265ShortTermRefPicSetExt; typedef struct _GstH265SliceHdr GstH265SliceHdr; typedef struct _GstH265PicTiming GstH265PicTiming; @@ -836,6 +838,30 @@ }; /** + * GstH265ShortTermRefPicSetExt: + * @use_delta_flag: Bit j equals to 1 specifies that the j-th entry in the source candidate + * short-term RPS is included in this candidate short-term RPS. + * @used_by_curr_pic: Bit j specifies if short-term RPS j is used by the current picture. + * @delta_poc_s0_minus1: Specifies the negative picture order count delta for the i-th + * entry in the short-term RPS. See details in section 7.4.8 "Short-term reference + * picture set semantics" of the specification. + * @delta_poc_s1_minus1: Specifies the positive picture order count delta for the i-th + * entry in the short-term RPS. See details in section 7.4.8 "Short-term reference + * picture set semantics" of the specification. + * + * Defines the extended #GstH265ShortTermRefPicSetExt params + * + * Since: 1.28 + */ +struct _GstH265ShortTermRefPicSetExt +{ + guint8 use_delta_flag16; + guint8 used_by_curr_pic_flag16; + guint32 delta_poc_s0_minus116; + guint32 delta_poc_s1_minus116; +}; + +/** * GstH265VUIParams: * @parsed: %TRUE indicate that VUI parameters have been parsed (Since: 1.22) * @aspect_ratio_info_present_flag: %TRUE specifies that aspect_ratio_idc is present. @@ -1264,6 +1290,17 @@ }; /** + * GstH265SPSEXT: + * + * H265 Sequence Parameter Set extension + * + * Since: 1.28 + */ +struct _GstH265SPSEXT { + GstH265ShortTermRefPicSetExt short_term_ref_pic_set_ext65; +}; + +/** * GstH265PPS: * * H265 Picture Parameter Set @@ -1715,11 +1752,12 @@ }; /** - * _GstH265SEIMessage.payload.user_data_unregistered: - * - * User Data Unregistered + * GstH265SEIMessage: + * @payloadType: #GstH265SEIPayloadType + * @payload: union of all possible SEI message data types * - * Since: 1.24 + * Constains information about SEI message. The content depends on the + * @payloadType. */ struct _GstH265SEIMessage { @@ -1733,6 +1771,14 @@ GstH265TimeCode time_code; GstH265MasteringDisplayColourVolume mastering_display_colour_volume; GstH265ContentLightLevel content_light_level; + + /** + * GstH265SEIMessage.user_data_unregistered: + * + * User Data Unregistered + * + * Since: 1.24 + */ GstH265UserDataUnregistered user_data_unregistered; /* ... could implement more */ } payload; @@ -2095,6 +2141,12 @@ GstH265SliceHdr * slice); GST_CODEC_PARSERS_API +GstH265ParserResult gst_h265_parser_parse_slice_hdr_ext (GstH265Parser * parser, + GstH265NalUnit * nalu, + GstH265SliceHdr * slice, + GstH265SPSEXT * sps_ext); + +GST_CODEC_PARSERS_API GstH265ParserResult gst_h265_parser_parse_vps (GstH265Parser * parser, GstH265NalUnit * nalu, GstH265VPS * vps); @@ -2106,6 +2158,12 @@ gboolean parse_vui_params); GST_CODEC_PARSERS_API +GstH265ParserResult gst_h265_parser_parse_sps_ext (GstH265Parser * parser, + GstH265NalUnit * nalu, + GstH265SPS * sps, + GstH265SPSEXT * sps_ext, + gboolean parse_vui_params); +GST_CODEC_PARSERS_API GstH265ParserResult gst_h265_parser_parse_pps (GstH265Parser * parser, GstH265NalUnit * nalu, GstH265PPS * pps); @@ -2145,6 +2203,13 @@ gboolean parse_vui_params); GST_CODEC_PARSERS_API +GstH265ParserResult gst_h265_parse_sps_ext (GstH265Parser * parser, + GstH265NalUnit * nalu, + GstH265SPS * sps, + GstH265SPSEXT * sps_ext, + gboolean parse_vui_params); + +GST_CODEC_PARSERS_API GstH265ParserResult gst_h265_parse_pps (GstH265Parser * parser, GstH265NalUnit * nalu, GstH265PPS * pps);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth266parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth266parser.c
Changed
@@ -1460,7 +1460,8 @@ if (bp->du_hrd_params_present_flag && bp->du_cpb_params_in_pic_timing_sei_flag) { - READ_UE (nr, pt->num_decoding_units_minus1); + READ_UE_MAX (nr, pt->num_decoding_units_minus1, + GST_H266_MAX_DECODING_UNITS_IN_PIC_TIMING - 1); if (pt->num_decoding_units_minus1 > 0) { READ_UINT8 (nr, pt->du_common_cpb_removal_delay_flag, 1); if (pt->du_common_cpb_removal_delay_flag) { @@ -1732,7 +1733,7 @@ } /** - * gst_h266_parser_new: + * gst_h266_parser_new: (skip) * * Creates a new #GstH266Parser. It should be freed with * gst_h266_parser_free after use. @@ -1984,7 +1985,7 @@ * @offset: the offset from which to parse @data * @size: the size of @data * @nal_length_size: the size in bytes of the VVC nal length prefix. - * @nalus: a caller allocated #GArray of #GstH266NalUnit where to store parsed nal headers + * @nalus: (element-type GstH266NalUnit): a caller allocated #GArray of #GstH266NalUnit where to store parsed nal headers * @consumed: the size of consumed bytes * * Parses @data for packetized (e.g., vvc1/vvi1) bitstream and @@ -3841,15 +3842,28 @@ goto error; } - tile_idx += pps->tile_idx_delta_vali; + gint new_tile_idx = (gint) tile_idx + pps->tile_idx_delta_vali; + if (new_tile_idx < 0 || + new_tile_idx >= (gint) pps->num_tiles_in_pic) { + GST_WARNING ("tile_idx %d out of bounds.", new_tile_idx); + goto error; + } + tile_idx = new_tile_idx; } else { pps->tile_idx_delta_vali = 0; - tile_idx += pps->slice_width_in_tiles_minus1i + 1; - if (tile_idx % pps->num_tile_columns == 0) { - tile_idx += pps->slice_height_in_tiles_minus1i * + gint new_tile_idx = (gint) tile_idx + + pps->slice_width_in_tiles_minus1i + 1; + if (new_tile_idx % pps->num_tile_columns == 0) { + new_tile_idx += pps->slice_height_in_tiles_minus1i * pps->num_tile_columns; } + if (new_tile_idx < 0 || + new_tile_idx >= (gint) pps->num_tiles_in_pic) { + GST_WARNING ("tile_idx %d out of bounds.", new_tile_idx); + goto error; + } + tile_idx = new_tile_idx; } } } @@ -4598,7 +4612,7 @@ READ_UINT8 (&nr, params_type, 3); aps->params_type = params_type; READ_UINT8 (&nr, aps->aps_id, 5); - CHECK_ALLOWED_MAX (aps->aps_id, GST_H266_MAX_APS_COUNT); + CHECK_ALLOWED_MAX (aps->aps_id, GST_H266_MAX_APS_COUNT - 1); READ_UINT8 (&nr, aps->chroma_present_flag, 1); switch (aps->params_type) { @@ -5348,7 +5362,7 @@ * gst_h266_parser_parse_picture_hdr: * @parser: a #GstH266Parser * @nalu: The picture header #GstH266NalUnit to parse - * @ph: The #GstH266PicHdr to fill. + * @picture: The #GstH266PicHdr to fill. * * Parses @data, and fills the @ph structure. * @@ -5440,7 +5454,7 @@ * gst_h266_parser_parse_slice_hdr: * @parser: a #GstH266Parser * @nalu: The slice #GstH266NalUnit to parse - * @sh: The #GstH266SliceHdr to fill. + * @slice: The #GstH266SliceHdr to fill. * * Parses @data, and fills the @sh structure. * @@ -6116,9 +6130,9 @@ /** * gst_h266_parser_parse_sei: - * @nalparser: a #GstH266Parser + * @parser: a #GstH266Parser * @nalu: The `GST_H266_NAL_*_SEI` #GstH266NalUnit to parse - * @messages: The GArray of #GstH266SEIMessage to fill. The caller must free + * @messages: (element-type GstH266SEIMessage): The GArray of #GstH266SEIMessage to fill. The caller must free * it when done. * * Parses @data, create and fills the @messages array.
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gsth266parser.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gsth266parser.h
Changed
@@ -105,6 +105,11 @@ The min coding block size is 8, so min width or height is 8. The min CTU size is 32. */ #define GST_H266_MAX_CTUS_IN_PICTURE (80216064 / 8 / 32) +/* Practical limit for number of decoding units per picture. + The spec allows up to PicSizeInCtbsY which could be very large, + but 600 is a reasonable practical limit matching the array sizes + in GstH266PicTiming. */ +#define GST_H266_MAX_DECODING_UNITS_IN_PIC_TIMING 600 /** * GST_H266_IS_NAL_TYPE_IDR: @@ -182,9 +187,6 @@ /** * GstH266ParserResult: - * - * The result of parsing H266 data. - * * @GST_H266_PARSER_OK: The parsing succeeded. * @GST_H266_PARSER_BROKEN_DATA: The data to parse is broken. * @GST_H266_PARSER_BROKEN_LINK: The link to structure needed for the parsing @@ -193,6 +195,8 @@ * @GST_H266_PARSER_NO_NAL: No nal found during the parsing. * @GST_H266_PARSER_NO_NAL_END: Start of the nal found, but not the end. * + * The result of parsing H266 data. + * * Since: 1.26 */ typedef enum @@ -207,9 +211,6 @@ /** * GstH266Profile: - * - * H.266 Profiles. - * * @GST_H266_PROFILE_MAIN_10: Main 10 profile (A.3.1). * @GST_H266_PROFILE_MAIN_10_STILL_PICTURE: Main 10 Still Picture profile (A.3.1). * @GST_H266_PROFILE_MULTILAYER_MAIN_10: MultiLayer Main 10 profile (A.3.3). @@ -234,6 +235,8 @@ * @GST_H266_PROFILE_MAIN_16_444_STILL_PICTURE: Main 16 4:4:4 Still Picture * profile (A.3.5). * + * H.266 Profiles. + * * Since: 1.26 */ typedef enum { @@ -292,10 +295,6 @@ /** * GstH266NalUnitType: - * - * Indicates the types of H266 Nal Units as - * table 5 - NAL unit type codes and NAL unit type classes. - * * @GST_H266_NAL_SLICE_TRAIL: Coded slice of a trailing picture or subpicture. * @GST_H266_NAL_SLICE_STSA: Coded slice of an STSA picture or subpicture. * @GST_H266_NAL_SLICE_RADL: Coded slice of a RADL picture or subpicture. @@ -319,6 +318,9 @@ * @GST_H266_NAL_SUFFIX_SEI: Suffix Suppliemental enhancement information. * @GST_H266_NAL_FD: Filler data (FD). * + * Indicates the types of H266 Nal Units as + * table 5 - NAL unit type codes and NAL unit type classes. + * * Since: 1.26 */ typedef enum @@ -349,10 +351,6 @@ /** * GstH266SEIPayloadType: - * - * The type of SEI message. - * More other SEIs are specified in Rec.ITU-T H.274 | ISO/IEC 23002-7. - * * @GST_H266_SEI_BUF_PERIOD: Buffering Period SEI Message. * @GST_H266_SEI_PIC_TIMING: Picture Timing SEI Message. * @GST_H266_SEI_REGISTERED_USER_DATA: Registered user data. @@ -362,6 +360,9 @@ * @GST_H266_SEI_FRAME_FIELD_INFO: Frame Field Info SEI Message. * @GST_H266_SEI_SUBPIC_LEVEL_INFO: Subpicture Level Information SEI. * + * The type of SEI message. + * More other SEIs are specified in Rec.ITU-T H.274 | ISO/IEC 23002-7. + * * Since: 1.26 */ typedef enum @@ -379,13 +380,12 @@ /** * GstH266SliceType: - * - * Types of Picture slice. - * * @GST_H266_B_SLICE: B slice type. * @GST_H266_P_SLICE: P slice type. * @GST_H266_I_SLICE: I slice type. * + * Types of Picture slice. + * * Since: 1.26 */ typedef enum @@ -397,14 +397,13 @@ /** * GstH266APSType: - * - * Indicates the types of Adaptation parameter set (APS) as - * Table 6 - APS parameters type codes and types of APS parameters. - * * @GST_H266_ALF_APS: ALF parameters. * @GST_H266_LMCS_APS: LMCS parameters. * @GST_H266_SCALING_APS: Scaling list parameters. * + * Indicates the types of Adaptation parameter set (APS) as + * Table 6 - APS parameters type codes and types of APS parameters. + * * Since: 1.26 */ typedef enum @@ -460,9 +459,6 @@ /** * GstH266NalUnit: - * - * Structure defining the H266 Nal unit headers. - * * @type: A #GstH266NalUnitType. * @layer_id: A nal unit layer id. * @temporal_id_plus1: A nal unit temporal identifier. @@ -474,6 +470,8 @@ * @data: The data from which the Nalu has been parsed. * @header_bytes: The size of the NALU header in bytes. * + * Structure defining the H266 Nal unit headers. + * * Since: 1.26 */ struct _GstH266NalUnit @@ -494,9 +492,6 @@ /** * GstH266GeneralConstraintsInfo: - * - * Structure defining the H266 general constraints info. - * * @present_flag: specifies whether additional syntax elements are present. * @intra_only_constraint_flag: specifies whether sh_slice_type for all slices * in OlsInScope shall be equal to 2. @@ -676,6 +671,8 @@ * shall be equal to 0. * @reserved_zero_bit: the reserved bits. * + * Structure defining the H266 general constraints info. + * * Since: 1.26 */ struct _GstH266GeneralConstraintsInfo { @@ -769,9 +766,6 @@ /** * GstH266ProfileTierLevel: - * - * Structure defining the H266 profile, tier and level. - * * @profile_idc: the profile id. * @tier_flag: specifies the main tier or high tier. * @level_idc: indicates a level to which OlsInScope conforms @@ -790,6 +784,8 @@ * @sub_profile_idc: specifies the i-th interoperability indicator registered * as specified by Rec. ITU-T T.35 * + * Structure defining the H266 profile, tier and level. + * * Since: 1.26 */ struct _GstH266ProfileTierLevel { @@ -811,9 +807,6 @@ /** * GstH266DPBParameters: - * - * Structure defining the H266 DPB parameters. - * * @max_dec_pic_buffering_minus1: specifies the maximum required size of the * DPB in units of picture storage buffers. * @max_num_reorder_pics: specifies the maximum allowed number of pictures of @@ -822,6 +815,8 @@ * @max_latency_increase_plus1: used to compute the value of MaxLatencyPictures, * which specifies the maximum number of pictures in the OLS. * + * Structure defining the H266 DPB parameters. + * * Since: 1.26 */ struct _GstH266DPBParameters @@ -833,9 +828,6 @@ /** * GstH266GeneralHRDParameters: - * - * Structure defining the H266 HDR parameters. - * * @num_units_in_tick: the number of time units of a clock operating at the * frequency time_scale. * @time_scale: number of time units that pass in one second. @@ -855,6 +847,8 @@ * @hrd_cpb_cnt_minus1: plus 1 specifies the number of alternative CPB * delivery schedules. * + * Structure defining the H266 HDR parameters. + * * Since: 1.26 */ struct _GstH266GeneralHRDParameters @@ -874,9 +868,6 @@ /** * GstH266SubLayerHRDParameters: - * - * Structure defining the H266 sub layer HDR parameters. - * * @bit_rate_value_minus1: specifies the maximum input bit rate for the CPB. * @cpb_size_value_minus1: together with cpb_size_scale to specify the CPB size. * @cpb_size_du_value_minus1: together with cpb_size_du_scale to specify @@ -887,6 +878,8 @@ * @bit_rate: the calculated bit rate. * @cpb_size: the calculated cpb size. * + * Structure defining the H266 sub layer HDR parameters. + * * Since: 1.26 */ struct _GstH266SubLayerHRDParameters @@ -903,9 +896,6 @@ /** * GstH266OLSHRDParameters: - * - * Structure defining the H266 OLS HDR parameters. - * * @fixed_pic_rate_general_flag: indicates the temporal distance between the * HRD output times of consecutive pictures in output order is constrained as * specified in this clause using the variable DpbOutputElementalIntervaln. @@ -920,6 +910,8 @@ * @nal_sub_layer_hrd_parameters: sub layer nal #GstH266SubLayerHRDParameters. * @vcl_sub_layer_hrd_parameters: sub layer vcl #GstH266SubLayerHRDParameters. * + * Structure defining the H266 OLS HDR parameters. + * * Since: 1.26 */ struct _GstH266OLSHRDParameters @@ -934,9 +926,6 @@ /** * GstH266VPS: - * - * Structure defining the H266 VPS. - * * @vps_id: provides an identifier for the VPS for reference by other syntax * elements. * @max_layers_minus1: specifies the number of layers specified by the VPS. @@ -1030,6 +1019,8 @@ * this Specification. * @valid: whether this VPS is valid. * + * Structure defining the H266 VPS. + * * Since: 1.26 */ struct _GstH266VPS { @@ -1092,9 +1083,6 @@ /** * GstH266RefPicListStruct: - * - * Structure defining the H266 reference picture list. - * * @num_ref_entries: specifies the number of entries in the * ref_pic_list_struct(listIdx, rplsIdx) syntax structure. * @ltrp_in_header_flag: specifies whether the POC LSBs of the LTRP entries @@ -1117,6 +1105,8 @@ * @num_inter_layer_pic: the number of inter layer reference picture. * @delta_poc_val_st: the calculated DeltaPocValSt value. * + * Structure defining the H266 reference picture list. + * * Since: 1.26 */ struct _GstH266RefPicListStruct { @@ -1136,9 +1126,6 @@ /** * GstH266RefPicLists: - * - * Structure defining the H266 reference picture lists. - * * @rpl_sps_flag: specifies whether RPL i in ref_pic_lists is derived based * on one of the ref_pic_list_struct(listIdx, rplsIdx) syntax structures * with listIdx equal to i in the SPS. @@ -1151,6 +1138,8 @@ * delta_poc_msb_cycle_ltij is present. * @delta_poc_msb_cycle_lt: specifies the value of the variable FullPocLtij. * + * Structure defining the H266 reference picture lists. + * * Since: 1.26 */ struct _GstH266RefPicLists { @@ -1164,9 +1153,6 @@ /** * GstH266VUIParams: - * - * Structure defining the H266 VUI parameters. - * * @progressive_source_flag: flag to indicate the progressive type of stream. * @interlaced_source_flag: flag to indicate the interlaced type of stream. * @non_packed_constraint_flag: indicate the presence of frame packing @@ -1202,6 +1188,8 @@ * @par_n: calculated aspect ratio numerator value. * @par_d: calculated aspect ratio denominator value. * + * Structure defining the H266 VUI parameters. + * * Since: 1.26 */ struct _GstH266VUIParams @@ -1241,9 +1229,6 @@ /** * GstH266SPSRangeExtensionParams: - * - * Structure defining the H266 SPS range extension parameters. - * * @extended_precision_flag: specifies whether an extended dynamic range is * used for transform coefficients. * @ts_residual_coding_rice_present_in_sh_flag: specifies whether @@ -1258,6 +1243,8 @@ * sh_reverse_last_sig_coeff_flag is present in slice_header syntax * structures referring to the SPS. * + * Structure defining the H266 SPS range extension parameters. + * * Since: 1.26 */ struct _GstH266SPSRangeExtensionParams { @@ -1270,9 +1257,6 @@ /** * GstH266SPS: - * - * Structure defining the H266 SPS. - * * @nuh_layer_id: specifies the identifier of the layer to which a VCL NAL unit * belongs or the identifier of a layer to which a non-VCL NAL unit applies. * @sps_id: provides an identifier for the SPS for reference by other @@ -1618,6 +1602,8 @@ * @fps_den: the calculated FPS denominator. * @valid: whether the SPS is valid. * + * Structure defining the H266 SPS. + * * Since: 1.26 */ struct _GstH266SPS @@ -1813,9 +1799,6 @@ /** * GstH266PPS: - * - * Structure defining the H266 PPS. - * * @pps_id: provides an identifier for the PPS for reference by other * syntax elements. * @sps_id: specifies the SPS referred to by this PPS. @@ -1991,6 +1974,8 @@ * @num_slices_in_subpic: slice number in subpicture. * @valid: whether this PPS is valid. * + * Structure defining the H266 PPS. + * * Since: 1.26 */ struct _GstH266PPS @@ -2110,9 +2095,6 @@ /** * GstH266ALF: - * - * Structure defining the H266 ALF parameters. - * * @luma_filter_signal_flag: specifies whether a luma filter set is signalled. * @chroma_filter_signal_flag: specifies whether a chroma filter is signalled. * @cc_cb_filter_signal_flag: specifies whether cross-component filters for the @@ -2157,6 +2139,8 @@ * @cc_cr_coeff_sign: specifies the sign of the j-th coefficient of the * signalled k-th cross-component filter for the Cr colour component. * + * Structure defining the H266 ALF parameters. + * * Since: 1.26 */ struct _GstH266ALF @@ -2186,9 +2170,6 @@ /** * GstH266LMCS: - * - * Structure defining the H266 LMCS parameters. - * * @min_bin_idx: minimum bin index used in the luma mapping with chroma scaling * construction process. * @delta_max_bin_idx: specifies the delta value between 15 and the maximum bin @@ -2202,6 +2183,8 @@ * lmcsDeltaCrs. * @delta_sign_crs_flag: specifies the sign of the variable lmcsDeltaCrs. * + * Structure defining the H266 LMCS parameters. + * * Since: 1.26 */ struct _GstH266LMCS @@ -2217,9 +2200,6 @@ /** * GstH266ScalingList: - * - * Structure defining the H266 scaling list parameters. - * * @copy_mode_flag: specifies whether the values of the scaling list are the * same as the values of a reference scaling list. * @pred_mode_flag: specifies whether the values of the scaling list can be @@ -2232,6 +2212,8 @@ * @scaling_list_DC: the scaling list DC coef. * @scaling_list: the calculated scaling list coefs. * + * Structure defining the H266 scaling list parameters. + * * Since: 1.26 */ struct _GstH266ScalingList @@ -2247,9 +2229,6 @@ /** * GstH266APS: - * - * Structure defining the H266 Adaptation Parameter Set. - * * @params_type: specifies the type of APS parameters carried in the APS as * specified in Table 6. * @aps_id: provides an identifier for the APS for reference by other syntax @@ -2266,6 +2245,8 @@ * process now. * @valid: whether this APS is valid. * + * Structure defining the H266 Adaptation Parameter Set. + * * Since: 1.26 */ struct _GstH266APS @@ -2287,9 +2268,6 @@ /** * GstH266PredWeightTable: - * - * Structure defining the H266 weight table parameters. - * * @luma_log2_weight_denom: the base 2 logarithm of the denominator for all * luma weighting factors. * @delta_chroma_log2_weight_denom: the difference of the base 2 logarithm of @@ -2323,6 +2301,8 @@ * @delta_chroma_offset_l1: the difference of the additive offset applied to * the chroma prediction values for list 1 prediction. * + * Structure defining the H266 weight table parameters. + * * Since: 1.26 */ struct _GstH266PredWeightTable @@ -2349,9 +2329,6 @@ /** * GstH266PicHdr: - * - * Structure defining the H266 picture header. - * * @gdr_or_irap_pic_flag: specifies whethers the current picture is a GDR or * IRAP picture. * @non_ref_pic_flag: specifies whether the current picture is never used as @@ -2519,6 +2496,8 @@ * @extension_data_byte: could have any value. * @valid: whether this picture header is valid. * + * Structure defining the H266 picture header. + * * Since: 1.26 */ struct _GstH266PicHdr { @@ -2618,9 +2597,6 @@ /** * GstH266SliceHdr: - * - * Structure defining the H266 slice header. - * * @gdr_or_irap_pic_flag: specifies that the PH syntax structure is present in * the slice header. * @picture_header: the picture header of #GstH266PicHdr. @@ -2722,6 +2698,8 @@ * @n_emulation_prevention_bytes: number of emulation prevention bytes (EPB) in * this slice_header. * + * Structure defining the H266 slice header. + * * Since: 1.26 */ struct _GstH266SliceHdr @@ -2802,13 +2780,12 @@ /** * GstH266AUD: - * - * Structure defining the H266 AU delimiter. - * * @irap_or_gdr_flag: specifies whether the AU containing the AU delimiter is * an IRAP or GDR AU. * @pic_type: indicates sh_slice_type values that could be present in the AU. * + * Structure defining the H266 AU delimiter. + * * Since: 1.26 */ struct _GstH266AUD { @@ -2818,9 +2795,6 @@ /** * GstH266OPI: - * - * Structure defining the H266 operating point information. - * * @ols_info_present_flag: specifies whether opi_ols_idx is present in the OPI. * @htid_info_present_flag: specifies whether opi_htid_plus1 is present. * @ols_idx: specifies that the current CVS and the next CVSs in decoding order @@ -2835,6 +2809,8 @@ * are present. * @extension_data_flag: could have any value. * + * Structure defining the H266 operating point information. + * * Since: 1.26 */ struct _GstH266OPI { @@ -2850,15 +2826,14 @@ /** * GstH266DCI: - * - * Structure defining the H266 decoding capability information. - * * @num_ptls_minus1: specifies the number of profile_tier_level syntax * structures in the DCI NAL unit. * @extension_flag: specifies whether dci_extension_data_flag syntax elements * are present. * @extension_data_flag: could have any value. * + * Structure defining the H266 decoding capability information. + * * Since: 1.26 */ struct _GstH266DCI { @@ -2872,9 +2847,6 @@ /** * GstH266BufferingPeriod: - * - * Structure defining the H266 buffering period. - * * @nal_hrd_params_present_flag: specifies whether a list of syntax element * pairs bp_nal_initial_cpb_removal_delay and bp_nal_initial_cpb_removal_offset * are present in the BP SEI message. @@ -2952,6 +2924,8 @@ * @use_alt_cpb_params_flag: could be used to derive the value of * UseAltCpbParamsFlag. * + * Structure defining the H266 buffering period. + * * Since: 1.26 */ struct _GstH266BufferingPeriod { @@ -2991,9 +2965,6 @@ /** * GstH266PicTiming: - * - * Structure defining the H266 picture timing. - * * @cpb_removal_delay_minus: calculate the number of clock ticks between the * nominal CPB removal times of the AU associated with the PT SEI message. * @sublayer_delays_present_flag: specifies whether cpb removal values are @@ -3044,6 +3015,8 @@ * @display_elemental_periods_minus1: indicates the number of elemental picture * period intervals. * + * Structure defining the H266 picture timing. + * * Since: 1.26 */ struct _GstH266PicTiming { @@ -3067,17 +3040,14 @@ guint8 du_common_cpb_removal_delay_flag; guint8 du_common_cpb_removal_delay_increment_minus18; /* TODO: PicSizeInCtbsY could be very large */ - guint32 num_nalus_in_du_minus1600; - guint8 du_cpb_removal_delay_increment_minus16008; + guint32 num_nalus_in_du_minus1GST_H266_MAX_DECODING_UNITS_IN_PIC_TIMING; + guint8 du_cpb_removal_delay_increment_minus1GST_H266_MAX_DECODING_UNITS_IN_PIC_TIMING8; guint8 delay_for_concatenation_ensured_flag; guint8 display_elemental_periods_minus1; }; /** * GstH266RegisteredUserData: - * - * The User data registered by Rec. ITU-T T.35 SEI message. - * * @country_code: an itu_t_t35_country_code. * @country_code_extension: an itu_t_t35_country_code_extension_byte. * Should be ignored when @country_code is not 0xff @@ -3085,6 +3055,8 @@ * @data: the data of itu_t_t35_payload_byte * excluding @country_code and @country_code_extension * + * The User data registered by Rec. ITU-T T.35 SEI message. + * * Since: 1.28 */ struct _GstH266RegisteredUserData @@ -3097,9 +3069,6 @@ /** * GstH266DUInfo: - * - * Structure defining the H266 decoding unit info. - * * @decoding_unit_idx: specifies the index to the list of DUs in the current AU. * @sublayer_delays_present_flag: specifies whether * dui_du_cpb_removal_delay_incrementi is present for the sublayer. @@ -3109,6 +3078,8 @@ * dui_dpb_output_du_delay syntax element in the DUI SEI message. * @dpb_output_du_delay: is used to compute the DPB output time of the AU. * + * Structure defining the H266 decoding unit info. + * * Since: 1.26 */ struct _GstH266DUInfo { @@ -3121,9 +3092,6 @@ /** * GstH266ScalableNesting: - * - * Structure defining the H266 scalable nesting. - * * @ols_flag: specifies whether the scalable-nested SEI messages apply to * specific OLSs. * @subpic_flag: specifies whether the scalable-nested SEI messages that apply @@ -3147,6 +3115,8 @@ * picture in the multiSubpicLayers. * @num_seis_minus1: specifies the number of scalable-nested SEI messages. * + * Structure defining the H266 scalable nesting. + * * Since: 1.26 */ struct _GstH266ScalableNesting { @@ -3165,9 +3135,6 @@ /** * GstH266SubPicLevelInfo: - * - * Structure defining the H266 subpicture level information. - * * @num_ref_levels_minus1: specifies the number of reference levels signalled * for each subpicture sequences. * @cbr_constraint_flag: specifies whether to decode the sub-bitstreams @@ -3187,6 +3154,8 @@ * @ref_level_fraction_minus1: specifies the i-th fraction of the level limits * for the subpictures. * + * Structure defining the H266 subpicture level information. + * * Since: 1.26 */ struct _GstH266SubPicLevelInfo { @@ -3203,9 +3172,6 @@ /** * GstH266FrameFieldInfo: - * - * Structure defining the H266 frame field information. - * * @field_pic_flag: indicates whether the display model considers the current * picture as a field. * @bottom_field_flag: indicates whether the current picture is a bottom field. @@ -3228,6 +3194,8 @@ * duplicate of a previous picture in output order. * @valid: whether this frame field info is valid. * + * Structure defining the H266 frame field information. + * * Since: 1.26 */ struct _GstH266FrameFieldInfo { @@ -3245,9 +3213,6 @@ /** * GstH266SEIMessage: - * - * Structure defining the H266 sei message. - * * @payloadType: the payload type of #GstH266SEIPayloadType. * @buffering_period: buffering period sei of #GstH266BufferingPeriod. * @pic_timing: picture timing sei of #GstH266PicTiming. @@ -3257,6 +3222,8 @@ * @frame_field_info: frame field info sei of #GstH266FrameFieldInfo. * @registered_user_data: registered user data sei of #GstH266RegisteredUserData. (Since: 1.28) * + * Structure defining the H266 sei message. + * * Since: 1.26 */ struct _GstH266SEIMessage @@ -3272,7 +3239,7 @@ GstH266FrameFieldInfo frame_field_info; /** - * _GstH266SEIMessage.payload.registered_user_data: + * GstH266SEIMessage.registered_user_data: * * Registered user data sei of #GstH266RegisteredUserData. * @@ -3323,9 +3290,6 @@ /** * GstH266PTLRecord: - * - * Contains VvcPTLRecord data as defined in ISO/IEC 14496-15 - * * @num_bytes_constraint_info: Number of bytes for constraint information. * @general_profile_idc: General profile id. * @general_tier_flag: General tier flag. @@ -3338,6 +3302,8 @@ * @ptl_num_sub_profiles: Number of sub-profiles. * @general_sub_profile_idc: Array containing general sub-profile ids. * + * Contains VvcPTLRecord data as defined in ISO/IEC 14496-15 + * * Since: 1.26 */ struct _GstH266PTLRecord {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstjpeg2000sampling.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstjpeg2000sampling.h
Changed
@@ -26,9 +26,6 @@ /** * GstJPEG2000Sampling: - * Sampling values from RF 5371 for JPEG 2000 over RTP : https://datatracker.ietf.org/doc/rfc5371/C - * Note: sampling extensions that are not listed in the RFC are signified by an _EXT at the end of the enum - * * @GST_JPEG2000_SAMPLING_NONE: no sampling * @GST_JPEG2000_SAMPLING_RGB: standard Red, Green, Blue color space. * @GST_JPEG2000_SAMPLING_BGR: standard Blue, Green, Red color space. @@ -41,6 +38,9 @@ * @GST_JPEG2000_SAMPLING_YBR410: standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4 alternating the Cb and Cr component. * @GST_JPEG2000_SAMPLING_GRAYSCALE: basically, a single component image of just multilevels of grey. * @GST_JPEG2000_SAMPLING_YBRA4444_EXT: standard YCbCr color space, alpha channel, no subsampling, + * + * Sampling values from RF 5371 for JPEG 2000 over RTP : https://datatracker.ietf.org/doc/rfc5371/C + * Note: sampling extensions that are not listed in the RFC are signified by an _EXT at the end of the enum */ /**
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstjpegbitwriter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstjpegbitwriter.c
Changed
@@ -18,6 +18,12 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:gstjpegbitwriter + * @title: GstJpegBitWriter + * @short_description: Functions for writing bitstream headers + */ + /* TODO: Add the support for the "differential mode(lossless mode)", "arithmetic mode" and "progressive mode". */ @@ -125,7 +131,7 @@ /** * gst_jpeg_bit_writer_scan_header: - * @frame_hdr: the scan header of #GstJpegScanHdr to write + * @scan_hdr: the scan header of #GstJpegScanHdr to write * @data: (out): the bit stream generated by this scan header * @size: (inout): the size in bytes of the input and output *
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstjpegparser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstjpegparser.c
Changed
@@ -77,6 +77,10 @@ #define READ_BYTES(reader, buf, length) G_STMT_START { \ const guint8 *vals; \ + if (length > sizeof (buf)) { \ + GST_WARNING ("data size is bigger than its storage"); \ + goto failed; \ + } \ if (!gst_byte_reader_get_data (reader, length, &vals)) { \ GST_WARNING ("failed to read bytes, size:%d", length); \ goto failed; \ @@ -600,7 +604,7 @@ /** * gst_jpeg_get_default_huffman_tables: - * @huf_tables: (out): The default DC/AC Huffman tables to fill in + * @huff_tables: (out): The default DC/AC Huffman tables to fill in * * Fills in @huf_tables with the default AC/DC Huffman tables, as * specified by the JPEG standard. @@ -664,7 +668,7 @@ /** * gst_jpeg_parse: - * @segment: (out): pointer to a #GstJpegSegment structure to fill in + * @seg: (out): pointer to a #GstJpegSegment structure to fill in * @data: The data to parse * @size: The size of @data * @offset: The offset from which to start parsing
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstmpegvideometa.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstmpegvideometa.c
Changed
@@ -129,12 +129,17 @@ /** * gst_buffer_add_mpeg_video_meta: * @buffer: a #GstBuffer + * @seq_hdr: a #GstMpegVideoSequenceHdr + * @seq_ext: a #GstMpegVideoSequenceExt + * @disp_ext: a #GstMpegVideoSequenceDisplayExt + * @pic_hdr: a #GstMpegVideoPictureHdr + * @pic_ext: a #GstMpegVideoPictureExt + * @quant_ext: a #GstMpegVideoQuantMatrixExt * * Creates and adds a #GstMpegVideoMeta to a @buffer. - * * Provided structures must either be %NULL or GSlice-allocated. * - * Returns: (transfer full): a newly created #GstMpegVideoMeta + * Returns: (transfer none): a newly created #GstMpegVideoMeta * * Since: 1.2 */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstmpegvideoparser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstmpegvideoparser.c
Changed
@@ -28,6 +28,8 @@ * @title: GstMpegvideoParser * @short_description: Convenience library for mpeg1 and 2 video * bitstream parsing. + * @sources: + * - gstmpegvideometa.h * * Provides useful functions for mpeg videos bitstream parsing. * @@ -703,7 +705,7 @@ /** * gst_mpeg_video_packet_parse_picture_extension: * @packet: The #GstMpegVideoPacket that carries the data - * @ext: (out): The #GstMpegVideoPictureExt structure to fill + * @picext: (out): The #GstMpegVideoPictureExt structure to fill * * Parse the @ext MPEG Video Picture Extension structure members from * video @packet @@ -932,7 +934,7 @@ * gst_mpeg_video_packet_parse_slice_header: * @packet: The #GstMpegVideoPacket that carries the data * @slice_hdr: (out): The #GstMpegVideoSliceHdr structure to fill - * @seqhdr: The #GstMpegVideoSequenceHdr header + * @seq_hdr: The #GstMpegVideoSequenceHdr header * @seqscaleext: The #GstMpegVideoSequenceScalableExt header * * Parses the @GstMpegVideoSliceHdr structure members from @data
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstvc1parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstvc1parser.c
Changed
@@ -1959,11 +1959,11 @@ if (advanced->hrd_param_flag) { if (seqhdr->advanced.hrd_param.hrd_num_leaky_buckets > - MAX_HRD_NUM_LEAKY_BUCKETS) { + GST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS) { GST_WARNING - ("hrd_num_leaky_buckets (%d) > MAX_HRD_NUM_LEAKY_BUCKETS (%d)", + ("hrd_num_leaky_buckets (%d) > GST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS (%d)", seqhdr->advanced.hrd_param.hrd_num_leaky_buckets, - MAX_HRD_NUM_LEAKY_BUCKETS); + GST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS); goto failed; } for (i = 0; i < seqhdr->advanced.hrd_param.hrd_num_leaky_buckets; i++) @@ -2146,7 +2146,7 @@ } /** - * gst_vc1_bitplanes_new: + * gst_vc1_bitplanes_new: (skip) * * Creates a new #GstVC1BitPlanes. It should be freed with * gst_vc1_bitplanes_free() after use.
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstvc1parser.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstvc1parser.h
Changed
@@ -32,7 +32,7 @@ G_BEGIN_DECLS -#define MAX_HRD_NUM_LEAKY_BUCKETS 31 +#define GST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS 31 /** * GST_VC1_BFRACTION_BASIS: @@ -169,8 +169,8 @@ guint8 hrd_num_leaky_buckets; guint8 bit_rate_exponent; guint8 buffer_size_exponent; - guint16 hrd_rateMAX_HRD_NUM_LEAKY_BUCKETS; - guint16 hrd_bufferMAX_HRD_NUM_LEAKY_BUCKETS; + guint16 hrd_rateGST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS; + guint16 hrd_bufferGST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS; }; /** @@ -200,7 +200,7 @@ guint8 range_mapuv_flag; guint8 range_mapuv; - guint8 hrd_fullMAX_HRD_NUM_LEAKY_BUCKETS; + guint8 hrd_fullGST_VC1_MAX_HRD_NUM_LEAKY_BUCKETS; }; /** @@ -636,7 +636,7 @@ GST_CODEC_PARSERS_API GstVC1ParserResult gst_vc1_parse_slice_header (const guint8 *data, gsize size, - GstVC1SliceHdr *slicehdr, + GstVC1SliceHdr *slicehdr, GstVC1SeqHdr *seqhdr); GST_CODEC_PARSERS_API
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstvp9bitwriter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstvp9bitwriter.c
Changed
@@ -18,6 +18,14 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:gstvp9bitwriter + * @title: GstVp9BitWriter + * @short_description: Functions for writing bitstream headers + * + * Since: 1.28 + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.c
Changed
@@ -626,7 +626,7 @@ /******** API *************/ /** - * gst_vp9_parser_new: + * gst_vp9_parser_new: (skip) * * Creates a new #GstVp9Parser. It should be freed with * gst_vp9_parser_free() after use.
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.h
Changed
@@ -90,14 +90,14 @@ } GstVp9ParserResult; /** - * GstVp9Profile: Bitstream profiles indicated by 2-3 bits in the uncompressed header + * GstVp9Profile: * @GST_VP9_PROFILE_0: Profile 0, 8-bit 4:2:0 only. * @GST_VP9_PROFILE_1: Profile 1, 8-bit 4:4:4, 4:2:2, and 4:4:0. * @GST_VP9_PROFILE_2: Profile 2, 10-bit and 12-bit color only, with 4:2:0 sampling. * @GST_VP9_PROFILE_3: Profile 3, 10-bit and 12-bit color only, with 4:2:2/4:4:4/4:4:0 sampling. * @GST_VP9_PROFILE_UNDEFINED: Undefined profile * - * VP9 Profiles + * VP9 Bitstream profiles indicated by 2-3 bits in the uncompressed header. * * Since: 1.8 */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecparsers/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecparsers/meson.build
Changed
@@ -27,6 +27,7 @@ codecparser_headers = files( 'codecparsers-prelude.h', 'gstmpegvideoparser.h', + 'gsth264bitwriter.h', 'gsth264parser.h', 'gstvc1parser.h', 'gstmpeg4parser.h', @@ -34,9 +35,11 @@ 'gstvp8parser.h', 'gstvp8rangedecoder.h', 'gstjpeg2000sampling.h', + 'gstjpegbitwriter.h', 'gstjpegparser.h', 'gstmpegvideometa.h', 'gstvp9parser.h', + 'gstav1bitwriter.h', 'gstav1parser.h', 'gstlcevcmeta.h', 'gsth266parser.h', @@ -48,7 +51,7 @@ doc_sources += s.full_path() endforeach -libs_c_sources += { +libs_sources += { 'codecparsers': pathsep.join(doc_sources) } @@ -81,8 +84,52 @@ description : 'Bitstream parsers for GStreamer elements', ) +gen_sources = +if build_gir + gir = { + 'sources' : codecparser_sources + codecparser_headers, + 'namespace' : 'GstCodecParsers', + 'nsversion' : api_version, + 'identifier_prefix' : 'Gst', + 'symbol_prefix' : 'gst', + 'export_packages' : pkg_name, + 'includes' : 'Gst-1.0', 'GstBase-1.0', + 'install' : true, + 'extra_args' : gir_init_section + cp_args + + '--c-include=gst/codecs/gstav1decoder.h', + '--c-include=gst/codecparsers/gstav1bitwriter.h', + '--c-include=gst/codecparsers/gstav1parser.h', + '--c-include=gst/codecparsers/gsth264bitwriter.h', + '--c-include=gst/codecparsers/gsth264parser.h', + '--c-include=gst/codecparsers/gsth265parser.h', + '--c-include=gst/codecparsers/gsth266parser.h', + '--c-include=gst/codecparsers/gstjpeg2000sampling.h', + '--c-include=gst/codecparsers/gstjpegbitwriter.h', + '--c-include=gst/codecparsers/gstjpegparser.h', + '--c-include=gst/codecparsers/gstlcevcmeta.h', + '--c-include=gst/codecparsers/gstmpeg4parser.h', + '--c-include=gst/codecparsers/gstmpegvideometa.h', + '--c-include=gst/codecparsers/gstmpegvideoparser.h', + '--c-include=gst/codecparsers/gstvc1parser.h', + '--c-include=gst/codecparsers/gstvp8parser.h', + '--c-include=gst/codecparsers/gstvp8rangedecoder.h', + '--c-include=gst/codecparsers/gstvp9parser.h', + , + 'dependencies' : gstbase_dep + } + library_def += {'gir': gir} + if not static_build + codecparsers_gir = gnome.generate_gir(gstcodecparsers, kwargs: gir) + library_def += {'gir_targets': library_def.get('gir_targets', ) + codecparsers_gir} + gen_sources += codecparsers_gir + endif +endif +gst_libraries += pkg_name, library_def + + gstcodecparsers_dep = declare_dependency(link_with : gstcodecparsers, include_directories : libsinc, + sources: gen_sources, dependencies : gstbase_dep) gst_libraries += pkg_name, {'lib': gstcodecparsers}
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecs/gsth265decoder.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecs/gsth265decoder.c
Changed
@@ -89,6 +89,9 @@ const GstH265SPS *active_sps; const GstH265PPS *active_pps; + // Store extended sps for each sps ids + GArray *sps_ext; + guint32 SpsMaxLatencyPictures; /* Picture currently being processed/decoded */ @@ -227,6 +230,8 @@ self->priv = priv = gst_h265_decoder_get_instance_private (self); + priv->sps_ext = g_array_sized_new (FALSE, TRUE, sizeof (GstH265SPSEXT), + GST_H265_MAX_SPS_COUNT); priv->last_output_poc = G_MININT32; priv->ref_pic_list_tmp = g_array_sized_new (FALSE, TRUE, @@ -257,6 +262,7 @@ g_array_unref (priv->ref_pic_list1); g_array_unref (priv->nalu); g_array_unref (priv->split_nalu); + g_array_unref (priv->sps_ext); gst_vec_deque_free (priv->output_queue); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -909,12 +915,13 @@ GstH265DecoderPrivate *priv = self->priv; GstH265ParserResult pres; GstH265Slice slice; + GstH265SPSEXT sps_ext; GstH265DecoderNalUnit decoder_nalu; memset (&slice, 0, sizeof (GstH265Slice)); - pres = gst_h265_parser_parse_slice_hdr (priv->preproc_parser, - nalu, &slice.header); + pres = gst_h265_parser_parse_slice_hdr_ext (priv->preproc_parser, + nalu, &slice.header, &sps_ext); if (pres != GST_H265_PARSER_OK) return pres; @@ -962,6 +969,10 @@ g_array_append_val (priv->nalu, decoder_nalu); + if (nalu->type == GST_H265_NAL_SPS) + g_array_index (priv->sps_ext, GstH265SPSEXT, decoder_nalu.unit.sps.id) + = sps_ext; + return GST_H265_PARSER_OK; } @@ -971,6 +982,7 @@ GstH265DecoderPrivate *priv = self->priv; GstH265VPS vps; GstH265SPS sps; + GstH265SPSEXT sps_ext; GstH265PPS pps; GstH265ParserResult ret = GST_H265_PARSER_OK; GstH265DecoderNalUnit decoder_nalu; @@ -991,11 +1003,14 @@ g_array_append_val (priv->nalu, decoder_nalu); break; case GST_H265_NAL_SPS: - ret = gst_h265_parser_parse_sps (priv->preproc_parser, nalu, &sps, TRUE); + ret = + gst_h265_parser_parse_sps_ext (priv->preproc_parser, nalu, &sps, + &sps_ext, TRUE); if (ret != GST_H265_PARSER_OK) break; decoder_nalu.unit.sps = sps; + g_array_index (priv->sps_ext, GstH265SPSEXT, sps.id) = sps_ext; g_array_append_val (priv->nalu, decoder_nalu); break; case GST_H265_NAL_PPS: @@ -2250,3 +2265,21 @@ { return gst_h265_dpb_get_picture (decoder->priv->dpb, system_frame_number); } + +/** + * gst_h265_decoder_get_sps_ext: + * @decoder: a #GstH265Decoder + * @sps : the #GstH265SPS matching the requested #GstH265SPSEXT + * + * Retrieve the extended SPS values attached to the given #GstH265SPS + * + * Returns: (transfer none) (nullable): a #GstH265SPSEXT if successful, or %NULL otherwise + * + * Since: 1.28 + */ +const GstH265SPSEXT * +gst_h265_decoder_get_sps_ext (const GstH265Decoder * decoder, + const GstH265SPS * sps) +{ + return &g_array_index (decoder->priv->sps_ext, GstH265SPSEXT, sps->id); +}
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecs/gsth265decoder.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecs/gsth265decoder.h
Changed
@@ -198,6 +198,10 @@ GstH265Picture * gst_h265_decoder_get_picture (GstH265Decoder * decoder, guint32 system_frame_number) G_GNUC_WARN_UNUSED_RESULT; +GST_CODECS_API +const GstH265SPSEXT * gst_h265_decoder_get_sps_ext (const GstH265Decoder * decoder, + const GstH265SPS * sps); + G_END_DECLS #endif /* __GST_H265_DECODER_H__ */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/codecs/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/codecs/meson.build
Changed
@@ -73,15 +73,16 @@ 'identifier_prefix' : 'Gst', 'symbol_prefix' : 'gst', 'export_packages' : pkg_name, - 'includes' : 'Gst-1.0', 'GstVideo-1.0', + 'includes' : 'Gst-1.0', 'GstVideo-1.0', 'GstCodecParsers-1.0', 'install' : true, 'extra_args' : gir_init_section + '-DGST_USE_UNSTABLE_API' + - '--c-include=gst/codecs/gsth264decoder.h', - '--c-include=gst/codecs/gsth265decoder.h', - '--c-include=gst/codecs/gstvp9decoder.h', - '--c-include=gst/codecs/gstvp8decoder.h', - '--c-include=gst/codecs/gstmpeg2decoder.h', - '--c-include=gst/codecs/gsth266decoder.h', + '--c-include=gst/codecs/gstav1decoder.h', + '--c-include=gst/codecs/gsth264decoder.h', + '--c-include=gst/codecs/gsth265decoder.h', + '--c-include=gst/codecs/gsth266decoder.h', + '--c-include=gst/codecs/gstmpeg2decoder.h', + '--c-include=gst/codecs/gstvp8decoder.h', + '--c-include=gst/codecs/gstvp9decoder.h', , 'dependencies' : gstvideo_dep, gstcodecparsers_dep } @@ -98,4 +99,5 @@ include_directories : libsinc, sources: gen_sources, dependencies : gstvideo_dep, gstcodecparsers_dep) + meson.override_dependency(pkg_name, gstcodecs_dep)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/play/gstplay.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/play/gstplay.c
Changed
@@ -2221,7 +2221,7 @@ for (l = list; l != NULL; l = l->next) { info = (GstPlayStreamInfo *) l->data; if (g_str_equal (info->stream_id, stream_id)) { - return info; + return g_object_ref (info); } } @@ -2247,17 +2247,19 @@ const gchar * stream_id, GType type) { GstPlayStreamInfo *info; + GstPlayStreamInfo *result_info = NULL; if (!self->media_info || !stream_id) return NULL; info = gst_play_stream_info_find_from_stream_id (self->media_info, stream_id); - if (info && G_OBJECT_TYPE (info) == type) - info = gst_play_stream_info_copy (info); - else - info = NULL; + if (info) { + if (G_OBJECT_TYPE (info) == type) + result_info = gst_play_stream_info_copy (info); + g_object_unref (info); + } - return info; + return result_info; } static void @@ -2280,6 +2282,7 @@ info = gst_play_stream_info_find_from_stream_id (self->media_info, stream_id); if (info) { gst_play_stream_info_update_from_stream (self, info, stream); + g_object_unref (info); emit_signal = TRUE; } g_mutex_unlock (&self->lock);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/va/gstvadisplay.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/va/gstvadisplay.c
Changed
@@ -95,7 +95,7 @@ static char * _get_desc (const char *vendor, GstVaImplementation impl) { - char *end, *start; + const char *end, *start; char desc1024; size_t size; @@ -145,7 +145,7 @@ break; case GST_VA_IMPLEMENTATION_INTEL_IHD: case GST_VA_IMPLEMENTATION_INTEL_I965:{ - char *end = strstr (vendor, " - "); + const char *end = strstr (vendor, " - "); if (end && sscanf (end, " - %d.%d.", &maj, &min) == 2) { *major = maj; *minor = min;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/gstvkdecoder-private.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/gstvkdecoder-private.c
Changed
@@ -84,7 +84,8 @@ return TRUE; priv->vk_populated = - gst_vulkan_video_get_vk_functions (self->queue->device, &priv->vk); + gst_vulkan_video_get_vk_functions (self->queue->device, &priv->vk, + self->codec); return priv->vk_populated; }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/gstvkencoder-private.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/gstvkencoder-private.c
Changed
@@ -93,7 +93,8 @@ return TRUE; priv->vk_loaded = - gst_vulkan_video_get_vk_functions (self->queue->device, &priv->vk); + gst_vulkan_video_get_vk_functions (self->queue->device, &priv->vk, + self->codec); return priv->vk_loaded; }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/gstvkvideo-private.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/gstvkvideo-private.c
Changed
@@ -70,7 +70,8 @@ gboolean gst_vulkan_video_get_vk_functions (GstVulkanDevice * device, - GstVulkanVideoFunctions * vk_funcs) + GstVulkanVideoFunctions * vk_funcs, + VkVideoCodecOperationFlagBitsKHR codec_op) { gboolean ret = FALSE; GstVulkanInstance *instance; @@ -91,8 +92,16 @@ } G_STMT_END; #define GET_DEVICE_PROC_ADDRESS_REQUIRED(name) GET_PROC_ADDRESS_REQUIRED(name, device) #define GET_INSTANCE_PROC_ADDRESS_REQUIRED(name) GET_PROC_ADDRESS_REQUIRED(name, instance) - GST_VULKAN_DEVICE_VIDEO_FN_LIST (GET_DEVICE_PROC_ADDRESS_REQUIRED); - GST_VULKAN_INSTANCE_VIDEO_FN_LIST (GET_INSTANCE_PROC_ADDRESS_REQUIRED); + GST_VULKAN_DEVICE_VIDEO_FN_LIST_COMMON (GET_DEVICE_PROC_ADDRESS_REQUIRED); + + if (GST_VULKAN_VIDEO_CODEC_OPERATION_IS_DECODE (codec_op)) + GST_VULKAN_DEVICE_VIDEO_FN_LIST_DECODE (GET_DEVICE_PROC_ADDRESS_REQUIRED); + + if (GST_VULKAN_VIDEO_CODEC_OPERATION_IS_ENCODE (codec_op)) { + GST_VULKAN_DEVICE_VIDEO_FN_LIST_ENCODE (GET_DEVICE_PROC_ADDRESS_REQUIRED); + GST_VULKAN_INSTANCE_VIDEO_FN_LIST_ENCODE + (GET_INSTANCE_PROC_ADDRESS_REQUIRED); + } #undef GET_DEVICE_PROC_ADDRESS_REQUIRED #undef GET_INSTANCE_PROC_ADDRESS_REQUIRED #undef GET_PROC_ADDRESS_REQUIRED
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/gstvkvideo-private.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/gstvkvideo-private.h
Changed
@@ -52,7 +52,7 @@ GST_VK_VIDEO_EXTENSION_MAX, } GST_VK_VIDEO_EXTENSIONS; -#define GST_VULKAN_DEVICE_VIDEO_FN_LIST(V) \ +#define GST_VULKAN_DEVICE_VIDEO_FN_LIST_COMMON(V) \ V(CreateVideoSession) \ V(DestroyVideoSession) \ V(GetVideoSessionMemoryRequirements) \ @@ -62,19 +62,25 @@ V(BindVideoSessionMemory) \ V(CmdBeginVideoCoding) \ V(CmdControlVideoCoding) \ - V(CmdEndVideoCoding) \ - V(CmdDecodeVideo) \ + V(CmdEndVideoCoding) + +#define GST_VULKAN_DEVICE_VIDEO_FN_LIST_DECODE(V) \ + V(CmdDecodeVideo) + +#define GST_VULKAN_DEVICE_VIDEO_FN_LIST_ENCODE(V) \ V(CmdEncodeVideo) \ V(GetEncodedVideoSessionParameters) -#define GST_VULKAN_INSTANCE_VIDEO_FN_LIST(V) \ +#define GST_VULKAN_INSTANCE_VIDEO_FN_LIST_ENCODE(V) \ V(GetPhysicalDeviceVideoEncodeQualityLevelProperties) struct _GstVulkanVideoFunctions { #define DEFINE_FUNCTION(name) G_PASTE(G_PASTE(PFN_vk, name), KHR) name; - GST_VULKAN_DEVICE_VIDEO_FN_LIST (DEFINE_FUNCTION) - GST_VULKAN_INSTANCE_VIDEO_FN_LIST (DEFINE_FUNCTION) + GST_VULKAN_DEVICE_VIDEO_FN_LIST_COMMON (DEFINE_FUNCTION) + GST_VULKAN_DEVICE_VIDEO_FN_LIST_DECODE (DEFINE_FUNCTION) + GST_VULKAN_DEVICE_VIDEO_FN_LIST_ENCODE (DEFINE_FUNCTION) + GST_VULKAN_INSTANCE_VIDEO_FN_LIST_ENCODE (DEFINE_FUNCTION) #undef DEFINE_FUNCTION }; @@ -85,7 +91,8 @@ extern const VkComponentMapping _vk_identity_component_map; gboolean gst_vulkan_video_get_vk_functions (GstVulkanDevice * device, - GstVulkanVideoFunctions * vk_funcs); + GstVulkanVideoFunctions * vk_funcs, + VkVideoCodecOperationFlagBitsKHR codec_op); gboolean gst_vulkan_video_session_create (GstVulkanVideoSession * session, GstVulkanDevice * device,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/ios/gstvkwindow_ios.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/ios/gstvkwindow_ios.m
Changed
@@ -299,16 +299,47 @@ window_ios = window; } --(void) layoutSubViews +-(void) didMoveToWindow +{ + super didMoveToWindow; + self updateDrawableSize; +} + +-(void) layoutSubviews { super layoutSubviews; - CGSize rect = self.bounds.size; - GST_ERROR ("%ix%i", (int) rect.width, (int) rect.height); - gboolean resize = self->width != rect.width || self->height != rect.height; - self->width = rect.width; - self->height = rect.height; + self updateDrawableSize; +} + +-(void) updateDrawableSize +{ + CGFloat scale = self.contentScaleFactor; + if (self.window) { + scale = self.window.screen.scale; + } + + CAMetalLayer *metalLayer = (CAMetalLayer*) self.layer; + metalLayer.contentsScale = scale; + + // Set drawable size in pixels, not points + CGSize drawableSize = CGSizeMake( + self.bounds.size.width * scale, + self.bounds.size.height * scale + ); + metalLayer.drawableSize = drawableSize; + + guint pixel_width = (guint) drawableSize.width; + guint pixel_height = (guint) drawableSize.height; + + GST_DEBUG ("%ux%u (scale=%.1f)", pixel_width, pixel_height, scale); + + gboolean resize = self->width != pixel_width || self->height != pixel_height; + self->width = pixel_width; + self->height = pixel_height; + if (resize && self->window_ios) { - gst_vulkan_window_resize (GST_VULKAN_WINDOW (self->window_ios), rect.width, rect.height); + gst_vulkan_window_resize (GST_VULKAN_WINDOW (self->window_ios), + pixel_width, pixel_height); } }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/vulkan/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/vulkan/meson.build
Changed
@@ -114,7 +114,7 @@ vulkan_conf.set(option, 0) endforeach -if 'ios', 'darwin'.contains(host_system) +if host_system == 'darwin' vulkan_dep = dependency('vulkan', method: 'pkg-config', required : false) if not vulkan_dep.found() # - ios does not support the loader/validation layers @@ -124,7 +124,10 @@ # on implementing a proper Metal extension for Vulkan # https://github.com/KhronosGroup/MoltenVK/issues/492 objcpp = meson.get_compiler('objcpp') - vulkan_dep = objcpp.find_library('MoltenVK', required : vulkan_opt) + vulkan_dep = objcpp.find_library('MoltenVK', required: false) + if not vulkan_dep.found() + vulkan_dep = dependency('MoltenVK', fallback: 'moltenvk', required: vulkan_opt) + endif endif elif host_system == 'windows' vulkan_root = run_command(python3, '-c', 'import os; print(os.environ.get("VK_SDK_PATH"))', check: false).stdout().strip() @@ -233,7 +236,7 @@ endif endif -if 'darwin', 'ios'.contains(host_system) +if host_system == 'darwin' objc = meson.get_compiler('objc') if not objc.has_argument('-fobjc-arc') error('ARC is required for building') @@ -249,7 +252,7 @@ endif endif -if host_system == 'darwin' +if subsystem == 'macos' cocoa_dep = dependency('appleframeworks', modules : 'Cocoa', required : vulkan_opt) if cocoa_dep.found() and cc.has_header('vulkan/vulkan_macos.h', dependencies: vulkan_dep, required: vulkan_opt) @@ -262,9 +265,7 @@ vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_COCOA', 1) enabled_vulkan_winsys += 'cocoa' endif -endif - -if host_system == 'ios' +elif host_system == 'darwin' uikit_dep = dependency('appleframeworks', modules : 'UIKit', 'IOSurface', 'CoreGraphics', 'Metal', required : vulkan_opt) if uikit_dep.found() and cc.has_header('vulkan/vulkan_ios.h', dependencies : vulkan_dep, required: vulkan_opt)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/wayland/gstwlwindow.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/wayland/gstwlwindow.c
Changed
@@ -741,8 +741,6 @@ GstVideoContentLightLevel *linfo = priv->next_linfo; struct wl_callback *callback; gboolean needs_layout_update = FALSE; - GstVideoMeta *vmeta = gst_wl_buffer_get_video_meta (buffer); - GstVideoCropMeta *cmeta = gst_wl_buffer_get_video_crop_meta (buffer); GstVideoRectangle crop = priv->crop; if (G_UNLIKELY (info)) { @@ -761,20 +759,23 @@ needs_layout_update = TRUE; } - if (vmeta) { - if (priv->buffer_width != vmeta->width - || priv->buffer_height != vmeta->height) { + if (G_LIKELY (buffer)) { + GstVideoMeta *vmeta = gst_wl_buffer_get_video_meta (buffer); + GstVideoCropMeta *cmeta = gst_wl_buffer_get_video_crop_meta (buffer); + + if (vmeta && (priv->buffer_width != vmeta->width + || priv->buffer_height != vmeta->height)) { priv->buffer_width = vmeta->width; priv->buffer_height = vmeta->height; needs_layout_update = TRUE; } - } - if (cmeta) { - crop.x = cmeta->x; - crop.y = cmeta->y; - crop.w = cmeta->width; - crop.h = cmeta->height; + if (cmeta) { + crop.x = cmeta->x; + crop.y = cmeta->y; + crop.w = cmeta->width; + crop.h = cmeta->height; + } } if (gst_wl_window_crop_rectangle_changed (self, &crop)) { @@ -1286,10 +1287,10 @@ /* We can't set the light level if we don't know the luminance range */ if (linfo) { - guint maxFALL = CLAMP (min_luminance + 1, - linfo->max_frame_average_light_level, max_luminance); + guint maxFALL = CLAMP (linfo->max_frame_average_light_level, + min_luminance + 1, max_luminance); guint maxCLL = - CLAMP (maxFALL, linfo->max_content_light_level, max_luminance); + CLAMP (linfo->max_content_light_level, maxFALL, max_luminance); wp_image_description_creator_params_v1_set_max_cll (params, maxCLL); wp_image_description_creator_params_v1_set_max_fall (params, maxFALL); }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-libs/gst/webrtc/nice/nicestream.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-libs/gst/webrtc/nice/nicestream.c
Changed
@@ -193,6 +193,7 @@ ret = GST_WEBRTC_ICE_TRANSPORT (gst_webrtc_nice_transport_new (nice_stream, component)); + gst_object_ref_sink (ret); nice_stream->priv->transports = g_list_prepend (nice_stream->priv->transports, weak_new (ret));
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst-plugins-bad.doap -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst-plugins-bad.doap
Changed
@@ -35,6 +35,16 @@ <release> <Version> + <revision>1.28.1</revision> + <branch>1.28</branch> + <name></name> + <created>2026-02-26</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.28.1.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.28.0</revision> <branch>main</branch> <name></name>
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/audiobuffersplit/gstaudiobuffersplit.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/audiobuffersplit/gstaudiobuffersplit.c
Changed
@@ -428,23 +428,12 @@ resync_time_diff = gst_util_uint64_scale (self->current_offset, GST_SECOND, rate); - if (self->out_segment.rate < 0.0) { - if (resync_pts > resync_time_diff) - GST_BUFFER_PTS (buffer) = resync_pts - resync_time_diff; - else - GST_BUFFER_PTS (buffer) = 0; - GST_BUFFER_DURATION (buffer) = - gst_util_uint64_scale (size / bpf, GST_SECOND, rate); - - self->current_offset += size / bpf; - } else { - GST_BUFFER_PTS (buffer) = resync_pts + resync_time_diff; - self->current_offset += size / bpf; - resync_time_diff = - gst_util_uint64_scale (self->current_offset, GST_SECOND, rate); - GST_BUFFER_DURATION (buffer) = - resync_time_diff - (GST_BUFFER_PTS (buffer) - resync_pts); - } + GST_BUFFER_PTS (buffer) = resync_pts + resync_time_diff; + self->current_offset += size / bpf; + resync_time_diff = + gst_util_uint64_scale (self->current_offset, GST_SECOND, rate); + GST_BUFFER_DURATION (buffer) = + resync_time_diff - (GST_BUFFER_PTS (buffer) - resync_pts); GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE; @@ -486,26 +475,27 @@ GstFlowReturn ret = GST_FLOW_OK; guint avail = gst_adapter_available (self->adapter); guint avail_samples = avail / bpf; + guint input_samples, input_scaled_samples; guint64 new_offset; GstClockTime input_rt, current_rt; - GstClockTime input_duration; GstClockTime current_rt_end; input_rt = gst_segment_to_running_time (&self->in_segment, GST_FORMAT_TIME, GST_BUFFER_PTS (buffer)); - input_duration = - (gst_buffer_get_size (buffer) / bpf) / ABS (self->in_segment.rate); - - GST_OBJECT_LOCK (self); - if (self->in_segment.rate < 0) { - discont = FALSE; + input_samples = gst_buffer_get_size (buffer) / bpf; + if (self->in_segment.rate == 1.0) { + input_scaled_samples = input_samples; } else { - discont = GST_BUFFER_IS_DISCONT (buffer) - || GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_RESYNC); + input_scaled_samples = ((gdouble) input_samples) / self->in_segment.rate; } + GST_OBJECT_LOCK (self); + + discont = GST_BUFFER_IS_DISCONT (buffer) + || GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_RESYNC); + /* If the segment rate is changing this is a discontinuity */ discont = discont || (self->out_segment.format != GST_FORMAT_UNDEFINED && self->in_segment.rate != self->out_segment.rate); @@ -515,7 +505,7 @@ discont = gst_audio_stream_align_process (self->stream_align, - discont, input_rt, input_duration, NULL, NULL, NULL); + discont, input_rt, input_scaled_samples, NULL, NULL, NULL); GST_OBJECT_UNLOCK (self); if (!discont) @@ -524,21 +514,12 @@ /* Reset */ self->drop_samples = 0; - if (self->in_segment.rate < 0.0) { - current_rt = - self->resync_rt - gst_util_uint64_scale (self->current_offset + - avail_samples, GST_SECOND, rate * ABS (self->in_segment.rate)); - current_rt_end = - self->resync_rt - gst_util_uint64_scale (self->current_offset, - GST_SECOND, rate * ABS (self->in_segment.rate)); - } else { - current_rt = - self->resync_rt + gst_util_uint64_scale (self->current_offset, - GST_SECOND, rate * self->in_segment.rate); - current_rt_end = - self->resync_rt + gst_util_uint64_scale (self->current_offset + - avail_samples, GST_SECOND, rate * self->in_segment.rate); - } + current_rt = + self->resync_rt + gst_util_uint64_scale (self->current_offset, + GST_SECOND, rate * self->out_segment.rate); + current_rt_end = + self->resync_rt + gst_util_uint64_scale (self->current_offset + + avail_samples, GST_SECOND, rate * self->out_segment.rate); if (self->gapless && self->current_offset != -1) { GST_DEBUG_OBJECT (self, @@ -550,13 +531,13 @@ new_offset = gst_util_uint64_scale (input_rt - self->resync_rt, - rate * ABS (self->in_segment.rate), GST_SECOND); + rate * self->out_segment.rate, GST_SECOND); if (input_rt < self->resync_rt) { guint64 drop_samples; new_offset = gst_util_uint64_scale (self->resync_rt - - input_rt, rate * ABS (self->in_segment.rate), GST_SECOND); + input_rt, rate * self->out_segment.rate, GST_SECOND); drop_samples = self->current_offset + avail_samples + new_offset; GST_DEBUG_OBJECT (self, @@ -679,19 +660,93 @@ return NULL; } - if (self->out_segment.rate < 0.0) { - buffer = - gst_audio_buffer_truncate (buffer, bpf, 0, - nsamples - self->drop_samples); - self->drop_samples = 0; - return buffer; - } else { - buffer = gst_audio_buffer_truncate (buffer, bpf, self->drop_samples, -1); - self->drop_samples = 0; - return buffer; + buffer = gst_audio_buffer_truncate (buffer, bpf, self->drop_samples, -1); + self->drop_samples = 0; + return buffer; +} + +static GstBuffer * +gst_audio_buffer_split_reverse_buffer (GstAudioBufferSplit * self, + GstBuffer * buffer, + const GstSegment * segment, gint rate, gint channels, gint bps) +{ + guint n_samples; + GstBuffer *outbuf; + GstClockTime pts, pts_end; + GstClockTime new_pts; + GstMapInfo in_map, out_map; + + n_samples = gst_buffer_get_size (buffer) / (bps * channels); + outbuf = gst_buffer_new_and_alloc (gst_buffer_get_size (buffer)); + + gst_buffer_copy_into (outbuf, buffer, GST_BUFFER_COPY_METADATA, 0, -1); + + pts = GST_BUFFER_PTS (buffer); + pts_end = pts + gst_util_uint64_scale (n_samples, GST_SECOND, rate); + + // PTS / PTS end are already clipped into the segment but due to rounding + // errors PTS end might be just behind segment.stop + if (pts_end > self->in_segment.stop) + pts_end = self->in_segment.stop; + new_pts = self->in_segment.start + (self->in_segment.stop - pts_end); + + GST_BUFFER_PTS (outbuf) = new_pts; + + GST_LOG_OBJECT (self, + "Reversing buffer of %u samples from PTS %" GST_TIME_FORMAT " to PTS %" + GST_TIME_FORMAT, n_samples, GST_TIME_ARGS (pts), GST_TIME_ARGS (new_pts)); + + if (n_samples == 0) + goto out; + + gst_buffer_map (buffer, &in_map, GST_MAP_READ); + gst_buffer_map (outbuf, &out_map, GST_MAP_WRITE); + +#define REVERSE_SAMPLES(type, stride) { \ + gsize i, j; \ + const type *in = (const type *) in_map.data; \ + type *out = ((type *) out_map.data) + (n_samples - 1) * channels * stride; \ + \ + for (i = 0; i < n_samples; i++) { \ + for (j = 0; j < channels * stride; j++) { \ + outj = inj; \ + } \ + \ + in += channels * stride; \ + out -= channels * stride; \ + } \ +} + + switch (bps) { + case 1: + REVERSE_SAMPLES (guint8, 1); + break; + case 2: + REVERSE_SAMPLES (guint16, 1); + break; + case 3: + REVERSE_SAMPLES (guint8, 3); + break; + case 4: + REVERSE_SAMPLES (guint32, 1); + break; + case 8: + REVERSE_SAMPLES (guint64, 1); + break; + default: + g_assert_not_reached (); + break; } - return buffer; +#undef REVERSE_SAMPLES + + gst_buffer_unmap (outbuf, &out_map); + gst_buffer_unmap (buffer, &in_map); + +out: + gst_buffer_unref (buffer); + + return outbuf; } static GstFlowReturn @@ -701,7 +756,7 @@ GstAudioBufferSplit *self = GST_AUDIO_BUFFER_SPLIT (parent); GstFlowReturn ret; GstAudioFormat format; - gint rate, bpf, samples_per_buffer; + gint rate, bpf, channels, bps, samples_per_buffer; GST_OBJECT_LOCK (self); format = @@ -709,18 +764,21 @@ finfo ? GST_AUDIO_INFO_FORMAT (&self->info) : GST_AUDIO_FORMAT_UNKNOWN; rate = GST_AUDIO_INFO_RATE (&self->info); bpf = GST_AUDIO_INFO_BPF (&self->info); + channels = GST_AUDIO_INFO_CHANNELS (&self->info); + bps = GST_AUDIO_INFO_BPS (&self->info); samples_per_buffer = self->samples_per_buffer; GST_OBJECT_UNLOCK (self); GST_LOG_OBJECT (self, "Processing buffer at running time %" GST_TIME_FORMAT " with timestamp %" GST_TIME_FORMAT " with duration %" GST_TIME_FORMAT - " (%u samples)", + " (%u samples)%s", GST_TIME_ARGS (gst_segment_to_running_time (&self->in_segment, GST_FORMAT_TIME, GST_BUFFER_PTS (buffer))), GST_TIME_ARGS (GST_BUFFER_PTS (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), - (guint) (gst_buffer_get_size (buffer) / bpf)); + (guint) (gst_buffer_get_size (buffer) / bpf), + GST_BUFFER_IS_DISCONT (buffer) ? " with discont" : ""); if (format == GST_AUDIO_FORMAT_UNKNOWN || samples_per_buffer == 0) { gst_buffer_unref (buffer); @@ -728,8 +786,18 @@ } buffer = gst_audio_buffer_clip (buffer, &self->in_segment, rate, bpf); - if (!buffer) + if (!buffer) { + GST_LOG_OBJECT (self, "Clipped buffer"); return GST_FLOW_OK; + } + + if (self->segment_reversed) { + buffer = + gst_audio_buffer_split_reverse_buffer (self, buffer, &self->in_segment, + rate, channels, bps); + if (!buffer) + return GST_FLOW_ERROR; + } ret = gst_audio_buffer_split_handle_discont (self, buffer, format, rate, bpf, @@ -821,6 +889,7 @@ case GST_EVENT_SEGMENT: gst_event_copy_segment (event, &self->in_segment); if (self->in_segment.format != GST_FORMAT_TIME) { + self->segment_reversed = FALSE; gst_event_unref (event); ret = FALSE; } else { @@ -829,11 +898,19 @@ &self->in_segment); self->segment_pending = TRUE; self->segment_seqnum = gst_event_get_seqnum (event); + if (self->in_segment.rate < 0.0) { + self->in_segment.rate = -self->in_segment.rate; + self->in_segment.applied_rate = -self->in_segment.applied_rate; + self->segment_reversed = TRUE; + } else { + self->segment_reversed = FALSE; + } gst_event_unref (event); ret = TRUE; } break; case GST_EVENT_EOS: + case GST_EVENT_SEGMENT_DONE: if (self->strict_buffer_size) { gst_adapter_clear (self->adapter); } else { @@ -853,8 +930,92 @@ gst_audio_buffer_split_output (self, TRUE, rate, bpf, samples_per_buffer); } + + if (self->segment_pending) { + GstEvent *event; + + self->out_segment = self->in_segment; + GST_DEBUG_OBJECT (self, "Updating output segment %" GST_SEGMENT_FORMAT, + &self->out_segment); + event = gst_event_new_segment (&self->out_segment); + gst_event_set_seqnum (event, self->segment_seqnum); + gst_pad_push_event (self->srcpad, event); + self->segment_pending = FALSE; + } + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT_DONE + && self->segment_reversed) { + GstFormat format; + gint64 new_position, position; + guint32 seqnum = gst_event_get_seqnum (event); + + gst_event_parse_segment_done (event, &format, &position); + new_position = position; + if (new_position < self->in_segment.start) + new_position = self->in_segment.start; + new_position = + self->in_segment.stop - (new_position - self->in_segment.start); + + gst_event_unref (event); + event = gst_event_new_segment_done (format, new_position); + if (format == GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (self, + "Updating segment-done position from %" GST_TIME_FORMAT " to %" + GST_TIME_FORMAT, GST_TIME_ARGS (position), + GST_TIME_ARGS (new_position)); + } else { + GST_DEBUG_OBJECT (self, + "Updating segment-done position from %" G_GINT64_FORMAT " to %" + G_GINT64_FORMAT, position, new_position); + } + gst_event_set_seqnum (event, seqnum); + } + ret = gst_pad_event_default (pad, parent, event); break; + case GST_EVENT_GAP:{ + GstClockTime timestamp, duration; + + gst_event_parse_gap (event, ×tamp, &duration); + gst_event_unref (event); + + if (duration == GST_CLOCK_TIME_NONE || self->info.rate == 0) { + GST_DEBUG_OBJECT (self, "Dropping gap event %" GST_PTR_FORMAT, event); + } else { + GstClockTime pts = timestamp; + guint64 silence_samples = + gst_util_uint64_scale (duration, self->info.rate, GST_SECOND); + + GST_DEBUG_OBJECT (self, + "Converting gap event %" GST_PTR_FORMAT " to silence buffer", + event); + + while (silence_samples > 0) { + guint n_samples = MIN (silence_samples, self->info.rate); + GstBuffer *buffer; + GstMapInfo map; + GstFlowReturn flow_ret; + + buffer = gst_buffer_new_and_alloc (n_samples * self->info.bpf); + GST_BUFFER_PTS (buffer) = pts; + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_GAP); + gst_buffer_map (buffer, &map, GST_MAP_WRITE); + gst_audio_format_info_fill_silence (self->info.finfo, map.data, + map.size); + gst_buffer_unmap (buffer, &map); + + flow_ret = gst_audio_buffer_split_sink_chain (self->sinkpad, + GST_OBJECT_CAST (self), buffer); + + if (flow_ret != GST_FLOW_OK) + return FALSE; + + silence_samples -= n_samples; + pts += gst_util_uint64_scale (n_samples, GST_SECOND, self->info.rate); + } + } + break; + } default: ret = gst_pad_event_default (pad, parent, event); break;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/audiobuffersplit/gstaudiobuffersplit.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/audiobuffersplit/gstaudiobuffersplit.h
Changed
@@ -1,4 +1,4 @@ -/* +/* * GStreamer * Copyright (C) 2016 Sebastian Dröge <sebastian@centricular.com> * @@ -17,7 +17,7 @@ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ - + #ifndef __GST_AUDIO_BUFFER_SPLIT_H__ #define __GST_AUDIO_BUFFER_SPLIT_H__ @@ -51,6 +51,7 @@ GstSegment in_segment, out_segment; guint32 segment_seqnum; gboolean segment_pending; + gboolean segment_reversed; GstAudioInfo info; GstAdapter *adapter;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/closedcaption/gstccconverter.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/closedcaption/gstccconverter.c
Changed
@@ -1747,7 +1747,7 @@ drain_input (self); /* fallthrough */ - case GST_EVENT_FLUSH_START: + case GST_EVENT_FLUSH_STOP: reset_counters (self); break; default:
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/closedcaption/gstcea608mux.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/closedcaption/gstcea608mux.c
Changed
@@ -216,8 +216,8 @@ static GstFlowReturn finish_s334_both_fields (GstCea608Mux * self) { - GstClockTime output_pts = gst_util_uint64_scale_int (GST_SECOND, - self->cdp_fps_entry->fps_d * self->n_output_buffers, + GstClockTime output_pts = gst_util_uint64_scale (GST_SECOND, + (guint64) self->cdp_fps_entry->fps_d * self->n_output_buffers, self->cdp_fps_entry->fps_n); GstClockTime output_duration = gst_util_uint64_scale_int (GST_SECOND, self->cdp_fps_entry->fps_d,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/closedcaption/gsth264ccextractor.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/closedcaption/gsth264ccextractor.c
Changed
@@ -207,6 +207,9 @@ if (self->caption_type == GST_VIDEO_CAPTION_TYPE_UNKNOWN) self->caption_type = GST_VIDEO_CAPTION_TYPE_CEA708_RAW; + self->fps_n = state->info.fps_n; + self->fps_d = state->info.fps_d; + /* Create dummy output state. Otherwise decoder baseclass will try to create * video caps on GAP event */ out_state = gst_video_decoder_set_output_state (decoder,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/closedcaption/gsth265ccextractor.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/closedcaption/gsth265ccextractor.c
Changed
@@ -202,6 +202,9 @@ if (self->caption_type == GST_VIDEO_CAPTION_TYPE_UNKNOWN) self->caption_type = GST_VIDEO_CAPTION_TYPE_CEA708_RAW; + self->fps_n = state->info.fps_n; + self->fps_d = state->info.fps_d; + /* Create dummy output state. Otherwise decoder baseclass will try to create * video caps on GAP event */ out_state = gst_video_decoder_set_output_state (decoder,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/codectimestamper/gstcodectimestamper.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/codectimestamper/gstcodectimestamper.c
Changed
@@ -688,8 +688,11 @@ gst_query_parse_latency (query, &live, &min, &max); g_rec_mutex_lock (&priv->lock); - if (GST_CLOCK_TIME_IS_VALID (priv->latency)) + if (GST_CLOCK_TIME_IS_VALID (priv->latency)) { min += priv->latency; + if (GST_CLOCK_TIME_IS_VALID (max)) + max += priv->latency; + } g_rec_mutex_unlock (&priv->lock); gst_query_set_latency (query, live, min, max);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/debugutils/gstvideocodectestsink.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/debugutils/gstvideocodectestsink.c
Changed
@@ -434,7 +434,7 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gst_element_class_set_static_metadata (element_class, - "Video CODEC Test Sink", "Debug/video/Sink", + "Video CODEC Test Sink", "Debug/Video/Sink", "Sink to test video CODEC conformance", - "Nicolas Dufresne <nicolas.dufresne@collabora.com"); + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/dvbsuboverlay/dvb-sub.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/dvbsuboverlay/dvb-sub.c
Changed
@@ -373,8 +373,8 @@ } static void -_dvb_sub_parse_page_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf, - gint buf_size) +_dvb_sub_parse_page_segment (DvbSub * dvb_sub, guint16 page_id, + const guint8 * buf, gint buf_size) { /* FIXME: Use guint for buf_size here and in many other places? */ DVBSubRegionDisplay *display; DVBSubRegionDisplay *tmp_display_list, **tmp_ptr; @@ -451,8 +451,8 @@ } static void -_dvb_sub_parse_region_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf, - gint buf_size) +_dvb_sub_parse_region_segment (DvbSub * dvb_sub, guint16 page_id, + const guint8 * buf, gint buf_size) { const guint8 *buf_end = buf + buf_size; guint8 region_id; @@ -483,6 +483,17 @@ region->height = GST_READ_UINT16_BE (buf); buf += 2; + /* Avoid integer overflows and also clamp to a reasonable size of 8kx8k for + * the region size. We allow 16kx16k display sizes. */ + if (region->width > 8192 || region->height > 8192) { + GST_WARNING ("too large region of %ux%x", region->width, region->height); + g_free (region->pbuf); + region->pbuf = NULL; + region->buf_size = 0; + region->width = region->height = 0; + return; + } + if (region->width * region->height != region->buf_size) { /* FIXME: Read closer from spec what happens when dimensions change */ g_free (region->pbuf); @@ -574,8 +585,8 @@ } static void -_dvb_sub_parse_clut_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf, - gint buf_size) +_dvb_sub_parse_clut_segment (DvbSub * dvb_sub, guint16 page_id, + const guint8 * buf, gint buf_size) { const guint8 *buf_end = buf + buf_size; guint8 clut_id; @@ -585,6 +596,9 @@ GST_MEMDUMP ("DVB clut packet", buf, buf_size); + if (buf_size < 1) + return; + clut_id = *buf++; buf += 1; @@ -601,7 +615,7 @@ dvb_sub->clut_list = clut; } - while (buf + 4 < buf_end) { + while (buf + 2 < buf_end) { entry_id = *buf++; depth = (*buf) & 0xe0; @@ -614,11 +628,15 @@ full_range = (*buf++) & 1; if (full_range) { + if (buf + 4 > buf_end) + break; y = *buf++; cr = *buf++; cb = *buf++; alpha = *buf++; } else { + if (buf + 2 > buf_end) + break; y = buf0 & 0xfc; cr = (((buf0 & 3) << 2) | ((buf1 >> 6) & 3)) << 4; cb = (buf1 << 2) & 0xf0; @@ -633,11 +651,11 @@ GST_DEBUG ("CLUT DEFINITION: clut %d := (%d,%d,%d,%d)", entry_id, y, cb, cr, alpha); - if (depth & 0x80) + if ((depth & 0x80) && entry_id < 4) clut->clut4entry_id = AYUV (y, cb, cr, 255 - alpha); - if (depth & 0x40) + if ((depth & 0x40) && entry_id < 16) clut->clut16entry_id = AYUV (y, cb, cr, 255 - alpha); - if (depth & 0x20) + if ((depth & 0x20) && entry_id < 256) clut->clut256entry_id = AYUV (y, cb, cr, 255 - alpha); } } @@ -649,8 +667,6 @@ const guint8 ** srcbuf, gint buf_size, guint8 non_mod, guint8 * map_table) { GstBitReader gb = GST_BIT_READER_INIT (*srcbuf, buf_size); - /* FIXME: Handle FALSE returns from gst_bit_reader_get_* calls? */ - gboolean stop_parsing = FALSE; guint32 bits = 0; guint32 pixels_read = 0; @@ -661,23 +677,29 @@ while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 1)) { guint run_length = 0, clut_index = 0; - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 2)) + goto not_enough_data; if (bits) { /* 2-bit_pixel-code */ run_length = 1; clut_index = bits; } else { /* 2-bit_zero */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 1)) + goto not_enough_data; if (bits == 1) { /* switch_1 == '1' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 3); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 3)) + goto not_enough_data; run_length += 3; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2)) + goto not_enough_data; } else { /* switch_1 == '0' */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 1)) + goto not_enough_data; if (bits == 1) { /* switch_2 == '1' */ run_length = 1; /* 1x pseudo-colour '00' */ } else { /* switch_2 == '0' */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 2)) + goto not_enough_data; switch (bits) { /* switch_3 */ case 0x0: /* end of 2-bit/pixel_code_string */ stop_parsing = TRUE; @@ -686,14 +708,18 @@ run_length = 2; break; case 0x2: /* the following 6 bits contain run length coded pixel data */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 4)) + goto not_enough_data; run_length += 12; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2)) + goto not_enough_data; break; case 0x3: /* the following 10 bits contain run length coded pixel data */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 8)) + goto not_enough_data; run_length += 29; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2)) + goto not_enough_data; break; } } @@ -727,13 +753,18 @@ pixels_read += run_length; } - // FIXME: Test skip_to_byte instead of adding 7 bits, once everything else is working good - //gst_bit_reader_skip_to_byte (&gb); - *srcbuf += (gst_bit_reader_get_pos (&gb) + 7) >> 3; + gst_bit_reader_skip_to_byte (&gb); + *srcbuf = gb.data + gb.byte; GST_TRACE ("PIXEL: returning, read %u pixels", pixels_read); // FIXME: Shouldn't need this variable if tracking things in the loop better return pixels_read; + +not_enough_data: + GST_WARNING ("Not enough data"); + // Go to the end of the buffer so the caller stops parsing + *srcbuf += buf_size; + return 0; } // FFMPEG-FIXME: The same code in ffmpeg is much more complex, it could use the same @@ -743,7 +774,6 @@ const guint8 ** srcbuf, gint buf_size, guint8 non_mod, guint8 * map_table) { GstBitReader gb = GST_BIT_READER_INIT (*srcbuf, buf_size); - /* FIXME: Handle FALSE returns from gst_bit_reader_get_* calls? */ gboolean stop_parsing = FALSE; guint32 bits = 0; guint32 pixels_read = 0; @@ -755,28 +785,35 @@ while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 3)) { guint run_length = 0, clut_index = 0; - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 4)) + goto not_enough_data; if (bits) { run_length = 1; clut_index = bits; } else { - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 1)) + goto not_enough_data; if (bits == 0) { /* switch_1 == '0' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 3); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 3)) + goto not_enough_data; if (!run_length) { stop_parsing = TRUE; } else { run_length += 2; } } else { /* switch_1 == '1' */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 1)) + goto not_enough_data; if (bits == 0) { /* switch_2 == '0' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 2)) + goto not_enough_data; run_length += 4; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4)) + goto not_enough_data; } else { /* switch_2 == '1' */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 2)) + goto not_enough_data; switch (bits) { case 0x0: /* switch_3 == '00' */ run_length = 1; /* 1 pixel of pseudo-color 0 */ @@ -785,14 +822,18 @@ run_length = 2; /* 2 pixels of pseudo-color 0 */ break; case 0x2: /* switch_3 == '10' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 4)) + goto not_enough_data; run_length += 9; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4)) + goto not_enough_data; break; case 0x3: /* switch_3 == '11' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 8)) + goto not_enough_data; run_length += 25; - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4); + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4)) + goto not_enough_data; break; } } @@ -826,14 +867,19 @@ pixels_read += run_length; } - // FIXME: Test skip_to_byte instead of adding 7 bits, once everything else is working good - //gst_bit_reader_skip_to_byte (&gb); - *srcbuf += (gst_bit_reader_get_pos (&gb) + 7) >> 3; + gst_bit_reader_skip_to_byte (&gb); + *srcbuf = gb.data + gb.byte; GST_LOG ("Returning with %u pixels read", pixels_read); // FIXME: Shouldn't need this variable if tracking things in the loop better return pixels_read; + +not_enough_data: + GST_WARNING ("Not enough data"); + // Go to the end of the buffer so the caller stops parsing + *srcbuf += buf_size; + return 0; } static int @@ -841,8 +887,6 @@ const guint8 ** srcbuf, gint buf_size, guint8 non_mod, guint8 * map_table) { GstBitReader gb = GST_BIT_READER_INIT (*srcbuf, buf_size); - /* FIXME: Handle FALSE returns from gst_bit_reader_get_* calls? */ - gboolean stop_parsing = FALSE; guint32 bits = 0; guint32 pixels_read = 0; @@ -858,23 +902,29 @@ /* Rephrased - it's better to work with bytes with default value '0' instead of reading from memory we don't own. */ while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 7)) { guint run_length = 0, clut_index = 0; - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8); + + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 8)) + goto not_enough_data; if (bits) { /* 8-bit_pixel-code */ run_length = 1; clut_index = bits; } else { /* 8-bit_zero */ - bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1); + if (!gst_bit_reader_get_bits_uint32 (&gb, &bits, 1)) + goto not_enough_data; if (bits == 0) { /* switch_1 == '0' */ /* run_length_1-127 for pseudo-colour _entry) '0x00' */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 7); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 7)) + goto not_enough_data; if (run_length == 0) { /* end_of_string_signal */ stop_parsing = TRUE; } } else { /* switch_1 == '1' */ /* run_length_3-127 */ - run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 7); - clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8); + if (!gst_bit_reader_get_bits_uint32 (&gb, &run_length, 7)) + goto not_enough_data; + if (!gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 8)) + goto not_enough_data; if (run_length < 3) { GST_WARNING ("runlength value was %u, but the spec requires it " @@ -912,10 +962,17 @@ GST_LOG ("Returning with %u pixels read", pixels_read); - *srcbuf += (gst_bit_reader_get_pos (&gb) + 7) >> 3; + gst_bit_reader_skip_to_byte (&gb); + *srcbuf = gb.data + gb.byte; // FIXME: Shouldn't need this variable if tracking things in the loop better return pixels_read; + +not_enough_data: + GST_WARNING ("Not enough data"); + // Go to the end of the buffer so the caller stops parsing + *srcbuf += buf_size; + return 0; } static void @@ -928,7 +985,6 @@ guint8 *pbuf; int x_pos, y_pos; int i; - gboolean dest_buf_filled = FALSE; guint8 map2to4 = { 0x0, 0x7, 0x8, 0xf }; guint8 map2to8 = { 0x00, 0x77, 0x88, 0xff }; @@ -963,24 +1019,13 @@ // FFMPEG-FIXME: ffmpeg doesn't check for equality and so can overflow destination buffer later on with bad input data // FFMPEG-FIXME: However that makes it warn on end_of_object_line and map tables as well, so we add the dest_buf_filled tracking - // FIXME: Removed x_pos checking here, because we don't want to turn dest_buf_filled to TRUE permanently in that case - // FIXME: We assume that region->width - x_pos as dbuf_len to read_nbit_string will take care of that case nicely; - // FIXME: That is, that read_nbit_string never scribbles anything if dbuf_len passed to it is zero due to this. - if (y_pos >= region->height) { - dest_buf_filled = TRUE; + if (x_pos >= region->width || y_pos >= region->height) { + GST_WARNING ("Invalid object location for data_type 0x%x!", *buf); + return; } switch (*buf++) { case 0x10: - if (dest_buf_filled) { - /* FIXME: Be more verbose */ - GST_WARNING ("Invalid object location for data_type 0x%x!", - *(buf - 1)); - GST_MEMDUMP ("Remaining data after invalid object location:", buf, - (guint) (buf_end - buf)); - return; - } - if (region->depth == 8) map_table = map2to8; else if (region->depth == 4) @@ -995,15 +1040,6 @@ region->width - x_pos, &buf, buf_end - buf, non_mod, map_table); break; case 0x11: - if (dest_buf_filled) { - /* FIXME: Be more verbose */ - GST_WARNING ("Invalid object location for data_type 0x%x!", - *(buf - 1)); - GST_MEMDUMP ("Remaining data after invalid object location:", buf, - buf_end - buf); - return; // FIXME: Perhaps tell read_nbit_string that dbuf_len is zero and let it walk the bytes regardless? (Same FIXME for 2bit and 8bit) - } - if (region->depth < 4) { GST_WARNING ("4-bit pixel string in %d-bit region!", region->depth); return; @@ -1024,15 +1060,6 @@ GST_DEBUG ("READ_4BIT_STRING finished: buf pointer now %p", buf); break; case 0x12: - if (dest_buf_filled) { - /* FIXME: Be more verbose */ - GST_WARNING ("Invalid object location for data_type 0x%x!", - *(buf - 1)); - GST_MEMDUMP ("Remaining data after invalid object location:", - buf, (guint) (buf_end - buf)); - return; - } - if (region->depth < 8) { GST_WARNING ("8-bit pixel string in %d-bit region!", region->depth); return; @@ -1046,19 +1073,29 @@ case 0x20: GST_DEBUG ("handling map2to4 table data"); - /* FIXME: I don't see any guards about buffer size here - buf++ happens with the switch, but - * FIXME: buffer is walked without length checks? Same deal in other map table cases */ + if (buf + 2 > buf_end) { + GST_WARNING ("map2to4 table too short"); + return; + } map2to40 = (*buf) >> 4; map2to41 = (*buf++) & 0xf; map2to42 = (*buf) >> 4; map2to43 = (*buf++) & 0xf; break; case 0x21: + if (buf + 4 > buf_end) { + GST_WARNING ("map2to8 table too short"); + return; + } GST_DEBUG ("handling map2to8 table data"); for (i = 0; i < 4; i++) map2to8i = *buf++; break; case 0x22: + if (buf + 16 > buf_end) { + GST_WARNING ("map4to8 table too short"); + return; + } GST_DEBUG ("handling map4to8 table data"); for (i = 0; i < 16; i++) map4to8i = *buf++; @@ -1076,8 +1113,8 @@ } static void -_dvb_sub_parse_object_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf, - gint buf_size) +_dvb_sub_parse_object_segment (DvbSub * dvb_sub, guint16 page_id, + const guint8 * buf, gint buf_size) { const guint8 *buf_end = buf + buf_size; guint object_id; @@ -1085,6 +1122,9 @@ guint8 coding_method, non_modifying_color; + if (buf_size < 3) + return; + object_id = GST_READ_UINT16_BE (buf); buf += 2; @@ -1107,6 +1147,9 @@ DVBSubObjectDisplay *display; guint16 top_field_len, bottom_field_len; + if (buf + 4 > buf_end) + return; + top_field_len = GST_READ_UINT16_BE (buf); buf += 2; bottom_field_len = GST_READ_UINT16_BE (buf); @@ -1147,7 +1190,7 @@ } static gint -_dvb_sub_parse_display_definition_segment (DvbSub * dvb_sub, guint8 * buf, +_dvb_sub_parse_display_definition_segment (DvbSub * dvb_sub, const guint8 * buf, gint buf_size) { int dds_version, info_byte; @@ -1164,6 +1207,18 @@ display_height = GST_READ_UINT16_BE (buf) + 1; buf += 2; + /* Avoid integer overflows and also clamp to a reasonable size of 16kx16k */ + if (display_width > 16384 || display_height > 16384) { + GST_WARNING ("too large display size of %ux%x", display_width, + display_height); + /* Reset to the initial values */ + dvb_sub->display_def.version = -1; + dvb_sub->display_def.window_flag = 0; + dvb_sub->display_def.display_width = 720; + dvb_sub->display_def.display_height = 576; + return -1; + } + if ((display_width != dvb_sub->display_def.display_width) || (display_height != dvb_sub->display_def.display_height)) { dvb_sub->display_def.display_width = display_width; @@ -1386,7 +1441,8 @@ * 0 or positive if data was handled. If positive, then amount of data consumed on success. FIXME: List the positive return values. */ gint -dvb_sub_feed_with_pts (DvbSub * dvb_sub, guint64 pts, guint8 * data, gint len) +dvb_sub_feed_with_pts (DvbSub * dvb_sub, guint64 pts, const guint8 * data, + gint len) { unsigned int pos = 0; guint8 segment_type;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/dvbsuboverlay/dvb-sub.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/dvbsuboverlay/dvb-sub.h
Changed
@@ -129,7 +129,7 @@ DvbSub *dvb_sub_new (void); void dvb_sub_free (DvbSub * sub); -gint dvb_sub_feed_with_pts (DvbSub *dvb_sub, guint64 pts, guint8 *data, gint len); +gint dvb_sub_feed_with_pts (DvbSub *dvb_sub, guint64 pts, const guint8 *data, gint len); void dvb_sub_set_callbacks (DvbSub *dvb_sub, DvbSubCallbacks *callbacks, gpointer user_data); void dvb_subtitles_free (DVBSubtitles *sub);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/fieldanalysis/gstfieldanalysis.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/fieldanalysis/gstfieldanalysis.c
Changed
@@ -286,7 +286,7 @@ gst_element_class_set_static_metadata (gstelement_class, "Video field analysis", - "Filter/Analysis/Video", + "Filter/Analyzer/Video", "Analyse fields from video frames to identify if they are progressive/telecined/interlaced", "Robert Swain <robert.swain@collabora.co.uk>");
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/frei0r/gstfrei0r.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/frei0r/gstfrei0r.c
Changed
@@ -29,6 +29,15 @@ #include <string.h> #include <gmodule.h> +#ifdef G_OS_WIN32 +#define GST_MODULE_SUFFIX ".dll" +#else +#define GST_MODULE_SUFFIX ".so" +#ifdef __APPLE__ +#define GST_EXTRA_MODULE_SUFFIX ".dylib" +#endif +#endif + GST_DEBUG_CATEGORY (frei0r_debug); #define GST_CAT_DEFAULT frei0r_debug @@ -636,7 +645,7 @@ } filename = g_build_filename (path, entry_name, NULL); - if ((g_str_has_suffix (filename, G_MODULE_SUFFIX) + if ((g_str_has_suffix (filename, GST_MODULE_SUFFIX) #ifdef GST_EXTRA_MODULE_SUFFIX || g_str_has_suffix (filename, GST_EXTRA_MODULE_SUFFIX) #endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/frei0r/gstfrei0rsrc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/frei0r/gstfrei0rsrc.c
Changed
@@ -341,7 +341,7 @@ if (desc == NULL || *desc == '\0') desc = "No details"; gst_element_class_set_metadata (gstelement_class, class_data->info.name, - "Src/Video", desc, author); + "Source/Video", desc, author); g_free (author); caps = gst_frei0r_caps_from_color_model (class_data->info.color_model);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/mpegtsdemux/mpegtspacketizer.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/mpegtsdemux/mpegtspacketizer.c
Changed
@@ -1471,9 +1471,6 @@ /* keep track of the last extended pcrtime */ pcr->last_pcrtime = gstpcrtime; - if (!packetizer->skew_correction) - goto no_skew; - /* we don't have an arrival timestamp so we can't do skew detection. we * should still apply a timestamp based on RTP timestamp and base_time */ if (!GST_CLOCK_TIME_IS_VALID (time) @@ -1514,6 +1511,9 @@ delta = 0; } + if (!packetizer->skew_correction) + goto no_skew; + pos = pcr->window_pos; if (G_UNLIKELY (pcr->window_filling)) {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/mpegtsdemux/tsdemux.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/mpegtsdemux/tsdemux.c
Changed
@@ -94,10 +94,8 @@ * Push incoming buffers to the array */ PENDING_PACKET_HEADER, /* PES header needs to be parsed * Push incoming buffers to the array */ - PENDING_PACKET_BUFFER, /* Currently filling up output buffer + PENDING_PACKET_BUFFER /* Currently filling up output buffer * Push incoming buffers to the bufferlist */ - PENDING_PACKET_DISCONT /* Discontinuity in incoming packets - * Drop all incoming buffers */ } PendingPacketState; /* Pending buffer */ @@ -2881,7 +2879,13 @@ stream->pending_header_data = NULL; stream->pending_header_size = 0; } - stream->state = PENDING_PACKET_DISCONT; + if (stream->data) { + g_free (stream->data); + stream->data = NULL; + stream->current_size = 0; + } + /* We need a new PUSI */ + stream->state = PENDING_PACKET_EMPTY; return; } @@ -2895,60 +2899,15 @@ { guint8 *data; guint size; - guint8 cc = FLAGS_CONTINUITY_COUNTER (packet->scram_afc_cc); GST_LOG_OBJECT (demux, "pid: 0x%04x state:%d", stream->stream.pid, stream->state); - /* Handle expected discontinuity */ - if (G_UNLIKELY (packet->afc_flags & MPEGTS_AFC_DISCONTINUITY_FLAG)) { - GST_LOG_OBJECT (demux, "pid: 0x%04x discontinuity flag, resetting counter", - stream->stream.pid); - stream->continuity_counter = CONTINUITY_UNSET; - } - size = packet->data_end - packet->payload; data = packet->payload; - if (stream->continuity_counter == CONTINUITY_UNSET) { - GST_DEBUG_OBJECT (demux, "CONTINUITY: Initialize to %d", cc); - } else if ((cc == stream->continuity_counter + 1 || - (stream->continuity_counter == MAX_CONTINUITY && cc == 0))) { - GST_LOG_OBJECT (demux, "CONTINUITY: Got expected %d", cc); - } else { - if (stream->state != PENDING_PACKET_EMPTY) { - if (packet->payload_unit_start_indicator) { - /* A mismatch is fatal, except if this is the beginning of a new - * frame (from which we can recover) */ - if (G_UNLIKELY (stream->data)) { - g_free (stream->data); - stream->data = NULL; - } - if (G_UNLIKELY (stream->pending_header_data)) { - g_free (stream->pending_header_data); - stream->pending_header_data = NULL; - } - stream->state = PENDING_PACKET_HEADER; - } else { - gchar *pad_name = gst_pad_get_name (stream->pad); - GST_ELEMENT_WARNING_WITH_DETAILS (demux, STREAM, DEMUX, - ("CONTINUITY: Mismatch packet %d, stream %d (pid 0x%04x)", cc, - stream->continuity_counter, stream->stream.pid), (NULL), - ("warning-type", G_TYPE_STRING, "continuity-mismatch", - "packet", G_TYPE_INT, cc, - "stream", G_TYPE_INT, stream->continuity_counter, - "pid", G_TYPE_UINT, stream->stream.pid, - "pad-name", G_TYPE_STRING, pad_name, NULL)); - g_free (pad_name); - stream->state = PENDING_PACKET_DISCONT; - } - } - } - stream->continuity_counter = cc; - if (stream->state == PENDING_PACKET_EMPTY) { if (G_UNLIKELY (!packet->payload_unit_start_indicator)) { - stream->state = PENDING_PACKET_DISCONT; GST_DEBUG_OBJECT (demux, "Didn't get the first packet of this PES"); } else { GST_LOG_OBJECT (demux, "EMPTY=>HEADER"); @@ -2979,20 +2938,6 @@ stream->current_size += size; break; } - case PENDING_PACKET_DISCONT: - { - GST_LOG_OBJECT (demux, "DISCONT: not storing/pushing"); - if (G_UNLIKELY (stream->data)) { - g_free (stream->data); - stream->data = NULL; - } - if (G_UNLIKELY (stream->pending_header_data)) { - g_free (stream->pending_header_data); - stream->pending_header_data = NULL; - } - stream->continuity_counter = CONTINUITY_UNSET; - break; - } default: break; } @@ -3956,19 +3901,54 @@ return res; } +/* packet is guaranteed to have a payload */ static GstFlowReturn gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, - MpegTSPacketizerPacket * packet, GstMpegtsSection * section) + MpegTSPacketizerPacket * packet, GstMpegtsSection * section G_GNUC_UNUSED) { GstFlowReturn res = GST_FLOW_OK; + guint8 cc = FLAGS_CONTINUITY_COUNTER (packet->scram_afc_cc); - GST_LOG_OBJECT (demux, "pid 0x%04x pusi:%d, afc:%d, cont:%d, payload:%p", + GST_LOG_OBJECT (demux, "pid 0x%04x pusi:%d, afc:%d, cc:%d, payload:%p", packet->pid, packet->payload_unit_start_indicator, - packet->scram_afc_cc & 0x30, - FLAGS_CONTINUITY_COUNTER (packet->scram_afc_cc), packet->payload); + packet->scram_afc_cc & 0x30, cc, packet->payload); - if (G_UNLIKELY (packet->payload_unit_start_indicator) && - FLAGS_HAS_PAYLOAD (packet->scram_afc_cc)) { + /* Check continuity */ + if (stream->continuity_counter != CONTINUITY_UNSET) { + if (((stream->continuity_counter + 1) % 16) != cc) { + if (stream->state != PENDING_PACKET_EMPTY) { +#ifndef GST_DISABLE_GST_DEBUG + gchar *pad_name = gst_pad_get_name (stream->pad); + GST_ELEMENT_WARNING_WITH_DETAILS (demux, STREAM, DEMUX, + ("CONTINUITY: Mismatch packet %d, stream %d (pid 0x%04x)", cc, + stream->continuity_counter, stream->stream.pid), + (NULL), + ("warning-type", G_TYPE_STRING, "continuity-mismatch", "packet", + G_TYPE_INT, cc, "stream", G_TYPE_INT, + stream->continuity_counter, "pid", G_TYPE_UINT, + stream->stream.pid, "pad-name", G_TYPE_STRING, pad_name, NULL)); + g_free (pad_name); +#endif + /* Clear pending state and don't process packet */ + stream->continuity_counter = cc; + if (G_UNLIKELY (stream->data)) { + g_free (stream->data); + stream->data = NULL; + stream->current_size = 0; + } + if (G_UNLIKELY (stream->pending_header_data)) { + g_free (stream->pending_header_data); + stream->pending_header_data = NULL; + } + stream->state = PENDING_PACKET_EMPTY; + + return GST_FLOW_OK; + } + } + } + stream->continuity_counter = cc; + + if (G_UNLIKELY (packet->payload_unit_start_indicator)) { /* Flush previous data */ res = gst_ts_demux_push_pending_data (demux, stream, NULL); if (res != GST_FLOW_REWINDING) { @@ -3976,9 +3956,13 @@ * rewinding since the states will have been resetted accordingly */ stream->state = PENDING_PACKET_HEADER; } + } else if (stream->state == PENDING_PACKET_EMPTY) { + GST_LOG_OBJECT (demux, "pid: 0x%04x waiting for packet start", + stream->stream.pid); + return GST_FLOW_OK; } - if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED) + if ((res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED) && stream->pad) { gst_ts_demux_queue_data (demux, stream, packet); GST_LOG_OBJECT (demux, "current_size:%d, expected_size:%d", @@ -4052,7 +4036,7 @@ TSDemuxStream *stream = NULL; GstFlowReturn res = GST_FLOW_OK; - if (G_LIKELY (demux->program)) { + if (G_LIKELY (packet->payload && demux->program)) { stream = (TSDemuxStream *) demux->program->streamspacket->pid; if (stream) {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/mpegtsmux/tsmux/tsmux.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/mpegtsmux/tsmux/tsmux.c
Changed
@@ -1023,8 +1023,7 @@ pcr_ext = (pi->pcr % 300); flags |= 0x10; - TS_DEBUG ("Writing PCR %" G_GUINT64_FORMAT " + ext %u", pcr_base, - pcr_ext); + TS_LOG ("Writing PCR %" G_GUINT64_FORMAT " + ext %u", pcr_base, pcr_ext); bufpos++ = (pcr_base >> 25) & 0xff; bufpos++ = (pcr_base >> 17) & 0xff; bufpos++ = (pcr_base >> 9) & 0xff; @@ -1040,7 +1039,7 @@ opcr_ext = (pi->opcr % 300); flags |= 0x08; - TS_DEBUG ("Writing OPCR"); + TS_LOG ("Writing OPCR"); bufpos++ = (opcr_base >> 25) & 0xff; bufpos++ = (opcr_base >> 17) & 0xff; bufpos++ = (opcr_base >> 9) & 0xff; @@ -1060,11 +1059,11 @@ bufpos++ = pi->private_data_len; memcpy (&(bufpos), pi->private_data, pi->private_data_len); pos += pi->private_data_len; - TS_DEBUG ("%u bytes of private data", pi->private_data_len); + TS_LOG ("%u bytes of private data", pi->private_data_len); } if (pi->flags & TSMUX_PACKET_FLAG_WRITE_ADAPT_EXT) { flags |= 0x01; - TS_DEBUG ("FIXME: write Adaptation extension"); + TS_LOG ("FIXME: write Adaptation extension"); /* Write an empty extension for now */ bufpos++ = 1; bufpos++ = 0x1f; /* lower 5 bits are reserved, and should be all 1 */ @@ -1100,7 +1099,7 @@ /* Sync byte */ buf0 = TSMUX_SYNC_BYTE; - TS_DEBUG ("PID 0x%04x, counter = 0x%01x, %u bytes avail", pi->pid, + TS_LOG ("PID 0x%04x, counter = 0x%01x, %u bytes avail", pi->pid, mux->pid_packet_countspi->pid & 0x0f, stream_avail); /* 3 bits: @@ -1177,10 +1176,10 @@ if (write_adapt) { - TS_DEBUG ("Adaptation field of size >= %d + %d bytes payload", + TS_LOG ("Adaptation field of size >= %d + %d bytes payload", adapt_len, payload_len); } else { - TS_DEBUG ("Payload of %d bytes only", payload_len); + TS_LOG ("Payload of %d bytes only", payload_len); } return TRUE; @@ -1688,7 +1687,7 @@ gst_buffer_unmap (buf, &map); - GST_DEBUG ("Writing PES of size %d", (int) gst_buffer_get_size (buf)); + GST_LOG ("Writing PES of size %d", (int) gst_buffer_get_size (buf)); res = tsmux_packet_out (mux, buf, new_pcr, TRUE); /* Reset all dynamic flags */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/mpegtsmux/tsmux/tsmuxcommon.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/mpegtsmux/tsmux/tsmuxcommon.h
Changed
@@ -169,6 +169,7 @@ GST_DEBUG_CATEGORY_EXTERN (gst_base_ts_mux_debug); #define TS_DEBUG GST_DEBUG +#define TS_LOG GST_LOG G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/mxf/mxfdemux.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/mxf/mxfdemux.c
Changed
@@ -351,6 +351,14 @@ gboolean ret; GstEvent *e; + if (pad->need_segment) { + GstEvent *e = gst_event_new_segment (&demux->segment); + GST_DEBUG_OBJECT (pad, "Sending unsent %" GST_PTR_FORMAT, e); + gst_event_set_seqnum (e, demux->seqnum); + gst_pad_push_event (GST_PAD_CAST (pad), e); + pad->need_segment = FALSE; + } + pad->eos = TRUE; if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { @@ -380,9 +388,19 @@ for (i = 0; i < demux->src->len; i++) { GstMXFDemuxPad *pad = GST_MXF_DEMUX_PAD (g_ptr_array_index (demux->src, i)); - if (pad->eos && (GST_EVENT_TYPE (event) == GST_EVENT_EOS - || GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT_DONE)) - continue; + if (GST_EVENT_TYPE (event) == GST_EVENT_EOS + || GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT_DONE) { + if (pad->eos) + continue; + + if (pad->need_segment) { + GstEvent *e = gst_event_new_segment (&demux->segment); + GST_DEBUG_OBJECT (pad, "Sending unsent %" GST_PTR_FORMAT, e); + gst_event_set_seqnum (e, demux->seqnum); + gst_pad_push_event (GST_PAD_CAST (pad), e); + pad->need_segment = FALSE; + } + } ret |= gst_pad_push_event (GST_PAD_CAST (pad), gst_event_ref (event)); } @@ -4695,9 +4713,12 @@ } *stream_time = - gst_util_uint64_scale (position + sum, + gst_util_uint64_scale (sum, pad->material_track->edit_rate.d * GST_SECOND, - pad->material_track->edit_rate.n); + pad->material_track->edit_rate.n) + + gst_util_uint64_scale (position, + etrack->source_track->edit_rate.d * GST_SECOND, + etrack->source_track->edit_rate.n); return TRUE; } @@ -5615,10 +5636,8 @@ if (!p->eos && p->current_essence_track_position >= - p->current_essence_track->duration) { - p->eos = TRUE; - gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ()); - } + p->current_essence_track->duration) + gst_mxf_demux_eos_single_stream (demux, p); } while ((p = gst_mxf_demux_get_earliest_pad (demux))) { @@ -5632,8 +5651,7 @@ &position, FALSE); if (offset == -1) { GST_ERROR_OBJECT (demux, "Failed to find offset for essence track"); - p->eos = TRUE; - gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ()); + gst_mxf_demux_eos_single_stream (demux, p); continue; } @@ -5653,8 +5671,7 @@ } else { GST_WARNING_OBJECT (demux, "Seek to remaining part of the file failed"); - p->eos = TRUE; - gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ()); + gst_mxf_demux_eos_single_stream (demux, p); continue; } }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rist/gstristrtpdeext.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rist/gstristrtpdeext.c
Changed
@@ -321,7 +321,7 @@ gst_element_class_set_static_metadata (element_class, "RIST RTP Extension remover", "Filter/Network", "Removes RIST TR-06-2 RTP Header extension", - "Olivier Crete <olivier.crete@collabora.com"); + "Olivier Crete <olivier.crete@collabora.com>"); gst_element_class_add_static_pad_template (element_class, &src_templ); gst_element_class_add_static_pad_template (element_class, &sink_templ);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rist/gstristrtpext.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rist/gstristrtpext.c
Changed
@@ -282,7 +282,7 @@ gst_element_class_set_static_metadata (element_class, "RIST RTP Extension adder", "Filter/Network", "Adds RIST TR-06-2 RTP Header extension", - "Olivier Crete <olivier.crete@collabora.com"); + "Olivier Crete <olivier.crete@collabora.com>"); gst_element_class_add_static_pad_template (element_class, &src_templ); gst_element_class_add_static_pad_template (element_class, &sink_templ);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rist/gstristsink.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rist/gstristsink.c
Changed
@@ -1344,7 +1344,7 @@ gst_element_class_set_static_metadata (element_class, "RIST Sink", "Source/Network", "Sink that implements RIST TR-06-1 streaming specification", - "Nicolas Dufresne <nicolas.dufresne@collabora.com"); + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); gst_element_class_add_static_pad_template (element_class, &sink_templ); element_class->change_state = gst_rist_sink_change_state;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rist/gstristsrc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rist/gstristsrc.c
Changed
@@ -1355,7 +1355,7 @@ gst_element_class_set_static_metadata (element_class, "RIST Source", "Source/Network", "Source that implements RIST TR-06-1 streaming specification", - "Nicolas Dufresne <nicolas.dufresne@collabora.com"); + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); gst_element_class_add_static_pad_template (element_class, &src_templ); bin_class->handle_message = gst_rist_src_handle_message;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rist/gstroundrobin.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rist/gstroundrobin.c
Changed
@@ -127,7 +127,7 @@ gst_element_class_set_static_metadata (element_class, "Round Robin", "Source/Network", "A round robin dispatcher element.", - "Nicolas Dufresne <nicolas.dufresne@collabora.com"); + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); gst_element_class_add_static_pad_template (element_class, &sink_templ); gst_element_class_add_static_pad_template (element_class, &src_templ);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/rtp/gstrtpsrc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/rtp/gstrtpsrc.c
Changed
@@ -520,7 +520,7 @@ gst_element_class_set_static_metadata (gstelement_class, "RTP Source element", - "Generic/Bin/Src", + "Generic/Bin/Source", "Simple RTP src", "Marc Leeman <marc.leeman@gmail.com>"); }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/siren/gstsirendec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/siren/gstsirendec.c
Changed
@@ -80,7 +80,7 @@ gst_element_class_add_static_pad_template (element_class, &sinktemplate); gst_element_class_set_static_metadata (element_class, "Siren Decoder element", - "Codec/Decoder/Audio ", + "Codec/Decoder/Audio", "Decode streams encoded with the Siren7 codec into 16bit PCM", "Youness Alaoui <kakaroto@kakaroto.homelinux.net>");
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/siren/gstsirenenc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/siren/gstsirenenc.c
Changed
@@ -77,7 +77,7 @@ gst_element_class_add_static_pad_template (element_class, &sinktemplate); gst_element_class_set_static_metadata (element_class, "Siren Encoder element", - "Codec/Encoder/Audio ", + "Codec/Encoder/Audio", "Encode 16bit PCM streams into the Siren7 codec", "Youness Alaoui <kakaroto@kakaroto.homelinux.net>");
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/tensordecoders/gstclassifiertensordecoder.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/tensordecoders/gstclassifiertensordecoder.c
Changed
@@ -486,7 +486,7 @@ gfloat max = 0.0; gfloat *result_data = NULL; gsize len; - GQuark q, qmax; + GQuark q, qmax = 0; gint max_idx = -1; GstAnalyticsClsMtd cls_mtd; @@ -557,11 +557,7 @@ } for (gint j = 0; j < len; j++) { - if (self->class_quark != NULL) { - q = g_array_index (self->class_quark, GQuark, j); - } else { - q = j; - } + q = g_array_index (self->class_quark, GQuark, j); if (result_dataj > max) { max = result_dataj;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/tensordecoders/gstyolosegtensordecoder.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/tensordecoders/gstyolosegtensordecoder.c
Changed
@@ -217,14 +217,14 @@ *logits_tensor = gst_tensor_meta_get_typed_tensor (tmeta, YOLO_SEGMENTATION_LOGITS_TENSOR_ID, GST_TENSOR_DATA_TYPE_FLOAT32, - GST_TENSOR_DIM_ORDER_ROW_MAJOR, YOLO_LOGITS_TENSOR_N_DIMS, logits_dims); + GST_TENSOR_DIM_ORDER_COL_MAJOR, YOLO_LOGITS_TENSOR_N_DIMS, logits_dims); if (*logits_tensor == NULL) continue; *detections_tensor = gst_tensor_meta_get_typed_tensor (tmeta, YOLO_SEGMENTATION_DETECTION_MASK_ID, GST_TENSOR_DATA_TYPE_FLOAT32, - GST_TENSOR_DIM_ORDER_ROW_MAJOR, YOLO_DETECTIONS_TENSOR_N_DIMS, + GST_TENSOR_DIM_ORDER_COL_MAJOR, YOLO_DETECTIONS_TENSOR_N_DIMS, detections_dims); if (*detections_tensor == NULL)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/tensordecoders/gstyolotensordecoder.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/tensordecoders/gstyolotensordecoder.c
Changed
@@ -439,7 +439,7 @@ tensor = gst_tensor_meta_get_typed_tensor (tensor_meta, YOLO_DETECTION_MASK_ID, GST_TENSOR_DATA_TYPE_FLOAT32, - GST_TENSOR_DIM_ORDER_ROW_MAJOR, YOLO_DETECTIONS_TENSOR_N_DIMS, dims); + GST_TENSOR_DIM_ORDER_COL_MAJOR, YOLO_DETECTIONS_TENSOR_N_DIMS, dims); if (tensor) { if (tensor->dims1 < 5) {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/unixfd/gstunixfdsrc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/unixfd/gstunixfdsrc.c
Changed
@@ -488,7 +488,7 @@ GST_DEBUG_CATEGORY_INIT (unixfdsrc_debug, "unixfdsrc", 0, "Unix file descriptor source"); gst_element_class_set_static_metadata (gstelement_class, - "Unix file descriptor source", "Src", "Unix file descriptor source", + "Unix file descriptor source", "Source", "Unix file descriptor source", "Xavier Claessens <xavier.claessens@collabora.com>"); gst_element_class_add_static_pad_template (gstelement_class, &srctemplate);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/videofilters/gstzebrastripe.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/videofilters/gstzebrastripe.c
Changed
@@ -110,7 +110,7 @@ gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass), "Zebra stripe overlay", - "Filter/Analysis", + "Video/Filter/Analyzer", "Overlays zebra striping on overexposed areas of video", "David Schleef <ds@entropywave.com>");
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/gst/videoparsers/gstmpegvideoparse.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/gst/videoparsers/gstmpegvideoparse.c
Changed
@@ -157,7 +157,7 @@ "MPEG video elementary stream parser", "Codec/Parser/Video", "Parses and frames MPEG-1 and MPEG-2 elementary video streams", - "Wim Taymans <wim.taymans@ccollabora.co.uk>, " + "Wim Taymans <wim.taymans@collabora.co.uk>, " "Jan Schmidt <thaytan@mad.scientist.com>, " "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>");
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/meson.build
Changed
@@ -1,5 +1,5 @@ project('gst-plugins-bad', 'c', 'cpp', - version : '1.28.0', + version : '1.28.1', meson_version : '>= 1.4', default_options : 'warning_level=1', 'buildtype=debugoptimized' ) @@ -43,8 +43,16 @@ cc = meson.get_compiler('c') cxx = meson.get_compiler('cpp') host_system = host_machine.system() +subsystem = '' +if host_system == 'ios' + warning('Setting system = \'ios\' in the cross file is deprecated, please use subsystem names') + host_system = 'darwin' + subsystem = 'ios' +elif host_system == 'darwin' + subsystem = host_machine.subsystem() +endif -if host_system in 'ios', 'darwin' +if host_system == 'darwin' have_objc = add_languages('objc', native: false) have_objcpp = add_languages('objcpp', native: false) else @@ -288,11 +296,8 @@ # FIXME: This should be exposed as a configuration option if host_system == 'linux' cdata.set_quoted('DEFAULT_VIDEOSRC', 'v4l2src') -elif 'darwin', 'ios'.contains(host_system) +elif host_system == 'darwin' cdata.set_quoted('DEFAULT_VIDEOSRC', 'avfvideosrc') - cdata.set_quoted('GST_EXTRA_MODULE_SUFFIX', '.dylib') - # Yes, we set this for iOS too. Same as Autotools. - cdata.set('HAVE_OSX', 1) else cdata.set_quoted('DEFAULT_VIDEOSRC', 'videotestsrc') endif @@ -407,7 +412,7 @@ endif # Optional dep of msdk and va -if host_system not in 'darwin', 'ios', 'android', 'windows', 'gnu' +if host_system not in 'darwin', 'android', 'windows', 'gnu' libdrm_dep = dependency('libdrm', version : '>=2.4.50', required : get_option('drm').enabled() or get_option('msdk').enabled(), ) @@ -456,28 +461,10 @@ winsock2 = endif -if 'darwin', 'ios'.contains(host_system) +if host_system == 'darwin' if not have_objc error('Building on MacOS/iOS/etc requires an ObjC compiler') endif - if host_system == 'ios' - cdata.set('HAVE_IOS', 1) - endif - - avfoundation_dep = dependency('AVFoundation', required : false) - if avfoundation_dep.found() - cdata.set('HAVE_AVFOUNDATION', 1) - endif - - videotoolbox_dep = dependency('VideoToolbox', required : false) - if videotoolbox_dep.found() - cdata.set('HAVE_VIDEOTOOLBOX', 1) - endif - -# FIXME: framework.version() returns 'unknown' -# if videotoolbox_dep.version().version_compare('>=10.9.6') -# cdata.set('HAVE_VIDEOTOOLBOX_10_9_6', 1) -# endif endif have_orcc = false @@ -643,6 +630,16 @@ meson.add_dist_script('scripts/gen-changelog.py', meson.project_name(), '1.26.0', meson.project_version()) +# dist common files from monorepo root +if not meson.is_subproject() + meson.add_dist_script('scripts/dist-common-files.py', meson.project_version()) +endif + +# dist common files from monorepo root +if not meson.is_subproject() + meson.add_dist_script('scripts/dist-common-files.py', meson.project_version()) +endif + subdir('docs') plugin_names =
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/po/gst-plugins-bad-1.0.pot -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/po/gst-plugins-bad-1.0.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.28.0\n" +"Project-Id-Version: gst-plugins-bad-1.28.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-27 17:03+0000\n" +"POT-Creation-Date: 2026-02-26 01:45+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/po/gst-plugins-bad.pot -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/po/gst-plugins-bad.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.28.0\n" +"Project-Id-Version: gst-plugins-bad-1.28.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-27 17:03+0000\n" +"POT-Creation-Date: 2026-02-26 01:45+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
View file
_service:download_files:gst-plugins-bad-1.28.1.tar.xz/release-notes-1.28.md
Added
@@ -0,0 +1,1705 @@ +# GStreamer 1.28 Release Notes + +GStreamer 1.28.0 was originally released on 27 January 2026. + +The latest bug-fix release in the stable 1.28 series is 1.28.1(#1.28.1) and was released on 26 February 2026. + +See https://gstreamer.freedesktop.org/releases/1.28/latest for the latest version of this document. + +*Last updated: Thursday 26 February 2026, 01:00 UTC (log)gitlog* + +latest: https://gstreamer.freedesktop.org/releases/1.28/ +gitlog: https://gitlab.freedesktop.org/gstreamer/www/commits/main/src/htdocs/releases/1.28/release-notes-1.28.md + +<a id="introduction"></a> +## Introduction + +The GStreamer team is proud to announce a new major feature release in the +stable 1.x API series of your favourite cross-platform multimedia framework! + +As always, this release is again packed with many new features, bug fixes, and other improvements. + +<a id="highlights"></a> +## Highlights + +- AMD HIP plugin and integration helper library +- Vulkan Video AV1 and VP9 decoding, H.264 encoding, and 10-bit support for H.265 decoder +- waylandsink: Parse and set the HDR10 metadata and other color management improvements +- Audio source separation element based on demucs in Rust +- Analytics combiner and splitter elements plus batch meta to batch buffers from one or more streams +- LiteRT inference element; move modelinfo to analytics lib; add script to help with modelinfo generation and upgrade +- Add general classifier tensor-decoder, facedetector, and more analytics convenience API +- New tensordecodebin element to auto-plug compatible tensor decoders based on their caps and many other additions and improvements +- Add a burn-based YOLOX inference element and a YOLOX tensor decoder in Rust +- applemedia: VideoToolbox VP9 and AV1 hardware-accelerated decoding support, and 10-bit HEVC encoding +- Add new GIF decoder element in Rust with looping support +- input-selector: implements a two-phase sinkpad switch now to avoid races when switching input pads +- The inter wormhole sink and source elements gained a way to forward upstream events to the producer as well as new fine-tuning properties +- webrtcsink: add renegotiation support and support for va hardware encoders +- webrtc WHEP client and server signaller +- New ST-2038 ancillary data combiner and extractor elements +- fallbacksrc gained support for encoded streams +- flv: enhanced rtmp H.265 video support, and support for multitrack audio +- glupload: Implement udmabuf uploader to share buffers between software decoders/sources and GPUs, display engines (wayland), and other dma devices +- video: Add crop, scale, rotate, flip, shear and more GstMeta transformation +- New task pool GstContext to share a thread pool amongst elements for better resource management and performance, especially for video conversion and compositing +- New Deepgram speech-to-text transcription plugin and many other translation and transcription improvements +- Speech synthesizers: expose new "compress" overflow mode that can speed up audio while preserving pitch +- ElevenLabs voice cloning element and support for Speechmatics speaker identification API +- textaccumulate: new element for speech synthesis or translation preprocessing +- New vmaf element to calculate perceptual video quality assessment scores using Netflix's VMAF framework +- decodebin3: expose KLV, ID3 PES and ST-2038 ancillary data streams with new metadata GstStream type +- New MPEG-H audio decoding plugin plus MP4 demuxing support +- LCEVC: Add autoplugging decoding support for LCEVC H265 and H266 video streams and LCEVC H.265 and H.266 encoders +- RTP "robust MPEG audio", raw audio (L8, L16, L24), and SMPTE ST291 ancillary metadata payloaders/depayloaders in Rust +- Add a Rust-based icecastsink element with AAC support +- The Windows IPC plugin gained support for passing generic data in addition to raw audio/video, and various properties +- New D3D12 interlace and overlay compositor elements, plus many other D3D12 improvements +- Blackmagic Decklink elements gained support for capturing and outputting all types of VANC via GstAncillaryMeta +- GstLogContext API to reduce log spam in several components and `GST_DEBUG_ONCE` (etc) convenience macros to log things only once +- hlssink3, hlscmafsink: Support the use of a single media file, plus I-frame only playlist support +- Webkit: New wpe2 plugin making use of the "WPE Platform API" +- MPEG-TS demuxer can now disable skew corrections +- New Qt6 QML render source element +- qml6gloverlay: support directly passing a QQuickItem for QML the render tree +- unifxfdsink: Add a property to allow copying to make sink usable with more upstream elements +- dots-viewer: Improve dot file generation and interactivity +- Python bindings: more syntactic sugar, analytics API improvements and type annotations +- cerbero: add support for Python wheel packaging, Windows ARM64, new iOS xcframework, Gtk4 on macOS and Windows, and more plugins +- Smaller binary sizes of Rust plugins in Windows and Android binary packages +- Peel: New C++ bindings for GStreamer +- Lots of new plugins, features, performance improvements and bug fixes +- Countless bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements + +<a id="major-changes"></a> +## Major new features and changes + +<a id="hip"></a> +### AMD HIP plugin and integration library + +- HIP (formerly known as Heterogeneous-computing Interface for Portability) is AMD’s + GPU programming API that enables portable, CUDA-like development across both AMD and + NVIDIA platforms: + + - On AMD GPUs, HIP runs natively via the ROCm stack. + - On NVIDIA GPUs, HIP operates as a thin translation layer over the CUDA runtime and driver APIs. + + This allows developers to maintain a single codebase that can target multiple GPU vendors with minimal effort. + +- The **new HIP plugin**hip-plugin provides the following elements: + + - **hipcompositor**: a HIP-based video mixer/compositor + - **hipconvert**: Converts video from one colorspace to another using HIP + - **hipconvertscale**: Resizes video and allow color conversion using HIP + - **hipscale**: Resize video using HIP + - **hipdownload**: Downloads HIP device memory into system memory + - **hipupload**: Uploads system memory into HIP device memory + +- The **GStreamer HIP integration helper library** provides HIP integration functionality + to applications and other HIP users. + +- Watch the Bringing AMD HIP into GStreamergstconf-hip talk from last year's GStreamer Conference + for more details or read Seungha's devlog postdevlog-hip on the subject. + +hip-plugin: https://gstreamer.freedesktop.org/documentation/hip/index.html?gi-language=c#hip-page +gstconf-hip: https://gstconf.ubicast.tv/videos/bringing-amd-hip-into-gstreamer/ +devlog-hip: https://centricular.com/devlog/2025-07/amd-hip-integration/ + +<a id="lvecv"></a> +### Low Complexity Enhancement Video Coding (LCEVC) support for H.265 and H.266 + +- LCEVClcevc is a codec that provides an enhancement layer on top of + another codec such as H.264 for example. It is standardised as MPEG-5 Part 2. + +- **LCEVC H.265 and H.266 encoder and decoder elements** based on V-Nova's SDK libraries + were added in this cycle + +- **Autoplugging support for LCEVC H265 and H266 video streams**, so these can be decoded + automatically in a decodebin3 or playbin3 scenario. + +lcevc: https://www.lcevc.org + +<a id="closedcaptions"></a> +### Closed captions and text handling improvements + +- **cea708overlay**: suport non-relative positioning for streams with CCs + that do not have relative positions. Instead of displaying them at the + top, they are positioned relatively. + +- **cea708mux**: expose "discarded-services" property on sink pads. This can be + useful when muxing in an original caption stream with a newly-created one + (e.g. transcription / translation), in which case one might wish to discard + select services from the original stream in order to avoid garbled captions. + +- **sccparse**: Better handling of streams with more byte tuples in the SCC field. + +- **tttocea608**: expose "speaker-prefix" property + +- Miscellaneous improvements and spec compliance fixes + +- Also see SMPTE ST-2038 metadata section below. + +<a id="stt-translations-and-speech-synthesis"></a> +### Speech to Text, Translation and Speech Synthesis + +- New **audio source separation element based on demucs** in Rust. This is useful + to separate speech from background audio before running speech to text transcription, + but could also be used to separate vocals from music for karaoke. + +- New **Deepgram speech-to-text transcription** plugin in Rust. + +- The **Speechmatics transcriber** has seen a **major refactoring** for better timings, + gap and discontinuity handling and has gained **support for the new Speechmatics speaker + identification API** as well as a new property to **mask profanities**. + +- New **ElevenLabs voice cloning element**. The new element can operate in two modes: + - In single speaker mode, the element will directly clone a single voice + from its input, without storing any samples. + - Otherwise, the element will store a backlog of samples, and wait to + receive certain events from a transcriber on its source pad before draining + them to create potentially multiple voices. + +- New **"compress" overflow mode for speech synthesizers** that can speed up + the audio while preserving pitch. This may be needed to keep or regain audio/video + synchronisation if translated speech output has been consistently longer in duration + than the original and there hasn't been a sufficient amount of silence that could be + filled in to make up the difference. + +- **awstranslate**: new "brevity-on" property for turning brevity on. + +- The **awstranscriber2** has been **refactored** to match the speechmatics transcriber design + and gained a "show-speaker-label" property that defines whether to partition speakers in the + transcription output. + +- New **textaccumulate** element for speech synthesis or translation preprocessing that + can be used to accumulate words and punctuation into complete sentences (or sentence fragments) + for synthesis and / or translation by further elements downstream. + +<a id="adaptive-streaming"></a> +### HLS DASH adaptive streaming improvements + +- Reverse playback, seeking and stream selection fixes in the HLS/DASH clients. + +- **hlscmafsink** can generate I-frame only playlists now + +- Both **hlssink3** and **hlscmafsink** gained support for use of a single media file, + in which case the media playlist will use byte range tags for each chunk whilst + always referencing the same single media file. This can be useful for VOD use cases. + +<a id="playback"></a> +### decodebin3 and playbin3 improvements + + - **decodebin3** now has a separate pad template for **metadata streams** and considers + KLV, ID3 PES streams and ST-2038 ancillary streams as raw formats for meta streams. This comes + also with a new dedicated `GST_STREAM_TYPE_METADATA` stream type in the stream collection. + +<a id="eflv"></a> +### Enhanced RTMP and multitrack audio/video support in FLV + +- The FLV container used for RTMP streaming is fairly old and limited in terms of features: + It only supports one audio and one video track, and also only a very limited number of + audio and video codecs, most of which are by now quite long in the tooth. + +- The Enhanced RTMP (V2) specification(https://veovera.org/docs/enhanced/enhanced-rtmp-v2.html) seeks + to remedy this and adds **support for modern video codecs such H.265 and AV1** as well as + **support for more than one audio and video track** inside the container. + +- Both H.265 video and multiple audio/video tracks are now supported for FLV in GStreamer. + +- Support for this comes in form of a **new eflvmuxeflvmux muxer element**, which is needed + to accommodate both the need of backwards compatibility in the existing FLV muxer and the + requirements of the new format. See Tarun's blog posteflv-devlog for more details. + +eflvmux: https://gstreamer.freedesktop.org/documentation/flv/eflvmux.html?gi-language=c#eflvmux-page +eflv-devlog: https://centricular.com/devlog/2025-11/Multitrack-Audio-Capability-in-FLV/ + +<a id="mpeg-ts"></a> +### MPEG-TS container format improvements + +- The **MPEG-TS demuxer** gained a "skew-corrections" **property that allows disabling + of skew corrections**, which are done by default for live inputs to make sure + downstream consumes data at the same rate as it comes in if the local clock and the + sender clock drift apart (as they usually do). Disabling skew corrections is useful if + the input stream has already been clock-corrected (for example with `mpegtslivesrc`) or + where the output doesn't require synchronisation against a clock, e.g. when it's + re-encoded and/or remuxed and written to file (incl. HLS/DASH output) where it's + desirable to maintain the original timestamps and frame spacings. + + It is also useful for cases where we want to refer to the PCR stream to figure out global + positioning, gap detection and wrapover correction. + +- **tsdemux** now also supports demuxing of ID3 tags in MPEG-TS as specified in the + Apple Timed Metadata for HTTP Live Streaming specificationapple-timed-metadata-spec. + These timed ID3 tags have a media type of `meta/x-id3` which is different from the one + used to tag audio files, and an `id3metaparse` element is needed to properly frame the + PES data coming out of the demuxer. + +- The **MPEG-TS muxer** now also reads `prog-mapPMT_ORDER_<PID>` for PMT order + key in addition to `prog-mapPMT_%d`, which fixes a wart in the API and provides + an unambiguous way to specify ordering keys. + +apple-timed-metadata-spec: https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/2/2.html + +<a id="matroska"></a> +### Matroska container format improvements + +- **matroskademux** now supports relative position cues in the seek table + and also had its maximum block size restrictions updated so that it can + support uncompressed video frames also in 4k UHD resolution and higher + bit depths. + +<a id="isomp4"></a> +### ISO MP4 container format improvements + +- **mp4mux** now supports E-AC3 muxing + +- **qtdemux**, the MP4 demuxer, has seen countless fixes for various + advanced use cases (with lots more in the pipeline for 1.28.1). + +- The **isomp4mux** from the Rust plugins set now support caps changes + and has also gained support for raw audio as per ISO/IEC 23003-5. + Plus improved brand selection. + +- The **isomp4mux**, **isofmp4mux** and related elements were merged into a single **isobmff** plugin, which allows sharing more code. As part of this, codec support was consolidated between the two. + +<a id="mxf"></a> +### MXF container format improvements + +- The MXF muxer and demuxer gained **support for non-closed-caption VANC ancillary metdata**: + + - Extends mxfdemux with support for outputting VANC (ST436M) essence + tracks as ST2038 streams instead of extracting closed captions internally. + + - Extends mxfmux with support for consuming ST2038 streams for outputting + VANC (ST436M) essence tracks instead of only supporting closed captions. + +To support ST2038 instead of the earlier closed captions, we introduce a +_breaking change_ to the caps handling on the pad. This was deemed the cleanest +way and should hopefully not cause too much breakage in the real world, as it +is likely not something that was used much in practice in this form. The +`st2038anctocc` element can be used to convert a ST2038 stream to plain +closed captions. + +We also now support both 8 and 10-bit VANC data when reading from MXF. + +<a id="mpeg-h"></a> +### MPEG-H audio support + +- New **MPEG-H audio decoding** plugin based on the Fraunhofer MPEG-H decoder + implementation plus MP4 demuxing support + +### SMPTE 2038 ancillary data stream handling improvements + +- New **ST-2038 ancillary data combiner and extractor elements** in + the `rsclosedcaption` Rust plugin that extract ST-3028 metadata streams + from `GstAncillaryMeta`s on video frames or converts ST-2038 metadata + streams to `GstAncillaryMeta` and combines it with a given video stream. + +- The MXF demuxer and muxer gained support for muxing and demuxing generic + ancillary metadata in ST-2038 format (see below). + +- decodebin3 now treats ST-2038 metadata streams as a "raw metadata format" + and exposes those streams as `GST_STREAM_TYPE_METADATA`. + +<a id="analytics"></a> +### Analytics + +This release introduces a major improvement in how analytics pipelines are built, +moving away from manual configuration toward a fully negotiated analytics pipeline. + +- **Robust Tensor Negotiation & Smart Selection**: All inference and tensor decoder + elements adopt the tensor capability negotiation mechanism. This provides informative + error handling by validating the pipeline during the setup phase and providing + descriptive error messages for configuration mismatches before processing begins. + Complementing this, the new tensordecodebin acts as an intelligent proxy that abstracts + decoder selection by auto-plugging the correct tensor decoder. This simplifies the use of + existing tensor decoders and allows new tensor decoders to be utilized instantly without + requiring changes to pipeline definitions. + +- **Simplified Model Integration with modelinfo**: The modelinfo library, configuration files, + and the modelinfo-generator.py script work together to make using any ML model inside + a GStreamer pipeline very simple. The new utility script helps you quickly generate or + upgrade metadata files for existing models. Combined with tensor negotiation and tensordecodebin, + these tools facilitate the seamless utilization of new models within the analytics chain. + +- **analyticsoverlay**: New "expire-overlay" property added to objectdetectionoverlay and can + also show tracking-id; New 'segmentationoverlay' to visualize segmented regions. + +- Add **LiteRT inference element** + +- Analytics: add **general classifier tensor-decoder**, **facedetector**, **YOLOv8 (detection)**, + **YOLOv8segmentation tensor decoders** and more convenience API. + +- **onnx**: Add **Verisilicon provider** support + +- New **IoU based tracker** + +- Add **`GstAnalyticsBatchMeta`**batchmeta representing a batch of buffers from one or + more streams together with the relevant events to be able to interpret the buffers and to + be able to reconstruct the original streams. + +- New **analyticscombiner**analyticscombiner and **analyticssplitter**analyticssplitter + elements in the Rust plugin set which batch buffers from one or more streams into a single + stream via the new `GstAnalyticsBatchMeta` and allow splitting that single stream into the + individual ones again later. + +- Add a burn-based YOLOX inference elementburnyoloxinference and a YOLOX tensor decoderyoloxtensordec in Rust. + +batchmeta: https://gstreamer.freedesktop.org/documentation/analytics/gstanalyticsbatchmeta.html?gi-language=c#GstAnalyticsBatchMeta +analyticscombiner: https://gstreamer.freedesktop.org/documentation/rsanalytics/analyticscombiner.html?gi-lang +analyticssplitter: https://gstreamer.freedesktop.org/documentation/rsanalytics/analyticssplitter.html?gi-language=c#analyticssplitter-page +burnyoloxinference: https://gstreamer.freedesktop.org/documentation/burn/index.html?gi-language=c#burnyoloxinference-page +yoloxtensordec: https://gstreamer.freedesktop.org/documentation/rsanalytics/yoloxtensordec.html?gi-language=c#yoloxtensordec-page + +<a id="vulkan"></a> +### Vulkan integration enhancements + +- The Vulkan Video encoders and decoders now dynamically generate their + pad template caps at runtime instead of hardcoding them, so they more + accurately reflect the actual capabilities of the hardware and drivers. + +- New **Vulkan AV1 and VP9 video decoding** support + +- New **Vulkan H.264 encoding** support + +- The **Vulkan H.265 decoder** now also supports **10-bit** depth + +<a id="opengl"></a> +### OpenGL integration enhancements + +- Implement keyboard, mouse, and scroll wheel navigation event handling for the + OpenGL Cocoa backend. + +- Added support for the `NV24` and `Y444_12` pixel formats. The latter is used by + certain HEVC decoders for 12-bit non-subsampled profiles. + +<a id="udmabuf"></a> +### udmabuf allocator with glupload support + +- Implement a **udmabuf-based memory allocator for user-space mappable dmabufs**. + +- **glupload**: add udmabuf uploader to **share buffers between software decoders/sources and GPUs, + display engines (wayland), and other dma devices**. This can help reduce memory copies and + can massively improve performance in video players like Showtime or Totem for software-decoded + video such as AV1 with `dav1ddec`. + +- **gtk4paintablesink**: Similar to `glupload`, this now proposes the udmabuf memory allocator to upstream which can reduce memory copies and improve performance with certain software decoders. + +<a id="wayland"></a> +### Wayland integration + +- Added **basic colorimetry support** + +- **waylandsink**: + + - Parse and set the **HDR10 metadata** and other **color management improvements** + + - **udmabuf support** (see above) + + - video **crop meta support** + + - New **"fullscreen-output"** and **"force-aspect-ratio" properties** + +<a id="qt"></a> +### Qt5 + Qt6 QML integration improvements + +- New **Qt6 QML qml6 render source element** + +- **qml6gloverlay**: support directly passing a QQuickItem for QML the render tree + +<a id="gtk"></a> +### GTK4 integration improvements + +- **gtk4paintablesink**: Added YCbCr memory texture formats and + improve color-state fallbacks. The sink will also propose a **udmabuf** buffer pool + and allocator now if upstream asks for sysmem, which would allow direct imports of the + memory by GL/Vulkan or the compositor. Plus many other improvements which have also + been backported into the 0.14 branch. + +<a id="cuda-nvcodec"></a> +### CUDA / NVCODEC integration and feature additions + +- **cudacompositor**, **cudaconvert** and its variants gained **crop meta support** + +- nvencoder: interlaced video handling improvements and "emit-frame-stats" property + which if enabled makes the encoder emit the "frame-stats" signal for each encoded + frame, allowing applications to monitor things like the average QP per frame. + +- **nvjpegenc**: Add an autogpu mode element (nvautogpunvenc) similar to `nvautogpu{h264,h265,av1}enc`. + +- **nvh264enc**, **nvh265enc** gained a new "num-slices" property which is + conditionally available based on device support for dynamic slice mode + +- **nvdsdewarp**: performance improvements and support for output resizing support, + along with a new "add-borders" property. + +<a id="aja-decklink"></a> +### Capture and playout cards support + +- **Blackmagic Decklink** elements gained support for **capturing and outputting all types of VANC via GstAncillaryMeta** + +<a id="rtp"></a> +### RTP and RTSP stack improvements + +- **rtspsrc** now sends RTSP keepalives also in TCP/interleaved modes. This fixes problems + with some cameras that don't see the RTCP traffic as sufficient proof of liveness, + when using TCP/HTTP tunnelled modes. + +- New **Rust RTP mparobust depayloader** for "robust mp3" audio**, a more + loss-tolerant RTP payload format for MP3 audio (RFC 5219) + +- New **Rust RTP L8/L16/L24 raw audio payloader and depayloader**, which offer + more correct timestamp handling compared to the old payloader and depayloader + and more correctly implements multichannel support. + +- New **Rust RTP SMTPE ST291 ancillary data payloader and depayloader** for sending + or receiving ancillary data over RTP. This is also the payload format used by ST2110-40. + +- Various performance improvements and fixes for `rtprecv` / `rtpsend` ("rtpbin2"). + +- Support for "multi-time aggregation packets" (MTAP) in the H264 RTP depayloader `rtph264depay`. + +<a id="webrtc"></a> +### WebRTC improvements + +- **webrtcbin** and **GstWebRTC library** improvements: + + - Add support for getting the selected ICE candidate pairs + + - Improve spec compliance for ICE candidate stats by filling the foundation, related-address, + related-port, username-fragment and tcp-type fields of stats. + + - improve compatibility with LiveKit + +- **webrtcsink** and **webrtcsrc** enhancements: + + - **webrtcsink** gained **renegotiation support**, and **support for va hardware encoders** + +- Added a WHEP client signaller and server signaller to the Rust webrtc plugin, including + support for server side offers for the WHEP client. + +- webrtc-api: Set **default bundle policy** to max-bundle. + +- The **dtls** plugin now uses a ECDSA private key for the default certificate. ECDSA is + widely used in browsers and SFUs, and some servers such as the ones using BouncyCastle + only accept certificates signed with ECDSA. + +<a id="new-cplusplus-bindings"></a> +### New GStreamer C++ bindings + +The old GStreamer C++ bindings (gstreamermm and qt-gstreamer) have been unmaintained for a +long time, leaving C++ developers only with the option to use the GStreamer C API. + +In recent years, a new approach for C++ bindings was developed by the GNOME community: +peel(https://gitlab.gnome.org/bugaevc/peel). While initially developed for GTK, with +various GObject Introspection and API fixes included in GStreamer 1.28, this is now also +usable for GStreamer. + +Compared to gstreamermm this offers a much lower overhead, headers-only C++ binding that +just depends on the C libraries and not even the C++ STL, and provides a modern C++ API +top of the GStreamer C API. Compared to qt-gstreamer there is no dependency on Qt. + +It's still in active development and various MRs(https://gitlab.gnome.org/bugaevc/peel/-/merge_requests) +for improving the GStreamer development experience are not merged yet, but it's already usable and a +great improvement over using the plain C API from C++. + +Various GStreamer examples can be found in Sebastian's GStreamer peel examples repositorypeel-examples. + +peel-examples: https://gitlab.freedesktop.org/slomo/gstreamer-peel-examples + +<a id="new-plugins"></a> +## New elements and plugins + +- Many exciting **new Rust elements**, see Rust section below. + +- New **D3D12** interlace, overlay compositor, fish eye dewarp and uv coordinate remapping elements + +- **VMAF**: New element to **calculate perceptual video quality assessment scores using Netflix's VMAF framework** + +- **Webkit**: New wpe2 plugin that makes use of the "WPE Platform API" with support + for rendering into GL and SHM buffers and navigation events (but not audio yet). + +- Many other new elements mentioned in other sections (e.g. CUDA, NVCODEC, D3D12, Speech, AMD HIP, Rust etc.) + +<a id="new-element-features"></a> +## New element features and additions + +- The **AWS S3 sink and source** elements now support S3 compatible URI schemes. + +- **clocksync**: new "rate" property and "resync" action signal so that clocksync + can synchronise buffer running time against the pipeline clock with a specified + rate factor. This can be useful if one wants to throttle pipeline throughput such + as e.g. in a non-realtime transcoding pipeline where the pipeline's CPU and/or + hardware resource consumption needs to be limited. + +- **fallbacksrc** is able to support **encoded outputs** now, not just uncompressed + audio/video. As part of this it supports stream selection via the `GstStream` API now. + +- **h265parse** now automatically inserts AUDs where needed if it outputs + byte-stream format, which helps fix decoding artefacts for multi-slice HEVC + streams with some hardware decoders. + +- **input-selector** now implements a two-phase sinkpad switch to avoid races when switching + input pads. Extensive tests have been added to avoid regressions. + +- The **inter plugin wormhole sink and source elements** for sending data between pipelines + within the same application process gained new **properties to fine tune the inner elements**. + intersrc can now also be configured to **forward upstream events to the producer pipeline** via + the new "event-types" property. + +- The **quinn** plugin supports **sharing of the QUIC/WebTransport connection/session** with an + element upstream or downstream. This is required for supporting Media over QUIC (MoQ) later, for + which an MR is already pending(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1906). + +- **replaygain** will use EBU-R128 gain tags now if available. + +- **threadshare: many improvements** to the various threadshare elements, plus examples and + a new benchmark program. The plugin was also relicensed to MPL-2.0. + +- The **unixfdsink** element for zero-copy 1:N IPC on Linux can now also copy the + input data if needed, which makes it usable with more upstream elements. Before + it would only work with elements that made use of the special memory allocator + it advertised. This (copy if needed) is enabled by default, but can be disabled + by setting the new "min-memory-size" property to -1. + + There's also a new "num-clients" property that gets notified when the number + of clients (unixfdsrc elements tapping the same unixfdsink) changes. + +- **videorate** and **imagefreeze** now also support JPEG XS. + +- **videorate**'s formerly defunct "new-pref" property was revived for + better control which frame to prefer for output in case of caps changes. + +<a id="plugin-library-moves"></a> +## Plugin and library moves and renames + +- The `y4mdec` plugin moved from gst-plugins-bad into gst-plugins-good and + was merged with the existing `y4menc` there into a single `y4m` plugin + containing both a YUV4MPEG encoder and decoder. + +- The `fmp4` and `mp4` plugins in the Rust plugins set were merged into a + single `isobmff` plugin. + +<a id="plugin-element-deprecations"></a> +## Plugin and element deprecations + +- The old librtmp-based **rtmpsrc** and **rtmpsink** elements are deprecated + are scheduled for removal in the next release cycle. Use the **rtmp2src** + and **rtmp2sink** elements instead (which will likely also be registered + under the old names after removal of the old rtmp plugin). + +- Deprecate the **webrtchttp** plugin in the Rust plugins set along with its + **whipsink** and **whepsrc** elements, in favour of the whipclientsink and + whepclientsrc elements from the webrtc plugin in the Rust plugins set. + +- The libmpeg2-based **mpeg2dec** element is deprecated and scheduled for + removal in the next release cycle, as libmpeg2 has been unmaintained for + a very long time. The libavcodec-based decoder has had a higher rank for + many years already and is also more performant. We would recommend that + distros that also ship the FFmpeg-based decoder out of the box stop shipping + the mpeg2dec plugin now or reduce its rank to `GST_RANK_NONE`. + +<a id="plugin-element-removals"></a> +## Plugin and element removals + +- The **cc708overlay** element has been removed. It is replaced by the + cea708overlaycea708overlay element from the `rsclosedcaption` plugin + in the Rust plugins module. + +cea708overlay: https://gstreamer.freedesktop.org/documentation/rsclosedcaption/cea708overlay.html?gi-language=c + +- Drop registration of **rusotos3src** and **rusotos3sink** in the AWS + plugin in the Rust plugins set. These were legacy names that were renamed + to awss3src and awss3sink in 2022, but had been kept around for a while + so applications had time to move to the new name space. + +<a id="new-api"></a> +## Miscellaneous API additions + +<a id="core-api"></a> +### GStreamer Core + +- `gst_call_async()`gst-call-async and `gst_object_call_async()`gst-object-call-async + are more generic and convenient replacements for `gst_element_call_async()` + +- `gst_check_version()`gst-check-version is a new convenience function to check for + a minimum GStreamer core version at runtime. + +- GstClock: Add gst_clock_is_system_monotonic()gst_clock_is_system_monotonic utility function + +- GstController: gst_timed_value_control_source_list_control_points()gst_timed_value_control_source_list_control_points + is a thread-safe method to retrieve the list of control points, replacing + `gst_timed_value_control_source_get_all()`. + +- GstCpuId: `gst_cpuid_supports_x86_avx()`cpuid-supports and friends can be used to check + which SIMD instruction sets are supported on the current machine's CPU without + relying on liborc for that. This is useful for plugins that rely on an external + library that wants to be told which SIMD code paths to use. + +- `gst_object_get_toplevel()`gst_object_get_toplevel can be used to get the + toplevel parent of an object, e.g. the pipeline an element is in. + +- **New API for tensor caps descriptions**: + + - `GstUniqueList`GstUniqueList is a new unordered, unique container value type for `GValue`s + similar to `GstValueList` but guaranteed to have unique values. Can only be queried and + manipulated via the `gst_value_*` API same as `GstValueList` and `GstValueArray`. + + - `gst_structure_get_caps()`gst_structure_get_caps gets a `GstCaps` from a structure + +- More accessor functions for `GstPadProbeInfo` fields and the `GstMapInfo` `data` field, as well as a generic `gst_map_info_clear()` which is useful for language bindings. + +- New EBU-R128 variants of the replay gain tags: `GST_TAG_TRACK_GAIN_R128` and `GST_TAG_ALBUM_GAIN_R128` + +- **GstReferenceTimestampMeta**: additional information about the timestamp can be provided via the + new optional info `GstStructure`. This should only be used for information about the timestamp and + not for information about the clock source. This is used in an implementation of the TAI timestamp + functionality described in ISO/IEC 23001-17 Amendment 1 in the Rust MP4 muxer. + +- GstValue: add `gst_value_hash()`gst_value_hash and support `0b` / `0B` prefix for + bitmasks when deserialising. + + - Add missing `_take()` and `_steal()` functions for some mini objects: + - `gst_buffer_take()`, `gst_buffer_steal()` + - `gst_buffer_list_steal()` + - `gst_caps_steal()` + - `gst_memory_take()`, `gst_memory_replace()`, `gst_memory_steal()` + - `gst_message_steal()` + - `gst_query_steal()` + +- GstElement: Deprecate `gst_element_state_*()` API and provide `gst_state_*()` + replacements with the right namespace + +gst-call-async: https://gstreamer.freedesktop.org/documentation/gstreamer/gstutils.html?gi-language=c#gst_call_async +gst-object-call-async: https://gstreamer.freedesktop.org/documentation/gstreamer/gstobject.html#gst_object_call_async +gst-check-version: https://gstreamer.freedesktop.org/documentation/gstreamer/gst.html?gi-language=c#gst_check_version +gst_clock_is_system_monotonic: https://gstreamer.freedesktop.org/documentation/gstreamer/gstclock.html?gi-language=c#gst_clock_is_system_monotonic +gst_structure_get_caps: https://gstreamer.freedesktop.org/documentation/gstreamer/gststructure.html?gi-language=c#gst_structure_get_caps +gst_timed_value_control_source_list_control_points: https://gstreamer.freedesktop.org/documentation/controller/gsttimedvaluecontrolsource.html?gi-language=c#gst_timed_value_control_source_list_control_points +GstUniqueList: https://gstreamer.freedesktop.org/documentation/gstreamer/gstvalue.html?gi-language=c#gst_value_unique_list_append_value +cpuid-supports: https://gstreamer.freedesktop.org/documentation/gstreamer/gstcpuid.html?gi-language=c +gst_object_get_toplevel: https://gstreamer.freedesktop.org/documentation/gstreamer/gstobject.html?gi-language=c#gst_object_get_toplevel +gst_value_hash: https://gstreamer.freedesktop.org/documentation/gstreamer/gstvalue.html?gi-language=c#gst_value_hash + +<a id="meta-factory"></a> +#### GstMetaFactory to dynamically register metas + +- `gst_meta_factory_register()`meta-factory-register allows to dynamically register metas + and store them in the registry by name. This is useful in combination with the `GstMeta` + serialisation and deserialisation functionality introduced in GStreamer 1.24, for metas that + are not provided by GStreamer core. If an element comes across a meta name that is not + registered yet with GStreamer, it can check the registry and load the right plugin which will + in turn register the meta with GStreamer. This is similar to how flag and enum types can be + stored in the registry so that if during caps deserialisation an unknown enum or flag type is + encountered, it can be loaded dynamically and registered with the type system before + deserialisation continues. + + The `pbtypes` plugin in gst-plugins-base registers `GstAudioMeta` and `GstVideoMeta` in the + registry so that e.g. `unixfdsrc` and other elements can make sure they get pulled in and + registered with GStreamer before deserialising them. + +meta-factory-register: https://gstreamer.freedesktop.org/documentation/gstreamer/gstmetafactory.html?gi-language=c#gst_meta_factory_register + +<a id="gstapp"></a> +### App Sink and Source Library + +- **appsrc** and **appsink** gained support for a more bindings-friendly + "simple callbacks" API that can be used instead of GObject signals (which have considerable overhead) or the normal callbacks API (which couldn't be used from most bindings). + +<a id="gstaudio"></a> +### Audio Library + +- added **support for 20-bit PCM audio stored in 32-bit containers**, + both signed (**`S20_32`**) and unsigned (**`U20_32`**), each in + little-endian and big-endian variants. + +<a id="gstpbutils"></a> +### Plugins Base Utils Library + +- Many minor improvements. + +<a id="gsttag"></a> +### Tag Library + +- Vorbis comments: parse EBU R128 tags + +<a id="gstvideo"></a> +### Video Library and OpenGL Library + +- Add DRM equivalents for various 10/12/16 bit SW-decoders formats + +- New **`GstVideoMetaTransformMatrix`** that adds crop, scale, rotate, + flip, shear and more meta transformations. The current "scaling" transformation + doesn't work if either the input buffer is cropped or if any kinds of borders + are added. And it completely falls down with more complex transformations like + compositor. + +- **`GstVideoOverlayCompositionMeta`**: handling of multiple video overlay composition metas + on a single buffer has been fixed in lots of places (overlays and sinks). Many elements + assumed there would only ever be a single overlay composition meta per buffer. For + that reason `gst_buffer_get_video_overlay_composition_meta()` has been deprecated, + so that elements have to iterate over the metas and handle multiple occurences of it. + +#### New Raw Video Formats + +- Add **more 10bit RGB formats** commonly used on ARM SoCs in GStreamer Video, OpenGL and Wayland, + as well as in deinterlace and gdkpixbufoverlay: + - **`BGR10x2_LE`**: packed 4:4:4 RGB (B-G-R-x), 10 bits for R/G/B channel and MSB 2 bits for padding + - **`RGB10x2_LE`**: packed 4:4:4 RGB (R-G-B-x), 10 bits for R/G/B channel and MSB 2 bits for padding + +- Add 10-bit 4:2:2 **`NV16_10LE40`** format, which is a fully-packed variant of `NV16_10LE32` and + also known as `NV20` and is produced by Rockchip `rkvdec` decoders. + +<a id="gstplay"></a> +### GstPlay Library + +- GstPlay: Add **support for gapless looping** + +<a id="optimisations"></a> +## Miscellaneous performance, latency and memory optimisations + +- New **task pool GstContext to share a thread pool amongst elements in a pipeline for better resource + management and performance**, especially for video conversion and compositing. This is currently only + made use of automatically in the GStreamer Editing Services library. + +- **glupload**: Implement **udmabuf uploader to share buffers between software decoders/sources and GPUs, + display engines (wayland)**, and other dma devices (see above). + +- **GstDeviceMonitor** now starts device providers in a **separate thread**. This **avoids blocking** the + application when `gst_device_monitor_start()` is called, which avoids each app having to spawn + a separate thread just to start device monitoring. This is especially important on Windows, where + device probing can take several seconds or on macOS where device access can block on user input. + A new `GST_MESSAGE_DEVICE_MONITOR_STARTED` is posted on the bus to signal to the application that + the device monitor has completed its async startup. + +- On Windows **audioresample** now has SIMD optimisations enabled also for the MSVC build. + +- **audiomixmatrix** / **audioconvert**: sparse matrix LUT optimisation which uses precomputed LUTs for + non-zero coefficients instead of blindly traversing all input/output channel combinations. + +- As always there have been plenty of performance, latency and memory optimisations + all over the place. + +<a id="misc-changes"></a> +## Miscellaneous other changes and enhancements + +- The **ALSA device provider** now supports enumerating virtual PCM sinks + +- The **ASIO** device monitor can now detect dynamically added and removed devices by monitoring USB events. + +<a id="tracing"></a> +## Tracing framework and debugging improvements + +- There are **new hooks to track when buffers are queued or dequeued from** + **buffer pools** in the tracing system. + +- The **pad-push-timings tracer** gained a new **"write-log" action signal** + +<!-- +### New tracers + +- None + +--> + +#### Dot tracer/viewer + +- **Enhanced dots-viewer**: Major refactoring with modular JavaScript + architecture, bundled dependencies (no more CDN), clickable pipeline + references for navigation between related dot files, download SVG button, + and improved UI/UX with better text handling and zoom fixes. + +### Dot file pipeline graphs + +- Dot file dumps of **pipeline graphs now show the list of active tracers** + at the bottom along with the tracer configuration. + +### Debug logging system improvements + +#### GstLogContext to fine-tune logging output and reduce log message spam + +- `GstLogContext`GstLogContext is a new API to control logging behavior, particularly for implementing "log once" functionality and periodic logging. This helps avoid spamming logs with repetitive messages. This comes with a whole suite of new `GST_CTX_*`GST_CTX debug log macros that take a context argument in addition to the usual arguments. + +- A number of `GST_{MEMDUMP,TRACE,LOG,DEBUG,INFO,WARNING,ERROR}_ONCE`LOG_ONCE convenience macros for logging something only once. + +GstLogContext: https://gstreamer.freedesktop.org/documentation/gstreamer/gstinfo.html?gi-language=c#GstLogContext +GST_CTX: https://gstreamer.freedesktop.org/documentation/gstreamer/gstinfo.html?gi-language=c#GST_CTX_LOG +LOG_ONCE: https://gstreamer.freedesktop.org/documentation/gstreamer/gstinfo.html?gi-language=c#GST_LOG_ONCE_OBJECT + +- The source code of elements and plugins has to be updated to make use of this new feature, + so if there are any particular log messages in certain elements that you feel are particularly + spammy, please feel free to file an issue in GitLab so we can see if it would make sense to + use the new API there. + +<a id="tools"></a> +## Tools + +- **gst-inspect-1.0** now shows the type of each field when it prints caps + and also pretty-prints tensor caps. + +<a id="ffmpeg"></a> +## GStreamer FFmpeg wrapper + +- The avdec video decoders have seen many improvements and fixes for their + buffer pool and allocation query handling. + +<a id="rtsp"></a> +## GStreamer RTSP server + +- rtsp-client: Add a "pre-closed" signal which provides a way for an application + to be notified when a connection is closed, before the client's sessions are + cleaned up. This is useful when a client terminates its session improperly, + for example, by sending a TCP RST. + +- rtsp-stream-transport: expose new "timed-out" property. Upon RTCP timeout, + rtpsession emits a signal that we can catch and then also expose the timed + out state a property of the transport in order for users (such as rtspclientsink) + to get notified about it. + +- **rtspclientsink** now errors out on timeout. + +<a id="vaapi"></a> +## VA-API integration + +### VA plugin for Hardware-Accelerated Video Encoding and Decoding on Intel/AMD + +- **vaav1enc**: Enable intrablock copy and palette mode. + +- Lots of other improvements and bug fixes. + +### GStreamer-VAAPI has been removed in favour of the va plugin + +- **gstreamer-vaapi has been removed and is no longer updated going forward** + Users who relied on gstreamer-vaapi are encouraged to migrate to the `va` + plugin's elements at the earliest opportunity. It should still be possible + to build old versions of gstreamer-vaapi against newer versions of GStreamer. + +<!-- + +<a id="v4l2"></a> +## GStreamer Video4Linux2 support + +- Nothing major? + +--> + +<a id="ges"></a> +## GStreamer Editing Services and NLE + +- **Task Pool Context Support**: GESPipeline now supports task pool context + handling for better resource management. It automatically creates and manages + a GstSharedTaskPool with threads set to the number of processors, also + allowing applications to provide their own shared task pool via context + negotiation. + +- **MT-Safe Controller API**: New + `gst_timed_value_control_source_list_control_points()` function provides + thread-safe access to control points, addressing use-after-free bugs in the + previous API which returned references to internal structures. + +- **OTIO Formatter Migration**: The OpenTimelineIO formatter has been moved from + embedded GLib resources to a standalone Python plugin located in gst-python, + simplifying the implementation and avoiding duplicated code. + +- **Framepositioner Z-order Enhancements**: The z-order property is now + controllable and exposed for manipulation, enabling dynamic adjustment of + layer stacking order during timeline editing. + +- **Clip Layer Movement Detection**: New `ges_clip_is_moving_between_layers()` + API distinguishes actual layer moves from other operations like split/ungroup, + with separate flags for track element freezing and layer movement. + +- **GES Error Domain**: Added `ges_error_quark()` function for proper GError + domain support, enabling automatic ErrorDomain implementation generation in + language bindings. + +- **Timeline Error Reporting**: Added GError parameter to + `ges_base_bin_set_timeline()` for proper error reporting when timeline setup + fails. + +- Various bug fixes for memory leaks, frame position calculations with + non-square pixel aspect ratios, and control binding handling. + + +<a id="validate"></a> + +## GStreamer validate + +- **New `check-last-frame-qrcode` action type**: New action type (from the Rust + validate plugin) to validate QR code content in video frames. Supports exact + string matching for single or multiple QR codes, and JSON field validation. + +- **Override Severity Levels**: New `overrides` parameter in the `meta` action + type allows changing issue severity levels during test execution. Tests can + now pass when encountering known issues by downgrading severity from critical + to warning/issue/ignore. + +- **Enhanced dots-viewer** (see dots-viewer section above) + +- **SSIM Validation Improvements**: Changed validation to check all images + before reporting errors instead of stopping at the first error. + +- **Reverse Playback Validation**: Changed segment.time mismatch from critical + to warning for reverse playback scenarios, acknowledging the additional + complexity demuxers face during reverse playback. + +- **Launcher Improvements**: Log files for passing tests are now removed by + default to reduce storage usage (with option to keep them), and debug log + colors are now supported when redirected to files. + +- **Python 3.14 Compatibility**: Fixed file:/// URI generation for Python 3.14 + with proper RFC 8089 compliance. + +- Various bug fixes for scenario handling, memory leaks, and improved backward + compatibility with GLib 2.64. + +<a id="python"></a> +## GStreamer Python Bindings + +gst-python is an extension of the regular GStreamer Python bindings based on +gobject-introspection information and PyGObject, and provides "syntactic sugar" +in form of overrides for various GStreamer APIs that makes them easier to use +in Python and more pythonic; as well as support for APIs that aren't available +through the regular gobject-introspection based bindings, such as e.g. +GStreamer's fundamental GLib types such as `Gst.Fraction`, `Gst.IntRange` etc. + +- More **pythonic API for analytics** + +- Type annotations have been updated in PyGObject-stubs(https://pypi.org/project/PyGObject-stubs/). + +- Writability of `Gst.Structure`, `Gst.Caps` and other objects has been improved. + * `caps.writable_structure()` now returns a ContextManager inside of which + the returned Gst.Structure can be modified. + * `obj.make_writable()` makes any MiniObject writable. + * Pad probe callbacks now has `info.writable_object()` and `info.set_object()` + to modify objects inside the callback. +- Breaking change: `Gst.ElementFactory.make` and `Gst.Bin.make_and_add` now + raise `Gst.MissingPluginError` exception when the element is not found. + +<a id="csharp"></a> +## GStreamer C# Bindings + +- The C# bindings have been updated for the latest GStreamer 1.28 APIs. + +<a id="rust"></a> +## GStreamer Rust Bindings and Rust Plugins + +The GStreamer Rust bindings and plugins are released separately with a different +release cadence that's tied to the gtk-rs release cycle. + +The latest release of the bindings (0.24) has already been updated for the new +GStreamer 1.28 APIs, and works with any GStreamer version starting from 1.14. + +`gst-plugins-rs`, the module containing GStreamer plugins written in Rust, +has also seen lots of activity with many new elements and plugins. + +The GStreamer 1.28 binaries will be tracking the `main` branch of `gst-plugins-rs` +for starters and then track the 0.15 branch once that has been released (around +the end of February 2026). After that, fixes from newer versions will be +backported as needed into the new 0.15 branch for future 1.28.x bugfix releases. + +Rust plugins can be used from any programming language. To applications, +they look just like a plugin written in C or C++. + +<a id="rust-elements"></a> +### New Rust elements + +- New **icecastsink element with AAC support** that is similar in functionality + to the existing shout2send element but also supports AAC, which upstream + libshout is not planning to support. + +- New **audio source separation element based on demucs** (see above). + +- New **Deepgram speech-to-text transcription** plugin, + **ElevenLabs voice cloning element** and **textaccumulate** element. See + <a href="#stt-translations-and-speech-synthesis">Speech to Text, Translation and Speech Synthesis</a> + section above. + +- New **analytics combiner and splitter elements** for batch metas (see above). + +- New **mpa robust RTP depayloader**, **L8/L16/L24** raw audio payloaders and depayloaders and **SMPTE ST291** ancillary data payloader and depayloader. + +- New **GIF decoder** element that supports looping. + +- New **ST-2038 ancillary data combiner and extractor elements** (see above) + +- Added a **burn-based YOLOX inference element and a YOLOX tensor decoder** + +- s302mparse: Add new **S302M audio parser** + +- New **Rust validate plugin** with a **check-last-frame-qrcode action**. + +<!-- +<a id="rust-other-improvements"></a> +### Other improvements + +- to be filled in +--> + +For a full list of changes in the Rust plugins see the +gst-plugins-rs ChangeLogrs-changelog between versions 0.14 +(shipped with GStreamer 1.26) and current `main` (soon `0.15`) branch +(shipped with GStreamer 1.28). + +Note that at the time of GStreamer 1.28.0 gst-plugins-rs 0.15 was not +released yet and the git `main` branch was included instead (see above). + +rs-changelog: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/blob/main/CHANGELOG.md + +<a id="build-and-deps"></a> +## Build and Dependencies + +- Meson >= 1.4 is now required for all modules + +- liborc >= 0.4.42 is strongly recommended + +- libnice >= 0.1.23 is now required for the WebRTC library. + +- The `closedcaption` plugin in gst-plugins-bad no longer depends on pangocairo after + removal of the `cc708overlay` element (see above). + +- Please also note plugin removals and deprecations. + +### Monorepo build + +- Updated wraps, incl. glib: cairo, directxmath, expat, fdk-aac, ffmpeg, flac, + freetype2, gdk-pixbuf, gtest, harfbuzz, json-glib, lame, libjpeg-turbo, libnice, + libopenjp2, libpng, libsrtp2, libxml2, nghttp2, ogg, pango, pcre2, pygobject, + soundtoch, sqlite3, wayland-protocols, zlib. + +- Added wraps: librsvg, svtjpegxs + +<!-- + +### gstreamer-full + +- Nothing major + +--> + +### Development environment + +- Local pre-commit checks via git hooks have been moved over to `pre-commit`, + including the code indentation check. + +- Code indentation checking no longer relies on a locally installed copy of + GNU indent (which had different outcomes depending on the exact version + installed). Instead, pre-commit will automatically install the gst-indent-1.0 + indentation tool through pip, which also works on Windows and macOS. + +- A pre-commit hook has been added to check documentation cache updates and + since tags. + +- Many meson wrap updates, including to FFmpeg 7.1 (FFmpeg 8.0 is pending) + +- The uninstalled development environment should work better on macOS now, + also in combination with homebrew (e.g. when libsoup comes from homebrew). + +- New `python-exe` Meson build option to override the target Python installation + to use. This will be picked up by the `gst-python` and `gst-editing-sevices` + subprojects. + +<a id="platform-specific"></a> +## Platform-specific changes and improvements + +<a id="android"></a> +### Android + +- **Overhaul hw-accelerated video codecs detection**: + + - Android 10 (API 29) added support for `isHardwareAccelerated()` to + `MediaCodecInfo` to detect whether a particular MediaCodec is backed by + hardware or not. We can now use that to ensure that the video hw-codec + is rank `PRIMARY+1` on Android, since using a software codec for video is + simply not feasible most of the time. + + - If we're not able to detect `isHardwareAccelerated()`, perhaps because + the Android API version is too old, we try to use the codec name as + a fallback and also rank as `PRIMARY+1` the `c2.android`, `c2.exynos` and + `c2.amlogic` audio codecs alongside `OMX.google`, because they are known-good. + +<a id="apple"></a> +### Apple macOS and iOS + +- **VP9 and AV1 hardware-accelerated video decoding** support + +- Support for **10-bit HEVC encoding** + +- Implement keyboard, mouse, and scroll wheel navigation event + handling for the OpenGL Cocoa backend. + +<a id="windows"></a> +### Windows + +<a id="d3d12"></a> +#### GStreamer Direct3D12 integration + +- New elements: + - d3d12interlaced3d12interlace: A Direct3D12 based **interlacing** element + - d3d12overlaycompositord3d12overlaycompositor: A Direct3D12-based **overlay composing** element + - d3d12fisheyedewarpd3d12fisheyedewarp: A Direct3D12-based **fisheye dewarping** element + - d3d12remapd3d12remap: A Direct3D12-based UV coordinate remapping element + +- Upload/download optimisations via a staging memory implementation + +- **d3d12swapchainsink** improvements: + - added a "last-rendered-sample" action signal to retrieve the last rendered frame + - added "uv-remap" and "redraw" action signals + +d3d12interlace: https://gstreamer.freedesktop.org/documentation/d3d12/d3d12interlace.html#d3d12interlace +d3d12overlaycompositor: https://gstreamer.freedesktop.org/documentation/d3d12/d3d12overlaycompositor.html?gi-language=c +d3d12fisheyedewarp: https://gstreamer.freedesktop.org/documentation/d3d12/d3d12fisheyedewarp.html?gi-language=c +d3d12remap: https://gstreamer.freedesktop.org/documentation/d3d12/d3d12remap.html?gi-language=c + +<a id="win32ipc"></a> +#### Windows inter process communication + +- The **Windows IPC plugin gained support for passing generic data** in addition to + raw audio/video, and various new properties. It also serialises metas now where that + is supported. + +<a id="wasapi2"></a> +#### Windows audio + +- **wasapi2**: add **support for dynamic audio device switching, exclusive mode and format negotiation**, + in addition to device provider improvements and latency enhancements. + +- **Disable all audio device providers except wasapi2** by default (by setting the + others' rank to NONE). We had too many device providers outputting duplicate device + entries, and it wasn't clear to people what they should be using. After the recent + device switching work done on WASAPI2, there is no reason to use directsound anymore. + +<!-- + +<a id="linux"></a> +### Linux + +- Many improvements which are described in other sections. + +--> + + +<a id="cerbero"></a> +### Cerbero + +Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily available, such as Windows, Android, iOS, and macOS. It is also used to create the GStreamer Python Wheels. + +#### General improvements + +- **New features:** + + - Support for generating Python wheels for macOS and Windows + - These will be uploaded to PyPI, currently blocked on PyPI(https://github.com/pypi/support/issues/8847) + - Support for iPhone Simulator on ARM64 macOS, via the new iOS xcframework + - Inno Setup is now used for Windows installers, which also bundle the MSVC runtime + - An installer is now shipped for Windows ARM64, built using MSVC + - GTK4 is now shipped on macOS and Windows (MSVC and MinGW) + - Smaller binary sizes of Rust plugins on all platforms except macOS and iOS + - Linux builds now integrate better with system dependencies + - Debuginfo is now correctly shipped on Windows and macOS + +- **API/ABI changes:** + + - Android NDK r25 is now used, targeting API level 24 (Android 7.0) + - Merge modules are no longer shipped for Windows + - Windows installers are no longer MSIs + - The legacy iOS framework with iPhone ARM64 and iPhoneSimulator x86_64 binaries is now **deprecated**. It will be removed in the next release. Please use the new iOS xcframework which supports iPhone ARM64 and iPhoneSimulator ARM64+x86_64. + +- **Plugins added:** + + - `pbtypes` is now shipped on all platforms + - `curl` is now shipped on all platforms except iOS and Android + - `lcevcdec` is now shipped on all platforms except Windows ARM64 and Windows 32-bit x86 + - `svtjpegxs` is now shipped on Linux and Windows, only on 64-bit + - `unixfd` is now shipped on all platforms except Windows + - `mediafoundation` is now shipped additionally on MinGW + - `wasapi2` is now shipped additionally on MinGW + - New Rust plugins on all platforms except Windows ARM64: + - `analytics` + - `audioparsers` + - `burn` + - `demucs` + - `elevenlabs` + - `gopbuffer` + - `hlsmultivariantsink` + - `icecastsink` + - `mpegtslive` + - `raptorq` + - `speechmatics` + - `streamgrouper` + - `vvdec` + +- **Plugins changed:** + + - `mp4` and `fmp4` plugins have been merged into `isobmff` + +- **Development improvements**: + + - Debuginfo is now correctly shipped on Windows and macOS + - Support for iPhone Simulator on ARM64 macOS, via the new iOS xcframework + +- **Known issues**: + + - cerbero: Rust plugins fail to link with Xcode 26 on macOS(https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/538) + - cerbero: Rust plugins are not shipped in the Windows ARM64 installer(https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/548) + - cerbero: Android devices with API level >= 30 cannot play tutorials 4 or 5(https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/529) -- Fix aimed for 1.28.1 + - cerbero: Missing pkg-config for macOS in the Android release(https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/522) + +<a id="docs"></a> +## Documentation improvements + +- Added a **Windows section** to "building from source" page + +- New **Python tutorials for dynamic pipelines** and time handling + +- The **Android tutorials were updated**: provided projects were updated to Gradle 8.11 and API level 24 + +- Updates of the **Machine Learning and Analytics design documentation** and the **GstMeta design docs** + +<a id="breaking-changes"></a> +## Possibly Breaking Changes + +- The MXF muxer and demuxer used to have direct support for standalone closed caption streams + (`closedcaption/x-cea-708`) as ancillary data, but that was removed in favour of more generic + ST 2038 ancillary metadata which is a better fit for how the data is stored internally and + also supports generic ancillary metadata. Closed captions can still be stored or extracted + by using the ST 2038 elements from the Rust plugins module. Also see the MXF section above. + +- Analytics: Previously it was guaranteed that there is only ever up to one `GstTensorMeta` + per buffer. This is no longer true and code working with `GstTensorMeta` must be able to + handle multiple `GstTensorMeta` now (after this Merge Request(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9564), + which was apparently backported into 1.26 as well). + +- The thread ID reported in debug logs is no longer prefixed with a `0x` on Windows, Linux and + FreeBSD platforms. This change can potentially break log parsers. GstDebugViewer was adapted accordingly. + +- Python bindings: `Gst.ElementFactory.make` and `Gst.Bin.make_and_add` now + raise `Gst.MissingPluginError` exception when the element is not found. + + +<a id="known-issues"></a> +## Known Issues + +- There are some open issues with the Apple hardware-accelerated AV1 decodingvtdec-av1-issues, + which we hope will be fixed in due course. Please let us know if you run into them and can + test patches. + +vtdec-av1-issues: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4768 + +- Autoplugging LCEVC H.264/H.265/H.266 streams is currently disabled until an issuelcevc-issue + with decodebin3 and non-LCEVC streams has been resolved. It is still possible to re-enable this + locally by overriding the rank of `lcevch26*decodebin` using the `GST_PLUGIN_FEATURE_RANK` + environment variable. + +lcevc-issue: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4870 + +<a id="statistics"></a> +## Statistics + +- 3548 commits +- 1765 Merge requests merged +- 476 Issues closed +- 190+ Contributors + +- more than 35% of all commits and Merge Requests were in Rust modules/code + +- 5430 files changed +- 395856 lines added +- 249844 lines deleted +- 146012 lines added (net) + +<a id="contributors"></a> + +## Contributors + +Aaron Boxer, Abd Razak, Adrian Perez de Castro, Adrien Plazas, +Albert Sjolund, Aleix Pol, Alexander Slobodeniuk, Alicia Boya García, +Alyssa Ross, Amotz Terem, Amy Ko, Andoni Morales Alastruey, +Andrew Yooeun Chun, Andrey Khamukhin, anonymix007, Arnout Engelen, +Artem Martus, Arun Raghavan, Ben Butterworth, Biswapriyo Nath, Brad Hards, +Brad Reitmeyer, Branko Subasic, Camilo Celis Guzman, Carlos Bentzen, +Carlos Falgueras García, Carlos Rafael Giani, +César Alejandro Torrealba Vázquez, Changyong Ahn, Chengfa Wang, +Christian Gräfe, Christo Joseph, Christopher Degawa, Christoph Reiter, +Daniel Almeida, Daniel Morin, David Maseda Neira, David Monge, +David Smitmanis, Denis Shimizu, Derek Foreman, Detlev Casanova, +Devon Sookhoo, Diego Nieto, Dominique Leroux, DongJoo Kim, Dongyun Seo, +Doug Nazar, Edward Hervey, Ekwang Lee, eipachte, Eli Mallon, Elliot Chen, +Enock Gomes Neto, Enrique Ocaña González, Eric, Eva Pace, F. Duncanh, +François Laignel, Gang Zhao, Glyn Davies, Guillaume Desmottes, +Gustav Fahlen, Haejung Hwang, Haihua Hu, Havard Graff, Hanna Weiß, +He Junyan, Hou Qi, Hyunjun Ko, Ian Napier, Inbok Kim, Jaehoon Lee, +Jakub Adam, James Cowgill, Jan Alexander Steffens (heftig), Jan Schmidt, +Jan Tojnar, Jan Vermaete, Jaslo Ziska, Jeehyun Lee, Jeffery Wilson, +jeongmin kwak, Jeongmin Kwak, Jerome Colle, Jiayin Zhang, Jihoon Lee, +Jochen Henneberg, Johan Sternerup, Jonathan Lui, Jordan Petridis, +Jordan Yelloz, Jorge Zapata, Julian Bouzas, Kevin Scott, Kevin Wolf, +L. E. Segovia, Linus Svensson, Loïc Le Page, Manuel Torres, +Marc-André Lureau, Marc Leeman, Marek Olejnik, Mark Nauwelaerts, +Marko Kohtala, Markus Hofstaetter, Mathieu Duponchelle, Matteo Bruni, +Matthew Semeniuk, Matthew Waters, Max Goltzsche, Mazdak Farzone, +Michael Grzeschik, Michael Olbrich, Michiel Westerbeek, Monty C, +Muhammad Azizul Hazim, Nicholas Jin, Nicolas Dufresne, Nirbheek Chauhan, +Norbert Hańderek, Ognyan Tonchev, Ola Fornander, Olivier Blin, +Olivier Crête, Oz Donner, Pablo García, Patricia Muscalu, Patrick Fischer, +Paul Fee, Paweł Kotiuk, Paxton Hare, Peter Stensson, pfee, Philippe Normand, +Piotr Brzeziński, Piotr Brzeziński, Pratik Pachange, Qian Hu (胡骞), +r4v3n6101Rafael Caricio, Raghavendra Rao, Rares Branici, +Ratchanan Srirattanamet, Razvan Grigore, Rick Ye, Rinat Zeh, +Robert Ayrapetyan, Robert Mader, Ross Burton, Ruben Gonzalez, Ruben Sanchez, +Samuel Thibault, Sanchayan Maity, Santiago Carot-Nemesio, Santosh Mahto, +Sebastian Dröge, Seungha Yang, Shengqi Yu (喻盛琪), Sjoerd Simons, +Slava Sokolovsky, Stefan Andersson, Stefan Dangl, Stéphane Cerveau, stevn, +Sven Püschel, Sylvain Garrigues, Taruntej Kanakamalla, Teus Groenewoud, +Théo Maillart, Thibault Saunier, Tim-Philipp Müller, Tjitte de Wert, +Tobias Schlager, Tobias Koenig, Tomasz Mikolajczyk, Tulio Beloqui, +Val Packett, Vasiliy Doylov, Víctor Manuel Jáquez Leal, +Vincent Beng Keat Cheah, Vineet Suryan, Vivia Nikolaidou, Vivian Lee, +Vivienne Watermeier, Wilhelm Bartel, William Wedler, Wim Taymans, +Xavier Claessens, Yun Liu, + +... and many others who have contributed bug reports, translations, +sent suggestions or helped testing. Thank you all! + +## Stable 1.28 branch + +After the 1.28.0 release there will be several 1.28.x bug-fix releases which +will contain bug fixes which have been deemed suitable for a stable branch, +but no new features or intrusive changes will be added to a bug-fix release +usually. The 1.28.x bug-fix releases will be made from the git 1.28 branch, +which is a stable release series branch. + +<a id="1.28.1"></a> + +### 1.28.1 + +The first 1.28 bug-fix release (1.28.1) was released on 26 February 2026. + +This release only contains bugfixes and important security fixessecurity. +It *should* be safe to update from 1.28.0 and we recommend you do so at your +earliest convenience. + +security: https://gstreamer.freedesktop.org/security/ + +#### Highlighted bugfixes in 1.28.1 + + - Various security fixessecurity and playback fixes + - Add new whisper-based speech-to-text transcription element + - Add new debugseimetainserter plugin for testing SEI meta insertion + - Fix scaling and resizing with UIView on EAGL and Vulkan + - Reverse playback and gap handling fixes in various components + - avviddec: Handle field/order changes in mixed interlace mode + - awstranscriber2: workaround for suspected Rust SDK regression + - cudaupload, cudadownload: Fix CUDA/GL interop copy path + - decodebin3: Fix switch to smaller collections and improve collection change on existing pad + - devenv: Add a subproject for providing the LunarG MoltenVK SDK + - livesync: fixes and reverse playback handling; ignore upstream latency when upstream is not live + - objectdetectionoverlay: add support for rotated bounding boxes + - qml6glsrc: Fix rendering of scene with clipped items + - speechmatics: allow configuring audio events such as detecting applause, laughter and music + - livekit webrtc: emit session-requested only for Producer role + - tsdemux: Fix Continuity Counter handling and handle clock change/resets without skew correction + - v4l2: Add support for AV1 stateful V4l2 decoder + - vpxdec: Support downstream pools with alignment requirements + - vtdec, vtenc: Lots of Apple VideoToolbox decoder and encoder fixes + - applemedia build improvements, patches for tvOS support, tvos cross file + - wavpack: Fix handling of format changes, extend parser with new features, handle non-S32 samples + - webrtcsink: allow specifying custom headers to signalling server + - webrtcsink: negotiate profile and level for input encoded in H.264 + - webrtcsrc: add request type pads and allow sending encoded data downstream + - cerbero: wheel: Add a new `gstreamer_meta` package with fewer deps + - Various bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements + +#### gstreamer + + - aggregator: Handle gap event before segment(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10789) + - aggregator: Various introspection annotations / docs fixes for vfuncs(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10723) + - basesink: Race condition when pausing can cause `render()` to not block on prerolling but process buffers like in PLAYING state(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4846) + - bitwriter: Steal owned data in reset_and_get_data()(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10805) + - caps: Fix the features leak in gst_caps_append_structure_full(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10689) + - filesink: Report write error correctly on Windows(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10758) + - gst: Add explanatory comment to call_async implementation(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10872) + - input-selector: fix several shortcomings(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10621) + - multiqueue: reverse playback: use segment stop position as start time(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10770) + - registry: Skip .dSYM bundles when loading plugins, try 2(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10853) + - typefindfunctions: Promote y4m_typefind(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10632) + - gst-stats: Also allow ANSI colored logs without 0x in front of the thread id(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10857) + - Fix a couple of new const-ness warnings around strstr() usage, out-of-bounds read in PTP clock and uninitialized variable compiler warning(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10656) + +#### gst-plugins-base + + - Fix scaling and resizing with UIView on EAGL and Vulkan(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10669) + - audiobuffersplit: Various smaller fixes and implement handling of negative rates correctly(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670) + - audiodecoder / videodecoder: Fix gap event handling(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10750) + - compositor: Do copy_metas also for background frame(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10825) + - decodebin3: Fix switch to smaller collections(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10674) + - decodebin3: Improve handling collection change on existing pad(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10638) + - input-selector: fix several shortcomings(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10621) + - playsink: unref color balance channels with g_object_unref()(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10710) + - riff: Correctly check that enough RGB palette data is available(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10892) + - rtp: Add mappings for H266 and AV1 encoding-names(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10661) + - rtsp: Validate transport parameter parsing in RFC 2326(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10717) + - typefindfunctions: Promote y4m_typefind(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10632) + - video-converter: Do not transform_metas with 0 width or height(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10833) + - videodecoder: Handle recovery from temporary reordered output(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10692) + - videofilter: Add VIDEO_ALIGNMENT to downstream pool(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10811) + - Fix a couple of new const-ness warnings around strstr() usage, out-of-bounds read in PTP clock and uninitialized variable compiler warning(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10656) + - Various element factory metadata fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729) + +#### gst-plugins-good + + - qml6glsrc: Fix rendering of scene with clipped items(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10678) + - qtdemux: Don't ignore flow return when pushing queued buffers downstream(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10680) + - qtdemux: Fix out-of-bounds read when parsing PlayReady DRM UUIDs(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10890) + - qtdemux: Make sure to not output the same samples multiple times in reverse playback mode(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10690) + - qtdemux: Push raw audio/video buffers downstream in reverse order if rate < 0(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10708) + - qtdemux: Set the segment position to the start on EOS in reverse playback mode(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10629) + - rtpqdm2depay: error out if anyone tries to use this element(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10897) + - rtpsource: Add locking for receive reports table(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10700) + - rtspsrc: Set new mki in the encoder upon crypto update(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10756) + - rtspsrc: fix Memory leak in gst_rtspsrc_close() when GST_RTSP_EEOF error occurs(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10768) + - rtspsrc: Not handling valid RTP-Info headers for RTSP 2.0(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3064) + - v4l2: Add support for AV1 stateful V4l2 decoder(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10664) + - vpxdec: Support downstream pools with alignment requirements(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10666) + - wavpack: Fix handling of format changes, extend parser with new features, handle non-S32 samples in all variations(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10707) + - wavparse: Avoid integer overflow and out-of-bounds read when parsing adtl chunks(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10903) + - Various element factory metadata fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729) + - meson: Fix libxml2 not building due to wrong option type(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10618) + +#### gst-plugins-bad + + - Fix scaling and resizing with UIView on EAGL and Vulkan(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10669) + - GstPlay: fix segmentation fault due to use after free(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10660) + - ajasink: Only allow 6 / 8 / 16 audio channels(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10624) + - ajasinkcombiner: Only forward the segment events from the video sinkpad(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10748) + - analytics: Fix dims_order handling(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10862) + - applemedia: Fix vtenc draining logic, port other existing fixes between vtdec and vtenc(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10860) + - applemedia: elements can now be individually registered with gst-full(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10828) + - applemedia build improvements, patches for tvOS support, tvos cross file(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10866) + - asiosink: Fill silence when paused(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10830) + - asio: asiosink can not handle pause event properly and generates noise when paused.(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4909) + - audiobuffersplit: Various smaller fixes and implement handling of negative rates correctly(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10670) + - audiobuffersplit: fix reverse playback(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10712) + - ccconverter: Reset counters on flush-stop(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10845) + - cea608mux: fix overflow when calculating output PTS(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10726) + - codecs: v4l2: Add short and long term ref sets support in v4l2 codecs(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10851) + - codectimestamper: Fix latency query handling(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10653) + - cudaupload, cudadownload: Fix CUDA/GL interop copy path(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10620) + - decklink: Explicitly use cpp_std=c++11 for decklink(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10804) + - dvbsuboverlay: Add missing bounds checks to the parser everywhere(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10894) + - h264,h265ccextractor: Fix framerate in initial caps(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10841) + - h265parser: Validate num_decoding_units_minus1 in pic_timing SEI(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10904) + - h266parser: Fix APS ID bounds check in APS parsing(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10899) + - h266parser: Fix out of bounds write when parsing pic_timing SEI(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10901) + - h266parser: Validate tile index bounds in picture partition parsing(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10898) + - jpegparser: boundary checks before copying it(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10896) + - mpeghdec: memory leak fix in MPEG-H Audio decoder plugin(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10687) + - mpegtspacketizer: Handle clock change/resets without skew correction(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10635) + - mxfdemux: always send a segment before sending eos or segment-done(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10650) + - mxfdemux: fix gst_mxf_demux_pad_get_stream_time ()(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10633) + - objectdetectionoverlay: add support for rotated bounding boxes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10671) + - openh264enc: remove broken drain and simplify handle_frame(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10739) + - tsdemux: Fix Continuity Counter handling(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10643) + - tsmux: reduce noise for DEBUG log level(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10736) + - v4l2: Add support for AV1 stateful V4l2 decoder(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10664) + - vabasetransform: copy buffer's metadata at copy when import buffer(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10810) + - vavp8enc: set color format chroma(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10806) + - vkav1dec: fix to set SavedOrderHints properly(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10846) + - vtdec: Avoid busy looping when queue length is smaller than DPB size(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10827) + - vtdec: Don't re-create session if only the framerate changed(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10702) + - vtdec: Fix CM memory leak due to incorrect unref(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10794) + - vtdec: Fix race condition when negotiating during playback(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10715) + - vtdec: Reverse playback fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10654) + - vtdec: Seeking to a frame with a simple pipeline causes a hang for some (ProRes only?, MOV-only?) videos in macOS (arm64, x86_64)(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4861) + - vtdec: Fix wrong DPB size check in the output loop(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10863) + - vtenc: Fix DTS offset calculation(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10873) + - vulkan: load video function pointers conditionally based on codec operation(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10773) + - wayland: Fix CLAMP operation of maxFALL and maxCLL(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10685) + - waylandsink: make gst_wl_window_commit_buffer handle NULL buffers(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10793) + - webrtc: sink floating refs of ICE transports(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10627) + - webrtcbin: Check the presence of encoding-name fields in answer caps(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10662) + - zxing: Fix version check for zxing-cpp 3.0.1(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10813) + - Fix a couple of new const-ness warnings around strstr() usage, out-of-bounds read in PTP clock and uninitialized variable compiler warning(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10656) + - meson: Add a subproject for providing the LunarG MoltenVK SDK(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10752) + - meson: Fix libxml2 not building due to wrong option type(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10618) + - Minimal support for compiling with zxing-cpp 3.x(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10799) + - Various element factory metadata fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729) + - gst-plugins-bad is incompatible with zxing-cpp 3.0.0+(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4893) + +#### gst-plugins-ugly + + - asfdemux: Error out on files with more than 32 streams(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10891) + - rmdemux: Check if new video fragment overflows the fragment storage before storing it(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10893) + +#### GStreamer Rust plugins + + - audio: add new whisper-based transcription element(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2851) + - aws: Don't run whole GStreamer tests in a tokio runtime(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2883) + - awstranscriber2: workaround suspected rust SDK regression(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2849) + - Block on a tokio runtime if available instead of going via futures::executor()(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2835) + - debugseimetainserter: add new plugin for testing SEI meta insertion(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2756) + - demucs: document how to build with a specific python version(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2871) + - demucs: Don't fail if std deviation of the input is too close to zero(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2872) + - demucs: improve url doc(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2868) + - demucs: pin python 3.13 in uv setup(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2867) + - demucs, speechmatics: don't take stream lock on FlushStart(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2869) + - elevenlabs,speechmatics: fix license(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2863) + - isobmff: add support for bayer video formats(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2855) + - isomp4mux: Improving level indicator in vpcC for vp8/vp9 with helpers in pbutils(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2815) + - livesync: fixes & reverse playback handling(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2830) + - livesync: ignore upstream latency when upstream is not live(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2877) + - polly: don't panic when no caps were received before first buffer(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2879) + - polly: fix panic in async send()(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2838) + - rtpav1pay: insert sequence header if a keyframe is missing it(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2902) + - rtprecv: Don't panic if no buffers of a bufferlist can be directly forwarded(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2844) + - rtprecv: Various improvements and bugfixes(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2852) + - rtpsend: send mandatory events on the rtcp srcpad before sending the first buffer(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2904) + - rtpsmpte291depay: Drop the current packet after processing if it was empty(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2875) + - rtp: smpte291: Use upper-case encoding-name(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2865) + - rtp: smpte291: Use video as media type instead of application(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2847) + - speechmatics: allow configuring audio events(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2837) + - st2038combiner: Sort by line and then horizontal offset(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2873) + - st2038combiner: Various minor fixes(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2857) + - transcriberbin: forward handled error messages as warning messages(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2839) + - transcriberbin: fix latency reported when transcriber=translationbin(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2885) + - transcribers: Ignore return value when pushing gap events(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2840) + - webrtc-api: Report pressed mouse buttons as modifiers(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2860) + - webrtc/livekit: emit session-requested only for Producer role(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2807) + - webrtcsink: allow specifying custom headers to signalling server(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2882) + - webrtcsink: multiple improvements(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2842) + - webrtcsink: negotiate profile and level for input encoded in H.264(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2658) + - webrtcsrc: add request type pads(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2796) + - webrtcsrc: allow sending encoded data downstream(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2786) + - cargo_wrapper: Add nasm dir to path only if needed(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2903) + - Update dependencies(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2834) + - Update dependencies(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2853) + - Update dependencies(https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2891) + +#### gst-libav + + - audiodecoder / videodecoder: Fix gap event handling(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10750) + - avviddec: Allow stride changes for some decoders(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10663) + - avviddec: Fix handling of mixed interlaced content(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10879) + - avviddec: Handle field/order changes in mixed interlace mode(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10696) + - avvidcmp: set colorimetry on AVFrame(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10665) + - libav: Don't process lines that won't be outputted in the debug log(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10815) + - Various element factory metadata fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10729) + +#### gst-rtsp-server + + - rtspclientsink: don't error out when stream transport notifies timeout(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10864) + - rtspclientsink <-> MediaMTX times out when migrating to 1.28(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4911) + +#### gstreamer-sharp + + - No changes + +#### gst-python + + - More Python typing fixes(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10625) + +#### gst-editing-services + + - meson: Fix libxml2 not building due to wrong option type(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10618) + +#### gst-devtools, gst-validate + gst-integration-testsuites + + - Update Rust dependencies(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10870) + +#### gst-examples + + - Update Rust dependencies(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10870) + +#### gstreamer-docs + + - No changes + +#### Development build environment + + - Add a Meson subproject for providing the LunarG MoltenVK SDK(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10752) + - Fix support for cross-compiling to iOS and add a cross file for it, remove HAVE_IOS, port to tvOS(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10807) + - pcre2.wrap: Add patch to fix the build on non-macOS Apple platforms(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10741) + - Revert "pygobject: Update to 3.55.0"(https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10732) + +#### Cerbero build tool and packaging changes in 1.28.1 + + - Add environment variable for building run with background priority(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2137) + - Rename vaapi variant to va and by default on Linux, test built plugins correctly on CI(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2135) + - fetch: use the Oven for parsing the dependency tree(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2118) + - fetch-package` may not fetch all dependencies needed for `package`(https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/125) + - filesprovider: Check missing files at the recipe level on CI runs(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2109) + - glib: Upstream old iOS GIO_MODULE_DIR hack(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2095) + - gtk.recipe: Enable gstreamer media backend on Windows(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2125) + - gst-plugins-rs: pin to 0.15 branch for 1.28(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2134) + - inno: Fix incorrect MSVC redistributable when cross-building for Arm64(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2096) + - inno: Restrict usage to native Windows as exposed by sys.platform(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2119) + - libpng: update to 1.6.55(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2101) + - osx-framework: Add missing gstreamer libraries(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2129) + - osx: fix file duplication in .pkg payloads(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2117) + - pygobject.recipe: Fix overflow when comparing GstMessageType on Windows(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2098) + - wheel: Add a new gstreamer_meta package with fewer deps(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2097) + - wheels: Add proper description / long_description(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2112) + - wheels: Don't raise an exception if cli exits with non-zero code(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2128) + - wheels: Use static python requires for all wheels(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2124) + - wheel: Add debuginfo wheel(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2136) + - x265: drop common source recipe(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2123) + - Bump up to NDK 29 and pin cpp_std to c++11 in opencore-amr(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2111) + - Update to Rust 1.93 / cargo-c 0.10.20(https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/2094) + +#### Contributors to 1.28.1 + +Adrian Perez de Castro, Andrey Sidorov, Axxel, Carlos Bentzen, Christian Gräfe, +Daniel Morin, Deepa Guthyappa Madivalara, Detlev Casanova, Dominique Leroux, +Edward Hervey, François Laignel, Guillaume Desmottes, He Junyan, Hyunjun Ko, +Jakub Adam, Jan Alexander Steffens (heftig), Jeongmin Kwak, L. E. Segovia, +Mathieu Duponchelle, Matthew Waters, Monty C, Nicolas Dufresne, Nirbheek Chauhan, +Ognyan Tonchev, Peter Stensson, Philippe Normand, Piotr Brzeziński, Rinat Zeh, +Robert Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Sjoerd Simons, +Stéphane Cerveau, Sven Püschel, Taruntej Kanakamalla, Thibault Saunier, +Tim-Philipp Müller, Tobias Koenig, Víctor Manuel Jáquez Leal, Vivia Nikolaidou, +Xabier Rodriguez Calvar, Xavier Claessens, Xi Ruoyao, + +... 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.28.1 + +- List of Merge Requests applied in 1.28.1(https://gitlab.freedesktop.org/groups/gstreamer/-/merge_requests?scope=all&utf8=%E2%9C%93&state=merged&milestone_title=1.28.1) +- List of Issues fixed in 1.28.1(https://gitlab.freedesktop.org/groups/gstreamer/-/issues?scope=all&utf8=%E2%9C%93&state=closed&milestone_title=1.28.1) + +## Schedule for 1.30 + +Our next major feature release will be 1.30, and 1.29 will be the unstable +development version leading up to the stable 1.30 release. The development +of 1.29/1.30 will happen in the git `main` branch of the GStreamer mono +repository. + +The schedule for 1.30 is still to be determined, but it will likely be +in Q4/2026. + +1.30 will be backwards-compatible to the stable 1.28, 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. + +<a id="1.27.1"></a><a id="1.27.2"></a><a id="1.27.50"></a><a id="1.27.90"></a> +## 1.27 pre-releases (superseded by 1.28) + +<!-- Add some anchors for the old pre-releases since anchors are handled + client side so we can't add server side redirects to the 1.27 page. + --> + +- 1.27.1 development snapshot release notesrn-1.27.1 +- 1.27.2 development snapshot release notesrn-1.27.2 +- 1.27.50 development snapshot release notesrn-1.27.50 +- 1.27.90 pre-release release notesrn-1.27.90 + +rn-1.27.1: https://gstreamer.freedesktop.org/releases/1.27/#1.27.1 +rn-1.27.2: https://gstreamer.freedesktop.org/releases/1.27/#1.27.2 +rn-1.27.50: https://gstreamer.freedesktop.org/releases/1.27/#1.27.50 +rn-1.27.90: https://gstreamer.freedesktop.org/releases/1.27/#1.27.90 + + +- - - + +*These release notes have been prepared by Tim-Philipp Müller with contributions from Daniel Morin, Nirbheek Chauhan, Philippe Normand, Sebastian Dröge, Thibault Saunier, Víctor Manuel Jáquez Leal, and Xavier Claessens* + +*License: CC BY-SA 4.0(http://creativecommons.org/licenses/by-sa/4.0/)*
View file
_service:download_files:gst-plugins-bad-1.28.1.tar.xz/scripts/dist-common-files.py
Added
@@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2023-2026 Tim-Philipp Müller <tim centricular net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301, USA. + +import os +import subprocess +import shutil +import tempfile +import sys + +if __name__ == "__main__": + dist_root = os.environ'MESON_DIST_ROOT' + build_root = os.environ'MESON_BUILD_ROOT' + source_root = os.environ'MESON_SOURCE_ROOT' + project_version = sys.argv1 + pwd = os.environ'PWD' + tmpdir = tempfile.gettempdir() + + ver_array = project_version.split('.') + major_minor = '{}.{}'.format(ver_array0, ver_array1) + + module = os.path.basename(os.path.normpath(source_root)) + + print('Copying README.md into dist staging directory ..') + readme_src = os.path.join(source_root, '..', '..', 'README.md') + shutil.copy2(readme_src, dist_root) + + # Release notes (instead of NEWS) - could also write it out as NEWS.md + print('Copying release notes into dist staging directory ..') + relnotes_src = os.path.join(source_root, '..', '..', 'release-notes', major_minor, f'release-notes-{major_minor}.md') + with open(relnotes_src, 'r') as f: + lines = f.readlines() + if not f'### {project_version}\n' in lines: + sys.exit(f'Update {relnotes_src} first, must contain a section for {project_version}') + if not project_version.endswith('.0'): + found = False + for line in lines: + if line.startswith('The latest') and project_version in line: + found = True + if not found: + sys.exit(f'Update {relnotes_src} first, header should say latest version is {project_version}.') + shutil.copy2(relnotes_src, dist_root) + + # RELEASE + print('Copying RELEASE into dist staging directory ..') + rel_src = os.path.join(source_root, '..', '..', 'release-notes', major_minor, f'RELEASE-{major_minor}.template') + with open(rel_src, 'r') as f: + lines = f.readlines() + + assert (lines0.startswith('This is GStreamer')) + + if module == 'gstreamer': + lines0 = f'This is GStreamer core {project_version}\n' + else: + lines0 = f'This is GStreamer {module} {project_version}\n' + + with open(os.path.join(dist_root, 'RELEASE'), 'w') as f: + f.writelines(lines)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/aja/gstajasinkcombiner.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/aja/gstajasinkcombiner.cpp
Changed
@@ -35,7 +35,7 @@ GST_STATIC_CAPS("audio/x-raw, " "format = (string) S32LE, " "rate = (int) 48000, " - "channels = (int) 1, 16 , " + "channels = (int) { 6, 8, 16 }, " "layout = (string) interleaved")); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE( @@ -140,10 +140,12 @@ switch (GST_EVENT_TYPE(event)) { case GST_EVENT_SEGMENT: { - const GstSegment *segment; + if (agg_pad == GST_AGGREGATOR_PAD_CAST(self->video_sinkpad)) { + const GstSegment *segment; - gst_event_parse_segment(event, &segment); - gst_aggregator_update_segment(GST_AGGREGATOR(self), segment); + gst_event_parse_segment(event, &segment); + gst_aggregator_update_segment(GST_AGGREGATOR(self), segment); + } break; } case GST_EVENT_CAPS: {
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfassetsrc.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfassetsrc.h
Changed
@@ -133,6 +133,7 @@ }; GType gst_avf_asset_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (avfassetsrc); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfassetsrc.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfassetsrc.m
Changed
@@ -38,6 +38,7 @@ #endif #include "avfassetsrc.h" +#include "helpers.h" #include "coremediabuffer.h" GST_DEBUG_CATEGORY_STATIC (gst_avf_asset_src_debug); @@ -122,8 +123,16 @@ 0, "avfassetsrc element"); } +#ifndef HAVE_IOS +#define AV_RANK GST_RANK_SECONDARY +#else +#define AV_RANK GST_RANK_PRIMARY +#endif + G_DEFINE_TYPE_WITH_CODE (GstAVFAssetSrc, gst_avf_asset_src, GST_TYPE_ELEMENT, _do_init (g_define_type_id)); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (avfassetsrc, "avfassetsrc", AV_RANK, + GST_TYPE_AVF_ASSET_SRC, gst_applemedia_init_once ()); /* GObject vmethod implementations */
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfdeviceprovider.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfdeviceprovider.h
Changed
@@ -28,6 +28,7 @@ #endif #include <gst/gst.h> +#include <gst/gstdeviceprovider.h> #include "avfvideosrc.h" G_BEGIN_DECLS @@ -58,6 +59,7 @@ }; GType gst_avf_device_provider_get_type (void); +GST_DEVICE_PROVIDER_REGISTER_DECLARE (avfdeviceprovider); typedef struct _GstAvfDevice GstAvfDevice;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfdeviceprovider.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfdeviceprovider.m
Changed
@@ -23,6 +23,7 @@ #include "config.h" #endif +#include <TargetConditionals.h> #import <AVFoundation/AVFoundation.h> #include "avfvideosrc.h" #include "avfdeviceprovider.h" @@ -37,6 +38,9 @@ G_DEFINE_TYPE (GstAVFDeviceProvider, gst_avf_device_provider, GST_TYPE_DEVICE_PROVIDER); +GST_DEVICE_PROVIDER_REGISTER_DEFINE (avfdeviceprovider, "avfdeviceprovider", + GST_RANK_PRIMARY, GST_TYPE_AVF_DEVICE_PROVIDER); + static GList *gst_avf_device_provider_probe (GstDeviceProvider * provider); static void @@ -81,13 +85,14 @@ g_free (unique_id); g_free (model_id); -#ifndef HAVE_IOS - char *manufacturer = g_strdup (device manufacturer UTF8String); - gst_structure_set (props, - "avf.manufacturer", G_TYPE_STRING, manufacturer, - NULL); - - g_free (manufacturer); +#if !TARGET_OS_WATCH + if (__builtin_available (macos 10.9, ios 14.0, tvos 17.0, visionos 2.1, *)) { + char *manufacturer = g_strdup (device manufacturer UTF8String); + gst_structure_set (props, + "avf.manufacturer", G_TYPE_STRING, manufacturer, + NULL); + g_free (manufacturer); + } #endif return props;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfvideosrc.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfvideosrc.h
Changed
@@ -21,7 +21,7 @@ #define __GST_AVF_VIDEO_SRC_H__ #import <AVFoundation/AVFoundation.h> -#include <gst/base/gstpushsrc.h> +#include <gst/base/base.h> G_BEGIN_DECLS @@ -82,9 +82,12 @@ }; GType gst_avf_video_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (avfvideosrc); void gst_avf_video_src_debug_init (void); -GstCaps *gst_av_capture_device_get_caps (AVCaptureDevice *device, AVCaptureVideoDataOutput *output, GstAVFVideoSourceOrientation orientation); +GstCaps* gst_av_capture_device_get_caps (AVCaptureDevice *device, + AVCaptureVideoDataOutput *output, + GstAVFVideoSourceOrientation orientation); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avfvideosrc.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avfvideosrc.m
Changed
@@ -25,11 +25,14 @@ #include "avfvideosrc.h" #include "glcontexthelper.h" +#include <TargetConditionals.h> #import <AVFoundation/AVFoundation.h> #import <CoreMedia/CoreMedia.h> -#ifndef HAVE_IOS + +#if TARGET_OS_OSX #import <AppKit/AppKit.h> #endif + #include <gst/video/video.h> #include <gst/gl/gstglcontext.h> #include "coremediabuffer.h" @@ -60,12 +63,12 @@ GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ( -#ifndef HAVE_IOS +#if TARGET_OS_OSX GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "UYVY") ", " "texture-target = " GST_GL_TEXTURE_TARGET_RECTANGLE_STR ";" -#else +#elif TARGET_OS_IOS || TARGET_OS_TV GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "NV12") ", " @@ -89,8 +92,16 @@ HAS_BUFFER_OR_STOP_REQUEST, } QueueState; +#ifndef HAVE_IOS +#define AV_RANK GST_RANK_SECONDARY +#else +#define AV_RANK GST_RANK_PRIMARY +#endif + #define gst_avf_video_src_parent_class parent_class G_DEFINE_TYPE (GstAVFVideoSrc, gst_avf_video_src, GST_TYPE_PUSH_SRC); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (avfvideosrc, "avfvideosrc", + AV_RANK, GST_TYPE_AVF_VIDEO_SRC, gst_applemedia_init_once ()); #define GST_TYPE_AVF_VIDEO_SOURCE_POSITION (gst_avf_video_source_position_get_type ()) static GType @@ -236,7 +247,7 @@ - (BOOL)openDevice; - (void)closeDevice; - (GstVideoFormat)getGstVideoFormat:(NSNumber *)pixel_format; -#ifndef HAVE_IOS +#if TARGET_OS_OSX - (CGDirectDisplayID)getDisplayIdFromDeviceIndex; - (float)getScaleFactorFromDeviceIndex; #endif @@ -260,8 +271,7 @@ @end -#ifdef HAVE_IOS - +#if TARGET_OS_IOS || TARGET_OS_TV static AVCaptureDeviceType GstAVFVideoSourceDeviceType2AVCaptureDeviceType(GstAVFVideoSourceDeviceType deviceType) { switch (deviceType) { case GST_AVF_VIDEO_SOURCE_DEVICE_TYPE_BUILT_IN_WIDE_ANGLE_CAMERA: @@ -287,6 +297,21 @@ } +static CGFloat GstAVFVideoSourceOrientation2VideoRotationAngle(GstAVFVideoSourceOrientation orientation) { + switch (orientation) { + case GST_AVF_VIDEO_SOURCE_ORIENTATION_PORTRAIT: + return 0.0; + case GST_AVF_VIDEO_SOURCE_ORIENTATION_PORTRAIT_UPSIDE_DOWN: + return 180.0; + case GST_AVF_VIDEO_SOURCE_ORIENTATION_LANDSCAPE_LEFT: + return -90.0; + case GST_AVF_VIDEO_SOURCE_ORIENTATION_LANDSCAPE_RIGHT: + return 90.0; + case GST_AVF_VIDEO_SOURCE_ORIENTATION_DEFAULT: + g_assert_not_reached(); + } +} + static AVCaptureVideoOrientation GstAVFVideoSourceOrientation2AVCaptureVideoOrientation(GstAVFVideoSourceOrientation orientation) { switch (orientation) { case GST_AVF_VIDEO_SOURCE_ORIENTATION_PORTRAIT: @@ -301,8 +326,7 @@ g_assert_not_reached(); } } - -#endif +#endif /* TARGET_OS_IOS || TARGET_OS_TV */ @implementation GstAVFVideoSrcImpl @@ -406,7 +430,8 @@ } if (deviceIndex == DEFAULT_DEVICE_INDEX) { -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV + // TODO: Also supported on macOS 10.15 and visionOS 2.1+ if (deviceType != DEFAULT_DEVICE_TYPE && position != DEFAULT_POSITION) { device = AVCaptureDevice defaultDeviceWithDeviceType:GstAVFVideoSourceDeviceType2AVCaptureDeviceType(deviceType) @@ -454,9 +479,7 @@ - (BOOL)openScreenInput { -#ifdef HAVE_IOS - return NO; -#else +#if TARGET_OS_OSX CGDirectDisplayID displayId; int screenHeight, screenWidth; @@ -501,6 +524,8 @@ screenInput.capturesMouseClicks = captureScreenMouseClicks; input = screenInput; return YES; +#else + return NO; #endif } @@ -533,9 +558,15 @@ /* retained by session */ connection = output connections firstObject; -#ifdef HAVE_IOS - if (orientation != DEFAULT_ORIENTATION) - connection.videoOrientation = GstAVFVideoSourceOrientation2AVCaptureVideoOrientation(orientation); +#if TARGET_OS_IOS || TARGET_OS_TV + if (orientation != DEFAULT_ORIENTATION) { + if (__builtin_available(ios 17.0, tvos 17.0, *)) { + // TODO: Also suppored on macOS 14.0+ + connection.videoRotationAngle = GstAVFVideoSourceOrientation2VideoRotationAngle(orientation); + } else { + connection.videoOrientation = GstAVFVideoSourceOrientation2AVCaptureVideoOrientation(orientation); + } + } #endif inputClock = ((AVCaptureInputPort *)connection.inputPorts0).clock; *successPtr = YES; @@ -601,7 +632,7 @@ return gst_format; } -#ifndef HAVE_IOS +#if TARGET_OS_OSX - (CGDirectDisplayID)getDisplayIdFromDeviceIndex { NSDictionary *description; @@ -705,7 +736,7 @@ pixel_formats = output.availableVideoCVPixelFormatTypes; if (captureScreen) { -#ifndef HAVE_IOS +#if TARGET_OS_OSX CGRect rect; AVCaptureScreenInput *screenInput = (AVCaptureScreenInput *)input; if (CGRectIsEmpty (screenInput.cropRect)) { @@ -757,7 +788,7 @@ forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey; if (captureScreen) { -#ifndef HAVE_IOS +#if TARGET_OS_OSX AVCaptureScreenInput *screenInput = (AVCaptureScreenInput *)input; screenInput.minFrameDuration = CMTimeMake(info.fps_d, info.fps_n); #else @@ -1151,7 +1182,7 @@ PROP_DEVICE_TYPE, PROP_DO_STATS, PROP_FPS, -#ifndef HAVE_IOS +#if TARGET_OS_OSX PROP_CAPTURE_SCREEN, PROP_CAPTURE_SCREEN_CURSOR, PROP_CAPTURE_SCREEN_MOUSE_CLICKS, @@ -1264,7 +1295,7 @@ g_param_spec_int ("fps", "Frames per second", "Last measured framerate, if statistics are enabled", -1, G_MAXINT, -1, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); -#ifndef HAVE_IOS +#if TARGET_OS_OSX g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN, g_param_spec_boolean ("capture-screen", "Enable screen capture", "Enable screen capture functionality", FALSE, @@ -1355,7 +1386,7 @@ GstAVFVideoSrcImpl *impl = GST_AVF_VIDEO_SRC_IMPL (object); switch (prop_id) { -#ifndef HAVE_IOS +#if TARGET_OS_OSX case PROP_CAPTURE_SCREEN: g_value_set_boolean (value, impl.captureScreen); break; @@ -1414,7 +1445,7 @@ GstAVFVideoSrcImpl *impl = GST_AVF_VIDEO_SRC_IMPL (object); switch (prop_id) { -#ifndef HAVE_IOS +#if TARGET_OS_OSX case PROP_CAPTURE_SCREEN: impl.captureScreen = g_value_get_boolean (value); break; @@ -1570,12 +1601,14 @@ gst_av_capture_device_get_caps (AVCaptureDevice *device, AVCaptureVideoDataOutput *output, GstAVFVideoSourceOrientation orientation) { GstCaps *result_caps, *result_gl_caps; +#if TARGET_OS_OSX || TARGET_OS_IOS || TARGET_OS_TV gboolean is_gl_format; -#ifndef HAVE_IOS +#if TARGET_OS_OSX GstVideoFormat gl_formats = { GST_VIDEO_FORMAT_UYVY, GST_VIDEO_FORMAT_YUY2, 0 }; #else GstVideoFormat gl_formats = { GST_VIDEO_FORMAT_NV12, 0 }; #endif +#endif result_caps = gst_caps_new_empty (); result_gl_caps = gst_caps_new_empty (); @@ -1621,6 +1654,7 @@ caps = GST_AVF_FPS_RANGE_CAPS_NEW (gst_format, dimensions.width, dimensions.height, min_fps_n, min_fps_d, max_fps_n, max_fps_d); +#if TARGET_OS_OSX || TARGET_OS_IOS || TARGET_OS_TV is_gl_format = FALSE; for (int i = 0; i < G_N_ELEMENTS (gl_formats); i++) { if (gst_format == gl_formatsi) { @@ -1639,7 +1673,7 @@ NULL)); gst_caps_set_simple (caps, "texture-target", G_TYPE_STRING, -#ifndef HAVE_IOS +#if TARGET_OS_OSX GST_GL_TEXTURE_TARGET_RECTANGLE_STR, #else GST_GL_TEXTURE_TARGET_2D_STR, @@ -1647,6 +1681,9 @@ NULL); gst_caps_append (result_gl_caps, caps); } +#else + gst_caps_append (result_caps, caps); +#endif } } }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avsamplevideosink.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avsamplevideosink.h
Changed
@@ -75,6 +75,7 @@ }; GType gst_av_sample_video_sink_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (avsamplebufferlayersink); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/avsamplevideosink.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/avsamplevideosink.m
Changed
@@ -30,6 +30,7 @@ #endif #include "avsamplevideosink.h" +#include "helpers.h" GST_DEBUG_CATEGORY (gst_debug_av_sink); #define GST_CAT_DEFAULT gst_debug_av_sink @@ -72,6 +73,9 @@ G_DEFINE_TYPE_WITH_CODE (GstAVSampleVideoSink, gst_av_sample_video_sink, GST_TYPE_VIDEO_SINK, GST_DEBUG_CATEGORY_INIT (gst_debug_av_sink, "avsamplevideosink", 0, "AV Sample Video Sink")); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (avsamplebufferlayersink, + "avsamplebufferlayersink", GST_RANK_NONE, + GST_TYPE_AV_SAMPLE_VIDEO_SINK, gst_applemedia_init_once ()); static void gst_av_sample_video_sink_class_init (GstAVSampleVideoSinkClass * klass)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/corevideobuffer.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/corevideobuffer.c
Changed
@@ -22,13 +22,17 @@ #endif #include "corevideobuffer.h" #include "corevideomemory.h" -#ifndef HAVE_IOS + +#include <TargetConditionals.h> +#if TARGET_OS_OSX #include "iosurfaceglmemory.h" #endif + #include "videotexturecache-gl.h" + #if defined(APPLEMEDIA_MOLTENVK) #include "videotexturecache-vulkan.h" -#ifndef HAVE_IOS +#if TARGET_OS_OSX #include "iosurfacevulkanmemory.h" #endif #endif @@ -110,9 +114,7 @@ _create_glmem (GstAppleCoreVideoPixelBuffer * gpixbuf, GstVideoInfo * info, guint plane, gsize size, GstVideoTextureCache * cache) { -#ifdef HAVE_IOS - return gst_video_texture_cache_create_memory (cache, gpixbuf, plane, size); -#else +#if TARGET_OS_OSX GstIOSurfaceGLMemory *mem; CVPixelBufferRef pixel_buf = gpixbuf->buf; IOSurfaceRef surface = CVPixelBufferGetIOSurface (pixel_buf); @@ -126,6 +128,8 @@ surface, GST_GL_TEXTURE_TARGET_RECTANGLE, tex_format, info, plane, NULL, pixel_buf, (GDestroyNotify) CFRelease); return GST_MEMORY_CAST (mem); +#else + return gst_video_texture_cache_create_memory (cache, gpixbuf, plane, size); #endif }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/helpers.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/helpers.h
Changed
@@ -46,5 +46,7 @@ GstVideoFormat gst_video_format_from_cvpixelformat (int fmt); int gst_video_format_to_cvpixelformat (GstVideoFormat fmt); +void gst_applemedia_init_once (void); + G_END_DECLS #endif /* _APPLEMEDIA_HELPERS_H_ */
View file
_service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/helpers.m
Added
@@ -0,0 +1,132 @@ +/* + * Copyright (C) 2023 Nirbheek Chauhan <nirbheek@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <TargetConditionals.h> +#import <Foundation/Foundation.h> +#include <CoreVideo/CVPixelBuffer.h> +#include "helpers.h" +#include "corevideomemory.h" + +#if TARGET_OS_IOS || TARGET_OS_TV +#include "iosglmemory.h" +#endif + +#if TARGET_OS_OSX +static void +enable_mt_mode (void) +{ + NSThread * th = NSThread alloc init; + th start; + g_assert (NSThread isMultiThreaded); +} +#endif + +GstVideoFormat +gst_video_format_from_cvpixelformat (int fmt) +{ + /* Note that video and full-range color values map to the same format */ + switch (fmt) { + /* YUV */ + case kCVPixelFormatType_420YpCbCr8Planar: + case kCVPixelFormatType_420YpCbCr8PlanarFullRange: + return GST_VIDEO_FORMAT_I420; + case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: + case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: + return GST_VIDEO_FORMAT_NV12; + case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: + case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: + return GST_VIDEO_FORMAT_P010_10LE; + case kCVPixelFormatType_422YpCbCr8: + return GST_VIDEO_FORMAT_UYVY; + case kCVPixelFormatType_422YpCbCr8_yuvs: + return GST_VIDEO_FORMAT_YUY2; + /* Alpha YUV */ + case kCVPixelFormatType_4444AYpCbCr16: + return GST_VIDEO_FORMAT_AYUV64; + /* RGB formats */ + case kCVPixelFormatType_32ARGB: + return GST_VIDEO_FORMAT_ARGB; + case kCVPixelFormatType_32BGRA: + return GST_VIDEO_FORMAT_BGRA; + case kCVPixelFormatType_64ARGB: + return GST_VIDEO_FORMAT_ARGB64_BE; + case kCVPixelFormatType_64RGBALE: + return GST_VIDEO_FORMAT_RGBA64_LE; + default: + return GST_VIDEO_FORMAT_UNKNOWN; + } +} + +int +gst_video_format_to_cvpixelformat (GstVideoFormat fmt) +{ + switch (fmt) { + /* YUV */ + case GST_VIDEO_FORMAT_I420: + return kCVPixelFormatType_420YpCbCr8Planar; + case GST_VIDEO_FORMAT_NV12: + return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; + case GST_VIDEO_FORMAT_P010_10LE: + return kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange; + case GST_VIDEO_FORMAT_UYVY: + return kCVPixelFormatType_422YpCbCr8; + case GST_VIDEO_FORMAT_YUY2: + return kCVPixelFormatType_422YpCbCr8_yuvs; + /* Alpha YUV */ + case GST_VIDEO_FORMAT_AYUV64: +/* This is fine for now because Apple only ships LE devices */ +#if G_BYTE_ORDER != G_LITTLE_ENDIAN +#error "AYUV64 is NE but kCVPixelFormatType_4444AYpCbCr16 is LE" +#endif + return kCVPixelFormatType_4444AYpCbCr16; + /* RGB formats */ + case GST_VIDEO_FORMAT_ARGB: + return kCVPixelFormatType_32ARGB; + case GST_VIDEO_FORMAT_BGRA: + return kCVPixelFormatType_32BGRA; + case GST_VIDEO_FORMAT_ARGB64_BE: + return kCVPixelFormatType_64ARGB; + case GST_VIDEO_FORMAT_RGBA64_LE: + return kCVPixelFormatType_64RGBALE; + default: + g_assert_not_reached (); + return -1; + } +} + +void +gst_applemedia_init_once (void) +{ + static gsize init_once = 0; + + if (g_once_init_enter (&init_once)) { + gst_apple_core_video_memory_init (); +#if TARGET_OS_IOS || TARGET_OS_TV + gst_ios_gl_memory_init (); +#endif +#if TARGET_OS_OSX + enable_mt_mode (); +#endif + g_once_init_leave (&init_once, 1); + } +}
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/iosassetsrc.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/iosassetsrc.h
Changed
@@ -91,6 +91,7 @@ }; GType gst_ios_asset_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (iosassetsrc); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/iosassetsrc.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/iosassetsrc.m
Changed
@@ -40,6 +40,7 @@ #include <gst/gst.h> #include <gst/base/base.h> #include "iosassetsrc.h" +#include "helpers.h" static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -93,6 +94,9 @@ G_DEFINE_TYPE_WITH_CODE (GstIOSAssetSrc, gst_ios_asset_src, GST_TYPE_BASE_SRC, _do_init (g_define_type_id)); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (iosassetsrc, "iosassetsrc", + GST_RANK_SECONDARY, GST_TYPE_IOS_ASSET_SRC, + gst_applemedia_init_once ()); static void gst_ios_asset_src_class_init (GstIOSAssetSrcClass * klass)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/meson.build
Changed
@@ -1,61 +1,61 @@ applemedia_sources = - 'plugin.m', - 'vtutil.c', - 'corevideomemory.c', - 'corevideobuffer.c', - 'coremediabuffer.c', - 'videotexturecache.m', - 'videotexturecache-gl.m', - 'glcontexthelper.c', - 'helpers.c', + 'avfassetsrc.m', + 'avsamplevideosink.m', + 'coremediabuffer.c', + 'corevideobuffer.c', + 'corevideomemory.c', + 'glcontexthelper.c', + 'helpers.m', + 'plugin.m', + 'videotexturecache-gl.m', + 'videotexturecache.m', + 'vtenc.c', + 'vtdec.c', + 'vtutil.c', applemedia_headers = - 'metal-helpers.h', - 'vtutil.h', - 'iosglmemory.h', - 'corevideobuffer.h', - 'videotexturecache.h', - 'coremediabuffer.h', - 'vtenc.h', + 'avfassetsrc.h', + 'avfdeviceprovider.h', + 'avfvideosrc.h', 'avsamplevideosink.h', - 'helpers.h', + 'coremediabuffer.h', + 'corevideobuffer.h', 'corevideomemory.h', + 'glcontexthelper.h', + 'helpers.h', 'iosassetsrc.h', + 'iosglmemory.h', 'iosurfaceglmemory.h', - 'avfdeviceprovider.h', - 'avfassetsrc.h', 'iosurfacevulkanmemory.h', + 'metal-helpers.h', + 'videotexturecache-gl.h', 'videotexturecache-vulkan.h', + 'videotexturecache.h', 'vtdec.h', - 'avfvideosrc.h', - 'videotexturecache-gl.h', - 'glcontexthelper.h', + 'vtenc.h', + 'vtutil.h', applemedia_args = - '-Dgst_core_media_buffer_new=gst_core_media_buffer_priv_new', - '-Dgst_core_media_buffer_get_type=gst_core_media_buffer_priv_get_type', - '-Dgst_core_media_buffer_get_pixel_buffer=gst_core_media_buffer_priv_get_pixel_buffer', - '-Dgst_core_video_buffer_new=gst_core_video_buffer_priv_new', - '-Dgst_core_video_buffer_get_type=gst_core_video_buffer_priv_get_type', - '-DGST_USE_UNSTABLE_API' + '-Dgst_core_media_buffer_new=gst_core_media_buffer_priv_new', + '-Dgst_core_media_buffer_get_type=gst_core_media_buffer_priv_get_type', + '-Dgst_core_media_buffer_get_pixel_buffer=gst_core_media_buffer_priv_get_pixel_buffer', + '-Dgst_core_video_buffer_new=gst_core_video_buffer_priv_new', + '-Dgst_core_video_buffer_get_type=gst_core_video_buffer_priv_get_type', + '-DGST_USE_UNSTABLE_API' -avfoundation_sources = +avcapturedevice_sources = 'avfvideosrc.m', - 'avfassetsrc.m', - 'avsamplevideosink.m', 'avfdeviceprovider.m', -vt_sources = - 'vtenc.c', - 'vtdec.c' +ios_deprecated_sources = + 'iosassetsrc.m', ios_sources = - 'iosassetsrc.m', 'iosglmemory.c', @@ -69,7 +69,7 @@ doc_sources = -foreach s: applemedia_sources + avfoundation_sources + vt_sources + ios_sources + non_ios_sources + vulkan_sources + applemedia_headers +foreach s: applemedia_sources + avcapturedevice_sources + ios_sources + ios_deprecated_sources + non_ios_sources + vulkan_sources + applemedia_headers doc_sources += meson.current_source_dir() / s endforeach @@ -80,7 +80,7 @@ applemedia_objc_args = applemedia_found_deps = false applemedia_option = get_option('applemedia') -if not 'darwin', 'ios'.contains(host_system) or applemedia_option.disabled() +if host_system != 'darwin' or applemedia_option.disabled() or not have_objcpp subdir_done() endif @@ -92,53 +92,59 @@ applemedia_objc_args += '-fobjc-arc' objcpp = meson.get_compiler('objcpp') -applemedia_frameworks = -corefoundation_dep = dependency('CoreFoundation', required : applemedia_option) -coremedia_dep = dependency('CoreMedia', required : applemedia_option) -corevideo_dep = dependency('CoreVideo', required : applemedia_option) -applemedia_frameworks += corefoundation_dep, coremedia_dep, corevideo_dep +applemedia_frameworks = + dependency('AVFoundation', required: applemedia_option), + dependency('CoreFoundation', required : applemedia_option), + dependency('CoreMedia', required : applemedia_option), + dependency('CoreVideo', required : applemedia_option), + -avfoundation_dep = dependency('AVFoundation', required : applemedia_option) -if avfoundation_dep.found() - applemedia_sources += avfoundation_sources - applemedia_frameworks += avfoundation_dep +if subsystem == 'macos' or subsystem.startswith('ios') + applemedia_sources += avcapturedevice_sources endif -videotoolbox_dep = dependency('VideoToolbox', required : applemedia_option) -if videotoolbox_dep.found() - applemedia_sources += vt_sources - applemedia_frameworks += videotoolbox_dep +if not subsystem.startswith('watchos') + applemedia_frameworks += dependency('VideoToolbox', required : applemedia_option) endif -if host_system == 'ios' - applemedia_sources += ios_sources - applemedia_objc_args += '-fobjc-abi-version=2', '-fobjc-legacy-dispatch' - - ios_media_dep = dependency('appleframeworks', modules : 'Foundation', 'AssetsLibrary', required : applemedia_option) - iosurface_dep = dependency('IOSurface', required : applemedia_option) - applemedia_frameworks += ios_media_dep, iosurface_dep +if subsystem == 'macos' + applemedia_sources += non_ios_sources + cocoa_dep = dependency('Cocoa', required : applemedia_option) + iosurface_dep = dependency('IOSurface', required : applemedia_option) + applemedia_opengl_dep = dependency('appleframeworks', modules : 'OpenGL', required : applemedia_option) + applemedia_frameworks += cocoa_dep, applemedia_opengl_dep, iosurface_dep else - applemedia_sources += non_ios_sources - cocoa_dep = dependency('Cocoa', required : applemedia_option) - iosurface_dep = dependency('IOSurface', required : applemedia_option) - applemedia_opengl_dep = dependency('appleframeworks', modules : 'OpenGL', required : applemedia_option) - applemedia_frameworks += cocoa_dep, applemedia_opengl_dep, iosurface_dep + applemedia_sources += ios_sources + if subsystem.startswith('ios') + applemedia_sources += ios_deprecated_sources + ios_media_dep = dependency('appleframeworks', modules : 'Foundation', 'AssetsLibrary', required : applemedia_option) + else + ios_media_dep = dependency('appleframeworks', modules : 'Foundation', required : applemedia_option) + endif + iosurface_dep = dependency('IOSurface', required : applemedia_option) + applemedia_frameworks += ios_media_dep, iosurface_dep + applemedia_objc_args += '-fobjc-abi-version=2', '-fobjc-legacy-dispatch' endif applemedia_found_deps = true foreach framework : applemedia_frameworks - if not framework.found() - applemedia_found_deps = false - endif + if not framework.found() + applemedia_found_deps = false + endif endforeach applemedia_objcpp_args = vulkan_option = get_option('vulkan') vk_required = applemedia_option.enabled() and vulkan_option.enabled() -if gstvulkan_dep.found() and have_objcpp and not vulkan_option.disabled() - moltenvk_dep = objcpp.find_library('MoltenVK', required: vk_required) - metal_dep = dependency('appleframeworks', modules : 'Metal', required: vk_required) - have_mvk_header = objcpp.has_header('MoltenVK/vk_mvk_moltenvk.h', required: vk_required) +if gstvulkan_dep.found() and not vulkan_option.disabled() + moltenvk_dep = objcpp.find_library('MoltenVK', required: false) + if moltenvk_dep.found() + have_mvk_header = objcpp.has_header('MoltenVK/vk_mvk_moltenvk.h', required: vk_required) + else + moltenvk_dep = dependency('MoltenVK', fallback: 'moltenvk', required: vk_required) + have_mvk_header = true + endif + metal_dep = dependency('Metal', required: vk_required) if metal_dep.found() and moltenvk_dep.found() and have_mvk_header applemedia_frameworks += moltenvk_dep, gstvulkan_dep, metal_dep applemedia_sources += vulkan_sources @@ -151,17 +157,17 @@ endif if applemedia_found_deps - gstapplemedia = library('gstapplemedia', - applemedia_sources, - c_args : gst_plugins_bad_args + applemedia_args, - objc_args : gst_plugins_bad_args + applemedia_args + applemedia_objc_args, - objcpp_args : gst_plugins_bad_args + applemedia_args + applemedia_objc_args + applemedia_objcpp_args, - link_args : noseh_link_args, - include_directories : configinc, libsinc, - dependencies : gstvideo_dep, gstpbutils_dep, gst_dep, gstbase_dep, gstgl_dep, gstglproto_dep, gstcodecparsers_dep + applemedia_frameworks, - override_options : 'cpp_std=c++11', - install : true, - install_dir : plugins_install_dir, - ) - plugins += gstapplemedia + gstapplemedia = library('gstapplemedia', + applemedia_sources, + c_args : gst_plugins_bad_args + applemedia_args, + objc_args : gst_plugins_bad_args + applemedia_args + applemedia_objc_args, + objcpp_args : gst_plugins_bad_args + applemedia_args + applemedia_objc_args + applemedia_objcpp_args, + link_args : noseh_link_args, + include_directories : configinc, libsinc, + dependencies : gstvideo_dep, gstpbutils_dep, gst_dep, gstbase_dep, gstgl_dep, gstglproto_dep, gstcodecparsers_dep + applemedia_frameworks, + override_options : 'cpp_std=c++11', + install : true, + install_dir : plugins_install_dir, + ) + plugins += gstapplemedia endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/plugin.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/plugin.m
Changed
@@ -21,33 +21,33 @@ # include <config.h> #endif +#include <TargetConditionals.h> #include <Foundation/Foundation.h> #include "corevideomemory.h" -#ifdef HAVE_IOS + +#if TARGET_OS_IOS #include "iosassetsrc.h" +#endif + +#if TARGET_OS_IOS || TARGET_OS_TV #include "iosglmemory.h" #endif -#ifdef HAVE_AVFOUNDATION -#include "avfvideosrc.h" + #include "avfassetsrc.h" -#include "avfdeviceprovider.h" #include "avsamplevideosink.h" +#if !TARGET_OS_WATCH && !TARGET_OS_TV +#include "avfvideosrc.h" +#if !TARGET_OS_TV && !TARGET_OS_VISION +#include "avfdeviceprovider.h" #endif -#ifdef HAVE_VIDEOTOOLBOX -#include "vtdec.h" -#endif -#ifndef HAVE_IOS -#define AV_RANK GST_RANK_SECONDARY -#else -#define AV_RANK GST_RANK_PRIMARY #endif -#ifdef HAVE_VIDEOTOOLBOX -void gst_vtenc_register_elements (GstPlugin * plugin); +#if !TARGET_OS_WATCH +#include "vtdec.h" +#include "vtenc.h" #endif -#ifndef HAVE_IOS - +#if TARGET_OS_OSX static void enable_mt_mode (void) { @@ -60,38 +60,35 @@ static gboolean plugin_init (GstPlugin * plugin) { - gboolean res = TRUE; + gboolean res = FALSE; gst_apple_core_video_memory_init (); -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV gst_ios_gl_memory_init (); +#endif - res &= gst_element_register (plugin, "iosassetsrc", GST_RANK_SECONDARY, - GST_TYPE_IOS_ASSET_SRC); -#else - enable_mt_mode (); +#if TARGET_OS_IOS + res |= GST_ELEMENT_REGISTER (iosassetsrc, plugin); #endif -#ifdef HAVE_AVFOUNDATION - res &= gst_element_register (plugin, "avfvideosrc", AV_RANK, - GST_TYPE_AVF_VIDEO_SRC); - res &= gst_element_register (plugin, "avfassetsrc", AV_RANK, - GST_TYPE_AVF_ASSET_SRC); - res &= gst_element_register (plugin, "avsamplebufferlayersink", - GST_RANK_NONE, GST_TYPE_AV_SAMPLE_VIDEO_SINK); - res &= gst_device_provider_register (plugin, "avfdeviceprovider", - GST_RANK_PRIMARY, GST_TYPE_AVF_DEVICE_PROVIDER); +#if TARGET_OS_OSX + enable_mt_mode (); #endif -#ifdef HAVE_VIDEOTOOLBOX - /* Check if the framework actually exists at runtime */ - if (&VTCompressionSessionCreate != NULL) { - gst_vtdec_register_elements (plugin); - gst_vtenc_register_elements (plugin); - } + res |= GST_ELEMENT_REGISTER (avfassetsrc, plugin); + res |= GST_ELEMENT_REGISTER (avsamplebufferlayersink, plugin); +#if !TARGET_OS_WATCH && !TARGET_OS_TV + res |= GST_ELEMENT_REGISTER (avfvideosrc, plugin); +#if !TARGET_OS_VISION + res |= GST_DEVICE_PROVIDER_REGISTER (avfdeviceprovider, plugin); +#endif #endif +#if !TARGET_OS_WATCH + res |= gst_vtdec_register_elements (plugin); + res |= gst_vtenc_register_elements (plugin); +#endif return res; }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/videotexturecache-gl.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/videotexturecache-gl.h
Changed
@@ -20,6 +20,7 @@ #ifndef __GST_CORE_VIDEO_TEXTURE_CACHE_GL_H__ #define __GST_CORE_VIDEO_TEXTURE_CACHE_GL_H__ +#include <TargetConditionals.h> #include <gst/video/gstvideometa.h> #include <gst/gl/gl.h> #include "corevideomemory.h" @@ -40,7 +41,7 @@ GstVideoTextureCache parent; GstGLContext *ctx; -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV CVOpenGLESTextureCacheRef cache; #else GstBufferPool *pool;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/videotexturecache-gl.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/videotexturecache-gl.m
Changed
@@ -25,10 +25,13 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS -#ifndef HAVE_IOS +#include <TargetConditionals.h> + +#if TARGET_OS_OSX #import <AppKit/AppKit.h> #include "iosurfaceglmemory.h" #endif + #include "iosglmemory.h" #include "videotexturecache-gl.h" #include "coremediabuffer.h" @@ -48,7 +51,7 @@ typedef struct _TextureWrapper { -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV CVOpenGLESTextureCacheRef cache; CVOpenGLESTextureRef texture; #else @@ -80,7 +83,7 @@ { GstVideoTextureCacheGL *cache_gl = GST_VIDEO_TEXTURE_CACHE_GL (object); -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV CFRelease (cache_gl->cache); /* iOS has no "CVOpenGLESTextureCacheRelease" */ #else #if 0 @@ -134,7 +137,7 @@ G_OBJECT_CLASS (gst_video_texture_cache_gl_parent_class)->constructed (object); g_return_if_fail (GST_IS_GL_CONTEXT (cache_gl->ctx)); -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV CFMutableDictionaryRef cache_attrs = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); @@ -172,7 +175,7 @@ cache_class->create_memory = gst_video_texture_cache_gl_create_memory; } -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV static void gst_video_texture_cache_gl_release_texture (TextureWrapper *data) { @@ -259,7 +262,7 @@ GstVideoTextureCacheGL *cache_gl = GST_VIDEO_TEXTURE_CACHE_GL (cache); ContextThreadData data = {cache_gl, gpixbuf, plane, size, NULL}; -#ifdef HAVE_IOS +#if TARGET_OS_IOS || TARGET_OS_TV gst_gl_context_thread_add (cache_gl->ctx, (GstGLContextThreadFunc) _do_create_memory, &data); #endif
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/videotexturecache-vulkan.mm -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/videotexturecache-vulkan.mm
Changed
@@ -21,9 +21,10 @@ # include "config.h" #endif +#include <TargetConditionals.h> #include <Metal/Metal.h> -#ifndef HAVE_IOS +#if TARGET_OS_OSX #import <AppKit/AppKit.h> #endif #include "iosurfacevulkanmemory.h"
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/videotexturecache.m -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/videotexturecache.m
Changed
@@ -21,7 +21,8 @@ # include "config.h" #endif -#ifndef HAVE_IOS +#include <TargetConditionals.h> +#if TARGET_OS_OSX #import <AppKit/AppKit.h> #endif #include "videotexturecache.h"
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/vtdec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/vtdec.c
Changed
@@ -50,16 +50,23 @@ #include "config.h" #endif -#ifdef HAVE_IOS -#include <dlfcn.h> -#endif #include <string.h> +#include "vtdec.h" #include <gst/gst.h> #include <gst/base/gstbytewriter.h> #include <gst/video/video.h> #include <gst/video/gstvideodecoder.h> #include <gst/gl/gstglcontext.h> -#include "vtdec.h" + +#if TARGET_OS_OSX || TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_VISION +#define HAVE_SUPPLEMENTAL +#if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 110000) || (TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 260200) || (TARGET_OS_TV && __TV_OS_VERSION_MAX_ALLOWED >= 260200) || (TARGET_OS_VISION && __VISION_OS_VERSION_MAX_ALLOWED >= 260200) +#define HAVE_SUPPLEMENTAL_DEFINITION +#else +#include <dlfcn.h> +#endif +#endif + #include "vtutil.h" #include "helpers.h" #include "corevideobuffer.h" @@ -94,6 +101,7 @@ GstVideoCodecState * state); static gboolean gst_vtdec_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_vtdec_finish (GstVideoDecoder * decoder); +static GstFlowReturn gst_vtdec_drain (GstVideoDecoder * decoder); static gboolean gst_vtdec_sink_event (GstVideoDecoder * decoder, GstEvent * event); static GstStateChangeReturn gst_vtdec_change_state (GstElement * element, @@ -216,6 +224,7 @@ video_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_vtdec_set_format); video_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_vtdec_flush); video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_vtdec_finish); + video_decoder_class->drain = GST_DEBUG_FUNCPTR (gst_vtdec_drain); video_decoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_vtdec_handle_frame); video_decoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_vtdec_sink_event); @@ -331,12 +340,16 @@ GstVideoDecoder *decoder = GST_VIDEO_DECODER (vtdec); g_mutex_lock (&vtdec->queue_mutex); - while (gst_vec_deque_is_empty (vtdec->reorder_queue) + while (gst_vec_deque_get_length (vtdec->reorder_queue) <= vtdec->dbp_size && !vtdec->pause_task && !vtdec->is_flushing && !vtdec->is_draining) { g_cond_wait (&vtdec->queue_cond, &vtdec->queue_mutex); } - if (vtdec->pause_task) { + /* If we're currently draining/flushing, make sure to not pause before we output all the frames */ + if (vtdec->pause_task && + ((!vtdec->is_flushing && !vtdec->is_draining) || + gst_vec_deque_is_empty (vtdec->reorder_queue))) { + GST_DEBUG_OBJECT (vtdec, "pausing output loop as requested"); g_mutex_unlock (&vtdec->queue_mutex); gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (decoder)); return; @@ -344,7 +357,7 @@ /* push a buffer if there are enough frames to guarantee * that we push in PTS order, or if we're draining/flushing */ - while ((gst_vec_deque_get_length (vtdec->reorder_queue) >= + while ((gst_vec_deque_get_length (vtdec->reorder_queue) > vtdec->dbp_size) || vtdec->is_flushing || vtdec->is_draining) { gboolean is_flushing; @@ -370,9 +383,11 @@ GST_LOG_OBJECT (vtdec, "dropping frame %d", frame->system_frame_number); gst_video_decoder_drop_frame (decoder, frame); } else { - GST_TRACE_OBJECT (vtdec, "pushing frame %d", - frame->system_frame_number); + guint32 frame_num = frame->system_frame_number; + GST_TRACE_OBJECT (vtdec, "pushing frame %d", frame_num); ret = gst_video_decoder_finish_frame (decoder, frame); + GST_TRACE_OBJECT (vtdec, "frame %d push ret %s", frame_num, + gst_flow_get_name (ret)); } GST_VIDEO_DECODER_STREAM_UNLOCK (vtdec); @@ -396,6 +411,7 @@ gst_video_decoder_release_frame (decoder, frame); } + /* Don't consider the FLUSHING ret an error if something flagged is_flushing in the meantime */ if (vtdec->is_flushing && ret == GST_FLOW_FLUSHING) { ret = GST_FLOW_OK; } @@ -407,7 +423,7 @@ GST_VIDEO_DECODER_STREAM_UNLOCK (vtdec); if (ret != GST_FLOW_OK) { - GST_DEBUG_OBJECT (vtdec, "pausing output task: %s", + GST_DEBUG_OBJECT (vtdec, "pausing output task because of downstream: %s", gst_flow_get_name (ret)); gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (decoder)); } @@ -493,6 +509,35 @@ } static gboolean +gst_vtdec_needs_new_session (GstCaps * old_caps, GstCaps * new_caps) +{ + GstCaps *old_copy, *new_copy; + gboolean ret; + + if (!old_caps) + return TRUE; + + if (!new_caps) + return FALSE; + + old_copy = gst_caps_copy (old_caps); + new_copy = gst_caps_copy (new_caps); + + /* Just ignore the framerate for now, was causing decoding errors with some fmp4 files */ + gst_structure_remove_field (gst_caps_get_structure (old_copy, 0), + "framerate"); + gst_structure_remove_field (gst_caps_get_structure (new_copy, 0), + "framerate"); + + ret = !gst_caps_is_equal (old_copy, new_copy); + + gst_caps_unref (old_copy); + gst_caps_unref (new_copy); + + return ret; +} + +static gboolean gst_vtdec_negotiate (GstVideoDecoder * decoder) { GstVideoCodecState *output_state = NULL; @@ -506,6 +551,8 @@ gboolean output_vulkan = FALSE; #endif + GST_DEBUG_OBJECT (decoder, "negotiating"); + vtdec = GST_VTDEC (decoder); if (vtdec->session) gst_vtdec_drain_decoder (GST_VIDEO_DECODER_CAST (vtdec), FALSE); @@ -581,17 +628,20 @@ output_state->caps = gst_video_info_to_caps (&output_state->info); if (features) { gst_caps_set_features (output_state->caps, 0, features); + +#if TARGET_OS_OSX || TARGET_OS_IOS || TARGET_OS_TV output_textures = gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY); if (output_textures) gst_caps_set_simple (output_state->caps, "texture-target", G_TYPE_STRING, -#ifndef HAVE_IOS +#if TARGET_OS_OSX GST_GL_TEXTURE_TARGET_RECTANGLE_STR, #else GST_GL_TEXTURE_TARGET_2D_STR, #endif NULL); +#endif #if defined(APPLEMEDIA_MOLTENVK) output_vulkan = @@ -608,22 +658,29 @@ "negotiated output format %" GST_PTR_FORMAT " previous %" GST_PTR_FORMAT, output_state->caps, prevcaps); - if (vtdec->session) - gst_vtdec_invalidate_session (vtdec); + /* Only recreate session if something other than framerate changed */ + if (gst_vtdec_needs_new_session (prevcaps, output_state->caps)) { + if (vtdec->session) + gst_vtdec_invalidate_session (vtdec); - err = gst_vtdec_create_session (vtdec, format, TRUE); - if (err == noErr) { - GST_INFO_OBJECT (vtdec, "using hardware decoder"); - } else if (err == kVTVideoDecoderNotAvailableNowErr && renegotiating) { - GST_WARNING_OBJECT (vtdec, "hw decoder not available anymore"); - err = gst_vtdec_create_session (vtdec, format, FALSE); - } + err = gst_vtdec_create_session (vtdec, format, TRUE); + + if (err == noErr) { + GST_INFO_OBJECT (vtdec, "using hardware decoder"); + } else if (err == kVTVideoDecoderNotAvailableNowErr && renegotiating) { + GST_WARNING_OBJECT (vtdec, "hw decoder not available anymore"); + err = gst_vtdec_create_session (vtdec, format, FALSE); + } - if (err != noErr) { - GST_ELEMENT_ERROR (vtdec, RESOURCE, FAILED, (NULL), - ("VTDecompressionSessionCreate returned %d", (int) err)); + if (err != noErr) { + GST_ELEMENT_ERROR (vtdec, RESOURCE, FAILED, (NULL), + ("VTDecompressionSessionCreate returned %d", (int) err)); + } + } else { + GST_INFO_OBJECT (vtdec, "no need to recreate VT session for this change"); } } + gst_video_codec_state_unref (output_state); if (vtdec->texture_cache != NULL && ((GST_IS_VIDEO_TEXTURE_CACHE_GL (vtdec->texture_cache) @@ -798,8 +855,11 @@ GST_DEBUG_OBJECT (vtdec, "flush"); - return gst_vtdec_drain_decoder (GST_VIDEO_DECODER_CAST (vtdec), - TRUE) == GST_FLOW_OK; + gst_vtdec_drain_decoder (GST_VIDEO_DECODER_CAST (vtdec), TRUE); + + vtdec->downstream_ret = GST_FLOW_OK; + + return TRUE; } static GstFlowReturn @@ -812,6 +872,19 @@ return gst_vtdec_drain_decoder (GST_VIDEO_DECODER_CAST (vtdec), FALSE); } +static GstFlowReturn +gst_vtdec_drain (GstVideoDecoder * decoder) +{ + GstVtdec *vtdec = GST_VTDEC (decoder); + + GST_DEBUG_OBJECT (vtdec, "drain"); + + gst_vtdec_finish (decoder); + gst_vtdec_flush (decoder); + + return GST_FLOW_OK; +} + static gboolean gst_vtdec_sink_event (GstVideoDecoder * decoder, GstEvent * event) { @@ -877,7 +950,6 @@ GstFlowReturn ret = GST_FLOW_OK; int decode_frame_number = frame->decode_frame_number; GstTaskState task_state; - gboolean is_flushing; if (vtdec->format_description == NULL) { ret = GST_FLOW_NOT_NEGOTIATED; @@ -959,13 +1031,13 @@ /* ...or if it stopped because of the flushing flag while the queue * was empty, in which case we didn't get GST_FLOW_FLUSHING... */ g_mutex_lock (&vtdec->queue_mutex); - is_flushing = vtdec->is_flushing; - g_mutex_unlock (&vtdec->queue_mutex); - if (is_flushing) { + if (vtdec->is_flushing) { + g_mutex_unlock (&vtdec->queue_mutex); GST_DEBUG_OBJECT (vtdec, "Flushing flag set, ignoring frame"); ret = GST_FLOW_FLUSHING; goto drop; } + g_mutex_unlock (&vtdec->queue_mutex); /* .. or if it refuses to resume - e.g. it was stopped instead of paused */ if (!gst_vtdec_ensure_output_loop (vtdec)) { @@ -1041,15 +1113,16 @@ CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - /* This is the default on iOS and the key does not exist there */ -#ifndef HAVE_IOS - gst_vtutil_dict_set_boolean (videoDecoderSpecification, - kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder, - enable_hardware); - if (enable_hardware && vtdec->require_hardware) +#if TARGET_OS_OSX || TARGET_OS_VISION || TARGET_OS_IOS || TARGET_OS_TV + if (__builtin_available (macOS 10.9, iOS 17.0, tvOS 17.0, visionOS 1.0, *)) { gst_vtutil_dict_set_boolean (videoDecoderSpecification, - kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder, - TRUE); + kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder, + enable_hardware); + if (enable_hardware && vtdec->require_hardware) + gst_vtutil_dict_set_boolean (videoDecoderSpecification, + kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder, + TRUE); + } #endif output_image_buffer_attrs = @@ -1318,9 +1391,10 @@ size_t sizeInBytes) { GstMapInfo *info = (GstMapInfo *) refCon; + GstMemory *mem = info->memory; - gst_memory_unmap (info->memory, info); - gst_memory_unref (info->memory); + gst_memory_unmap (mem, info); + gst_memory_unref (mem); g_slice_free (GstMapInfo, info); } @@ -1478,7 +1552,7 @@ GST_DEBUG_OBJECT (vtdec, "ReferenceMissingErr when decoding frame %d", frame->decode_frame_number); break; -#ifndef HAVE_IOS +#if TARGET_OS_OSX case codecBadDataErr: /* SW decoder on macOS uses a different code from the hardware one... */ #endif case kVTVideoDecoderBadDataErr: @@ -1563,18 +1637,26 @@ /* Only early-return here if we're draining (as that needs to output frames). * Flushing doesn't care about errors from downstream. */ - if (!flush && vtdec->downstream_ret != GST_FLOW_OK - && vtdec->downstream_ret != GST_FLOW_FLUSHING) { + if (!flush && vtdec->downstream_ret != GST_FLOW_OK) { + /* Makes sure the output callback won't get stuck waiting for space in the queue */ + g_mutex_lock (&vtdec->queue_mutex); + vtdec->is_flushing = TRUE; + g_cond_signal (&vtdec->queue_cond); + g_mutex_unlock (&vtdec->queue_mutex); + GST_WARNING_OBJECT (vtdec, "Output loop stopped with error (%s), leaving", gst_flow_get_name (vtdec->downstream_ret)); return vtdec->downstream_ret; } g_mutex_lock (&vtdec->queue_mutex); - if (flush) + if (flush) { + GST_DEBUG_OBJECT (vtdec, "setting flushing flag"); vtdec->is_flushing = TRUE; - else + } else { + GST_DEBUG_OBJECT (vtdec, "setting draining flag"); vtdec->is_draining = TRUE; + } g_cond_signal (&vtdec->queue_cond); g_mutex_unlock (&vtdec->queue_mutex); @@ -1583,6 +1665,7 @@ return GST_FLOW_ERROR; } + GST_DEBUG_OBJECT (vtdec, "draining VT session"); GST_VIDEO_DECODER_STREAM_UNLOCK (vtdec); vt_status = VTDecompressionSessionWaitForAsynchronousFrames (vtdec->session); if (vt_status != noErr) { @@ -1591,19 +1674,18 @@ (int) vt_status); } + /* This will only pause after all frames are out because is_flushing/is_draining=TRUE */ gst_vtdec_pause_output_loop (vtdec); - /* Ensure the output loop runs once more in case it got paused before - * handling frames pushed by gst_vtdec_session_output_callback. */ - if (!flush) - gst_vtdec_output_loop (vtdec); - GST_VIDEO_DECODER_STREAM_LOCK (vtdec); - /* Only reset the draining flag here, - * is_flushing will be reset in sink_event() */ - if (vtdec->is_draining) + if (flush) { + GST_DEBUG_OBJECT (vtdec, "clearing flushing flag"); + vtdec->is_flushing = FALSE; + } else { + GST_DEBUG_OBJECT (vtdec, "clearing draining flag"); vtdec->is_draining = FALSE; + } if (vtdec->downstream_ret == GST_FLOW_OK) GST_DEBUG_OBJECT (vtdec, "buffer queue cleaned"); @@ -1856,14 +1938,14 @@ GST_DEBUG_OBJECT (vtdec, "Checking VP9 VideoToolbox support"); -#if !defined(HAVE_IOS) || (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 260200) - if (__builtin_available (macos 11.0, ios 26.2, *)) { +#ifdef HAVE_SUPPLEMENTAL +#ifdef HAVE_SUPPLEMENTAL_DEFINITION + if (__builtin_available (macOS 11.0, iOS 26.2, tvOS 26.2, visionOS 26.2, *)) { VTRegisterSupplementalVideoDecoderIfAvailable (kCMVideoCodecType_VP9); } #else - /* FIXME: Temporary measure until Xcode on CI has a SDK version that has the - * variant that introduces VTRegisterSupplementalVideoDecoderIfAvailable on - * iOS 26.2. + /* Needed temporarily till we can require a new-enough Xcode that has + * VTRegisterSupplementalVideoDecoderIfAvailable on iOS, tvOS, visionOS 26.2 */ VTRegisterSupplementalVideoDecoderIfAvailableFunc func = (VTRegisterSupplementalVideoDecoderIfAvailableFunc) @@ -1873,13 +1955,14 @@ func (kCMVideoCodecType_VP9); } #endif +#endif vp9_supported = VTIsHardwareDecodeSupported (kCMVideoCodecType_VP9); if (vp9_supported) { GST_INFO_OBJECT (vtdec, "VP9 hardware decoding is supported"); } else { - GST_WARNING_OBJECT (vtdec, + GST_INFO_OBJECT (vtdec, "VP9 hardware decoding is not supported on this system"); } @@ -1893,15 +1976,14 @@ GST_DEBUG_OBJECT (vtdec, "Checking AV1 VideoToolbox support"); - -#if !defined(HAVE_IOS) || (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 260200) - if (__builtin_available (macos 11.0, ios 26.2, *)) { +#ifdef HAVE_SUPPLEMENTAL +#ifdef HAVE_SUPPLEMENTAL_DEFINITION + if (__builtin_available (macOS 11.0, iOS 26.2, tvOS 26.2, visionOS 26.2, *)) { VTRegisterSupplementalVideoDecoderIfAvailable (kCMVideoCodecType_AV1); } #else - /* FIXME: Temporary measure until Xcode on CI has a SDK version that has the - * variant that introduces VTRegisterSupplementalVideoDecoderIfAvailable on - * iOS 26.2. + /* Needed temporarily till we can require a new-enough Xcode that has + * VTRegisterSupplementalVideoDecoderIfAvailable on iOS, tvOS, visionOS 26.2 */ VTRegisterSupplementalVideoDecoderIfAvailableFunc func = (VTRegisterSupplementalVideoDecoderIfAvailableFunc) @@ -1912,6 +1994,7 @@ func (kCMVideoCodecType_AV1); } #endif +#endif /* Check if hardware decode is supported for AV1 */ av1_supported = VTIsHardwareDecodeSupported (kCMVideoCodecType_AV1); @@ -1919,7 +2002,7 @@ if (av1_supported) { GST_INFO_OBJECT (vtdec, "AV1 hardware decoding is supported"); } else { - GST_WARNING_OBJECT (vtdec, + GST_INFO_OBJECT (vtdec, "AV1 hardware decoding is not supported on this system"); } @@ -1929,6 +2012,8 @@ static GstCaps * gst_vtdec_getcaps (GstVideoDecoder * decoder, GstCaps * filter) { + static gsize av1_once = 0; + static gsize vp9_once = 0; GstVtdec *vtdec = GST_VTDEC (decoder); GstCaps *sinkcaps, *result; @@ -1940,10 +2025,24 @@ for (guint i = 0; i < n;) { GstStructure *s = gst_caps_get_structure (sinkcaps, i); + if (gst_structure_has_name (s, "video/x-av1")) { + if (g_once_init_enter (&av1_once)) { + if (gst_vtdec_check_av1_support (vtdec)) + vtdec->codec_support |= Av1Supported; + g_once_init_leave (&av1_once, Av1Supported); + } + } else if (gst_structure_has_name (s, "video/x-vp9")) { + if (g_once_init_enter (&vp9_once)) { + if (gst_vtdec_check_vp9_support (vtdec)) + vtdec->codec_support |= Vp9Supported; + g_once_init_leave (&vp9_once, Vp9Supported); + } + } + if ((gst_structure_has_name (s, "video/x-av1") - && !gst_vtdec_check_av1_support (vtdec)) + && !(vtdec->codec_support & Av1Supported)) || (gst_structure_has_name (s, "video/x-vp9") - && !gst_vtdec_check_vp9_support (vtdec))) { + && !(vtdec->codec_support & Vp9Supported))) { gst_caps_remove_structure (sinkcaps, i); n--; } else { @@ -2049,7 +2148,6 @@ GST_ELEMENT_CLASS (gst_vtdec_parent_class)->set_context (element, context); } -#ifndef HAVE_IOS #define GST_TYPE_VTDEC_HW (gst_vtdec_hw_get_type()) #define GST_VTDEC_HW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VTDEC_HW,GstVtdecHw)) #define GST_VTDEC_HW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VTDEC_HW,GstVtdecHwClass)) @@ -2080,19 +2178,64 @@ GST_VTDEC (vtdec)->require_hardware = TRUE; } +static void +gst_vtdec_init_once (void) +{ + static gsize init_once = 0; + + if (g_once_init_enter (&init_once)) { + gst_applemedia_init_once (); + GST_DEBUG_CATEGORY_INIT (gst_vtdec_debug_category, "vtdec", 0, + "debug category for vtdec element"); + g_once_init_leave (&init_once, 1); + } +} + + +static gboolean +gst_vtdec_register_vtdec (GstPlugin * plugin) +{ + gint rank = GST_RANK_PRIMARY; + + gst_vtdec_init_once (); + +#if !TARGET_OS_WATCH + if (__builtin_available (macOS 10.9, iOS 17.0, tvOS 17.0, visionOS 1.0, *)) + rank = GST_RANK_SECONDARY; #endif -void + return gst_element_register (plugin, "vtdec", rank, GST_TYPE_VTDEC); +} + +#if !TARGET_OS_WATCH +static gboolean +gst_vtdec_register_vtdec_hw (GstPlugin * plugin) +{ + gst_vtdec_init_once (); + + if (__builtin_available (macOS 10.9, iOS 17.0, tvOS 17.0, visionOS 1.0, *)) { + return gst_element_register (plugin, "vtdec_hw", GST_RANK_PRIMARY + 1, + GST_TYPE_VTDEC_HW); + } + + return TRUE; +} +#endif + +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtdec, gst_vtdec_register_vtdec); +#if !TARGET_OS_WATCH +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtdec_hw, gst_vtdec_register_vtdec_hw); +#endif + +gboolean gst_vtdec_register_elements (GstPlugin * plugin) { - GST_DEBUG_CATEGORY_INIT (gst_vtdec_debug_category, "vtdec", 0, - "debug category for vtdec element"); + gboolean ret = FALSE; -#ifdef HAVE_IOS - gst_element_register (plugin, "vtdec", GST_RANK_PRIMARY, GST_TYPE_VTDEC); -#else - gst_element_register (plugin, "vtdec_hw", GST_RANK_PRIMARY + 1, - GST_TYPE_VTDEC_HW); - gst_element_register (plugin, "vtdec", GST_RANK_SECONDARY, GST_TYPE_VTDEC); +#if !TARGET_OS_WATCH + ret |= GST_ELEMENT_REGISTER (vtdec_hw, plugin); #endif + ret |= GST_ELEMENT_REGISTER (vtdec, plugin); + + return ret; }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/vtdec.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/vtdec.h
Changed
@@ -24,6 +24,7 @@ #include <gst/base/gstqueuearray.h> #include <gst/video/video.h> #include <gst/video/gstvideodecoder.h> +#include <TargetConditionals.h> #include <CoreMedia/CoreMedia.h> #include <VideoToolbox/VideoToolbox.h> #include "videotexturecache.h" @@ -47,6 +48,13 @@ #define GST_VTDEC_DPB_MAX_SIZE 16 +typedef enum +{ + NoneSupported = 0, + Av1Supported = 1 << 0, + Vp9Supported = 1 << 1, +} SupplementalSupport; + struct _GstVtdec { GstVideoDecoder base_vtdec; @@ -62,10 +70,13 @@ GMutex queue_mutex; GCond queue_cond; - GstFlowReturn downstream_ret; + /* protected by queue_mutex */ gboolean is_flushing; gboolean is_draining; gboolean pause_task; + + /* protected by the STREAM_LOCK */ + GstFlowReturn downstream_ret; #if defined(APPLEMEDIA_MOLTENVK) GstVulkanInstance *instance; @@ -73,6 +84,7 @@ #endif gboolean require_hardware; + SupplementalSupport codec_support; gboolean av1_needs_sequence_header; /* TRUE if we need to wait for sequence header OBU before creating session */ GstBuffer *av1_sequence_header_obu; /* Store the sequence header OBU for format description */ @@ -87,8 +99,12 @@ }; GType gst_vtdec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (vtdec); +#if !TARGET_OS_WATCH +GST_ELEMENT_REGISTER_DECLARE (vtdec_hw); +#endif -void gst_vtdec_register_elements (GstPlugin * plugin); +gboolean gst_vtdec_register_elements (GstPlugin * plugin); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/vtenc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/vtenc.c
Changed
@@ -96,7 +96,7 @@ * * Apple VideoToolbox H265 encoder with alpha channel support. * This encoder can either use HW or a SW implementation depending on the device. - * + * * ## Example pipeline (assuming a PNG with an alpha channel as input) * | * gst-launch-1.0 -v filesrc location=test.png ! pngdec ! imagefreeze num-buffers=1000 ! videoconvert ! vtenc_h265a ! qtmux ! filesink location=out.mov @@ -111,7 +111,7 @@ * * Apple VideoToolbox H265 HW-only encoder with alpha channel support. * Currently only available on macOS. - * + * * ## Example pipeline (assuming a PNG with an alpha channel as input) * | * gst-launch-1.0 -v filesrc location=test.png ! pngdec ! imagefreeze num-buffers=1000 ! videoconvert ! vtenc_h265a ! qtmux ! filesink location=out.mov @@ -127,9 +127,11 @@ #include "vtenc.h" #include "coremediabuffer.h" -#ifdef HAVE_IOS + +#if !TARGET_OS_OSX #include "corevideobuffer.h" #endif + #include "vtutil.h" #include "helpers.h" #include <gst/pbutils/codec-utils.h> @@ -171,12 +173,6 @@ const CFStringRef kVTCompressionPropertyKey_Quality = CFSTR ("Quality"); #endif -#ifdef HAVE_VIDEOTOOLBOX_10_9_6 -extern OSStatus -VTCompressionSessionPrepareToEncodeFrames (VTCompressionSessionRef session) - __attribute__((weak_import)); -#endif - /* This property key is currently completely undocumented. The only way you can * know about its existence is if Apple tells you. It allows you to tell the * encoder to not preserve alpha even when outputting alpha formats. */ @@ -254,14 +250,14 @@ static GstFlowReturn gst_vtenc_encode_frame (GstVTEnc * self, GstVideoCodecFrame * frame); -static void gst_vtenc_enqueue_buffer (void *outputCallbackRefCon, +static void gst_vtenc_session_output_callback (void *outputCallbackRefCon, void *sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer); static gboolean gst_vtenc_buffer_is_keyframe (GstVTEnc * self, CMSampleBufferRef sbuf); -#ifndef HAVE_IOS +#if TARGET_OS_OSX static GstVTEncFrame *gst_vtenc_frame_new (GstBuffer * buf, GstVideoInfo * videoinfo); static void gst_vtenc_frame_free (GstVTEncFrame * frame); @@ -317,7 +313,7 @@ { GstCaps *caps = gst_static_caps_get (&sink_caps); -#ifndef HAVE_IOS +#if TARGET_OS_OSX gboolean enable_argb = TRUE; int retval; char cpu_name30; @@ -774,38 +770,40 @@ g_mutex_unlock (&self->queue_mutex); } -static void -gst_vtenc_set_flushing_flag (GstVTEnc * self) -{ - g_mutex_lock (&self->queue_mutex); - self->is_flushing = TRUE; - g_cond_signal (&self->queue_cond); - g_mutex_unlock (&self->queue_mutex); -} - static GstFlowReturn -gst_vtenc_finish_encoding (GstVTEnc * self, gboolean is_flushing) +gst_vtenc_drain_encoder (GstVTEnc * self, gboolean flush) { - GST_DEBUG_OBJECT (self, - "complete encoding and clean buffer queue, is flushing %d", is_flushing); + GST_DEBUG_OBJECT (self, "drain_encoder, flushing: %d", flush); OSStatus vt_status; /* In case of EOS before the first buffer/caps */ if (self->session == NULL) return GST_FLOW_OK; - /* If output loop failed to push things downstream */ - if (self->downstream_ret != GST_FLOW_OK - && self->downstream_ret != GST_FLOW_FLUSHING) { - /* Tells enqueue_buffer() to instantly discard any new encoded frames */ - gst_vtenc_set_flushing_flag (self); + /* Only early-return here if we're draining (as that needs to output frames). + * Flushing doesn't care about errors from downstream. */ + if (!flush && self->downstream_ret != GST_FLOW_OK) { + /* Makes sure the output callback won't get stuck waiting for space in the queue */ + g_mutex_lock (&self->queue_mutex); + self->is_flushing = TRUE; + g_cond_signal (&self->queue_cond); + g_mutex_unlock (&self->queue_mutex); + GST_WARNING_OBJECT (self, "Output loop stopped with error (%s), leaving", gst_flow_get_name (self->downstream_ret)); return self->downstream_ret; } - if (is_flushing) - gst_vtenc_set_flushing_flag (self); + g_mutex_lock (&self->queue_mutex); + if (flush) { + GST_DEBUG_OBJECT (self, "setting flushing flag"); + self->is_flushing = TRUE; + } else { + GST_DEBUG_OBJECT (self, "setting draining flag"); + self->is_draining = TRUE; + } + g_cond_signal (&self->queue_cond); + g_mutex_unlock (&self->queue_mutex); if (!gst_vtenc_ensure_output_loop (self)) { GST_ERROR_OBJECT (self, "Output loop failed to resume"); @@ -827,9 +825,31 @@ (int) vt_status); } + /* If self->first_frame is still true, that means we never got more than 1 frame + * and that's all for now, so let's push it manually now */ + if (self->first_frame) { + GST_DEBUG_OBJECT (self, + "first frame never pushed downstream, sending to output loop"); + + g_mutex_lock (&self->queue_mutex); + gst_vec_deque_push_tail (self->output_queue, self->first_frame); + self->first_frame = NULL; + g_cond_signal (&self->queue_cond); + g_mutex_unlock (&self->queue_mutex); + } + + /* This will only pause after all frames are out because is_flushing/is_draining=TRUE */ gst_vtenc_pause_output_loop (self); GST_VIDEO_ENCODER_STREAM_LOCK (self); + if (flush) { + GST_DEBUG_OBJECT (self, "clearing flushing flag"); + self->is_flushing = FALSE; + } else { + GST_DEBUG_OBJECT (self, "clearing draining flag"); + self->is_draining = FALSE; + } + if (self->downstream_ret == GST_FLOW_OK) GST_DEBUG_OBJECT (self, "buffer queue cleaned"); else @@ -847,8 +867,10 @@ /* DTS can be negative if b-frames are enabled */ gst_video_encoder_set_min_pts (enc, GST_SECOND * 60 * 60 * 1000); + self->dts_offset = GST_CLOCK_TIME_NONE; self->is_flushing = FALSE; + self->is_draining = FALSE; self->downstream_ret = GST_FLOW_OK; g_atomic_int_set (&self->require_restart, FALSE); g_atomic_int_set (&self->require_reconfigure, FALSE); @@ -890,6 +912,7 @@ self->negotiate_downstream = TRUE; self->is_flushing = TRUE; + self->is_draining = FALSE; if (self->profile_level) CFRelease (self->profile_level); @@ -899,6 +922,10 @@ gst_video_codec_state_unref (self->input_state); self->input_state = NULL; + if (self->first_frame) + gst_video_codec_frame_unref (self->first_frame); + self->first_frame = NULL; + self->video_info.width = self->video_info.height = 0; self->video_info.fps_n = self->video_info.fps_d = 0; @@ -1084,7 +1111,7 @@ VTCompressionSessionRef session; if (self->input_state) { - gst_vtenc_finish_encoding (self, FALSE); + gst_vtenc_drain_encoder (self, FALSE); gst_video_codec_state_unref (self->input_state); } @@ -1314,18 +1341,22 @@ gst_vtenc_finish (GstVideoEncoder * enc) { GstVTEnc *self = GST_VTENC_CAST (enc); - return gst_vtenc_finish_encoding (self, FALSE); + + GST_DEBUG_OBJECT (self, "finish"); + return gst_vtenc_drain_encoder (self, FALSE); } static gboolean gst_vtenc_flush (GstVideoEncoder * enc) { GstVTEnc *self = GST_VTENC_CAST (enc); - GstFlowReturn ret; - ret = gst_vtenc_finish_encoding (self, TRUE); + GST_DEBUG_OBJECT (self, "flush"); + gst_vtenc_drain_encoder (self, TRUE); - return (ret == GST_FLOW_OK); + self->downstream_ret = GST_FLOW_OK; + + return TRUE; } static void @@ -1445,42 +1476,6 @@ } } -static gboolean -gst_vtenc_compute_dts_offset (GstVTEnc * self, gint fps_n, gint fps_d) -{ - gint num_offset_frames; - - // kVTCompressionPropertyKey_AllowFrameReordering enables B-Frames - if (!self->allow_frame_reordering || - (self->specific_format_id == kCMVideoCodecType_H264 - && self->h264_profile == GST_H264_PROFILE_BASELINE)) { - num_offset_frames = 0; - } else { - if (self->specific_format_id == kCMVideoCodecType_H264) { - // H264 encoder always sets 2 max_num_ref_frames - num_offset_frames = 1; - } else { - // HEVC encoder uses B-pyramid - num_offset_frames = 2; - } - } - - if (fps_d == 0 && num_offset_frames != 0) { - GST_ERROR_OBJECT (self, - "Variable framerate is not supported with B-Frames"); - return FALSE; - } - - self->dts_offset = - gst_util_uint64_scale (num_offset_frames * GST_SECOND, - self->video_info.fps_d, self->video_info.fps_n); - - GST_DEBUG_OBJECT (self, "DTS Offset:%" GST_TIME_FORMAT, - GST_TIME_ARGS (self->dts_offset)); - - return TRUE; -} - static VTCompressionSessionRef gst_vtenc_create_session (GstVTEnc * self) { @@ -1490,7 +1485,7 @@ const GstVTEncoderDetails *codec_details = GST_VTENC_CLASS_GET_CODEC_DETAILS (G_OBJECT_GET_CLASS (self)); -#ifndef HAVE_IOS +#if TARGET_OS_OSX /* Apple's M1 hardware encoding fails when provided with an interlaced ProRes source. * It's most likely a bug in VideoToolbox, as no such limitation has been officially mentioned anywhere. * For now let's disable HW encoding entirely when such case occurs. */ @@ -1513,7 +1508,21 @@ TRUE); #endif + /* This was set in gst_vtenc_negotiate_specific_format_details() */ + g_assert_cmpint (self->specific_format_id, !=, 0); + if (self->profile_level) { + /* If there's no B-frames, the DTS offset doesn't need to be calculated + * (kVTCompressionPropertyKey_AllowFrameReordering enables B-Frames) */ + if (!self->allow_frame_reordering + || CFStringHasPrefix (self->profile_level, CFSTR ("H264_Baseline"))) { + self->dts_offset = 0; + } else if (self->video_info.fps_n == 0) { + GST_ERROR_OBJECT (self, + "Variable framerate is not supported with B-Frames"); + goto beach; + } + pb_attrs = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); gst_vtutil_dict_set_i32 (pb_attrs, kCVPixelBufferWidthKey, @@ -1522,20 +1531,10 @@ self->video_info.height); } - /* This was set in gst_vtenc_negotiate_specific_format_details() */ - g_assert_cmpint (self->specific_format_id, !=, 0); - - if (self->profile_level) { - if (!gst_vtenc_compute_dts_offset (self, self->video_info.fps_d, - self->video_info.fps_n)) { - goto beach; - } - } - status = VTCompressionSessionCreate (NULL, self->video_info.width, self->video_info.height, self->specific_format_id, encoder_spec, pb_attrs, NULL, - gst_vtenc_enqueue_buffer, self, &session); + gst_vtenc_session_output_callback, self, &session); GST_INFO_OBJECT (self, "VTCompressionSessionCreate for %d x %d => %d", self->video_info.width, self->video_info.height, (int) status); if (status != noErr) { @@ -1632,8 +1631,8 @@ gst_vtenc_session_dump_properties (self, session); self->dump_properties = FALSE; } -#ifdef HAVE_VIDEOTOOLBOX_10_9_6 - if (VTCompressionSessionPrepareToEncodeFrames) { +#if !TARGET_OS_WATCH + if (__builtin_available (ios 8.0, macos 10.9, tvos 10.2, visionos 1.0, *)) { status = VTCompressionSessionPrepareToEncodeFrames (session); if (status != noErr) { GST_ERROR_OBJECT (self, @@ -1774,7 +1773,7 @@ /* * In addition to the OS requirements, CBR also requires Apple Silicon */ - if (__builtin_available (macOS 13.0, iOS 16.0, *)) { + if (__builtin_available (macOS 13.0, iOS 16.0, tvOS 16.0, visionOS 1.0, *)) { key = kVTCompressionPropertyKey_ConstantBitRate; } else #endif @@ -1927,14 +1926,14 @@ } static void -gst_vtenc_update_timestamps (GstVTEnc * self, GstVideoCodecFrame * frame, +gst_vtenc_set_timestamps_from_sample_buf (GstVideoCodecFrame * frame, CMSampleBufferRef sample_buf) { CMTime pts = CMSampleBufferGetOutputPresentationTimeStamp (sample_buf); frame->pts = CMTIME_TO_GST_CLOCK_TIME (pts); CMTime dts = CMSampleBufferGetOutputDecodeTimeStamp (sample_buf); if (CMTIME_IS_VALID (dts)) { - frame->dts = CMTIME_TO_GST_CLOCK_TIME (dts) - self->dts_offset; + frame->dts = CMTIME_TO_GST_CLOCK_TIME (dts); } } @@ -2125,7 +2124,7 @@ if (meta != NULL) { pbuf = gst_core_media_buffer_get_pixel_buffer (frame->input_buffer); } -#ifdef HAVE_IOS +#if !TARGET_OS_OSX if (pbuf == NULL) { GstVideoFrame inframe, outframe; GstBuffer *outbuf; @@ -2243,7 +2242,7 @@ * When paired with a fast enough source like videotestsrc, this can result in * a ton of memory being taken up by frames inside the encoder, eventually killing * the process because of OOM. - * + * * The workaround here tries to block until the number of pending frames falls * below a certain threshold. Best we can do until Apple fixes this. */ if (self->specific_format_id == kCMVideoCodecType_HEVCWithAlpha) { @@ -2301,13 +2300,14 @@ } static void -gst_vtenc_enqueue_buffer (void *outputCallbackRefCon, +gst_vtenc_session_output_callback (void *outputCallbackRefCon, void *sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) { GstVTEnc *self = outputCallbackRefCon; GstVideoCodecFrame *frame; + gboolean push_anyway; frame = gst_video_encoder_get_frame (GST_VIDEO_ENCODER_CAST (self), @@ -2348,17 +2348,6 @@ return; } - g_mutex_lock (&self->queue_mutex); - if (self->is_flushing) { - GST_DEBUG_OBJECT (self, "Ignoring frame %d because we're flushing", - frame->system_frame_number); - - gst_video_encoder_release_frame (GST_VIDEO_ENCODER_CAST (self), frame); - g_mutex_unlock (&self->queue_mutex); - return; - } - g_mutex_unlock (&self->queue_mutex); - /* This may happen if we don't have enough bitrate */ if (sampleBuffer == NULL) goto drop; @@ -2370,14 +2359,56 @@ * to enable the use of the video meta API on the core media buffer */ frame->output_buffer = gst_core_media_buffer_new (sampleBuffer, FALSE, NULL); - gst_vtenc_update_timestamps (self, frame, sampleBuffer); + gst_vtenc_set_timestamps_from_sample_buf (frame, sampleBuffer); - /* Limit the amount of frames in our output queue - * to avoid processing too many frames ahead */ g_mutex_lock (&self->queue_mutex); - while (gst_vec_deque_get_length (self->output_queue) > + + /* VT can give us frames with DTS>PTS. We need to offset DTS by the max possible difference + * between PTS and DTS, which can be calculated from the PTS diff between the 1st and 2nd frame */ + if (self->first_frame) { + if (GST_CLOCK_TIME_IS_VALID (self->first_frame->pts) + && GST_CLOCK_TIME_IS_VALID (frame->pts)) { + self->dts_offset = frame->pts - self->first_frame->pts; + GST_INFO_OBJECT (self, "DTS offset: %" GST_TIME_FORMAT, + GST_TIME_ARGS (self->dts_offset)); + } else { + GST_INFO_OBJECT (self, + "DTS offset set to 0 because of invalid PTS: frame 1 PTS %" + GST_TIME_FORMAT ", frame 2 PTS %" GST_TIME_FORMAT, + GST_TIME_ARGS (self->first_frame->pts), GST_TIME_ARGS (frame->pts)); + self->dts_offset = 0; + } + + if (GST_CLOCK_TIME_IS_VALID (self->first_frame->dts)) + self->first_frame->dts -= self->dts_offset; + + gst_vec_deque_push_tail (self->output_queue, self->first_frame); + self->first_frame = NULL; + } else if (!GST_CLOCK_TIME_IS_VALID (self->dts_offset)) { + self->first_frame = frame; + g_mutex_unlock (&self->queue_mutex); + return; + } + + if (GST_CLOCK_TIME_IS_VALID (self->dts_offset) + && GST_CLOCK_TIME_IS_VALID (frame->dts)) { + frame->dts -= self->dts_offset; + } + + GST_TRACE_OBJECT (self, + "encoded frame %d PTS %" GST_TIME_FORMAT " DTS %" GST_TIME_FORMAT, + frame->system_frame_number, GST_TIME_ARGS (frame->pts), + GST_TIME_ARGS (frame->dts)); + + /* Limit the amount of frames in our output queue to avoid processing + * too many frames ahead, and also make sure we don't block here + * if the output loop paused due to a downstream error. */ + push_anyway = self->is_flushing || self->is_draining; + while (!push_anyway + && gst_vec_deque_get_length (self->output_queue) > VTENC_OUTPUT_QUEUE_SIZE) { g_cond_wait (&self->queue_cond, &self->queue_mutex); + push_anyway = self->is_flushing || self->is_draining; } gst_vec_deque_push_tail (self->output_queue, frame); @@ -2395,15 +2426,18 @@ GstVideoCodecFrame *outframe; GstCoreMediaMeta *meta; GstFlowReturn ret = GST_FLOW_OK; - gboolean should_pause; g_mutex_lock (&self->queue_mutex); while (gst_vec_deque_is_empty (self->output_queue) && !self->pause_task - && !self->is_flushing) { + && !self->is_flushing && !self->is_draining) { g_cond_wait (&self->queue_cond, &self->queue_mutex); } - if (self->pause_task) { + /* If we're currently draining/flushing, make sure to not pause before we + * output all the frames */ + if (self->pause_task && ((!self->is_flushing && !self->is_draining) + || gst_vec_deque_is_empty (self->output_queue))) { + GST_DEBUG_OBJECT (self, "pausing output loop as requested"); g_mutex_unlock (&self->queue_mutex); gst_pad_pause_task (GST_VIDEO_ENCODER_CAST (self)->srcpad); return; @@ -2441,7 +2475,10 @@ gst_vtenc_update_latency (self); - GST_LOG_OBJECT (self, "finishing frame %d", outframe->system_frame_number); + GST_LOG_OBJECT (self, + "finishing frame %d dts %" GST_TIME_FORMAT " pts %" GST_TIME_FORMAT, + outframe->system_frame_number, + GST_TIME_ARGS (outframe->dts), GST_TIME_ARGS (outframe->pts)); GST_VIDEO_ENCODER_STREAM_UNLOCK (self); /* releases frame, even if it has no output buffer (i.e. failed to encode) */ ret = @@ -2455,9 +2492,8 @@ g_mutex_unlock (&self->queue_mutex); GST_VIDEO_ENCODER_STREAM_LOCK (self); - self->downstream_ret = ret; - /* We need to empty the queue immediately so that enqueue_buffer() + /* We need to empty the queue immediately so that enqueue_buffer() * can push out the current buffer, otherwise it can block other * encoder callbacks completely */ if (ret != GST_FLOW_OK) { @@ -2468,22 +2504,21 @@ gst_video_encoder_release_frame (GST_VIDEO_ENCODER_CAST (self), outframe); } + /* Don't consider the FLUSHING ret an error if something flagged is_flushing in the meantime */ + if (self->is_flushing && ret == GST_FLOW_FLUSHING) { + ret = GST_FLOW_OK; + } g_cond_signal (&self->queue_cond); g_mutex_unlock (&self->queue_mutex); } + self->downstream_ret = ret; GST_VIDEO_ENCODER_STREAM_UNLOCK (self); - /* Check is_flushing here in case we had an empty queue. - * In that scenario we also want to pause, as the encoder callback - * will discard any frames that are output while flushing */ - g_mutex_lock (&self->queue_mutex); - should_pause = ret != GST_FLOW_OK || self->is_flushing; - g_mutex_unlock (&self->queue_mutex); - if (should_pause) { - GST_DEBUG_OBJECT (self, "pausing output task: %s", - ret != GST_FLOW_OK ? gst_flow_get_name (ret) : "flushing"); - gst_pad_pause_task (GST_VIDEO_ENCODER_CAST (self)->srcpad); + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (self, "pausing output task because of downstream: %s", + gst_flow_get_name (ret)); + gst_pad_pause_task (GST_VIDEO_ENCODER_SRC_PAD (self)); } } @@ -2507,7 +2542,7 @@ return result; } -#ifndef HAVE_IOS +#if TARGET_OS_OSX static GstVTEncFrame * gst_vtenc_frame_new (GstBuffer * buf, GstVideoInfo * video_info) { @@ -2541,7 +2576,7 @@ } #endif -static void +static gboolean gst_vtenc_register (GstPlugin * plugin, const GstVTEncoderDetails * codec_details) { @@ -2573,44 +2608,150 @@ } g_free (type_name); + + return result; } -static const GstVTEncoderDetails gst_vtenc_codecs = { - {"H.264", "h264", "video/x-h264", - "Ole André Vadla Ravnås <oleavr@soundrop.com>, " +static void +gst_vtenc_init_once (void) +{ + static gsize init_once = 0; + + if (g_once_init_enter (&init_once)) { + gst_applemedia_init_once (); + GST_DEBUG_CATEGORY_INIT (gst_vtenc_debug, "vtenc", 0, + "Apple VideoToolbox Encoder Wrapper"); + g_once_init_leave (&init_once, 1); + } +} + +static gboolean +gst_vtenc_register_h264 (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.264", "h264", "video/x-h264", + "Ole André Vadla Ravnås <oleavr@soundrop.com>, " "Dominik Röttsches <dominik.rottsches@intel.com>", - kCMVideoCodecType_H264, FALSE}, - {"H.265/HEVC", "h265", "video/x-h265", - "Piotr Brzeziński <piotr@centricular.com>", - kCMVideoCodecType_HEVC, FALSE}, - {"H.265/HEVC with alpha", "h265a", "video/x-h265", - "Piotr Brzeziński <piotr@centricular.com>", - kCMVideoCodecType_HEVCWithAlpha, FALSE}, -#ifndef HAVE_IOS - {"H.264 (HW only)", "h264_hw", "video/x-h264", - "Ole André Vadla Ravnås <oleavr@soundrop.com>, " + kCMVideoCodecType_H264, FALSE + }; + + return gst_vtenc_register (plugin, &codec); +} + +static gboolean +gst_vtenc_register_h265 (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.265/HEVC", "h265", "video/x-h265", + "Piotr Brzeziński <piotr@centricular.com>", + kCMVideoCodecType_HEVC, FALSE + }; + + return gst_vtenc_register (plugin, &codec); +} + +static gboolean +gst_vtenc_register_h265a (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.265/HEVC with alpha", "h265a", "video/x-h265", + "Piotr Brzeziński <piotr@centricular.com>", + kCMVideoCodecType_HEVCWithAlpha, FALSE + }; + + return gst_vtenc_register (plugin, &codec); +} + +#if TARGET_OS_OSX +static gboolean +gst_vtenc_register_h264_hw (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.264 (HW only)", "h264_hw", "video/x-h264", + "Ole André Vadla Ravnås <oleavr@soundrop.com>, " "Dominik Röttsches <dominik.rottsches@intel.com>", - kCMVideoCodecType_H264, TRUE}, - {"H.265/HEVC (HW only)", "h265_hw", "video/x-h265", - "Piotr Brzeziński <piotr@centricular.com>", - kCMVideoCodecType_HEVC, TRUE}, - {"H.265/HEVC with alpha (HW only)", "h265a_hw", "video/x-h265", - "Piotr Brzeziński <piotr@centricular.com>", - kCMVideoCodecType_HEVCWithAlpha, TRUE}, + kCMVideoCodecType_H264, TRUE + }; + + return gst_vtenc_register (plugin, &codec); +} + +static gboolean +gst_vtenc_register_h265_hw (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.265/HEVC (HW only)", "h265_hw", "video/x-h265", + "Piotr Brzeziński <piotr@centricular.com>", + kCMVideoCodecType_HEVC, TRUE + }; + + return gst_vtenc_register (plugin, &codec); +} + +static gboolean +gst_vtenc_register_h265a_hw (GstPlugin * plugin) +{ + gst_vtenc_init_once (); + + static const GstVTEncoderDetails codec = { + "H.265/HEVC with alpha (HW only)", "h265a_hw", "video/x-h265", + "Piotr Brzeziński <piotr@centricular.com>", + kCMVideoCodecType_HEVCWithAlpha, TRUE + }; + + return gst_vtenc_register (plugin, &codec); +} #endif - {"Apple ProRes", "prores", "video/x-prores", - "Nirbheek Chauhan <nirbheek@centricular.com>", - GST_kCMVideoCodecType_Some_AppleProRes, FALSE}, -}; -void -gst_vtenc_register_elements (GstPlugin * plugin) +static gboolean +gst_vtenc_register_prores (GstPlugin * plugin) { - guint i; + gst_vtenc_init_once (); - GST_DEBUG_CATEGORY_INIT (gst_vtenc_debug, "vtenc", - 0, "Apple VideoToolbox Encoder Wrapper"); + static const GstVTEncoderDetails codec = { + "Apple ProRes", "prores", "video/x-prores", + "Nirbheek Chauhan <nirbheek@centricular.com>", + GST_kCMVideoCodecType_Some_AppleProRes, FALSE + }; + + return gst_vtenc_register (plugin, &codec); +} + +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h264, gst_vtenc_register_h264); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h265, gst_vtenc_register_h265); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h265a, gst_vtenc_register_h265a); +#if TARGET_OS_OSX +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h264_hw, gst_vtenc_register_h264_hw); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h265_hw, gst_vtenc_register_h265_hw); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_h265a_hw, + gst_vtenc_register_h265a_hw); +#endif +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (vtenc_prores, gst_vtenc_register_prores); - for (i = 0; i != G_N_ELEMENTS (gst_vtenc_codecs); i++) - gst_vtenc_register (plugin, &gst_vtenc_codecsi); +gboolean +gst_vtenc_register_elements (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (vtenc_h264, plugin); + ret |= GST_ELEMENT_REGISTER (vtenc_h265, plugin); + ret |= GST_ELEMENT_REGISTER (vtenc_h265a, plugin); +#if TARGET_OS_OSX + ret |= GST_ELEMENT_REGISTER (vtenc_h264_hw, plugin); + ret |= GST_ELEMENT_REGISTER (vtenc_h265_hw, plugin); + ret |= GST_ELEMENT_REGISTER (vtenc_h265a_hw, plugin); +#endif + ret |= GST_ELEMENT_REGISTER (vtenc_prores, plugin); + + return ret; }
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/applemedia/vtenc.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/applemedia/vtenc.h
Changed
@@ -24,6 +24,7 @@ #include <gst/base/gstqueuearray.h> #include <gst/codecparsers/gsth264parser.h> #include <gst/video/video.h> +#include <TargetConditionals.h> #include <VideoToolbox/VideoToolbox.h> G_BEGIN_DECLS @@ -102,10 +103,9 @@ GstVideoInfo video_info; VTCompressionSessionRef session; CFDictionaryRef keyframe_props; - GstClockTime dts_offset; GstVecDeque * output_queue; - /* Protects output_queue, is_flushing and pause_task */ + /* Protects output_queue, is_flushing, is_draining and pause_task */ GMutex queue_mutex; GCond queue_cond; @@ -117,6 +117,7 @@ GstFlowReturn downstream_ret; gboolean negotiate_downstream; gboolean is_flushing; + gboolean is_draining; gboolean pause_task; /* If we get an EncoderMalfunctionErr or similar, we restart the session @@ -127,11 +128,26 @@ * We can't do it straight from the setter as that would often deadlock, * so we instead reconfigure on next encode call. */ gboolean require_reconfigure; + + /* DTS offset: frame2 PTS - frame1 PTS + * Explanation here: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6791#note_2396581 */ + GstClockTime dts_offset; + GstVideoCodecFrame *first_frame; }; GType gst_vtenc_get_type (void); -void gst_vtenc_register_elements (GstPlugin * plugin); +gboolean gst_vtenc_register_elements (GstPlugin * plugin); + +GST_ELEMENT_REGISTER_DECLARE (vtenc_h264); +GST_ELEMENT_REGISTER_DECLARE (vtenc_h265); +GST_ELEMENT_REGISTER_DECLARE (vtenc_h265a); +#if TARGET_OS_OSX +GST_ELEMENT_REGISTER_DECLARE (vtenc_h264_hw); +GST_ELEMENT_REGISTER_DECLARE (vtenc_h265_hw); +GST_ELEMENT_REGISTER_DECLARE (vtenc_h265a_hw); +#endif +GST_ELEMENT_REGISTER_DECLARE (vtenc_prores); G_END_DECLS
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/asio/gstasioringbuffer.cpp -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/asio/gstasioringbuffer.cpp
Changed
@@ -26,10 +26,20 @@ #include <string.h> #include "gstasioutils.h" #include "gstasioobject.h" +#include <atomic> +#include <vector> GST_DEBUG_CATEGORY_STATIC (gst_asio_ring_buffer_debug); #define GST_CAT_DEFAULT gst_asio_ring_buffer_debug +/* *INDENT-OFF* */ +struct GstAsioRingBufferPrivate +{ + std::vector<guint8> empty_buf; + std::atomic<bool> paused = { false }; +}; +/* *INDENT-ON* */ + struct _GstAsioRingBuffer { GstAudioRingBuffer parent; @@ -51,6 +61,8 @@ gboolean is_first; guint64 expected_sample_position; gboolean trace_sample_position; + + GstAsioRingBufferPrivate *priv; }; enum @@ -60,6 +72,7 @@ }; static void gst_asio_ring_buffer_dispose (GObject * object); +static void gst_asio_ring_buffer_finalize (GObject * object); static gboolean gst_asio_ring_buffer_open_device (GstAudioRingBuffer * buf); static gboolean gst_asio_ring_buffer_close_device (GstAudioRingBuffer * buf); @@ -69,6 +82,8 @@ static gboolean gst_asio_ring_buffer_start (GstAudioRingBuffer * buf); static gboolean gst_asio_ring_buffer_stop (GstAudioRingBuffer * buf); static guint gst_asio_ring_buffer_delay (GstAudioRingBuffer * buf); +static gboolean gst_asio_ring_buffer_resume (GstAudioRingBuffer * buf); +static gboolean gst_asio_ring_buffer_pause (GstAudioRingBuffer * buf); #define gst_asio_ring_buffer_parent_class parent_class G_DEFINE_TYPE (GstAsioRingBuffer, gst_asio_ring_buffer, @@ -82,6 +97,7 @@ GST_AUDIO_RING_BUFFER_CLASS (klass); gobject_class->dispose = gst_asio_ring_buffer_dispose; + gobject_class->finalize = gst_asio_ring_buffer_finalize; ring_buffer_class->open_device = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_open_device); @@ -93,6 +109,8 @@ ring_buffer_class->resume = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_start); ring_buffer_class->stop = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_stop); ring_buffer_class->delay = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_delay); + ring_buffer_class->resume = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_resume); + ring_buffer_class->pause = GST_DEBUG_FUNCPTR (gst_asio_ring_buffer_pause); GST_DEBUG_CATEGORY_INIT (gst_asio_ring_buffer_debug, "asioringbuffer", 0, "asioringbuffer"); @@ -101,6 +119,7 @@ static void gst_asio_ring_buffer_init (GstAsioRingBuffer * self) { + self->priv = new GstAsioRingBufferPrivate (); } static void @@ -114,6 +133,16 @@ G_OBJECT_CLASS (parent_class)->dispose (object); } +static void +gst_asio_ring_buffer_finalize (GObject * object) +{ + auto self = GST_ASIO_RING_BUFFER (object); + + delete self->priv; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + static gboolean gst_asio_ring_buffer_open_device (GstAudioRingBuffer * buf) { @@ -146,6 +175,7 @@ { GstAsioRingBuffer *self = (GstAsioRingBuffer *) user_data; GstAudioRingBuffer *ringbuffer = GST_AUDIO_RING_BUFFER_CAST (self); + auto priv = self->priv; gint segment; guint8 *readptr; gint len; @@ -158,7 +188,15 @@ GST_TRACE_OBJECT (self, "Buffer Switch callback, index %ld", index); - if (!gst_audio_ring_buffer_prepare_read (ringbuffer, + auto paused = priv->paused.load (); + if (paused) { + /* Source is always live, do nothing when paused */ + if (self->type != GST_ASIO_DEVICE_CLASS_RENDER) + return TRUE; + + readptr = priv->empty_buf.data (); + len = (gint) priv->empty_buf.size (); + } else if (!gst_audio_ring_buffer_prepare_read (ringbuffer, &segment, &readptr, &len)) { GST_WARNING_OBJECT (self, "No segment available"); return TRUE; @@ -282,6 +320,10 @@ } } + /* Do not advance ringbuffer position if we didn't consume its buffer */ + if (paused) + return TRUE; + if (self->type == GST_ASIO_DEVICE_CLASS_RENDER) gst_audio_ring_buffer_clear (ringbuffer, segment); gst_audio_ring_buffer_advance (ringbuffer, 1); @@ -294,6 +336,7 @@ GstAudioRingBufferSpec * spec) { GstAsioRingBuffer *self = GST_ASIO_RING_BUFFER (buf); + auto priv = self->priv; if (!self->asio_object) { GST_ERROR_OBJECT (self, "No configured ASIO object"); @@ -321,6 +364,11 @@ gst_audio_format_info_fill_silence (buf->spec.info.finfo, buf->memory, buf->size); + /* Prepare empty buffer to fill silence when paused state */ + priv->empty_buf.resize (spec->segsize); + gst_audio_format_info_fill_silence (buf->spec.info.finfo, + priv->empty_buf.data (), spec->segsize); + return TRUE; } @@ -338,6 +386,7 @@ gst_asio_ring_buffer_start (GstAudioRingBuffer * buf) { GstAsioRingBuffer *self = GST_ASIO_RING_BUFFER (buf); + auto priv = self->priv; GstAsioObjectCallbacks callbacks; GST_DEBUG_OBJECT (buf, "Start"); @@ -347,6 +396,7 @@ self->is_first = TRUE; self->expected_sample_position = 0; + priv->paused = false; if (!gst_asio_object_install_callback (self->asio_object, self->type, &callbacks, &self->callback_id)) { @@ -400,6 +450,32 @@ return 0; } +static gboolean +gst_asio_ring_buffer_resume (GstAudioRingBuffer * buf) +{ + auto self = GST_ASIO_RING_BUFFER (buf); + auto priv = self->priv; + + GST_DEBUG_OBJECT (self, "Resume"); + + priv->paused = false; + + return TRUE; +} + +static gboolean +gst_asio_ring_buffer_pause (GstAudioRingBuffer * buf) +{ + auto self = GST_ASIO_RING_BUFFER (buf); + auto priv = self->priv; + + GST_DEBUG_OBJECT (self, "Pause"); + + priv->paused = true; + + return TRUE; +} + GstAsioRingBuffer * gst_asio_ring_buffer_new (GstAsioObject * object, GstAsioDeviceClassType type, const gchar * name)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/decklink/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/decklink/meson.build
Changed
@@ -65,7 +65,7 @@ if host_system == 'linux' decklink_sources += linux_sources build_decklink = true - elif 'darwin', 'ios'.contains(host_system) + elif host_system == 'darwin' decklink_sources += osx_sources decklink_ldflags = '-Wl,-framework,CoreFoundation' build_decklink = true @@ -85,6 +85,7 @@ link_args : decklink_ldflags + noseh_link_args, include_directories : configinc, dependencies : gstvideo_dep, gstaudio_dep, gstbase_dep, gst_dep + decklink_libs, + override_options : 'cpp_std=c++11', install : true, install_dir : plugins_install_dir, )
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/ipcpipeline/gstipcslavepipeline.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/ipcpipeline/gstipcslavepipeline.c
Changed
@@ -74,7 +74,7 @@ "Inter-process slave pipeline", "Generic/Bin/Slave", "Contains the slave part of an inter-process pipeline", - "Vincent Penquerc'h <vincent.penquerch@collabora.co.uk"); + "Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>"); } static void
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/nvcodec/gstcudamemorycopy.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/nvcodec/gstcudamemorycopy.c
Changed
@@ -923,7 +923,7 @@ in_type = GST_CUDA_BUFFER_COPY_CUDA; use_device_copy = TRUE; #ifdef HAVE_CUDA_GST_GL - } else if (self->gl_context && gst_is_gl_memory_pbo (in_mem)) { + } else if (gst_is_gl_memory_pbo (in_mem)) { in_type = GST_CUDA_BUFFER_COPY_GL; #endif #ifdef G_OS_WIN32 @@ -943,7 +943,7 @@ out_type = GST_CUDA_BUFFER_COPY_CUDA; use_device_copy = TRUE; #ifdef HAVE_CUDA_GST_GL - } else if (self->gl_context && gst_is_gl_memory_pbo (out_mem)) { + } else if (gst_is_gl_memory_pbo (out_mem)) { out_type = GST_CUDA_BUFFER_COPY_GL; #endif #ifdef G_OS_WIN32
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/shm/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/shm/meson.build
Changed
@@ -29,7 +29,7 @@ endif # NetBSD has shm_* in librt -if 'darwin', 'ios', 'freebsd', 'openbsd'.contains(host_system) +if host_system in 'darwin', 'freebsd', 'openbsd' rt_dep = shm_enabled = true else
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/shm/shmpipe.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/shm/shmpipe.c
Changed
@@ -27,7 +27,7 @@ #include "config.h" #endif -#ifdef HAVE_OSX +#ifdef __APPLE__ #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL SO_NOSIGPIPE #endif @@ -292,7 +292,7 @@ if (path) flags = O_RDONLY; else -#ifdef HAVE_OSX +#ifdef __APPLE__ flags = O_RDWR | O_CREAT | O_EXCL; #else flags = O_RDWR | O_CREAT | O_TRUNC | O_EXCL;
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/v4l2codecs/gstv4l2codech265dec.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/v4l2codecs/gstv4l2codech265dec.c
Changed
@@ -117,6 +117,8 @@ struct v4l2_ctrl_hevc_pps pps; struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix; struct v4l2_ctrl_hevc_decode_params decode_params; + GArray *ext_sps_st_rps; + GArray *ext_sps_lt_rps; GArray *slice_params; GArray *entry_point_offsets; @@ -129,6 +131,7 @@ gboolean support_scaling_matrix; gboolean support_slice_parameters; gboolean support_entry_point_offsets; + gboolean support_long_short_term_rps; GstVideoConverter *convert; gboolean need_crop; @@ -196,6 +199,14 @@ SET_ID (V4L2_CID_STATELESS_HEVC_SLICE_PARAMS), .size = sizeof(struct v4l2_ctrl_hevc_slice_params), .optional = TRUE, + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS), + .size = sizeof(struct v4l2_ctrl_hevc_ext_sps_st_rps), + .optional = TRUE, + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS), + .size = sizeof(struct v4l2_ctrl_hevc_ext_sps_lt_rps), + .optional = TRUE, } }; #undef SET_ID @@ -247,6 +258,18 @@ .size = sizeof (self->scaling_matrix), }, }; + struct v4l2_ext_control long_short_term_rps = { + { + .id = V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS, + .ptr = self->ext_sps_st_rps->data, + .size = sizeof (struct v4l2_ctrl_hevc_ext_sps_st_rps), + }, + { + .id = V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS, + .ptr = self->ext_sps_lt_rps->data, + .size = sizeof (struct v4l2_ctrl_hevc_ext_sps_lt_rps), + }, + }; /* *INDENT-ON* */ if (!gst_v4l2_decoder_open (self->decoder)) { @@ -276,6 +299,10 @@ gst_v4l2_decoder_query_control_size (self->decoder, V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, NULL); + self->support_long_short_term_rps = + gst_v4l2_decoder_get_controls (self->decoder, long_short_term_rps, + G_N_ELEMENTS (long_short_term_rps)); + self->decode_mode = control0.value; self->start_code = control1.value; @@ -903,6 +930,57 @@ } } +static void +gst_v4l2_codec_h265_dec_fill_ext_sps_rps (GstV4l2CodecH265Dec * self, + const GstH265SPS * sps) +{ + GstH265Decoder *decoder = (GstH265Decoder *) self; + struct v4l2_ctrl_hevc_ext_sps_st_rps *ext_sps_st_rps_set; + struct v4l2_ctrl_hevc_ext_sps_lt_rps *ext_sps_lt_rps_set; + const GstH265SPSEXT *sps_ext = gst_h265_decoder_get_sps_ext (decoder, sps); + gint i, j; + + for (i = 0; i < sps->num_short_term_ref_pic_sets; i++) { + ext_sps_st_rps_set = &g_array_index (self->ext_sps_st_rps, + struct v4l2_ctrl_hevc_ext_sps_st_rps, i); + + ext_sps_st_rps_set->flags |= + sps->short_term_ref_pic_seti.inter_ref_pic_set_prediction_flag ? + V4L2_HEVC_EXT_SPS_ST_RPS_FLAG_INTER_REF_PIC_SET_PRED : 0; + ext_sps_st_rps_set->delta_idx_minus1 = + sps->short_term_ref_pic_seti.delta_idx_minus1; + ext_sps_st_rps_set->delta_rps_sign = + sps->short_term_ref_pic_seti.delta_rps_sign; + ext_sps_st_rps_set->abs_delta_rps_minus1 = + sps->short_term_ref_pic_seti.abs_delta_rps_minus1; + ext_sps_st_rps_set->num_negative_pics = + sps->short_term_ref_pic_seti.NumNegativePics; + ext_sps_st_rps_set->num_positive_pics = + sps->short_term_ref_pic_seti.NumPositivePics; + + for (j = 0; j < 16; j++) { + ext_sps_st_rps_set->used_by_curr_pic |= + (!!(sps_ext-> + short_term_ref_pic_set_exti.used_by_curr_pic_flagj)) << j; + ext_sps_st_rps_set->use_delta_flag |= + (!!(sps_ext->short_term_ref_pic_set_exti.use_delta_flagj)) << j; + ext_sps_st_rps_set->delta_poc_s0_minus1j = + sps_ext->short_term_ref_pic_set_exti.delta_poc_s0_minus1j; + ext_sps_st_rps_set->delta_poc_s1_minus1j = + sps_ext->short_term_ref_pic_set_exti.delta_poc_s1_minus1j; + } + } + + for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) { + ext_sps_lt_rps_set = &g_array_index (self->ext_sps_lt_rps, + struct v4l2_ctrl_hevc_ext_sps_lt_rps, i); + + ext_sps_lt_rps_set->lt_ref_pic_poc_lsb_sps = sps->lt_ref_pic_poc_lsb_spsi; + ext_sps_lt_rps_set->flags = sps->used_by_curr_pic_lt_sps_flagi ? + V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_USED_LT : 0; + } +} + static guint8 lookup_dpb_index (struct v4l2_hevc_dpb_entry dpb16, GstH265Picture * ref_pic) { @@ -1016,6 +1094,7 @@ } gst_v4l2_codec_h265_dec_fill_sequence (self, sps); + gst_v4l2_codec_h265_dec_fill_ext_sps_rps (self, sps); if (negotiation_needed) { gst_v4l2_codec_h265_dec_streamoff (self); @@ -1128,8 +1207,10 @@ /* The base class will only emit new_sequence for allocation related changes * in the SPS, make sure to keep the SPS upt-to-date */ - if (slice->header.pps->sps->id != self->sps.seq_parameter_set_id) + if (slice->header.pps->sps->id != self->sps.seq_parameter_set_id) { gst_v4l2_codec_h265_dec_fill_sequence (self, slice->header.pps->sps); + gst_v4l2_codec_h265_dec_fill_ext_sps_rps (self, slice->header.pps->sps); + } gst_v4l2_codec_h265_dec_fill_pps (self, slice->header.pps); gst_v4l2_codec_h265_dec_fill_scaling_matrix (self, slice->header.pps); @@ -1383,6 +1464,8 @@ { }, /* SLICE_PARAMS */ { }, /* SCALING_MATRIX */ { }, /* ENTRY_POINT_OFFSETS */ + { }, /* EXT_SPS_ST_RPS */ + { }, /* EXT_SPS_LT_RPS */ }; /* *INDENT-ON* */ @@ -1427,6 +1510,24 @@ controlnum_controls.size = sizeof (self->sps); num_controls++; self->need_sequence = FALSE; + if (self->sps.num_short_term_ref_pic_sets + && self->support_long_short_term_rps) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS; + controlnum_controls.ptr = self->ext_sps_st_rps->data; + controlnum_controls.size = + g_array_get_element_size (self->ext_sps_st_rps) + * self->sps.num_short_term_ref_pic_sets; + num_controls++; + } + if (self->sps.num_long_term_ref_pics_sps + && self->support_long_short_term_rps) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS; + controlnum_controls.ptr = self->ext_sps_lt_rps->data; + controlnum_controls.size = + g_array_get_element_size (self->ext_sps_lt_rps) + * self->sps.num_long_term_ref_pics_sps; + num_controls++; + } } if (self->first_slice) { @@ -1682,6 +1783,12 @@ g_array_set_size (self->slice_params, 4); self->entry_point_offsets = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 4); + self->ext_sps_st_rps = g_array_sized_new (FALSE, TRUE, + sizeof (struct v4l2_ctrl_hevc_ext_sps_st_rps), 65); + g_array_set_size (self->ext_sps_st_rps, 65); + self->ext_sps_lt_rps = g_array_sized_new (FALSE, TRUE, + sizeof (struct v4l2_ctrl_hevc_ext_sps_lt_rps), 65); + g_array_set_size (self->ext_sps_lt_rps, 65); } static void @@ -1690,6 +1797,8 @@ GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (object); g_clear_object (&self->decoder); + g_clear_pointer (&self->ext_sps_st_rps, g_array_unref); + g_clear_pointer (&self->ext_sps_lt_rps, g_array_unref); g_clear_pointer (&self->slice_params, g_array_unref); g_clear_pointer (&self->entry_point_offsets, g_array_unref);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/v4l2codecs/linux/v4l2-controls.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/v4l2codecs/linux/v4l2-controls.h
Changed
@@ -2062,6 +2062,8 @@ #define V4L2_CID_STATELESS_HEVC_DECODE_MODE (V4L2_CID_CODEC_STATELESS_BASE + 405) #define V4L2_CID_STATELESS_HEVC_START_CODE (V4L2_CID_CODEC_STATELESS_BASE + 406) #define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (V4L2_CID_CODEC_STATELESS_BASE + 407) +#define V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS (V4L2_CID_CODEC_STATELESS_BASE + 408) +#define V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS (V4L2_CID_CODEC_STATELESS_BASE + 409) enum v4l2_stateless_hevc_decode_mode { V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED, @@ -2517,6 +2519,64 @@ __u8 scaling_list_dc_coef_32x322; }; + +#define V4L2_HEVC_EXT_SPS_ST_RPS_FLAG_INTER_REF_PIC_SET_PRED 0x1 + +/* + * struct v4l2_ctrl_hevc_ext_sps_st_rps - HEVC short term RPS parameters + * + * Dynamic size 1-dimension array for short term RPS. The number of elements + * is v4l2_ctrl_hevc_sps::num_short_term_ref_pic_sets. + * + * @delta_idx_minus1: Specifies the delta compare to the index. See details in section 7.4.8 + * "Short-term reference picture set semantics" of the specification. + * @delta_rps_sign: Sign of the delta as specified in section 7.4.8 "Short-term reference picture + * set semantics" of the specification. + * @abs_delta_rps_minus1: Absolute delta RPS as specified in section 7.4.8 "Short-term reference + * picture set semantics" of the specification. + * @num_negative_pics: Number of short-term RPS entries that have picture order count values less + * than the picture order count value of the current picture. + * @num_positive_pics: Number of short-term RPS entries that have picture order count values + * greater than the picture order count value of the current picture. + * @used_by_curr_pic: Specifies if short-term RPS i is used by the current picture. + * @delta_poc_s0_minus1: Specifies the negative picture order count delta for the i-th entry in + * the short-term RPS. See details in section 7.4.8 "Short-term reference + * picture set semantics" of the specification. + * @delta_poc_s1_minus1: Specifies the positive picture order count delta for the i-th entry in + * the short-term RPS. See details in section 7.4.8 "Short-term reference + * picture set semantics" of the specification. + * @flags: See V4L2_HEVC_EXT_SPS_ST_RPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_ext_sps_st_rps { + __u8 delta_idx_minus1; + __u8 delta_rps_sign; + __u8 num_negative_pics; + __u8 num_positive_pics; + __u32 used_by_curr_pic; + __u32 use_delta_flag; + __u16 abs_delta_rps_minus1; + __u16 delta_poc_s0_minus116; + __u16 delta_poc_s1_minus116; + __u16 flags; +}; + +#define V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_USED_LT 0x1 + +/* + * struct v4l2_ctrl_hevc_ext_sps_lt_rps - HEVC long term RPS parameters + * + * Dynamic size 1-dimension array for long term RPS. The number of elements + * is v4l2_ctrl_hevc_sps::num_long_term_ref_pics_sps. + * + * @lt_ref_pic_poc_lsb_sps: picture order count modulo MaxPicOrderCntLsb + * of the i-th candidate long-term reference picture. + * @flags: See V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_ext_sps_lt_rps { + __u16 lt_ref_pic_poc_lsb_sps; + __u16 flags; +}; + #define V4L2_CID_COLORIMETRY_CLASS_BASE (V4L2_CTRL_CLASS_COLORIMETRY | 0x900) #define V4L2_CID_COLORIMETRY_CLASS (V4L2_CTRL_CLASS_COLORIMETRY | 1)
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/v4l2codecs/linux/videodev2.h -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/v4l2codecs/linux/videodev2.h
Changed
@@ -734,6 +734,7 @@ #define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */ #define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ #define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ +#define V4L2_PIX_FMT_AV1 v4l2_fourcc('A', 'V', '0', '1') /* AV1 */ #define V4L2_PIX_FMT_AV1_FRAME v4l2_fourcc('A', 'V', '1', 'F') /* AV1 parsed frame */ #define V4L2_PIX_FMT_SPK v4l2_fourcc('S', 'P', 'K', '0') /* Sorenson Spark */ #define V4L2_PIX_FMT_RV30 v4l2_fourcc('R', 'V', '3', '0') /* RealVideo 8 */ @@ -1864,6 +1865,8 @@ V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 0x0272, V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273, V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274, + V4L2_CTRL_TYPE_HEVC_EXT_SPS_ST_RPS = 0x0275, + V4L2_CTRL_TYPE_HEVC_EXT_SPS_LT_RPS = 0x0276, V4L2_CTRL_TYPE_AV1_SEQUENCE = 0x280, V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY = 0x281,
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/va/gstvabasetransform.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/va/gstvabasetransform.c
Changed
@@ -488,13 +488,14 @@ GstBuffer ** outbuf) { GstVaBaseTransform *self = GST_VA_BASE_TRANSFORM (trans); + GstBaseTransformClass *btrans_klass = GST_BASE_TRANSFORM_CLASS (parent_class); GstVideoFrame src_frame; GstVideoFrame dest_frame; GstBuffer *buffer = NULL; GstFlowReturn ret; + gboolean res; - ret = GST_BASE_TRANSFORM_CLASS (parent_class)->generate_output (trans, - outbuf); + ret = btrans_klass->generate_output (trans, outbuf); if (ret != GST_FLOW_OK || *outbuf == NULL) return ret; @@ -534,7 +535,17 @@ gst_video_frame_unmap (&src_frame); gst_video_frame_unmap (&dest_frame); - gst_buffer_replace (outbuf, buffer); + res = btrans_klass->copy_metadata (trans, *outbuf, buffer); + if (!res) + GST_WARNING_OBJECT (self, "failed to copy metadata"); + + res = gst_buffer_replace (outbuf, buffer); + if (!res) { + GST_ERROR_OBJECT (self, "couldn't replace output buffer"); + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } + ret = GST_FLOW_OK; out:
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/sys/va/gstvavp8enc.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/sys/va/gstvavp8enc.c
Changed
@@ -45,6 +45,7 @@ #include <math.h> #include <gst/codecparsers/gstvp8parser.h> +#include <gst/va/gstvavideoformat.h> #include "gstvabaseenc.h" #include "gstvapluginutils.h" @@ -579,7 +580,7 @@ GstVideoFormat format; const GstVideoFormatInfo *format_info; gboolean do_renegotiation = TRUE; - guint max_ref_frames, latency_num; + guint max_ref_frames, latency_num, rt_format; gint width, height; GstClockTime latency; @@ -594,6 +595,13 @@ GST_VIDEO_FORMAT_INFO_H_SUB (format_info, 1) != 1) return FALSE; + rt_format = gst_va_chroma_from_video_format (format); + if (!rt_format) { + GST_ERROR_OBJECT (self, "unrecognized input format: %s", + gst_video_format_to_string (format)); + return FALSE; + } + gst_va_base_enc_reset_state (base); if (base->is_live) { @@ -605,6 +613,7 @@ base->profile = VAProfileVP8Version0_3; base->width = width; base->height = height; + base->rt_format = rt_format; /* Frame rate is needed for rate control and PTS setting. */ if (GST_VIDEO_INFO_FPS_N (&base->in_info) == 0
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/tests/check/libs/h265parser.c -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/tests/check/libs/h265parser.c
Changed
@@ -896,8 +896,8 @@ test_vectori.is_rasl); } - for (i = RESERVED_NON_IRAP_NAL_TYPE_MIN; - i <= UNSPECIFIED_NON_VCL_NAL_TYPE_MAX; i++) { + for (i = GST_H265_RESERVED_NON_IRAP_NAL_TYPE_MIN; + i <= GST_H265_UNSPECIFIED_NON_VCL_NAL_TYPE_MAX; i++) { assert_equals_int (GST_H265_IS_NAL_TYPE_IDR (i), FALSE); assert_equals_int (GST_H265_IS_NAL_TYPE_IRAP (i), FALSE); assert_equals_int (GST_H265_IS_NAL_TYPE_BLA (i), FALSE);
View file
_service:download_files:gst-plugins-bad-1.28.0.tar.xz/tests/examples/avsamplesink/meson.build -> _service:download_files:gst-plugins-bad-1.28.1.tar.xz/tests/examples/avsamplesink/meson.build
Changed
@@ -1,4 +1,4 @@ -if 'darwin', 'ios'.contains(host_system) +if host_system == 'darwin' avfoundation_dep = dependency('appleframeworks', modules : 'AVFoundation', required : get_option('examples')) quartzcore_dep = dependency('appleframeworks', modules : 'QuartzCore', required : get_option('examples')) corefoundation_dep = dependency('appleframeworks', modules : 'CoreFoundation', required : get_option('examples'))
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.