Projects
Essentials
gstreamer-plugins-bad-codecs
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
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> +
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
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); + } +
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) {
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;
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
.