Projects
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 36
View file
gstreamer-plugins-bad-codecs.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Tue Jul 15 09:29:27 UTC 2025 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.26.3 + +------------------------------------------------------------------- Tue Jul 1 09:27:49 UTC 2025 - Bjørn Lie <zaitor@opensuse.org> - Drop faad plugin, moved to main package.
View file
gstreamer-plugins-bad-codecs.spec
Changed
@@ -7,7 +7,7 @@ %define _version 1.26.0 Name: gstreamer-plugins-bad-codecs -Version: 1.26.2 +Version: 1.26.3 Release: 0 Summary: Codecs/plugins for gstreamer-plugins-bad License: LGPL-2.1-or-later
View file
_service
Changed
@@ -2,7 +2,7 @@ <service name="download_url"> <param name="host">gstreamer.freedesktop.org</param> <param name="protocol">https</param> - <param name="path">/src/gst-plugins-bad/gst-plugins-bad-1.26.2.tar.xz</param> + <param name="path">/src/gst-plugins-bad/gst-plugins-bad-1.26.3.tar.xz</param> </service> <service name="set_version" mode="buildtime"/> </services>
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ChangeLog -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ChangeLog
Changed
@@ -1,3 +1,341 @@ +=== release 1.26.3 === + +2025-06-26 21:25:24 +0100 Tim-Philipp Müller <tim@centricular.com> + + * NEWS: + * RELEASE: + * gst-plugins-bad.doap: + * meson.build: + Release 1.26.3 + +2025-06-24 21:40:26 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecparsers/gsth266parser.c: + * gst-libs/gst/codecparsers/gsth266parser.h: + h266parser: Fix overflow when parsing subpic_level_info + 1. non_subpic_layers_fraction, ref_level_idc and ref_level_fraction_minus1 + fields should not have the GST_H266_MAX_SUBLAYERS limitation. + 2. Should check max_sublayers_minus1, no more than GST_H266_MAX_SUBLAYERS-1 + Fixes ZDI-CAN-27381, CVE-2025-6663 + Closes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4503 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9295> + +2025-06-25 16:24:44 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> + + * ext/srt/gstsrtsink.c: + * ext/srt/gstsrtsink.h: + srtsink: Fix header buffer filtering + Cleans up the code and fixes two issues: + - If there are no streamheaders in the caps but we have `HEADER` + buffers, it would run `gst_buffer_list_foreach` with `self->headers` + being `NULL`. + - The code forgot to unmap the buffer if it decided to ignore it. + Fixes: 0a562a92d7ee38d8919d1b802add84d3c93b59eb + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9286> + +2025-06-21 07:12:29 -0400 Doug Nazar <nazard@nazar.ca> + + * ext/analyticsoverlay/gstobjectdetectionoverlay.c: + analyticsoverlay: Fix memory leak + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9271> + +2025-06-21 07:11:29 -0400 Doug Nazar <nazard@nazar.ca> + + * tests/check/elements/dashsink.c: + dashsink: test: Minor cleanups + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9271> + +2025-06-21 07:10:54 -0400 Doug Nazar <nazard@nazar.ca> + + * ext/dash/gstdashsink.c: + dashsink: Fix memory leak + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9271> + +2025-06-23 10:22:57 +1000 Matthew Waters <matthew@centricular.com> + + * sys/decklink/gstdecklink.cpp: + * sys/decklink/gstdecklink.h: + * sys/decklink/gstdecklinkvideosink.cpp: + decklink/clock: remove clock_offset + It is completely unused and only ever initialized to 0. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9269> + +2025-06-18 14:20:32 +1000 Matthew Waters <matthew@centricular.com> + + * sys/decklink/gstdecklinkvideosink.cpp: + * sys/decklink/gstdecklinkvideosink.h: + decklink: calculate internal using values closer to the current clock times + In a previous version of the clock time conversion code, scheduled playback used + to be started (from 0) when transitioning to PLAYING and stopped when + transitioning PLAYING->PAUSED. This worked fine when converting running times + using the internal clock. However, now the decklink clock will produce values + that are monotonically increasing and do not reset to 0 at the same moments as + running time anymore. This means that the clock adjustments could attempt to + convert a small running time based on a large clock time e.g. after pausing + for many hours. As the adjustment code is a simple linear interpolation based on + the current clock times (large) using the provided value (small), the small + differences in the rate could result in very large differences in the + output time. + Fix by instead using both internal and external clock times based on the values + that gst_clock_get_calibration() will return. By doing so, small changes in the + rate calculations between the internal and external clock times will not result + in potentially large differences in the output internal time from + gst_clock_unadjust_with_calibration(). + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4197 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9269> + +2025-06-18 14:04:14 +0200 Edward Hervey <edward@centricular.com> + + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Allow access unit parsing failures + * Refactor the various Access Unit extraction calls into a single function + * Allow the access unit parsing to fail, but emit a warning + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9258> + +2025-06-16 18:38:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/androidmedia/gstamc-codeclist.h: + * sys/androidmedia/gstamc.c: + * sys/androidmedia/gstamc.h: + * sys/androidmedia/jni/gstamc-codeclist-jni.c: + amc: 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 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. + Also rank PRIMARY+1 the c2.android c2.exynos and c2.amlogic audio + codecs alongside OMX.google, because they are known-good. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9257> + +2025-06-17 03:32:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/androidmedia/gstamc.c: + amc: Log under GST_FIXME for audio encoders + We don't support audio encoders yet, so log that correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9257> + +2025-06-16 18:36:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/androidmedia/gstamc.c: + amc: Improve codec registration logging + Most of the messages can be printed with INFO threshold since they are + only printed on plugin registration. + Fix printing of codec caps, since GST_PTR_FORMAT truncates the output + in almost every case that I saw. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9257> + +2025-06-16 18:34:39 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/androidmedia/gstamc.c: + amc: Print error messages when registering plugins + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9257> + +2025-02-20 21:59:31 +0000 Ben Butterworth <24711048+ben-xD@users.noreply.github.com> + + * gst/mpegtsdemux/tsdemux.c: + mpegts: handle MPEG2-TS with KLV metadata safely by preventing out of bounds + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3896 + @slomo, as requested on https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3896#note_2780065 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9251> + +2024-07-26 14:23:10 +1000 Matthew Waters <matthew@centricular.com> + + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: disconnect signal ICE handlers on dispose + It is entirely possible that the in progress may still provide some state + updates until the ICE object is destroyed, these state updates should + not really be done when webrtcbin is in the process of destroying itself + and access freed data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9249> + +2025-06-13 12:35:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * ext/vulkan/vkupload.c: + vkupload: use gst_buffer_find_memory() to select memory + We never implemented correctly the selection of memories in a buffer given the + plane. + This patch uses gst_buffer_find_memory() for that. The offset is checked via the + video meta either in the input and output buffers, or the default offset given + the format and size. + This patch also requests the video meta option for the output buffers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9243> + +2025-06-13 11:28:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/vulkan/gstvkimagebufferpool.c: + vkimagebufferpool: set video meta to buffers if requested + This patch adds the possibility to attach video metas to allocated buffers if + API users request that option. + The main reason to add this meta is for the future usage of + gst_buffer_find_memory(), where the requested offset determines the memory + index. + In the case of multi-memory Vulkan images the offset of every component is + larger than the default offset determined by the format and frame size, because + of the buffer minimum size and memory alignment determined by the used driver. + Then, the offset is set in the buffer video meta. + In the case of single memory Vulkan images, the default offset is set in the + video meta. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9243> + +2025-06-13 11:27:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/vulkan/gstvkimagebufferpool.c: + vkimagebufferpool: remove unused variable + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9243> + +2024-12-13 19:08:30 +1100 Jan Schmidt <jan@centricular.com> + + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Send new-segment before GAP + If adding a sparse stream and sending a gap event to bring it + up to speed, make sure to send the new segment event first + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9235> + +2025-06-10 22:17:46 +1000 Matthew Waters <matthew@centricular.com> + + * sys/decklink/gstdecklinkvideosink.cpp: + decklinkvideosink: show preroll frame correctly + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4254 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9238> + +2025-06-16 13:39:55 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * tests/check/elements/vkupload.c: + * tests/check/meson.build: + test: vulkanupload unit test + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9228> + +2025-06-13 14:36:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * ext/vulkan/vkupload.c: + vulkanupload: fix regression for uploading VulkanBuffer + Merge request !5651 introduced a regression for uploading VulkanBuffer. It can + be verified by + gst-launch-1.0 videotestsrc ! video/x-raw, format=NV12 ! vulkanupload ! \ + video/x-raw\(memory:VulkanBuffer\) ! fakesink + Nobody has complained about this regression, so we assume it's a very niche + use-case. + This patch solve the regression by instantiating a different buffer pool + depending on the output cap features, and configuring it accordingly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9228> + +2025-06-10 12:53:05 +0100 Philippe Normand <philn@igalia.com> + + * gst-libs/gst/transcoder/gsttranscoder.c: + transcoder: Fix uritranscodebin reference handling + Make sure the reference is not floating, because the get_pipeline function + returns a transfer-full reference. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9203> + +2025-06-06 16:24:19 +0200 Jakub Adam <jakub.adam@collabora.com> + + * ext/soundtouch/meson.build: + meson: fix building -bad tests with disabled soundtouch + Fixes an error from Meson: + ../subprojects/gst-plugins-bad/tests/validate/meson.build:16:93: ERROR: + Unknown variable "soundtouch_dep" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9192> + +2025-05-12 11:31:32 +0100 Glyn Davies <glyn@solet.io> + + * gst/mpegtsmux/tsmux/tsmuxstream.c: + mpegtsmux: Corrections around Teletext handling + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9183> + +2025-05-22 10:11:36 -0400 Julian Bouzas <julian.bouzas@collabora.com> + + * ext/lcevcdecoder/gstlcevcdec.c: + lcevcdec: Check for errors after receiving all enhanced and base pictures + The LCEVC_ReceiveDecoderBase() and LCEVC_ReceiveDecoderPicture() APIs from the + LCEVCdec SDK can return LCEVC_Error if the enhancement data is wrong. This + change improves the lcevcdec element to check for those errors and stop the + pipeline when that happens. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9177> + +2025-06-04 17:56:39 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Use interlace info in input caps + ... instead of relying on only parsed values from bitstream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9174> + +2025-06-04 17:55:51 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d12/gstd3d12decoder.cpp: + d3d12decoder: Use interlace info in input caps + ... instead of relying on only parsed values from bitstream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9174> + +2025-06-04 03:49:19 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvdecoder.cpp: + * sys/nvcodec/gstnvh265dec.cpp: + nvdec: Use interlace info in input caps + ... instead of relying on only parsed values from bitstream. + Also parses HEVC specific interlace information + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9174> + +2025-06-02 00:59:52 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Fix negative position handling + Negative positions should be cropped out + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9161> + +2025-06-01 23:38:27 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d12/gstd3d12compositor.cpp: + d3d12compositor: Fix negative position handling + Negative positions should be cropped out + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4249 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9161> + +2025-06-01 22:55:53 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d12/gstd3d12compositor.cpp: + d3d12compositor: Fix critical warnings + compositor will record rendering commands using multiple threads + (i.e., blending commands are recoded using thread pool, and + background one is recorded on aggregate thread). + And there can be temporary refcount increase (so not writable). + Updates fence once all rendering commands have been submitted. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9159> + +2025-06-01 22:50:30 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/d3d12/gstd3d12converter-unpack.cpp: + d3d12converter: Fix fallback upload process + Fixing typo + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9159> + +2025-05-30 12:41:06 +0300 Sebastian Dröge <sebastian@centricular.com> + + * gst/bayer/gstrgb2bayer.c: + rgb2bayer: Use gst_structure_has_name() instead of g_str_equal() for simplicity + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9150> + +2025-05-30 12:40:42 +0300 Sebastian Dröge <sebastian@centricular.com> + + * gst/bayer/gstbayer2rgb.c: + bayer2rgb: Use gst_structure_has_name() instead of strcmp() for clarity + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9150> + +2025-05-30 12:33:09 +0300 Sebastian Dröge <sebastian@centricular.com> + + * gst/bayer/gstbayer2rgb.c: + bayer2rgb: Fix RGB stride calculation + This fixes a regression introduced in 4c92d4096e9. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9150> + +2025-05-30 00:03:12 +0100 Tim-Philipp Müller <tim@centricular.com> + + * meson.build: + Back to development after 1.26.2 + === release 1.26.2 === 2025-05-29 23:56:43 +0100 Tim-Philipp Müller <tim@centricular.com>
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/NEWS -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/NEWS
Changed
@@ -1809,6 +1809,213 @@ - List of Merge Requests applied in 1.26.2 - List of Issues fixed in 1.26.2 +1.26.3 + +The third 1.26 bug-fix release (1.26.3) was released on 26 June 2025. + +This release only contains bugfixes including some important playback fixes, and it should be safe to update from 1.26.x. + +Highlighted bugfixes in 1.26.3 + +- Security fix for the H.266 video parser +- Fix regression for WAV files with acid chunks +- Fix high memory consumption caused by a text handling regression in uridecodebin3 and playbin3 +- Fix panic on late GOP in fragmented MP4 muxer +- Closed caption conversion, rendering and muxing improvements +- Decklink video sink preroll frame rendering and clock drift handling fixes +- MPEG-TS demuxing and muxing fixes +- MP4 muxer fixes for creating very large files with faststart support +- New thread-sharing 1:N inter source and sink elements, and a ts-rtpdtmfsrc +- New speech synthesis element around ElevenLabs API +- RTP H.265 depayloader fixes and improvements, as well as TWCC and GCC congestion control fixes +- Seeking improvements in DASH client for streams with gaps +- WebRTC sink and source fixes and enhancements, including to LiveKit and WHIP signallers +- The macOS osxvideosink now posts navigation messages +- QtQML6GL video sink input event handling improvements +- Overhaul detection of hardware-accelerated video codecs on Android +- Video4Linux capture source fixes and support for BT.2100 PQ and 1:4:5:3 colorimetry +- Vulkan buffer upload and memory handling regression fixes +- gst-python: fix various regressions introduced in 1.26.2 +- cerbero: fix text relocation issues on 32-bit Android and fix broken VisualStudio VC templates +- packages: ship pbtypes plugin and update openssl to 3.5.0 LTS +- Various bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements + +gstreamer + +- aggregator: Do not set event seqnum to INVALID +- baseparse: test: Fix race on test start +- pad: Only remove TAG events on STREAM_START if the stream-id actually changes +- utils: Mark times array as static to avoid symbol conflict with the POSIX function +- vecdeque: Use correct index type gst_vec_deque_drop_struct() + +gst-plugins-base + +- GstAudioAggregator: fix structure unref in peek_next_sample() +- audioconvert: Fix setting mix-matrix when input caps changes +- encodebasebin: Duplicate encoding profile in property setter +- gl: simplify private gst_gl_gst_meta_api_type_tags_contain_only() +- osxvideosink: Use gst_pad_push_event() and post navigation messages +- playsink: Fix race condition in stream synchronizer pad cleanup during state changes +- python: Fix pulling events from appsink +- streamsynchronizer: Consider streams having received stream-start as waiting +- urisourcebin: Text tracks are no longer set as sparse stream in urisourcebin’s multiqueue + +gst-plugins-good + +- aacparse: Fix counting audio channels in program_config_element +- adaptivedemux2: free cancellable when freeing transfer task +- dashdemux2: Fix seeking in a stream with gaps +- decodebin wavparse cannot pull header +- imagefreeze: fix not negotiate log when stop +- osxvideosink: Use gst_pad_push_event() and post navigation messages +- qml6glsink: Allow configuring if the item will consume input events +- qtmux: Update chunk offsets when converting stco to co64 with faststart +- splitmuxsink: Only send closed message once per open fragment +- rtph265depay: CRA_NUT can also start an (open) GOP +- rtph265depay: fix codec_data generation +- rtspsrc: Don’t emit error during close if server is EOF +- twcc: Fix reference timestamp wrapping (again) +- v4l2: Fix possible internal pool leak +- v4l2object: Add support for colorimetry bt2100-pq and 1:4:5:3 +- wavparse: Don’t error out always when parsing acid chunks + +gst-plugins-bad + +- amc: Overhaul hw-accelerated video codecs detection +- bayer2rgb: Fix RGB stride calculation +- d3d12compositor: Fix critical warnings +- dashsink: Fix failing test +- decklink: calculate internal using values closer to the current clock times +- decklinkvideosink: show preroll frame correctly +- decklink: clock synchronization after pause +- h266parser: Fix overflow when parsing subpic_level_info +- lcevcdec: Check for errors after receiving all enhanced and base pictures +- meson: fix building -bad tests with disabled soundtouch +- mpegts: handle MPEG2-TS with KLV metadata safely by preventing out of bounds +- mpegtsmux: Corrections around Teletext handling +- srtsink: Fix header buffer filtering +- transcoder: Fix uritranscodebin reference handling +- tsdemux: Allow access unit parsing failures +- tsdemux: Send new-segment before GAP +- vulkanupload: fix regression for uploading VulkanBuffer +- vulkanupload: fix regression when uploading to single memory multiplaned memory images. +- webrtcbin: disconnect signal ICE handlers on dispose +- {d3d12,d3d11}compositor: Fix negative position handling +- {nv,d3d12,d3d11}decoder: Use interlace info in input caps + +gst-plugins-ugly + +- No changes + +GStreamer Rust plugins + +- Add new speech synthesis element around ElevenLabs API +- cea708mux: fix another WouldOverflow case +- cea708mux: support configuring a limit to how much data will be pending +- cea708overlay: also reset the output size on flush stop +- gcc: handle out of order packets +- fmp4mux: Fix panic on late GOP +- livekit: expose a connection state property +- mp4mux: add taic box +- mp4mux: test the trak structure +- pcap_writer: Make target-property and pad-path properties writable again +- skia: Don’t build skia plugin by default for now +- threadshare: cleanups & usability improvements +- threadshare: sync runtime with latest async-io +- threadshare: fix kqueue reactor +- threadshare: Update to getifaddrs 0.2 +- threadshare: add new thread-sharing inter elements +- threadshare: add a ts-rtpdtmfsrc element +- transcriberbin: fix naming of subtitle pads +- tttocea708: don’t panic if a new service would overflow +- webrtc: android: Update Gradle and migrate to FindGStreamerMobile +- webrtc: add new examples for stream selection over data channel +- webrtcsrc: the webrtcbin get-transceiver index is not mlineindex +- webrtcsrc: send CustomUpstream events over control channel .. +- webrtcsink: Don’t require encoder element for pre-encoded streams +- webrtcsink: Don’t reject caps events if the codec_data changes +- whip: server: pick session-id from the endpoint if specified +- cargo: add config file to force CARGO_NET_GIT_FETCH_WITH_CLI=true +- Cargo.lock, deny: Update dependencies and log duplicated targo-lexicon +- Update windows-sys dependency from “>=0.52, <=0.59” to “>=0.52, <=0.60” +- deny: Add override for windows-sys 0.59 +- deny: Update lints +- cargo_wrapper: Fix backslashes being parsed as escape codes on Windows +- Fixes for Clock: non-optional return types +- Rename relationmeta plugin to analytics + +gst-libav + +- No changes + +gst-rtsp-server + +- rtsp-server: tests: Fix a few memory leaks + +gstreamer-vaapi + +- No changes + +gstreamer-sharp + +- No changes + +gst-python + +This release includes some important regression fixes for the GStreamer Python bindings for regressions introduced in 1.26.2. + +- gst-python/tests: don’t depend on webrtc and rtsp-server +- python: Fix pulling events from appsink and other fixes + +gst-editing-services + +- No changes + +gst-devtools, gst-validate + gst-integration-testsuites + +- validate: More memory leaks +- validate: Valgrind fixes + +gst-examples + +- No changes + +gstreamer-docs + +- No changes + +Development build environment + +- gst-env: Emit a warning about DYLD_LIBRARY_PATH on macOS + +Cerbero build tool and packaging changes in 1.26.3 + +- WiX: fix broken VC templates +- android: Don’t ignore text relocation errors on 32-bit, and error out if any are found +- build: source: handle existing .cargo/config.toml as in plugins-rs +- ci: Detect text relocations when building android examples +- gst-plugins-base: Ship pbtypes +- gst-plugins-base: Fix category of pbtypes +- gst-plugins-rs: Update for relationmeta -> analytics plugin rename +- libsoup.recipe: XML-RPC support was removed before the 3.0 release +- openssl: Update to 3.5.0 LTS + +Contributors to 1.26.3 + +Albert Sjolund, Aleix Pol, Ben Butterworth, Brad Hards, César Alejandro Torrealba Vázquez, Changyong Ahn, Doug Nazar, Edward +Hervey, Elliot Chen, Enrique Ocaña González, François Laignel, Glyn Davies, He Junyan, Jakub Adam, James Cowgill, Jan Alexander +Steffens (heftig), Jan Schmidt, Jochen Henneberg, Johan Sternerup, Julian Bouzas, L. E. Segovia, Loïc Le Page, Mathieu +Duponchelle, Matthew Waters, Nicolas Dufresne, Nirbheek Chauhan, Philippe Normand, Pratik Pachange, Qian Hu (胡骞), Sebastian +Dröge, Seungha Yang, Taruntej Kanakamalla, Théo Maillart, Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, +Xavier Claessens, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.26.3 + +- List of Merge Requests applied in 1.26.3 +- List of Issues fixed in 1.26.3 + Schedule for 1.28 Our next major feature release will be 1.28, and 1.27 will be the unstable development version leading up to the stable 1.28
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/RELEASE -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/RELEASE
Changed
@@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-bad 1.26.2. +This is GStreamer gst-plugins-bad 1.26.3. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework!
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/analyticsoverlay/gstobjectdetectionoverlay.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/analyticsoverlay/gstobjectdetectionoverlay.c
Changed
@@ -622,9 +622,8 @@ GstVideoInfo * out_info) { GstObjectDetectionOverlay *overlay = GST_OBJECT_DETECTION_OVERLAY (filter); - GST_DEBUG_OBJECT (filter, "set_info incaps:%s", gst_caps_to_string (incaps)); - GST_DEBUG_OBJECT (filter, "set_info outcaps:%s", - gst_caps_to_string (outcaps)); + GST_DEBUG_OBJECT (filter, "set_info incaps:%" GST_PTR_FORMAT, incaps); + GST_DEBUG_OBJECT (filter, "set_info outcaps:%" GST_PTR_FORMAT, outcaps); filter->in_info = *in_info; filter->out_info = *out_info;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/dash/gstdashsink.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/dash/gstdashsink.c
Changed
@@ -763,7 +763,7 @@ GstStructure *s; GstCaps *caps = gst_pad_get_current_caps (stream->pad); - GST_DEBUG_OBJECT (sink, "stream caps %s", gst_caps_to_string (caps)); + GST_DEBUG_OBJECT (sink, "stream caps %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); g_free (stream->codec);
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/lcevcdecoder/gstlcevcdec.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/lcevcdecoder/gstlcevcdec.c
Changed
@@ -391,9 +391,10 @@ { LCEVC_PictureHandle picture_handle = { 0, }; LCEVC_DecodeInformation decode_info = { 0, }; + LCEVC_ReturnCode ret; - while (LCEVC_ReceiveDecoderPicture (lcevc->decoder_handle, &picture_handle, - &decode_info) == LCEVC_Success) { + while ((ret = LCEVC_ReceiveDecoderPicture (lcevc->decoder_handle, + &picture_handle, &decode_info)) == LCEVC_Success) { LCEVC_PictureDesc pic_desc = { 0, }; GstVideoCodecFrame *received_frame; GstVideoCropMeta *cmeta; @@ -470,6 +471,13 @@ } } + /* Make sure no errors happened */ + if (ret == LCEVC_Error) { + GST_ELEMENT_ERROR (lcevc, STREAM, DECODE, (NULL), + ("Could not receive enhanced picture")); + return FALSE; + } + return TRUE; } @@ -477,9 +485,10 @@ receive_base_picture (GstLcevcDec * lcevc) { LCEVC_PictureHandle picture_handle = { 0, }; + LCEVC_ReturnCode ret; - while (LCEVC_ReceiveDecoderBase (lcevc->decoder_handle, &picture_handle) - == LCEVC_Success) { + while ((ret = LCEVC_ReceiveDecoderBase (lcevc->decoder_handle, + &picture_handle)) == LCEVC_Success) { GST_DEBUG_OBJECT (lcevc, "Received base picture %" G_GUINTPTR_FORMAT, picture_handle.hdl); @@ -492,6 +501,13 @@ } } + /* Make sure no errors happened */ + if (ret == LCEVC_Error) { + GST_ELEMENT_ERROR (lcevc, STREAM, DECODE, (NULL), + ("Could not receive base picture")); + return FALSE; + } + return TRUE; }
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/soundtouch/meson.build -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/soundtouch/meson.build
Changed
@@ -20,6 +20,7 @@ soundtouch_cargs = '-DHAVE_SOUNDTOUCH' if get_option('soundtouch').disabled() + soundtouch_dep = dependency('', required: false) subdir_done() endif
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/srt/gstsrtsink.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/srt/gstsrtsink.c
Changed
@@ -138,7 +138,6 @@ static void gst_srt_sink_init (GstSRTSink * self) { - self->streamconfig_sent = FALSE; self->srtobject = gst_srt_object_new (GST_ELEMENT (self)); gst_srt_object_set_uri (self->srtobject, GST_SRT_DEFAULT_URI, NULL); } @@ -169,6 +168,7 @@ GstSRTSink *self = GST_SRT_SINK (bsink); g_clear_pointer (&self->headers, gst_buffer_list_unref); + self->headers_sent = FALSE; gst_srt_object_close (self->srtobject); return TRUE; @@ -184,7 +184,7 @@ is_buffer_different (GstBuffer ** buffer, guint idx, gpointer data) { StreamheaderCheckContext *ctx = (StreamheaderCheckContext *) data; - gboolean retval = FALSE; + g_return_val_if_fail (buffer != NULL, FALSE); g_return_val_if_fail (GST_IS_BUFFER (*buffer), FALSE); g_return_val_if_fail (ctx != NULL, FALSE); @@ -199,9 +199,9 @@ if (gst_buffer_memcmp (*buffer, 0, ctx->map_info->data, ctx->map_info->size) != 0) - retval = TRUE; + return TRUE; - return retval; + return FALSE; } static GstFlowReturn @@ -211,39 +211,30 @@ GstFlowReturn ret = GST_FLOW_OK; GstMapInfo info; GError *error = NULL; - StreamheaderCheckContext ctx = { 0 }; if (g_cancellable_is_cancelled (self->srtobject->cancellable)) { ret = GST_FLOW_FLUSHING; } - if (!self->streamconfig_sent && GST_BUFFER_FLAG_IS_SET (buffer, - GST_BUFFER_FLAG_HEADER)) { + if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { + GST_ELEMENT_ERROR (self, RESOURCE, READ, + ("Could not map the input stream"), (NULL)); + return GST_FLOW_ERROR; + } - if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { - GST_ELEMENT_ERROR (self, RESOURCE, READ, - ("Could not map the input stream"), (NULL)); - return GST_FLOW_ERROR; - } - ctx.map_info = &info; - ctx.buf = buffer; + if (!self->headers_sent && self->headers && + GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_HEADER)) { + StreamheaderCheckContext ctx = {.buf = buffer,.map_info = &info }; if (!gst_buffer_list_foreach (self->headers, is_buffer_different, &ctx)) { GST_DEBUG_OBJECT (self, "Have streamheaders," " ignoring header %" GST_PTR_FORMAT, buffer); + gst_buffer_unmap (buffer, &info); return GST_FLOW_OK; } } - self->streamconfig_sent = TRUE; - - if (ctx.map_info != &info) { - if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { - GST_ELEMENT_ERROR (self, RESOURCE, READ, - ("Could not map the input stream"), (NULL)); - return GST_FLOW_ERROR; - } - } + self->headers_sent = TRUE; if (gst_srt_object_write (self->srtobject, self->headers, &info, &error) < 0) { GST_ELEMENT_ERROR (self, RESOURCE, WRITE, @@ -298,7 +289,7 @@ GST_DEBUG_OBJECT (self, "setcaps %" GST_PTR_FORMAT, caps); g_clear_pointer (&self->headers, gst_buffer_list_unref); - self->streamconfig_sent = FALSE; + self->headers_sent = FALSE; s = gst_caps_get_structure (caps, 0); streamheader = gst_structure_get_value (s, "streamheader");
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/srt/gstsrtsink.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/srt/gstsrtsink.h
Changed
@@ -46,10 +46,9 @@ GstBaseSink parent; GstBufferList *headers; + gboolean headers_sent; GstSRTObject *srtobject; - - gboolean streamconfig_sent; }; struct _GstSRTSinkClass {
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/vulkan/vkupload.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/vulkan/vkupload.c
Changed
@@ -283,7 +283,7 @@ plane_size = GST_VIDEO_INFO_PLANE_STRIDE (&raw->out_info, i) * GST_VIDEO_INFO_COMP_HEIGHT (&raw->out_info, i); - g_assert (plane_size < map_info.size); + g_assert (plane_size <= map_info.size); memcpy (map_info.data, v_frame.datai, plane_size); gst_memory_unmap (GST_MEMORY_CAST (mem), &map_info); @@ -392,6 +392,7 @@ GArray *barriers = NULL; VkImageLayout dst_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; GstBufferPool *pool; + GstVideoMeta *in_vmeta, *out_vmeta; pool = gst_base_transform_get_buffer_pool (GST_BASE_TRANSFORM_CAST (raw->upload)); @@ -458,8 +459,11 @@ g_clear_pointer (&barriers, g_array_unref); n_mems = gst_buffer_n_memory (*outbuf); + out_vmeta = gst_buffer_get_video_meta (*outbuf); n_planes = GST_VIDEO_INFO_N_PLANES (&raw->out_info); + in_vmeta = gst_buffer_get_video_meta (inbuf); + for (i = 0; i < n_planes; i++) { VkBufferImageCopy region; GstMemory *in_mem, *out_mem; @@ -469,9 +473,19 @@ VK_IMAGE_ASPECT_PLANE_1_BIT, VK_IMAGE_ASPECT_PLANE_2_BIT, }; VkImageAspectFlags plane_aspect; - guint idx; + guint idx, len; + gsize offset, skip; + offset = in_vmeta ? in_vmeta->offseti + : GST_VIDEO_INFO_PLANE_OFFSET (&raw->in_info, i); + if (!gst_buffer_find_memory (inbuf, offset, 1, &idx, &len, &skip)) { + GST_WARNING_OBJECT (raw->upload, + "Input buffer plane %u, no memory at offset %" G_GSIZE_FORMAT, i, + offset); + goto unlock_error; + } in_mem = gst_buffer_peek_memory (inbuf, i); + if (!gst_is_vulkan_buffer_memory (in_mem)) { GST_WARNING_OBJECT (raw->upload, "Input is not a GstVulkanBufferMemory"); goto unlock_error; @@ -502,8 +516,16 @@ } }; - idx = MIN (i, n_mems - 1); + offset = out_vmeta ? out_vmeta->offseti + : GST_VIDEO_INFO_PLANE_OFFSET (&raw->out_info, i); + if (!gst_buffer_find_memory (*outbuf, offset, 1, &idx, &len, &skip)) { + GST_WARNING_OBJECT (raw->upload, + "Output buffer plane %u, no memory at offset %" G_GSIZE_FORMAT, i, + offset); + goto unlock_error; + } out_mem = gst_buffer_peek_memory (*outbuf, idx); + if (!gst_is_vulkan_image_memory (out_mem)) { GST_WARNING_OBJECT (raw->upload, "Output is not a GstVulkanImageMemory"); goto unlock_error; @@ -654,9 +676,10 @@ GstVulkanCommandBuffer *cmd_buf; GError *error = NULL; GArray *barriers = NULL; - guint i, n_mems, n_planes, n_out_mems; + guint i, n_planes, n_out_mems; VkImageLayout dst_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; GstBufferPool *pool; + GstVideoMeta *in_vmeta, *out_vmeta; pool = gst_base_transform_get_buffer_pool (GST_BASE_TRANSFORM_CAST (raw->upload)); @@ -720,11 +743,12 @@ } g_clear_pointer (&barriers, g_array_unref); - n_mems = gst_buffer_n_memory (inbuf); + in_vmeta = gst_buffer_get_video_meta (inbuf); n_out_mems = gst_buffer_n_memory (*outbuf); + out_vmeta = gst_buffer_get_video_meta (*outbuf); n_planes = GST_VIDEO_INFO_N_PLANES (&raw->in_info); - for (i = 0; i < n_out_mems; i++) { + for (i = 0; i < n_planes; i++) { VkBufferImageCopy region; GstMemory *in_mem = NULL, *out_mem; GstVulkanBufferMemory *buf_mem; @@ -733,10 +757,18 @@ VK_IMAGE_ASPECT_PLANE_1_BIT, VK_IMAGE_ASPECT_PLANE_2_BIT, }; VkImageAspectFlags plane_aspect; - guint idx; + guint idx, len; + gsize offset, skip; - if (i < n_mems) - in_mem = gst_buffer_peek_memory (inbuf, i); + offset = in_vmeta ? in_vmeta->offseti : + GST_VIDEO_INFO_PLANE_OFFSET (&raw->in_info, i); + if (!gst_buffer_find_memory (inbuf, offset, 1, &idx, &len, &skip)) { + GST_WARNING_OBJECT (raw->upload, + "Input buffer plane %u, no memory at offset %" G_GSIZE_FORMAT, i, + offset); + goto unlock_error; + } + in_mem = gst_buffer_peek_memory (inbuf, idx); if (gst_is_vulkan_buffer_memory (in_mem)) { GST_TRACE_OBJECT (raw->upload, "Input is a GstVulkanBufferMemory"); @@ -800,8 +832,15 @@ buf_mem = (GstVulkanBufferMemory *) in_mem; } - idx = MIN (i, n_out_mems - 1); + offset = out_vmeta ? out_vmeta->offseti : GST_VIDEO_INFO_PLANE_OFFSET (&raw->out_info, i); + if (!gst_buffer_find_memory (*outbuf, offset, 1, &idx, &len, &skip)) { + GST_WARNING_OBJECT (raw->upload, + "Output buffer plane %u, no memory at offset %" G_GSIZE_FORMAT, i, + offset); + goto unlock_error; + } out_mem = gst_buffer_peek_memory (*outbuf, idx); + if (!gst_is_vulkan_image_memory (out_mem)) { GST_WARNING_OBJECT (raw->upload, "Output is not a GstVulkanImageMemory"); goto unlock_error; @@ -1336,6 +1375,20 @@ return TRUE; } +static GstBufferPool * +gst_vulkan_upload_create_buffer_pool (GstVulkanUpload * vk_upload) +{ + gboolean is_image; + GstCapsFeatures *feats = gst_caps_get_features (vk_upload->out_caps, 0); + + is_image = + gst_caps_features_contains (feats, GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE); + + if (is_image) + return gst_vulkan_image_buffer_pool_new (vk_upload->device); + return gst_vulkan_buffer_pool_new (vk_upload->device); +} + static gboolean gst_vulkan_upload_decide_allocation (GstBaseTransform * bt, GstQuery * query) { @@ -1360,13 +1413,15 @@ gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); update_pool = TRUE; - is_vulkan_pool = GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool); + is_vulkan_pool = GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool) + || GST_IS_VULKAN_BUFFER_POOL (pool); } else { GstVideoInfo vinfo; gst_video_info_init (&vinfo); gst_video_info_from_caps (&vinfo, caps); - size = vinfo.size; + + size = GST_VIDEO_INFO_SIZE (&vinfo); min = max = 0; is_vulkan_pool = update_pool = FALSE; } @@ -1374,12 +1429,12 @@ if (!pool || !is_vulkan_pool) { if (pool) gst_object_unref (pool); - pool = gst_vulkan_image_buffer_pool_new (vk_upload->device); + pool = gst_vulkan_upload_create_buffer_pool (vk_upload); } config = gst_buffer_pool_get_config (pool); - if (is_vulkan_pool) { + if (GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool)) { gst_vulkan_image_buffer_pool_config_get_allocation_params (config, &usage, &mem_props, &layout, &access); /* these usage parameters are essential for upload */ @@ -1387,8 +1442,16 @@ } gst_buffer_pool_config_set_params (config, caps, size, min, max); - gst_vulkan_image_buffer_pool_config_set_allocation_params (config, usage, - mem_props, layout, access); + + if (GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool)) { + gst_vulkan_image_buffer_pool_config_set_allocation_params (config, usage, + mem_props, layout, access); + } + + if (gst_buffer_pool_has_option (pool, GST_BUFFER_POOL_OPTION_VIDEO_META)) { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + } if (!gst_buffer_pool_set_config (pool, config)) { GST_ERROR_OBJECT (pool, "Vulkan Image buffer pool doesn't support requested"
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/ext/webrtc/gstwebrtcbin.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/ext/webrtc/gstwebrtcbin.c
Changed
@@ -8777,8 +8777,11 @@ { GstWebRTCBin *webrtc = GST_WEBRTC_BIN (object); - if (webrtc->priv->ice) + if (webrtc->priv->ice) { + gst_webrtc_ice_set_on_ice_candidate (webrtc->priv->ice, NULL, NULL, NULL); + g_signal_handlers_disconnect_by_data (webrtc->priv->ice, webrtc); gst_object_unref (webrtc->priv->ice); + } webrtc->priv->ice = NULL; if (webrtc->priv->ice_stream_map)
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-libs/gst/codecparsers/gsth266parser.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-libs/gst/codecparsers/gsth266parser.c
Changed
@@ -1620,6 +1620,10 @@ READ_UE_MAX (nr, sli->num_subpics_minus1, GST_H266_MAX_SLICES_PER_AU - 1); READ_UINT8 (nr, sli->max_sublayers_minus1, 3); + /* The value of sli_max_sublayers_minus1 shall be equal to + vps_max_sublayers_minus1. */ + CHECK_ALLOWED_MAX (sli->max_sublayers_minus1, GST_H266_MAX_SUBLAYERS - 1); + READ_UINT8 (nr, sli->sublayer_info_present_flag, 1); while (!nal_reader_is_byte_aligned (nr))
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-libs/gst/codecparsers/gsth266parser.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-libs/gst/codecparsers/gsth266parser.h
Changed
@@ -43,6 +43,8 @@ /* 7.4.3.3 The value of vps_max_sublayers_minus1 * shall be in the range of 0 to 6, inclusive */ #define GST_H266_MAX_SUBLAYERS 7 +/* 3-bit minus1 value, so max is 7+1 */ +#define GST_H266_MAX_SLI_REF_LEVELS 8 /* 7.4.3.3 vps_num_output_layer_sets_minus2 is u(8) */ #define GST_H266_MAX_TOTAL_NUM_OLSS 257 /* 7.4.3.3 vps_num_ptls_minus1 shall be less than TotalNumOlss, @@ -3171,9 +3173,9 @@ guint16 num_subpics_minus1; guint8 max_sublayers_minus1; guint8 sublayer_info_present_flag; - guint8 non_subpic_layers_fractionGST_H266_MAX_SUBLAYERSGST_H266_MAX_SUBLAYERS; - guint8 ref_level_idcGST_H266_MAX_SUBLAYERSGST_H266_MAX_SUBLAYERS; - guint8 ref_level_fraction_minus1GST_H266_MAX_SUBLAYERSGST_H266_MAX_SLICES_PER_AUGST_H266_MAX_SUBLAYERS; + guint8 non_subpic_layers_fractionGST_H266_MAX_SLI_REF_LEVELSGST_H266_MAX_SUBLAYERS; + guint8 ref_level_idcGST_H266_MAX_SLI_REF_LEVELSGST_H266_MAX_SUBLAYERS; + guint8 ref_level_fraction_minus1GST_H266_MAX_SLI_REF_LEVELSGST_H266_MAX_SLICES_PER_AUGST_H266_MAX_SUBLAYERS; }; /**
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-libs/gst/d3d12/gstd3d12converter-unpack.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-libs/gst/d3d12/gstd3d12converter-unpack.cpp
Changed
@@ -376,7 +376,7 @@ return nullptr; } - if (gst_d3d12_buffer_copy_into (upload_buf, in_buf, &priv->upload_info)) { + if (!gst_d3d12_buffer_copy_into (upload_buf, in_buf, &priv->upload_info)) { GST_ERROR_OBJECT (self, "Couldn't copy to upload buffer"); gst_buffer_unref (upload_buf); return nullptr;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-libs/gst/transcoder/gsttranscoder.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-libs/gst/transcoder/gsttranscoder.c
Changed
@@ -277,6 +277,7 @@ self->transcodebin = gst_element_factory_make ("uritranscodebin", "uritranscodebin"); + gst_object_ref_sink (self->transcodebin); g_object_set (self->transcodebin, "source-uri", self->source_uri, "dest-uri", self->dest_uri, "profile", self->profile, @@ -843,7 +844,7 @@ self->current_state = GST_STATE_NULL; if (self->transcodebin) { gst_element_set_state (self->transcodebin, GST_STATE_NULL); - g_clear_object (&self->transcodebin); + gst_clear_object (&self->transcodebin); } GST_TRACE_OBJECT (self, "Stopped main thread");
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-libs/gst/vulkan/gstvkimagebufferpool.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-libs/gst/vulkan/gstvkimagebufferpool.c
Changed
@@ -57,6 +57,7 @@ guint32 n_profiles; GstVulkanVideoProfile profiles2; GstVulkanOperation *exec; + gboolean add_videometa; }; static void gst_vulkan_image_buffer_pool_finalize (GObject * object); @@ -212,7 +213,7 @@ guint min_buffers, max_buffers; GstCaps *caps = NULL, *decode_caps = NULL, *encode_caps = NULL; GstCapsFeatures *features; - gboolean found, no_multiplane, ret = TRUE; + gboolean found, no_multiplane; guint i; if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers, @@ -378,7 +379,11 @@ priv->usage = requested_usage; - return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret; + /* enable metadata based on config of the pool */ + priv->add_videometa = gst_buffer_pool_config_has_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); /* ERRORS */ wrong_config: @@ -512,6 +517,7 @@ VkImageCreateInfo image_info; GstBuffer *buf; guint i; + gsize offsetGST_VIDEO_MAX_PLANES = { 0, }; /* *INDENT-OFF* */ image_info = (VkImageCreateInfo) { @@ -576,11 +582,24 @@ goto mem_create_failed; } + if (i < GST_VIDEO_MAX_PLANES - 1) + offseti + 1 = mem->size; + gst_buffer_append_memory (buf, mem); } prepare_buffer (vk_pool, buf); + if (priv->add_videometa) { + gsize *off = (priv->n_imgs == 1) ? priv->v_info.offset : offset; + + gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT (&priv->v_info), + GST_VIDEO_INFO_WIDTH (&priv->v_info), + GST_VIDEO_INFO_HEIGHT (&priv->v_info), + GST_VIDEO_INFO_N_PLANES (&priv->v_info), off, priv->v_info.stride); + } + *buffer = buf; return GST_FLOW_OK; @@ -628,6 +647,13 @@ } } +static const gchar ** +gst_vulkan_image_buffer_pool_get_options (GstBufferPool * pool) +{ + static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL }; + return options; +} + /** * gst_vulkan_image_buffer_pool_new: * @device: the #GstVulkanDevice to use @@ -663,6 +689,7 @@ gstbufferpool_class->alloc_buffer = gst_vulkan_image_buffer_pool_alloc; gstbufferpool_class->stop = gst_vulkan_image_buffer_pool_stop; gstbufferpool_class->reset_buffer = gst_vulkan_image_buffer_pool_reset_buffer; + gstbufferpool_class->get_options = gst_vulkan_image_buffer_pool_get_options; } static void
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst-plugins-bad.doap -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst-plugins-bad.doap
Changed
@@ -35,6 +35,16 @@ <release> <Version> + <revision>1.26.3</revision> + <branch>1.26</branch> + <name></name> + <created>2025-06-26</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.26.3.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.26.2</revision> <branch>1.26</branch> <name></name>
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst/bayer/gstbayer2rgb.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst/bayer/gstbayer2rgb.c
Changed
@@ -381,22 +381,20 @@ GstBayer2RGB *bayer2rgb; int width; int height; - const char *name; structure = gst_caps_get_structure (caps, 0); bayer2rgb = GST_BAYER2RGB (base); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { - name = gst_structure_get_name (structure); /* Our name must be either video/x-bayer video/x-raw */ - if (strcmp (name, "video/x-raw")) { + if (gst_structure_has_name (structure, "video/x-bayer")) { *size = GST_ROUND_UP_4 (width) * height * DIV_ROUND_UP (bayer2rgb->bpp, 8); return TRUE; } else { /* For output, calculate according to format */ - *size = width * height * DIV_ROUND_UP (bayer2rgb->bpp, 8); + *size = width * height * 4 * DIV_ROUND_UP (bayer2rgb->bpp, 8); return TRUE; }
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst/bayer/gstrgb2bayer.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst/bayer/gstrgb2bayer.c
Changed
@@ -190,15 +190,13 @@ GstStructure *structure; int width; int height; - const char *name; structure = gst_caps_get_structure (caps, 0); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { - name = gst_structure_get_name (structure); /* Our name must be either video/x-bayer video/x-raw */ - if (g_str_equal (name, "video/x-bayer")) { + if (gst_structure_has_name (structure, "video/x-bayer")) { *size = GST_ROUND_UP_4 (width) * height * DIV_ROUND_UP (rgb2bayer->bpp, 8); return TRUE;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst/mpegtsdemux/tsdemux.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst/mpegtsdemux/tsdemux.c
Changed
@@ -344,6 +344,9 @@ GstClockTime time); static void handle_psi (MpegTSBase * base, GstMpegtsSection * section); +static void calculate_and_push_newsegment (GstTSDemux * demux, + TSDemuxStream * stream, MpegTSBaseProgram * target_program); + #define gst_ts_demux_parent_class parent_class G_DEFINE_TYPE (GstTSDemux, gst_ts_demux, GST_TYPE_MPEGTS_BASE); #define _do_element_init \ @@ -2369,6 +2372,10 @@ * pad already and which otherwise would only be sent on the first buffer * or serialized event (which means very late in case of subtitle streams), * and playsink waits for stream-start or another serialized event */ + if (G_UNLIKELY (stream->need_newsegment)) { + calculate_and_push_newsegment (demux, stream, program); + } + GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event"); gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0)); } @@ -2459,6 +2466,10 @@ * pad already and which otherwise would only be sent on the first buffer * or serialized event (which means very late in case of subtitle streams), * and playsink waits for stream-start or another serialized event */ + if (G_UNLIKELY (stream->need_newsegment)) { + calculate_and_push_newsegment (demux, stream, program); + } + GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event"); gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0)); } @@ -3546,8 +3557,11 @@ if (!gst_byte_reader_get_uint16_be (&reader, &au_size)) goto error; - if (gst_byte_reader_get_remaining (&reader) < au_size) - goto error; + guint rem = gst_byte_reader_get_remaining (&reader); + + if (rem < au_size) { + au_size = rem; + } if (!gst_byte_reader_dup_data (&reader, au_size, &au_data)) goto error; @@ -3581,6 +3595,46 @@ } } +/* Extract Access Unit content in the format used by GStreamer */ +static GstBuffer * +parse_access_unit (GstTSDemux * demux, TSDemuxStream * stream, + GstBufferList ** ret_buffer_list) +{ + MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; + GstBuffer *buffer = NULL; + GstBufferList *buffer_list = NULL; + + if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS && + bs->registration_id == DRF_ID_OPUS) { + buffer_list = parse_opus_access_unit (stream); + } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) { + buffer = parse_jp2k_access_unit (stream); + } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS) { + buffer = parse_aac_adts_frame (stream); + } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS + && bs->registration_id == DRF_ID_KLVA) { + buffer_list = parse_pes_metadata_frame (stream); + } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) { + buffer = parse_jpegxs_access_unit (stream); + } else { + buffer = gst_buffer_new_wrapped (stream->data, stream->current_size); + } + + if (buffer_list != NULL && gst_buffer_list_length (buffer_list) == 1) { + buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0)); + gst_buffer_list_unref (buffer_list); + buffer_list = NULL; + } + + if (buffer == NULL && buffer_list == NULL) { + GST_WARNING_OBJECT (stream->pad, "Failed to extract access unit"); + } + + *ret_buffer_list = buffer_list; + + return buffer; +} + static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream, MpegTSBaseProgram * target_program) @@ -3626,22 +3680,8 @@ "Got Keyframe, ready to go at %" GST_TIME_FORMAT, GST_TIME_ARGS (stream->pts)); - if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS && - bs->registration_id == DRF_ID_OPUS) { - buffer_list = parse_opus_access_unit (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) { - buffer = parse_jp2k_access_unit (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS - && bs->registration_id == DRF_ID_KLVA) { - buffer_list = parse_pes_metadata_frame (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) { - buffer = parse_jpegxs_access_unit (stream); - } else { - buffer = gst_buffer_new_wrapped (stream->data, stream->current_size); - } - + buffer = parse_access_unit (demux, stream, &buffer_list); if (buffer == NULL && buffer_list == NULL) { - res = GST_FLOW_ERROR; goto beach; } @@ -3676,23 +3716,9 @@ goto beach; } } else { - if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS && - bs->registration_id == DRF_ID_OPUS) { - buffer_list = parse_opus_access_unit (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) { - buffer = parse_jp2k_access_unit (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS) { - buffer = parse_aac_adts_frame (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS - && bs->registration_id == DRF_ID_KLVA) { - buffer_list = parse_pes_metadata_frame (stream); - } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) { - buffer = parse_jpegxs_access_unit (stream); - } else { - buffer = gst_buffer_new_wrapped (stream->data, stream->current_size); - } + buffer = parse_access_unit (demux, stream, &buffer_list); + if (buffer == NULL && buffer_list == NULL) { - res = GST_FLOW_ERROR; goto beach; } @@ -3724,13 +3750,6 @@ } } - - if (buffer_list != NULL && gst_buffer_list_length (buffer_list) == 1) { - buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0)); - gst_buffer_list_unref (buffer_list); - buffer_list = NULL; - } - if (G_UNLIKELY (stream->need_newsegment)) calculate_and_push_newsegment (demux, stream, target_program);
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/gst/mpegtsmux/tsmux/tsmuxstream.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/gst/mpegtsmux/tsmux/tsmuxstream.c
Changed
@@ -212,7 +212,12 @@ case TSMUX_ST_PS_TELETEXT: /* needs fixes PES header length */ stream->pi.pes_header_length = 36; - /* fall through */ + stream->id = 0xBD; + stream->stream_type = TSMUX_ST_PRIVATE_DATA; + stream->pi.flags |= + TSMUX_PACKET_FLAG_PES_FULL_HEADER | + TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT; + break; case TSMUX_ST_PS_DVB_SUBPICTURE: /* private stream 1 */ stream->id = 0xBD; @@ -965,15 +970,6 @@ case TSMUX_ST_PS_AUDIO_LPCM: /* FIXME */ break; - case TSMUX_ST_PS_TELETEXT: - /* FIXME empty descriptor for now; - * should be provided by upstream in event or so ? */ - descriptor = - gst_mpegts_descriptor_from_custom (GST_MTS_DESC_DVB_TELETEXT, 0, 1); - - g_ptr_array_add (pmt_stream->descriptors, descriptor); - break; - case TSMUX_ST_PES_METADATA: if (stream->internal_stream_type == TSMUX_ST_PS_ID3) { @@ -1060,6 +1056,14 @@ if (stream->pmt_descriptor) g_ptr_array_add (pmt_stream->descriptors, stream->pmt_descriptor); } + if (stream->internal_stream_type == TSMUX_ST_PS_TELETEXT) { + // FIXME empty descriptor for now; + // How should this be signalled from upstream? + // Definitions in EN300468 - 6.2.43 Teletext descriptor + descriptor = + gst_mpegts_descriptor_from_custom (GST_MTS_DESC_DVB_TELETEXT, 0, 1); + g_ptr_array_add (pmt_stream->descriptors, descriptor); + } default: break; }
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/meson.build -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/meson.build
Changed
@@ -1,5 +1,5 @@ project('gst-plugins-bad', 'c', 'cpp', - version : '1.26.2', + version : '1.26.3', meson_version : '>= 1.4', default_options : 'warning_level=1', 'buildtype=debugoptimized' )
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/po/gst-plugins-bad-1.0.pot -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/po/gst-plugins-bad-1.0.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.26.2\n" +"Project-Id-Version: gst-plugins-bad-1.26.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-05-29 23:57+0100\n" +"POT-Creation-Date: 2025-06-26 21:26+0100\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_url:gst-plugins-bad-1.26.2.tar.xz/po/gst-plugins-bad.pot -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/po/gst-plugins-bad.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.26.2\n" +"Project-Id-Version: gst-plugins-bad-1.26.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-05-29 23:57+0100\n" +"POT-Creation-Date: 2025-06-26 21:26+0100\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_url:gst-plugins-bad-1.26.2.tar.xz/sys/androidmedia/gstamc-codeclist.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/androidmedia/gstamc-codeclist.h
Changed
@@ -44,6 +44,8 @@ GError ** err); gboolean gst_amc_codec_info_handle_is_encoder (GstAmcCodecInfoHandle * handle, gboolean * is_encoder, GError ** err); +gboolean gst_amc_codec_info_handle_is_hardware_accelerated (GstAmcCodecInfoHandle * handle, + gboolean * is_hardware_accelerated, GError ** err); gchar ** gst_amc_codec_info_handle_get_supported_types ( GstAmcCodecInfoHandle * handle, gsize * length, GError ** err); GstAmcCodecCapabilitiesHandle * gst_amc_codec_info_handle_get_capabilities_for_type (
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/androidmedia/gstamc.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/androidmedia/gstamc.c
Changed
@@ -62,6 +62,19 @@ static gboolean accepted_color_formats (GstAmcCodecType * type, gboolean is_encoder); +static const char * +gst_amc_accel_to_string (GstAmcCodecAccel accel) +{ + switch (accel) { + case AMC_CODEC_ACCEL_IS_SW: + return "SW"; + case AMC_CODEC_ACCEL_IS_HW: + return "HW"; + case AMC_CODEC_ACCEL_IS_UNKNOWN: + return "unknown acceleration"; + } +} + static gboolean scan_codecs (GstPlugin * plugin) { @@ -70,13 +83,13 @@ const GstStructure *cache_data; GError *error = NULL; - GST_DEBUG ("Scanning codecs"); + GST_INFO ("Scanning codecs"); if ((cache_data = gst_plugin_get_cache_data (plugin))) { const GValue *arr = gst_structure_get_value (cache_data, "codecs"); guint i, n; - GST_DEBUG ("Getting codecs from cache"); + GST_INFO ("Getting codecs from cache"); n = gst_value_array_get_size (arr); for (i = 0; i < n; i++) { const GValue *cv = gst_value_array_get_value (arr, i); @@ -150,7 +163,8 @@ } if (!gst_amc_codeclist_get_count (&codec_count, &error)) { - GST_ERROR ("Failed to get number of available codecs"); + GST_ERROR ("Failed to get number of available codecs: %s", + error ? error->message : "unknown error"); ret = FALSE; goto done; } @@ -161,7 +175,7 @@ GstAmcCodecInfo *gst_codec_info; GstAmcCodecInfoHandle *codec_info = NULL; gchar *name_str = NULL; - gboolean is_encoder; + gboolean is_encoder, is_hw; gchar **supported_types = NULL; gsize n_supported_types; gsize j; @@ -171,14 +185,16 @@ codec_info = gst_amc_codeclist_get_codec_info_at (i, &error); if (!codec_info) { - GST_ERROR ("Failed to get codec info %d", i); + GST_ERROR ("Failed to get codec info %d: %s", i, + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_codec; } name_str = gst_amc_codec_info_handle_get_name (codec_info, &error); if (!name_str) { - GST_ERROR ("Failed to get codec name"); + GST_ERROR ("Failed to get codec name: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_codec; } @@ -232,23 +248,37 @@ gst_codec_info->name = g_strdup (name_str); if (!gst_amc_codec_info_handle_is_encoder (codec_info, &is_encoder, &error)) { - GST_ERROR ("Failed to detect if codec is an encoder"); + GST_ERROR ("Failed to detect if codec is an encoder: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_codec; } gst_codec_info->is_encoder = is_encoder; gst_codec_info->gl_output_only = FALSE; + if (!gst_amc_codec_info_handle_is_hardware_accelerated (codec_info, &is_hw, + &error)) { + GST_WARNING ("Failed to detect if codec is hardware-accelerated: %s", + error ? error->message : "unknown error"); + g_clear_error (&error); + gst_codec_info->accel = AMC_CODEC_ACCEL_IS_UNKNOWN; + } else { + gst_codec_info->accel = + is_hw ? AMC_CODEC_ACCEL_IS_HW : AMC_CODEC_ACCEL_IS_SW; + } + supported_types = gst_amc_codec_info_handle_get_supported_types (codec_info, &n_supported_types, &error); if (!supported_types) { - GST_ERROR ("Failed to get supported types"); + GST_ERROR ("Failed to get supported types: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_codec; } - GST_INFO ("Codec '%s' has %" G_GSIZE_FORMAT " supported types", name_str, + GST_INFO ("Codec '%s' (%s) has %" G_GSIZE_FORMAT " supported types", + name_str, gst_amc_accel_to_string (gst_codec_info->accel), n_supported_types); gst_codec_info->supported_types = @@ -277,7 +307,8 @@ gst_amc_codec_info_handle_get_capabilities_for_type (codec_info, supported_type_str, &error); if (!capabilities) { - GST_ERROR ("Failed to get capabilities for supported type"); + GST_ERROR ("Failed to get capabilities for supported type: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_supported_type; } @@ -287,7 +318,8 @@ gst_amc_codec_capabilities_handle_get_color_formats (capabilities, &gst_codec_type->n_color_formats, &error); if (!gst_codec_type->color_formats) { - GST_ERROR ("Failed to get color format elements"); + GST_ERROR ("Failed to get color format elements: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_supported_type; } @@ -317,7 +349,8 @@ gst_amc_codec_capabilities_handle_get_profile_levels (capabilities, &gst_codec_type->n_profile_levels, &error); if (error) { - GST_ERROR ("Failed to get profile/levels: %s", error->message); + GST_ERROR ("Failed to get profile/levels: %s", + error ? error->message : "unknown error"); valid_codec = FALSE; goto next_supported_type; } @@ -1728,48 +1761,44 @@ gboolean ret = TRUE; GList *l; - GST_DEBUG ("Registering plugins"); + GST_INFO ("Registering plugins"); for (l = codec_infos.head; l; l = l->next) { GstAmcCodecInfo *codec_info = l->data; - gboolean is_audio = FALSE; - gboolean is_video = FALSE; + gboolean is_video; gint i; - gint n_types; - GST_DEBUG ("Registering codec '%s'", codec_info->name); + GST_INFO ("Registering codec '%s'", codec_info->name); for (i = 0; i < codec_info->n_supported_types; i++) { - GstAmcCodecType *codec_type = &codec_info->supported_typesi; - - if (g_str_has_prefix (codec_type->mime, "audio/")) - is_audio = TRUE; - else if (g_str_has_prefix (codec_type->mime, "video/")) - is_video = TRUE; - } - - n_types = 0; - if (is_audio) - n_types++; - if (is_video) - n_types++; - - for (i = 0; i < n_types; i++) { GTypeQuery type_query; GTypeInfo type_info = { 0, }; GType type, subtype; gchar *type_name, *element_name; guint rank; + GstAmcCodecType *codec_type = &codec_info->supported_typesi; + + if (g_str_has_prefix (codec_type->mime, "audio/")) { + is_video = FALSE; + } else if (g_str_has_prefix (codec_type->mime, "video/")) { + is_video = TRUE; + } else { + GST_INFO ("Skipping codec %s: unsupported type", codec_info->name); + continue; + } if (is_video) { if (codec_info->is_encoder) type = gst_amc_video_enc_get_type (); else type = gst_amc_video_dec_get_type (); - } else if (is_audio && !codec_info->is_encoder) { - type = gst_amc_audio_dec_get_type (); } else { - GST_DEBUG ("Skipping unsupported codec type"); - continue; + if (codec_info->is_encoder) { + GST_FIXME ("Skipping %s: audio encoders are not supported yet", + codec_info->name); + continue; + } else { + type = gst_amc_audio_dec_get_type (); + } } g_type_query (type, &type_query); @@ -1794,26 +1823,61 @@ create_element_name (is_video, codec_info->is_encoder, codec_info->name); - /* Give the Google software codec a secondary rank, - * everything else is likely a hardware codec, except - * OMX.SEC.*.sw.dec (as seen in Galaxy S4). - * - * Also on some devices there are codecs that don't start - * with OMX., while there are also some that do. And on - * some of these devices the ones that don't start with - * OMX. just crash during initialization while the others - * work. To make things even more complicated other devices - * have codecs with the same name that work and no alternatives. - * So just give a lower rank to these non-OMX codecs and hope - * that there's an alternative with a higher rank. - */ - if (g_str_has_prefix (codec_info->name, "OMX.google") || - g_str_has_suffix (codec_info->name, ".sw.dec")) { - /* For video we prefer hardware codecs, for audio we prefer software - * codecs. Hardware codecs don't make much sense for audio */ - rank = is_video ? GST_RANK_SECONDARY : GST_RANK_PRIMARY; - } else if (g_str_has_prefix (codec_info->name, "OMX.Exynos.") - && !is_video) { + if (is_video) { + /* Give PRIMARY+1 rank to all hardware-accelerated video codecs and + * MARGINAL to sw video codecs, because any gstreamer-native codecs + * compiled-in may be higher quality */ + switch (codec_info->accel) { + case AMC_CODEC_ACCEL_IS_HW: + rank = GST_RANK_PRIMARY + 1; + break; + case AMC_CODEC_ACCEL_IS_SW: + rank = GST_RANK_MARGINAL; + break; + case AMC_CODEC_ACCEL_IS_UNKNOWN: + /* Android version is too old, could not auto-detect hw-accel + * status. Try guessing from the name. + * + * Amlogic/Exynos hardware video codecs end in .encoder/.decoder: + * c2.amlogic.avc.decoder + * c2.amlogic.avc.encoder + * c2.amlogic.hevc.decoder + * c2.amlogic.av1.decoder + * c2.exynos.h264.decoder + * c2.exynos.h264.encoder + * c2.exynos.hevc.decoder + * c2.exynos.hevc.encoder + * c2.exynos.vp9.decoder + * c2.exynos.vp9.encoder + * NOTE: c2.google.av1.decoder can be a hw decoder, but it's only + * available in newer Android versions and codec_info->accel + * will work reliably there. + * Software video codecs end in .sw or .secure (usually?): + * c2.amlogic.vp8.decoder.sw + * c2.amlogic.wmv3.decoder.sw + * c2.amlogic.avc.decoder.secure + * As an aside, software audio codecs look like this: + * c2.amlogic.audio.decoder.mp2 + * c2.amlogic.audio.decoder.eac3 + * But we only rank video here. + */ + if ((g_str_has_prefix (codec_info->name, "c2.amlogic") || + g_str_has_prefix (codec_info->name, "c2.exynos")) && + (g_str_has_suffix (codec_info->name, "decoder") || + g_str_has_suffix (codec_info->name, "encoder"))) { + rank = GST_RANK_PRIMARY + 1; + } else { + rank = GST_RANK_MARGINAL; + } + break; + } + } else if (g_str_has_prefix (codec_info->name, "OMX.google.") || + g_str_has_prefix (codec_info->name, "c2.android.") || + g_str_has_prefix (codec_info->name, "c2.amlogic.") || + g_str_has_prefix (codec_info->name, "c2.exynos.")) { + /* Known-high-quality audio codecs get PRIMARY+1 rank */ + rank = GST_RANK_PRIMARY + 1; + } else if (g_str_has_prefix (codec_info->name, "OMX.Exynos.")) { /* OMX.Exynos. audio codecs are existing on some devices like the * Galaxy S5 mini, and cause random crashes (of the device, * not the app!) and generally misbehave. That specific device @@ -1823,16 +1887,28 @@ * ones */ rank = GST_RANK_MARGINAL; - } else if (g_str_has_prefix (codec_info->name, "OMX.")) { - rank = is_video ? GST_RANK_PRIMARY : GST_RANK_SECONDARY; } else { - rank = GST_RANK_MARGINAL; + /* On some devices there are audio codecs that don't start + * with OMX., while there are also some that do. And on + * some of these devices the ones that don't start with + * OMX. just crash during initialization while the others + * work. To make things even more complicated other devices + * have codecs with the same name that work and no alternatives. + * So just give a lower rank to these non-OMX codecs and hope + * that there's an alternative with a higher rank. + */ + if (g_str_has_prefix (codec_info->name, "OMX.")) { + rank = GST_RANK_SECONDARY; + } else { + rank = GST_RANK_MARGINAL; + } } ret |= gst_element_register (plugin, element_name, rank, subtype); g_free (element_name); - is_video = FALSE; + GST_INFO ("Registered %s codec '%s' with rank %u", + gst_amc_accel_to_string (codec_info->accel), codec_info->name, rank); } } @@ -2430,9 +2506,23 @@ } } - GST_DEBUG ("Returning caps for '%s':", codec_info->name); - GST_DEBUG (" raw caps: %" GST_PTR_FORMAT, raw_ret); - GST_DEBUG (" encoded caps: %" GST_PTR_FORMAT, encoded_ret); + /* Split caps into structures to bypass logcat line length limit */ + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_INFO) { + guint i, n; + GST_INFO ("Returning caps for '%s':", codec_info->name); + + GST_INFO (" raw caps:"); + n = gst_caps_get_size (raw_ret); + for (i = 0; i < n; i++) { + GST_INFO (" %" GST_PTR_FORMAT, gst_caps_get_structure (raw_ret, i)); + } + + GST_INFO (" encoded caps:"); + n = gst_caps_get_size (encoded_ret); + for (i = 0; i < n; i++) { + GST_INFO (" %" GST_PTR_FORMAT, gst_caps_get_structure (encoded_ret, i)); + } + } } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/androidmedia/gstamc.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/androidmedia/gstamc.h
Changed
@@ -43,9 +43,17 @@ gsize n_profile_levels; }; +typedef enum +{ + AMC_CODEC_ACCEL_IS_SW, + AMC_CODEC_ACCEL_IS_HW, + AMC_CODEC_ACCEL_IS_UNKNOWN, +} GstAmcCodecAccel; + struct _GstAmcCodecInfo { gchar *name; gboolean is_encoder; + GstAmcCodecAccel accel; gboolean gl_output_only; GstAmcCodecType *supported_types; gint n_supported_types;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/androidmedia/jni/gstamc-codeclist-jni.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/androidmedia/jni/gstamc-codeclist-jni.c
Changed
@@ -52,6 +52,7 @@ jmethodID get_name; jmethodID get_supported_types; jmethodID is_encoder; + jmethodID is_hardware_accelerated; } media_codecinfo; static struct @@ -158,6 +159,16 @@ return FALSE; } + media_codecinfo.is_hardware_accelerated = + gst_amc_jni_get_method_id (env, &err, media_codecinfo.klass, + "isHardwareAccelerated", "()Z"); + if (!media_codecinfo.is_hardware_accelerated) { + GST_ERROR ("Failed to get android.media.MediaCodecInfo " + "isHardwareAccelerated(): %s", err->message); + g_clear_error (&err); + return FALSE; + } + media_codeccapabilities.klass = gst_amc_jni_get_class (env, &err, "android/media/MediaCodecInfo$CodecCapabilities"); @@ -309,6 +320,24 @@ return TRUE; } +gboolean +gst_amc_codec_info_handle_is_hardware_accelerated (GstAmcCodecInfoHandle * + handle, gboolean * is_hardware_accelerated, GError ** err) +{ + JNIEnv *env; + + g_return_val_if_fail (handle != NULL, FALSE); + g_return_val_if_fail (is_hardware_accelerated != NULL, FALSE); + + env = gst_amc_jni_get_env (); + + if (!gst_amc_jni_call_boolean_method (env, err, handle->object, + media_codecinfo.is_hardware_accelerated, is_hardware_accelerated)) + return FALSE; + + return TRUE; +} + gchar ** gst_amc_codec_info_handle_get_supported_types (GstAmcCodecInfoHandle * handle, gsize * length, GError ** err)
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/d3d11/gstd3d11compositor.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/d3d11/gstd3d11compositor.cpp
Changed
@@ -2083,6 +2083,8 @@ GstVideoFrame *prepared_frame = gst_video_aggregator_pad_get_prepared_frame (pad); gint x, y, w, h; + gint x_offset = 0; + gint y_offset = 0; GstVideoCropMeta *crop_meta; if (!prepared_frame) @@ -2094,6 +2096,12 @@ break; } + if (cpad->xpos < 0) + x_offset = cpad->xpos; + + if (cpad->ypos < 0) + y_offset = cpad->ypos; + crop_meta = gst_buffer_get_video_crop_meta (prepared_frame->buffer); if (crop_meta) { x = crop_meta->x; @@ -2106,8 +2114,8 @@ h = pad->info.height; } - g_object_set (cpad->convert, "src-x", x, "src-y", y, "src-width", w, - "src-height", h, nullptr); + g_object_set (cpad->convert, "src-x", x - x_offset, "src-y", y - y_offset, + "src-width", w + x_offset, "src-height", h + y_offset, nullptr); if (!gst_d3d11_converter_convert_buffer_unlocked (cpad->convert, prepared_frame->buffer, target_buf)) {
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/d3d11/gstd3d11decoder.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/d3d11/gstd3d11decoder.cpp
Changed
@@ -1739,9 +1739,22 @@ state->info.fps_n *= 2; } } else { - state = gst_video_decoder_set_interlaced_output_state (videodec, - GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_INTERLACE_MODE (info), - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), input_state); + state = gst_video_decoder_set_output_state (videodec, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), input_state); + + if (state) { + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + auto in_s = gst_caps_get_structure (input_state->caps, 0); + if (!gst_structure_has_field (in_s, "interlace-mode")) { + /* Use our parsed info if missed in upstream */ + GST_VIDEO_INFO_INTERLACE_MODE (&state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (info); + GST_VIDEO_INFO_FIELD_ORDER (&state->info) = + GST_VIDEO_INFO_FIELD_ORDER (info); + } + } + } } if (!state) {
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/d3d12/gstd3d12compositor.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/d3d12/gstd3d12compositor.cpp
Changed
@@ -951,7 +951,6 @@ * left unscaled) */ - std::lock_guard < std::recursive_mutex > lk (priv->lock); if (priv->alpha == 0) return TRUE; @@ -983,8 +982,6 @@ gboolean output_has_alpha_comp = FALSE; gint x_offset, y_offset; - std::lock_guard < std::recursive_mutex > lk (priv->lock); - if (GST_VIDEO_INFO_HAS_ALPHA (info) || GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_BGRx || GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_RGBx) { @@ -1090,30 +1087,42 @@ return FALSE; } - /* Skip this frame */ - if (gst_d3d12_compositor_pad_check_frame_obscured (pad, vagg)) - return TRUE; + { + std::lock_guard < std::recursive_mutex > lk (priv->lock); + /* Skip this frame */ + if (gst_d3d12_compositor_pad_check_frame_obscured (pad, vagg)) + return TRUE; - if (!gst_d3d12_compositor_pad_setup_converter (pad, vagg)) - return FALSE; + if (!gst_d3d12_compositor_pad_setup_converter (pad, vagg)) + return FALSE; - gint x, y, w, h; - auto crop_meta = gst_buffer_get_video_crop_meta (buffer); - if (crop_meta) { - x = crop_meta->x; - y = crop_meta->y; - w = crop_meta->width; - h = crop_meta->height; - } else { - x = y = 0; - w = pad->info.width; - h = pad->info.height; - } + gint x, y, w, h; + gint x_offset = 0; + gint y_offset = 0; - g_assert (priv->ctx); + if (priv->xpos < 0) + x_offset = priv->xpos; - g_object_set (priv->ctx->conv, "src-x", x, "src-y", y, "src-width", w, - "src-height", h, nullptr); + if (priv->ypos < 0) + y_offset = priv->ypos; + + auto crop_meta = gst_buffer_get_video_crop_meta (buffer); + if (crop_meta) { + x = crop_meta->x; + y = crop_meta->y; + w = crop_meta->width; + h = crop_meta->height; + } else { + x = y = 0; + w = pad->info.width; + h = pad->info.height; + } + + g_assert (priv->ctx); + + g_object_set (priv->ctx->conv, "src-x", x - x_offset, "src-y", y - y_offset, + "src-width", w + x_offset, "src-height", h + y_offset, nullptr); + } GstD3D12CmdAlloc *gst_ca; if (!gst_d3d12_cmd_alloc_pool_acquire (priv->ctx->ca_pool, &gst_ca)) { @@ -2344,11 +2353,6 @@ return FALSE; } - auto fence = gst_d3d12_device_get_fence_handle (self->device, - D3D12_COMMAND_LIST_TYPE_DIRECT); - gst_d3d12_buffer_set_fence (priv->generated_output_buf, fence, - bg_render->fence_val, FALSE); - if (bg_render->vertex_index_upload) { gst_d3d12_fence_data_push (fence_data, FENCE_NOTIFY_COM (bg_render->vertex_index_upload.Detach ())); @@ -2423,11 +2427,12 @@ } fence_val = pad_priv->ctx->fence_val; - gst_d3d12_buffer_set_fence (priv->generated_output_buf, - fence, fence_val, FALSE); } GST_OBJECT_UNLOCK (self); + gst_d3d12_buffer_set_fence (priv->generated_output_buf, + fence, fence_val, FALSE); + if (ret != GST_FLOW_OK) return ret;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/d3d12/gstd3d12decoder.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/d3d12/gstd3d12decoder.cpp
Changed
@@ -1798,15 +1798,26 @@ auto info = &priv->session->output_info; /* TODO: add support alternate interlace */ - auto state = gst_video_decoder_set_interlaced_output_state (videodec, - GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_INTERLACE_MODE (info), - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), input_state); + auto state = gst_video_decoder_set_output_state (videodec, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), input_state); if (!state) { GST_ERROR_OBJECT (decoder, "Couldn't set output state"); return FALSE; } + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + auto in_s = gst_caps_get_structure (input_state->caps, 0); + if (!gst_structure_has_field (in_s, "interlace-mode")) { + /* Use our parsed info if missed in upstream */ + GST_VIDEO_INFO_INTERLACE_MODE (&state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (info); + GST_VIDEO_INFO_FIELD_ORDER (&state->info) = + GST_VIDEO_INFO_FIELD_ORDER (info); + } + } + state->caps = gst_video_info_to_caps (&state->info); s = gst_caps_get_structure (input_state->caps, 0);
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/decklink/gstdecklink.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/decklink/gstdecklink.cpp
Changed
@@ -2533,13 +2533,11 @@ { GstDecklinkClock *self = GST_DECKLINK_CLOCK (clock); GstClockTime result, start_time, last_time; - GstClockTimeDiff offset; BMDTimeValue time; HRESULT ret; g_mutex_lock (&self->output->lock); start_time = self->output->clock_start_time; - offset = self->output->clock_offset; last_time = self->output->clock_last_time; time = -1; if (!self->output->started) { @@ -2560,13 +2558,6 @@ else result = 0; - if (self->output->clock_restart) { - self->output->clock_offset = result - last_time; - offset = self->output->clock_offset; - self->output->clock_restart = FALSE; - } - result = MAX (last_time, result); - result -= offset; result = MAX (last_time, result); } else { result = last_time; @@ -2579,9 +2570,8 @@ GST_LOG_OBJECT (clock, "result %" GST_TIME_FORMAT " time %" GST_TIME_FORMAT " last time %" - GST_TIME_FORMAT " offset %" GST_TIME_FORMAT " start time %" - GST_TIME_FORMAT " (ret: 0x%08lx)", GST_TIME_ARGS (result), - GST_TIME_ARGS (time), GST_TIME_ARGS (last_time), GST_TIME_ARGS (offset), + GST_TIME_FORMAT " start time %" GST_TIME_FORMAT " (ret: 0x%08lx)", + GST_TIME_ARGS (result), GST_TIME_ARGS (time), GST_TIME_ARGS (last_time), GST_TIME_ARGS (start_time), (unsigned long) ret); return result;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/decklink/gstdecklink.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/decklink/gstdecklink.h
Changed
@@ -552,9 +552,7 @@ GstClock *clock; GstClockTime clock_start_time, clock_last_time, clock_epoch; - GstClockTimeDiff clock_offset; gboolean started; - gboolean clock_restart; /* Everything below protected by mutex */ GMutex lock;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/decklink/gstdecklinkvideosink.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/decklink/gstdecklinkvideosink.cpp
Changed
@@ -757,6 +757,8 @@ GstCaps * filter); static gboolean gst_decklink_video_sink_set_caps (GstBaseSink * bsink, GstCaps * caps); +static GstFlowReturn gst_decklink_video_sink_preroll (GstBaseSink * bsink, + GstBuffer * buffer); static GstFlowReturn gst_decklink_video_sink_render (GstBaseSink * bsink, GstBuffer * buffer); static gboolean gst_decklink_video_sink_open (GstBaseSink * bsink); @@ -810,6 +812,7 @@ GST_DEBUG_FUNCPTR (gst_decklink_video_sink_get_caps); basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_decklink_video_sink_set_caps); + basesink_class->preroll = GST_DEBUG_FUNCPTR (gst_decklink_video_sink_preroll); basesink_class->render = GST_DEBUG_FUNCPTR (gst_decklink_video_sink_render); // FIXME: These are misnamed in basesink! basesink_class->start = GST_DEBUG_FUNCPTR (gst_decklink_video_sink_open); @@ -1340,49 +1343,31 @@ GstClockTime * timestamp, GstClockTime * duration) { GstClock *clock; - GstClockTime internal_base, external_base, internal_offset; + GstClockTime internal_base, external_base, base_time; g_assert (timestamp != NULL); clock = gst_element_get_clock (GST_ELEMENT_CAST (self)); + base_time = gst_element_get_base_time (GST_ELEMENT_CAST (self)); + GST_OBJECT_LOCK (self); internal_base = self->internal_base_time; external_base = self->external_base_time; - internal_offset = self->internal_time_offset; GST_OBJECT_UNLOCK (self); - if (!clock || clock != self->output->clock) { + // If we don't have any initial correlation between multiple clocks + if (external_base == GST_CLOCK_TIME_NONE || + internal_base == GST_CLOCK_TIME_NONE) { + *timestamp = gst_clock_get_internal_time (self->output->clock); + } else if (!clock || clock != self->output->clock) { GstClockTime internal, external, rate_n, rate_d; GstClockTime external_timestamp = *timestamp; - GstClockTime base_time; gst_clock_get_calibration (self->output->clock, &internal, &external, &rate_n, &rate_d); - // Convert to the running time corresponding to both clock times - if (!GST_CLOCK_TIME_IS_VALID (internal_base) || internal < internal_base) - internal = 0; - else - internal -= internal_base; - - if (!GST_CLOCK_TIME_IS_VALID (external_base) || external < external_base) - external = 0; - else - external -= external_base; - - // Convert timestamp to the "running time" since we started scheduled - // playback, that is the difference between the pipeline's base time - // and our own base time. - base_time = gst_element_get_base_time (GST_ELEMENT_CAST (self)); - if (base_time > external_base) - base_time = 0; - else - base_time = external_base - base_time; - - if (external_timestamp < base_time) - external_timestamp = 0; - else - external_timestamp = external_timestamp - base_time; + // get the clock time for this running time + external_timestamp += base_time; // Get the difference in the external time, note // that the running time is external time. @@ -1417,18 +1402,12 @@ } else { GST_LOG_OBJECT (self, "No clock conversion needed, same clocks: %" GST_TIME_FORMAT, GST_TIME_ARGS (*timestamp)); + *timestamp += base_time; } - if (external_base != GST_CLOCK_TIME_NONE && - internal_base != GST_CLOCK_TIME_NONE) - *timestamp += internal_offset; - else - *timestamp = gst_clock_get_internal_time (self->output->clock); - GST_DEBUG_OBJECT (self, "Output timestamp %" GST_TIME_FORMAT - " using clock epoch %" GST_TIME_FORMAT " and offset %" GST_TIME_FORMAT, - GST_TIME_ARGS (*timestamp), GST_TIME_ARGS (self->output->clock_epoch), - GST_TIME_ARGS (internal_offset)); + " using clock epoch %" GST_TIME_FORMAT, + GST_TIME_ARGS (*timestamp), GST_TIME_ARGS (self->output->clock_epoch)); if (clock) gst_object_unref (clock); @@ -2001,6 +1980,49 @@ } static GstFlowReturn +gst_decklink_video_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer) +{ + GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink); + GstFlowReturn flow_ret = GST_FLOW_OK; + GstDecklinkVideoFrame *frame; + GstClockTime running_time, frame_duration; + HRESULT ret; + + if ((flow_ret = gst_decklink_video_sink_prepare (bsink, buffer)) != GST_FLOW_OK) + return flow_ret; + + frame = + (GstDecklinkVideoFrame *) g_queue_pop_head (self->pending_frames); + running_time = gst_clock_get_internal_time (self->output->clock); + + frame_duration = + gst_util_uint64_scale_int (GST_SECOND, self->output->mode->fps_d, + self->output->mode->fps_n); + running_time = gst_util_uint64_scale (running_time, 1, frame_duration); + running_time = gst_util_uint64_scale_ceil (running_time, frame_duration, 1); + + GST_DEBUG_OBJECT (self, "Scheduling preroll video frame %p at %" GST_TIME_FORMAT + " with duration %" GST_TIME_FORMAT, frame, GST_TIME_ARGS (running_time), + GST_TIME_ARGS (frame_duration)); + + ret = self->output->output->ScheduleVideoFrame (frame, + running_time, frame_duration, GST_SECOND); + if (ret != S_OK) { + GST_ELEMENT_ERROR (self, STREAM, FAILED, + (NULL), ("Failed to schedule frame: 0x%08lx", (unsigned long) ret)); + frame->Release (); + flow_ret = GST_FLOW_ERROR; + goto out; + } + frame->Release (); + + return flow_ret; + +out: + return flow_ret; +} + +static GstFlowReturn gst_decklink_video_sink_render (GstBaseSink * bsink, GstBuffer * buffer) { GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink); @@ -2040,30 +2062,24 @@ GST_OBJECT_LOCK (self); self->initial_sync = FALSE; if (clock) { + GstClockTime external_time = gst_clock_get_internal_time (clock); + GstClockTime internal_time = gst_clock_get_internal_time (self->output->clock); + if (clock != self->output->clock) { gst_clock_set_master (self->output->clock, clock); } if (self->external_base_time == GST_CLOCK_TIME_NONE || self->internal_base_time == GST_CLOCK_TIME_NONE) { - self->external_base_time = gst_clock_get_internal_time (clock); - self->internal_base_time = - gst_clock_get_internal_time (self->output->clock); - self->internal_time_offset = self->internal_base_time; - } else if (GST_CLOCK_TIME_IS_VALID (self->internal_pause_time)) { - self->internal_time_offset += - gst_clock_get_internal_time (self->output->clock) - - self->internal_pause_time; - self->internal_pause_time = GST_CLOCK_TIME_NONE; + self->external_base_time = external_time; + self->internal_base_time = internal_time; } GST_INFO_OBJECT (self, "clock has been set to %" GST_PTR_FORMAT ", updated base times - internal: %" GST_TIME_FORMAT - " external: %" GST_TIME_FORMAT " internal offset %" - GST_TIME_FORMAT, clock, + " external: %" GST_TIME_FORMAT, clock, GST_TIME_ARGS (self->internal_base_time), - GST_TIME_ARGS (self->external_base_time), - GST_TIME_ARGS (self->internal_time_offset)); + GST_TIME_ARGS (self->external_base_time)); gst_object_unref (clock); } else { @@ -2075,7 +2091,6 @@ } GST_OBJECT_UNLOCK (self); - while (self->pending_frames->length > 0) { GstDecklinkVideoFrame *frame = (GstDecklinkVideoFrame *) g_queue_pop_head (self->pending_frames); @@ -2176,7 +2191,6 @@ self->output->clock_start_time = GST_CLOCK_TIME_NONE; self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; - self->output->clock_offset = 0; GST_OBJECT_LOCK (self); self->internal_base_time = GST_CLOCK_TIME_NONE; self->external_base_time = GST_CLOCK_TIME_NONE; @@ -2392,7 +2406,6 @@ g_mutex_lock (&self->output->lock); self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; - self->output->clock_offset = 0; g_mutex_unlock (&self->output->lock); gst_element_post_message (element, gst_message_new_clock_provide (GST_OBJECT_CAST (element), @@ -2436,13 +2449,11 @@ g_mutex_lock (&self->output->lock); self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; - self->output->clock_offset = 0; g_mutex_unlock (&self->output->lock); gst_decklink_video_sink_stop (self); GST_OBJECT_LOCK (self); self->internal_base_time = GST_CLOCK_TIME_NONE; self->external_base_time = GST_CLOCK_TIME_NONE; - self->internal_pause_time = GST_CLOCK_TIME_NONE; GST_OBJECT_UNLOCK (self); break; } @@ -2452,8 +2463,6 @@ case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - self->internal_pause_time = - gst_clock_get_internal_time (self->output->clock); break; default: break; @@ -2482,6 +2491,7 @@ /* force a recalculation of clock base times */ self->external_base_time = GST_CLOCK_TIME_NONE; self->internal_base_time = GST_CLOCK_TIME_NONE; + self->initial_sync = TRUE; GST_OBJECT_UNLOCK (self); } break;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/decklink/gstdecklinkvideosink.h -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/decklink/gstdecklinkvideosink.h
Changed
@@ -63,10 +63,6 @@ GstClockTime internal_base_time; GstClockTime external_base_time; - /* really an internal start time */ - GstClockTime internal_time_offset; - GstClockTime internal_pause_time; - GstDecklinkOutput *output; GstVideoVBIEncoder *vbiencoder;
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/nvcodec/gstnvdecoder.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/nvcodec/gstnvdecoder.cpp
Changed
@@ -1988,11 +1988,22 @@ } #endif - state = gst_video_decoder_set_interlaced_output_state (videodec, + state = gst_video_decoder_set_output_state (videodec, GST_VIDEO_INFO_FORMAT (&decoder->output_info), - GST_VIDEO_INFO_INTERLACE_MODE (&decoder->output_info), GST_VIDEO_INFO_WIDTH (&decoder->output_info), GST_VIDEO_INFO_HEIGHT (&decoder->output_info), input_state); + + if (GST_VIDEO_INFO_IS_INTERLACED (&decoder->info)) { + auto in_s = gst_caps_get_structure (input_state->caps, 0); + if (!gst_structure_has_field (in_s, "interlace-mode")) { + /* Use our parsed info if missed in upstream */ + GST_VIDEO_INFO_INTERLACE_MODE (&state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (&decoder->info); + GST_VIDEO_INFO_FIELD_ORDER (&state->info) = + GST_VIDEO_INFO_FIELD_ORDER (&decoder->info); + } + } + state->caps = gst_video_info_to_caps (&state->info); switch (decoder->output_type) {
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/sys/nvcodec/gstnvh265dec.cpp -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/sys/nvcodec/gstnvh265dec.cpp
Changed
@@ -153,6 +153,7 @@ gint max_display_delay; GstVideoFormat out_format; + GstVideoInterlaceMode interlace_mode; } GstNvH265Dec; typedef struct _GstNvH265DecClass @@ -193,6 +194,7 @@ GstContext * context); static gboolean gst_nv_h265_dec_open (GstVideoDecoder * decoder); static gboolean gst_nv_h265_dec_close (GstVideoDecoder * decoder); +static gboolean gst_nv_h265_dec_start (GstVideoDecoder * decoder); static gboolean gst_nv_h265_dec_stop (GstVideoDecoder * decoder); static gboolean gst_nv_h265_dec_negotiate (GstVideoDecoder * decoder); static gboolean gst_nv_h265_dec_decide_allocation (GstVideoDecoder * @@ -334,6 +336,7 @@ decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_open); decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_close); + decoder_class->start = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_stop); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_negotiate); decoder_class->decide_allocation = @@ -490,6 +493,23 @@ } static gboolean +gst_nv_h265_dec_start (GstVideoDecoder * decoder) +{ + GstNvH265Dec *self = GST_NV_H265_DEC (decoder); + + self->width = 0; + self->height = 0; + self->coded_width = 0; + self->coded_height = 0; + self->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; + self->chroma_format_idc = 0; + self->bitdepth = 0; + self->max_dpb_size = 0; + + return GST_VIDEO_DECODER_CLASS (parent_class)->start (decoder); +} + +static gboolean gst_nv_h265_dec_stop (GstVideoDecoder * decoder) { GstNvH265Dec *self = GST_NV_H265_DEC (decoder); @@ -581,6 +601,7 @@ gboolean modified = FALSE; guint max_width, max_height; GstVideoFormat out_format = GST_VIDEO_FORMAT_UNKNOWN; + GstVideoInterlaceMode interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; gboolean is_gbr = FALSE; const GstH265VUIParams *vui = &sps->vui_params; @@ -630,6 +651,26 @@ is_gbr = TRUE; } + if (sps->vui_parameters_present_flag && sps->vui_params.field_seq_flag) { + GST_ELEMENT_WARNING (self, STREAM, NOT_IMPLEMENTED, (nullptr), + ("alternate interlace mode is not properly supported. Output might have wrong aspect ratio")); + } else { + /* 7.4.4 Profile, tier and level sementics */ + if (sps->profile_tier_level.progressive_source_flag && + !sps->profile_tier_level.interlaced_source_flag) { + interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; + } else { + interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED; + } + } + + if (self->interlace_mode != interlace_mode) { + GST_INFO_OBJECT (self, "Interlace mode change %d -> %d", + self->interlace_mode, interlace_mode); + self->interlace_mode = interlace_mode; + modified = TRUE; + } + switch (self->bitdepth) { case 8: if (self->chroma_format_idc == 1) @@ -677,8 +718,8 @@ if (modified || !gst_nv_decoder_is_configured (self->decoder)) { GstVideoInfo info; - gst_video_info_set_format (&info, - self->out_format, self->width, self->height); + gst_video_info_set_interlaced_format (&info, + self->out_format, self->interlace_mode, self->width, self->height); self->max_dpb_size = max_dpb_size; max_width = gst_nv_decoder_get_max_output_size (self->coded_width,
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/tests/check/elements/dashsink.c -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/tests/check/elements/dashsink.c
Changed
@@ -38,10 +38,8 @@ static void tempdir_setup (void) { - const gchar *systmp = g_get_tmp_dir (); - tmpdir = g_build_filename (systmp, "dashsink-test-XXXXXX", NULL); - /* Rewrites tmpdir template input: */ - tmpdir = g_mkdtemp (tmpdir); + tmpdir = g_dir_make_tmp ("dashsink-test-XXXXXX", NULL); + fail_if (tmpdir == NULL); } static void @@ -127,7 +125,6 @@ guint segment_id; fail_unless (gst_structure_get_uint (s, "segment-id", &segment_id)); fail_unless (segment_id < num_segments_expected); - fail_unless (gst_structure_get_clock_time (s, "duration", &segment_duration)); @@ -152,7 +149,7 @@ dump_error (msg); else if (num_segments_expected != 0) { // Success. Check we got the expected number of fragment messages - fail_unless (segments_seen == num_segments_expected); + assert_equals_uint64 (segments_seen, num_segments_expected); } return msg;
View file
_service:download_url:gst-plugins-bad-1.26.3.tar.xz/tests/check/elements/vkupload.c
Added
@@ -0,0 +1,113 @@ +/* GStreamer + * + * unit test for vulkanupload element + * Copyright (C) 2025 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.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 <gst/gst.h> +#include <gst/check/gstcheck.h> +#include <gst/check/gstharness.h> +#include <gst/vulkan/vulkan.h> + +#define SOURCE "videotestsrc num-buffers=1 pattern=blue ! " +#define CAPS "format=NV12, width=320, height=240" + +static void +check_output_buffer (GstBuffer * buf) +{ + GstMapInfo mapinfo; + guint i; + + fail_unless (gst_buffer_map (buf, &mapinfo, GST_MAP_READ)); + + /* Check for a 320x240 blue square in NV12 format */ + /* Y */ + for (i = 0; i < 0x12c00; i++) + fail_unless (mapinfo.datai == 0x29); + /* UV */ + for (i = 0x12c00; i < 0x1c1f0; i++) + fail_unless (mapinfo.datai == 0xf0 && mapinfo.data++i == 0x6e); + gst_buffer_unmap (buf, &mapinfo); +} + +GST_START_TEST (test_vulkan_upload_buffer) +{ + GstHarness *h; + GstBuffer *buf; + + h = gst_harness_new_parse (SOURCE "vulkanupload"); + gst_harness_set_sink_caps_str (h, "video/x-raw(memory:VulkanBuffer), " CAPS); + gst_harness_play (h); + + buf = gst_harness_pull (h); + ck_assert (buf); + check_output_buffer (buf); + + gst_buffer_unref (buf); + gst_harness_teardown (h); +} + +GST_END_TEST; + +GST_START_TEST (test_vulkan_upload_image) +{ + GstHarness *h; + GstBuffer *buf; + + h = gst_harness_new_parse (SOURCE "vulkanupload ! vulkandownload"); + gst_harness_set_sink_caps_str (h, "video/x-raw, " CAPS); + gst_harness_play (h); + + buf = gst_harness_pull (h); + ck_assert (buf); + check_output_buffer (buf); + + gst_buffer_unref (buf); + gst_harness_teardown (h); +} + +GST_END_TEST; + +static Suite * +vkupload_suite (void) +{ + Suite *s = suite_create ("vkupload"); + TCase *tc_basic = tcase_create ("general"); + GstVulkanInstance *instance; + gboolean have_instance; + + suite_add_tcase (s, tc_basic); + + /* FIXME: CI doesn't have a software vulkan renderer (and none exists currently) */ + instance = gst_vulkan_instance_new (); + have_instance = gst_vulkan_instance_open (instance, NULL); + gst_object_unref (instance); + if (have_instance) { + tcase_add_test (tc_basic, test_vulkan_upload_buffer); + tcase_add_test (tc_basic, test_vulkan_upload_image); + } + + return s; +} + +GST_CHECK_MAIN (vkupload);
View file
_service:download_url:gst-plugins-bad-1.26.2.tar.xz/tests/check/meson.build -> _service:download_url:gst-plugins-bad-1.26.3.tar.xz/tests/check/meson.build
Changed
@@ -82,6 +82,9 @@ 'elements/switchbin.c', get_option('switchbin').disabled(), 'elements/videoframe-audiolevel.c', get_option('videoframe_audiolevel').disabled(), 'elements/viewfinderbin.c', + 'elements/vkcolorconvert.c', not gstvulkan_dep.found(), gstvulkan_dep, + 'elements/vkdeviceprovider.c', not gstvulkan_dep.found(), gstvulkan_dep, + 'elements/vkupload.c', not gstvulkan_dep.found(), gstvulkan_dep, 'elements/voamrwbenc.c', not voamrwbenc_dep.found(), voamrwbenc_dep, 'elements/vp9parse.c', false, gstcodecparsers_dep, 'elements/av1parse.c', false, gstcodecparsers_dep, @@ -110,10 +113,8 @@ 'libs/jpegbitwriter.c', false, gstcodecparsers_dep, 'libs/vkmemory.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/analyticsmeta.c', false, gstanalytics_dep, - 'elements/vkcolorconvert.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkwindow.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkdevice.c', not gstvulkan_dep.found(), gstvulkan_dep, - 'elements/vkdeviceprovider.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkcommandpool.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkimage.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkinstance.c', not gstvulkan_dep.found(), gstvulkan_dep,
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
.