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 12
View file
gstreamer-plugins-bad-codecs.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Mon Mar 13 09:59:44 UTC 2023 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.22.1 + +------------------------------------------------------------------- Tue Feb 7 15:38:26 UTC 2023 - Simon Vogl <simon.vogl@gmx.net> - Removed the openh264 gstreamer plugin as openSUSE now ships the
View file
gstreamer-plugins-bad-codecs.spec
Changed
@@ -7,7 +7,7 @@ %define _version 1.22.0 Name: gstreamer-plugins-bad-codecs -Version: 1.22.0 +Version: 1.22.1 Release: 0 Summary: Codecs/plugins for gstreamer-plugins-bad License: LGPL-2.1-or-later
View file
gst-plugins-bad-1.22.0.tar.xz/ChangeLog -> gst-plugins-bad-1.22.1.tar.xz/ChangeLog
Changed
@@ -1,3 +1,462 @@ +=== release 1.22.1 === + +2023-03-04 13:42:32 +0000 Tim-Philipp Müller <tim@centricular.com> + + * NEWS: + * RELEASE: + * gst-plugins-bad.doap: + * meson.build: + Release 1.22.1 + +2023-02-23 14:14:57 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/meson.build: + * sys/applemedia/vtdec.c: + * sys/applemedia/vtdec.h: + vtdec: Correctly retrieve reorder queue length from SPS + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4110> + +2023-03-01 06:36:15 +1100 Jan Schmidt <jan@centricular.com> + + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Fix description and trailing whitespace + Minor fix to mention that the element is also useful on MacOS, + and remove some trailing whitespace + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4096> + +2023-03-01 06:32:19 +1100 Jan Schmidt <jan@centricular.com> + + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Don't wait on main thread for permissions request + Recursively invoking the NSMainLoop can cause crashes in + applications that don't expect it. Instead of waiting for + permission to be granted, move the wait later - until we + actually need device permissions when starting the capture + session. That moves the wait into the streaming thread + instead of the application thread that's setting the pipeline + state to READY. + Instead of a manual state change implementation to open + and close the device, use the basesrc start/stop methods that + are intended for the purpose. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4096> + +2023-02-28 15:26:45 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtenc.c: + vtenc: Fix checking for certain CPU variants when running in VMs + These checks were introduced to prevent exposing ARGB64/RGBA64 in the caps + when running on M1 Pro/Max with macOS <13 because of a bug in VideoToolbox. + Unfortunately, the initial buffer size of 15 is too short when running + in a VM - the CPU brand string there looks like "Apple M1 Pro (Virtual)", + which due to its length causes sysctlbyname to return -1, resulting in + broken formats still showing up in the caps. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4082> + +2023-01-28 02:32:13 +0900 Seungha Yang <seungha@centricular.com> + + * tools/gst-transcoder.c: + tools: Make sure UTF-8 encoded command line arguments on Windows + On Windows, arguments passed in main() are system codepage + encoded and might not be valid UTF-8 string. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4072> + +2023-02-20 03:20:46 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvencoder.cpp: + nvencoder: Fix b-frame encoding on Linux + On Windows, Win32 event handle is used to wait for encoded output, + but it's not available on Linux. We should delay bitstream locking + if encoder returns "need-more-input" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4008> + +2023-02-22 00:47:09 +0900 Seungha Yang <seungha@centricular.com> + + * gst/videoparsers/gsth265parse.c: + * tests/check/elements/h265parse.c: + h265parse: Always set profile on src caps + h265parse should provide profile for autoplugging + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4068> + +2023-02-24 21:58:00 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstjpegdecoder.c: + jpegdecoder: fail early if no input caps have been provided + The jpegdecoder class does not implement the ->parse() virtual function, + and we always need to add the jpegparse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1829 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 21:49:27 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gstav1decoder.c: + av1decoder: fail early if no input caps have been provided + The av1decoder class does not implement the ->parse() virtual function, + and we always need to add the av1parse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 21:38:48 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gstvp9decoder.c: + vp9decoder: fail early if no input caps have been provided + The vp9decoder class does not implement the ->parse() virtual function, + and we always need to add the vp9parse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 21:27:27 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gstvp8decoder.c: + vp8decoder: fail early if no input caps have been provided + The vp8decoder class does not implement the ->parse() virtual function, + it can only accepts frame aligned data. If some element such as filesrc + feed it with unaligned data, the behaviour is undecided. So we should + set_needs_format of the decoder to TRUE, then it can fail with a + "not-negotiated" error early, rather than go on and generate unexpected + error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 21:12:40 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gstmpeg2decoder.c: + mpeg2decoder: fail early if no input caps have been provided + The mpeg2decoder class does not implement the ->parse() virtual function, + and we always need to add the mpegvideoparse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 21:09:31 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gsth264decoder.c: + h264decoder: fail early if no input caps have been provided + The h264decoder class does not implement the ->parse() virtual function, + and we always need to add the h264parse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-02-24 20:15:20 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: fail early if no input caps have been provided + The h265decoder class does not implement the ->parse() virtual function, + and we always need to add the h265parse element before it. So we should + set_needs_format of the decoder to TRUE, then if no parse before it, it + can fail with a "not-negotiated" error early, rather than go on and + generate unexpected error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4066> + +2023-01-27 12:45:10 +0100 Robert Rosengren <robertr@axis.com> + + * ext/curl/gstcurlhttpsrc.c: + curlhttpsrc: Add curl anyauth option + Add curl anyauth option to support http request to endpoints not using + only basic authentication (as default in curl). Also aligning with + curlhttpsink that already uses this option. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4065> + +2023-02-22 15:18:12 +0100 Célestin Marot <c.marot@intopix.com> + + * sys/d3d11/gstd3d11overlaycompositor.cpp: + d3d11overlaycompositor: fix texture width and height + The dimension of the overlay texture directly corresponds to the size of the overlay **buffer** which is given by its video meta. + The dimension at which the overlay should be displayed directly correspond to the overlay `render_width`and `render_height`. + This match the behavior of glimagesink + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4053> + +2023-02-22 11:52:38 +0000 Tim-Philipp Müller <tim@centricular.com> + + * po/fur.po: + gst-plugins-bad: update translations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4041> + +2023-02-16 15:03:25 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * gst-libs/gst/va/gstvaallocator.c: + vaallocator: Check return value from va_sync_surface + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4007> + +2023-02-09 16:54:16 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/va/gstvaav1dec.c: + * sys/va/gstvabaseenc.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvaencoder.c: + * sys/va/gstvah264enc.c: + va: Fix some code defects + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4007> + +2022-12-22 10:17:42 +0000 Philippe Normand <philn@igalia.com> + + * ext/wpe/WPEThreadedView.cpp: + * ext/wpe/wpe-extension/gstwpeextension.c: + wpe: Logging fixes for the WebExtension + Using logging macros without a `GST_CAT_DEFAULT` in scope leads to critical + warnings. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4022> + +2023-02-21 15:19:35 +1100 Matthew Waters <matthew@centricular.com> + + * ext/closedcaption/gstccconverter.c: + ccconverter: don't debug a potentially freed filter caps + Fixes a use-after-free + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4013> + +2023-02-21 00:27:27 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Fix rendering on external handle + Partial revert of the commit 068a5c1053ae05b3c7747243948447e764d25aa6. + That introduced size mismatch between internal and external HWND + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4010> + +2023-02-19 12:01:59 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah265enc.c: + vah265enc: Use helper to update properties. + This is a continuation of the original patch by + Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4009> + +2023-02-14 10:29:00 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * gst-libs/gst/codecparsers/gstav1parser.c: + * gst-libs/gst/codecparsers/gsth265parser.c: + av1parser, h265parser: Fix some code defects + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4003> + +2023-02-07 04:58:04 +1100 Jan Schmidt <jan@centricular.com> + + * ext/webrtc/gstwebrtcstats.c: + webrtc: Calculate the jitter for remote-inbound-rtp stats + Populate the clock-rate in the internal stats structure, so + it can be used by the _get_stats_from_remote_rtp_source_stats() + method to calculate remote receivers' jitter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3994> + +2023-02-01 10:44:26 +1100 Jan Schmidt <jan@centricular.com> + + * ext/webrtc/gstwebrtcstats.c: + webrtcbin: Report full codec-stats for source pads + Use the current caps for webrtcbin srcpads, as received_caps + are only stored for sink pads based on incoming caps events. + Makes it so that webrtcbin stats reports contain fuller + codec information. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3994> + +2023-02-17 14:56:20 +0800 Yinhang Liu <yinhang.liu@intel.com> + + * sys/msdk/gstmsdk.c: + msdkav1enc: fix the category for msdkav1enc debug + The msdkav1enc debug initialized with gst_msdkav1dec_debug, + fix this. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3991> + +2023-02-16 01:36:41 +0900 Seungha Yang <seungha@centricular.com> + + * gst/codectimestamper/gstcodectimestamper.c: + codectimestamper: Fix timestamping on sequence update + ... and enhance debug logging. + Keep internal timestamp offsets on drain, no reason to reset them + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3987> + +2023-02-15 09:45:28 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * gst-libs/gst/codecparsers/gsth264bitwriter.c: + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + codecparsers: {h264,h265}bitwriter: Remove redundant condition checks + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3978> + +2023-02-12 23:17:41 +0900 Seungha Yang <seungha@centricular.com> + + * sys/amfcodec/gstamfav1enc.cpp: + amfav1enc: Set stream-format on caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3961> + +2023-02-12 23:12:21 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvav1enc.cpp: + qsvav1enc: Set stream-format on caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3961> + +2023-02-07 16:25:02 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + * sys/applemedia/vtenc.c: + * sys/applemedia/vtutil.h: + vtenc/vtdec: Fix typo in RGBA64_LE availability define + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3962> + +2023-02-07 16:04:22 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtenc.c: + vtenc: Disable ARGB/RGBA64 caps on M1 Pro/Max with macOS <13 + Fixes #1358. + Passing ARGB64/RGBA64 to vtenc caused the encoding to fail + when running on M1 Pro/Max variants with macOS 12.x, so let's + remove these formats from caps when such scenario is detected. + This issue appears to have been fixed OS-side in macOS 13.0. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3962> + +2023-02-09 18:51:30 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtdec.c: + vtdec: Fix not waiting for async frames when flushing + This was causing incorrect output when seeking, especially + when used with a multithreaded source like `videotestsrc n-threads=2`. + It should now correctly wait for frames still being processed by VT + while vtdec is flushing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3937> + +2023-02-10 12:52:17 +0100 Alessandro Bono <alessandro.bono369@gmail.com> + + * sys/win32ipc/protocol/win32ipcutils.cpp: + win32ipcutils: Add missing include + We are using std::isspace() with one parameter. That function is defined + in the cctype header. + ``` + win32ipcutils.cpp(34): error C2672: 'std::isspace': no matching overloaded function found + win32ipcutils.cpp(34): error C2780: 'bool std::isspace(_Elem,const std::locale &)': expects 2 arguments - 1 provided + ``` + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3936> + +2023-02-06 15:26:48 +0200 Sebastian Dröge <sebastian@centricular.com> + + * gst-libs/gst/codecparsers/gstav1parser.c: + av1parser: Don't consider unknown metadata OBUs a bitstream error + Just don't parse them. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1774 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3924> + +2023-02-07 08:49:24 +0100 Edward Hervey <edward@centricular.com> + + * ext/closedcaption/gstceaccoverlay.c: + closedcaption: Don't leak caps event + All events that we handle should be unreffed + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3906> + +2023-02-03 22:10:12 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvencoder.cpp: + * sys/nvcodec/gstnvencoder.h: + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh265encoder.cpp: + nvencoder: Fix min buffers parameter of allocation query in auto GPU mode + At the time when propose_allocation() get called, encoder session + would not be initialized yet. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3891> + +2023-01-19 11:03:09 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvah264dec.c: + va: Avoid the array index overflow when filling 8x8 scaling list. + The VA API has not defined the scaling list entries for U/V planes + for the 4:4:4 stream. In fact, we do not meet the 4:4:4 format output + for H264 so far, and scaling list is not used frequently, so we just + print out some warning and ignore these scaling list values. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3877> + +2022-11-09 20:20:35 +0100 Piotr Brzeziński <piotr@centricular.com> + + * sys/applemedia/vtenc.c: + vtenc: Disable HW acceleration for interlaced ProRes + Due to a bug in the VT API, attempting to encode interlaced content + with ProRes results in an error, halting the pipeline instead of + gracefully falling back to software encoding. + Should be removed in the future if Apple ever fixes this issue. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3878> + +2023-02-01 17:26:57 +0200 Sebastian Dröge <sebastian@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * ext/aom/gstav1dec.c: + * ext/aom/gstav1enc.c: + aom: Include stream-format and alignment in the AV1 caps + The decoder does not work with arbitrary alignment and annexb stream + format and the encoder can give the information that it outputs + obu-stream/tu to downstream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3873> + +2023-02-02 05:04:48 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvvp9dec.c: + nvvp9dec: Fix return value + It should return GstFlowReturn value, not boolean + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3874> + +2023-01-27 15:54:48 -0300 Thibault Saunier <tsaunier@igalia.com> + + * gst/transcode/gsturitranscodebin.c: + uritranscodebin: Fix unref of NULL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3837> + +2022-12-30 00:49:27 +0900 Seungha Yang <seungha@centricular.com> + + * gst/mpegdemux/gstmpegdemux.c: + mpegpsdemux: Ignore DTS if PTS < DTS + It's possibly timestamp rollover case. But PTS < DTS is already + invalid case anyway. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3836> + +2023-01-24 23:26:50 +0900 Seungha Yang <seungha@centricular.com> + + * sys/wasapi2/gstwasapi2ringbuffer.cpp: + wasapi2src: Fix loopback capture on Windows 10 Anniversary Update + ... or older. Work around an OS bug that loopback capture + device doesn't notify event. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1738 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3820> + +2023-01-04 17:30:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/vulkan/gstvkmemory.c: + vulkan: memory: Flush non coherent memory after write. + Spec 7.1.3: + If a memory object does not have the VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + property, then vkFlushMappedMemoryRanges must be called in order to guarantee + that writes to the memory object from the host are made available to the host + domain, where they can be further made available to the device domain via a + domain operation. Similarly, vkInvalidateMappedMemoryRanges must be called to + guarantee that writes which are available to the host domain are made visible to + host operations. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3817> + +2023-01-24 11:26:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/nvcodec/plugin.c: + nvcodec: Log readable errors when initializing CUDA + It is really difficult for people to figure out why nvcodec has + 0 features. Even the debug log is cryptic. Also make sure the errors + go to the ERROR log level, which is more likely to be enabled by + default. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3813> + +2023-01-24 11:16:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * sys/nvcodec/plugin.c: + nvcodec: Fix reporting of CuDeviceGetCount error + cuda_ret is was always going to be CUDA_SUCCESS in the error log. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3813> + +2023-01-25 16:46:42 +0000 Tim-Philipp Müller <tim@centricular.com> + + * meson.build: + Back to development + === release 1.22.0 === 2023-01-23 19:29:34 +0000 Tim-Philipp Müller <tim@centricular.com>
View file
gst-plugins-bad-1.22.0.tar.xz/NEWS -> gst-plugins-bad-1.22.1.tar.xz/NEWS
Changed
@@ -2,10 +2,13 @@ GStreamer 1.22.0 was originally released on 23 January 2023. +The latest bug-fix release in the stable 1.22 series is 1.22.1 and was +released on 04 March 2023. + See https://gstreamer.freedesktop.org/releases/1.22/ for the latest version of this document. -Last updated: Monday 23 January 2023, 17:00 UTC (log) +Last updated: Monday 04 March 2023, 13:00 UTC (log) Introduction @@ -298,8 +301,8 @@ - This is enabled by setting the instant-uri property to true, setting the URI to switch to immediately, and then disabling the instant-uri property again afterwards. -- playbin3, decodebin3, uridecodebin3, parsebin, and urisrc are no - longer experimental +- playbin3, decodebin3, uridecodebin3, parsebin, and urisourcebin are + no longer experimental - They were originally marked as ‘technology preview’ but have since seen extensive usage in production settings, so are considered ready for general use now. @@ -819,9 +822,9 @@ New MP4 muxer + Fragmented MP4 muxer -- fmp4mux: New fragmented MP4/ISOBMFF/CMAF muxer for generating - e.g. DASH/HLS media fragments. -- isomp4mux: New non-fragmented, normal MP4 muxer. +- isofmp4mux, cmafmux, dashmp4mux, onviffmp4mux: New fragmented + MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments. +- isomp4mux, onvifmp4mux: New non-fragmented, normal MP4 muxer. Both plugins provides elements that replace the existing qtmux/mp4mux element from gst-plugins-good. While not feature-equivalent yet, the new @@ -1217,6 +1220,240 @@ 1.22.0 was originally released on 23 January 2023. +1.22.1 + +The first 1.22 bug-fix release (1.22.1) was released on 04 March 2023. + +This release only contains bugfixes and it should be safe to update from +1.22.0. + +Highlighted bugfixes in 1.22.1 + +- audio channel-mix: allow up to 64 channels (instead of up to 63 + channels) +- avfvideosrc: Don’t wait on main thread for permissions request +- avvidenc: avoid generating inaccurate output timestamps, especially + with variable framerate streams +- AV1 video codec caps signalling improvements in various elements +- codectimestamper: Fix timestamping on sequence update +- d3d11overlaycompositor: fix texture width and height +- d3d11videosink: Fix rendering on external handle +- dashdemux2: fix seek operation taking a log time to finish for some + streams +- nvencoder: Fix B-frame encoding on Linux and min buffers in auto GPU + mode +- playbin3: fixing buffering for live pipelines +- playbin: fix potential deadlock when stopping stream with subtitles + visible +- redenc: fix setting of extension ID for twcc +- rtspsrc: improved compatibility with more broken RTSP servers +- v4l2h264dec: Fix Raspberry Pi4 will not play video in application +- vtdec: fix jittery playback of H.264 Level 4.1 movies in macOS +- vtdec: Fix non-deterministic frame output after flushing seeks +- vtenc: fix handling of interlaced ProRes on Apple M1 hardware +- vtenc: don’t advertise ARGB/RGBA64 input caps on M1 Pro/Max with + macOS <13 +- wasapi2src: Fix loopback capture on Windows 10 Anniversary Update +- tools: better handling of non-ASCII command line arguments on + Windows +- gst-libav: fix build against newer ffmpeg versions +- gst-python: Use arch-specific install dir for gi overrides +- cerbero: Fix setuptools site.py breakage in Python 3.11 +- macOS packages: Fix broken binaries on macos < 11.0 +- various bug fixes, memory leak fixes, and other stability and + reliability improvements + +gstreamer + +- buffer: fix copy meta reference debug log formatting +- bin: Don’t unlock unlocked mutex in gst_bin_remove_func() +- pad: Don’t leak user_data in gst_pad_start_task() +- aggregator: Always lock aggpad around update_time_level +- inputselector: Avoid potential deadlock when shutting down, + e.g. playbin with subtitles +- multiqueue: Handle use-interleave latency live pipelines, fixing + buffering for live pipelines in playbin3 +- GstBaseSrc: fix transfer annotation for fixate() virtual method +- GstBaseSrc, GstPushSrc: add nullable annotations to virtual methods +- tools: Make sure UTF-8 encoded command line arguments on Windows + +gst-plugins-base + +- alsasink: Fix stall when going from PLAYING to NULL (stucked at + PAUSED) with uac1 gadget +- appsrc: Don’t chain up BaseSrc::negotiate() +- audio: channel-mix: Fix channel count limit to be able to equal 64 +- gldisplay: Mark gst_gl_display_create_context() other_context + parameter as nullable +- gldisplay: Remove unused code +- gstglwindow_x11.c: Fix colormap leak +- gl/cocoa: Return a strong ref to the parent GstGLContext +- rtspconnection: Annotate RTSP message and RTSP events parameters + correctly +- sdp, typefind: Fix some annotations +- sdp: gstmikey: gst_mikey_message_to_caps: extract ROC from first + crypto session +- subparse: Properly forward segment seqnum +- uridecodebin: Set source element to READY before querying it +- uritranscodebin: Fix unref of NULL +- gst-play-1.0: Don’t force accurate seeking + +gst-plugins-good + +- adaptivedemux2: Fix buffering threshold initialization +- dashdemux2: the seek operation takes a log time to finish for some + streams +- glvideomixer: Keep a reference to the underlying pad +- qtdemux: Don’t emit GstSegment correcting start time when in MSE + mode +- qtdemux: Handle moov atom length=0 case by reading until the end +- qtdemux, qtmux: Drop av1C version 0 parsing and implement version 1 + parsing/writing +- qtmux: Fix assertion on caps update +- redenc: fix setting of extension ID for twcc +- rtspsrc: Use the correct vfunc for the push-backchannel-sample + action signal +- rtpssrcdemux: set different stream-id on each src pad +- udpsrc: GstSocketTimestampMessage only for SCM_TIMESTAMPNS +- v4l2h264dec: Fix Raspberry Pi4 will not play video in application + +gst-plugins-bad + +- aom: Include stream-format and alignment in the AV1 caps +- av1parser, h265parser: Fix some code defects +- av1parser: Don’t consider unknown metadata OBUs a bitstream error +- avfvideosrc: Don’t wait on main thread for permissions request +- ccconverter: don’t debug a potentially freed filter caps +- codectimestamper: Fix timestamping on sequence update +- codecparsers: {h264, h265}bitwriter: Remove redundant condition + checks +- codecs: decoders: fail early if no input caps have been provided for + all new decoder base classes +- closedcaption: Don’t leak caps event +- curlhttpsrc: Add curl anyauth option +- d3d11overlaycompositor: fix texture width and height +- d3d11videosink: Fix rendering on external handle +- h265parse: Always set profile on src caps +- msdkav1enc: fix the category for msdkav1enc debug +- nvcodec: improve error reporting on plugin init +- nvencoder: Fix b-frame encoding on Linux +- nvencoder: Fix min buffers parameter of allocation query in auto GPU + mode +- nvvp9dec: Fix return value +- qsvav1enc, amfav1enc: Set stream-format on caps +- vtdec: Jittery playback of H.264 Level 4.1 movies in macOS (both + x86_64 and arm64) +- vtdec: Fix DPB size calculations not taking values from SPS into + account +- vtdec: Fix not waiting for async frames when flushing +- vtenc: Disable ARGB/RGBA64 caps on M1 Pro/Max with macOS <13 +- vtenc: Fix checking for certain CPU variants when running in VMs +- vtenc: Disable HW acceleration for interlaced ProRes +- va: Avoid the array index overflow when filling 8x8 scaling list. +- va: Fix some code defects +- vah265enc: Use helper to update properties. +- vulkan: memory: Flush non coherent memory after write. +- wasapi2src: Fix loopback capture on Windows 10 Anniversary Update +- webrtcbin: small stats improvements +- win32ipcutils: Add missing include +- wpe: Logging fixes for the WebExtension + +gst-plugins-ugly + +- mpegpsdemux: Ignore DTS if PTS < DTS + +gst-libav + +- avauddec, avviddec: Free packet side data after usage +- avviddec: change + AV_CODEC_CAP_AUTO_THREADS->AV_CODEC_CAP_OTHER_THREADS to fix build + against newer ffmpeg versions +- Memory leak in ’ av_packet_add_side_data’ in + /lib/x86_64-linux-gnu/libavcodec.so reading the file + clock_odd_size_RLE_g1597902.avi +- avvidenc: Don’t take ffmpeg timestamps verbatim but only use them to + calculate DTS + +gst-rtsp-server + +- No changes + +gstreamer-vaapi + +- vaapi: Skip plugin pc file for shared plugins + +gstreamer-sharp + +- No changes + +gst-omx + +- No changes + +gst-python + +- gst-python: Use arch-specific install dir for gi overrides + +gst-editing-services + +- No changes + +gst-validate + gst-integration-testsuites + +- validate:scenario: sink refs when building +- tests: Fix known issue definition location for unit tests and how we + handle them in validate launcher +- tests: mark elements_srtp.test_play test as flaky +- Fix gstreamer-validate-1.0 dependency name +- validate-scenario: fix g-i warning in annotation +- validate: Fix gst_validate_execute_action annotation + +gst-examples + +- webrtc examples: Use webrtc.gstreamer.net +- webrtc_sendrecv.py: Various fixes + +Development build environment + +- gst-env: Handle installing python modules to dist-packages +- meson: Allow sysdeps to be forced as fallback subprojects +- meson: Switch dav1d wrap to a tarball and update to dav1d 1.1.0 + +Cerbero build tool and packaging changes in 1.22.1 + +- macos: Fix broken binaries on macos < 11.0 +- orc: Update pthread_jit_write_protect fix for macOS/iOS +- dav1d: Update to 1.1.0 +- libsrtp: update to v2.5.0 +- rustup: Update to 1.25.2 +- rust: Update to 1.67; cargo-c to 0.9.16 +- cerbero: Don’t error out if bindir already exists +- Fix setuptools site.py breakage in Python 3.11, bump + gobject-introspection, bump windows image +- cerbero: Retry if cargo update fails on macOS +- gst-plugins-rs: Build glib/gio bindings with 2.74 API support + +Contributors to 1.22.1 + +Alessandro Bono, Arun Raghavan, Bart Van Severen, Carlos Falgueras +García, Célestin Marot, David Svensson Fors, Edward Hervey, Enrique +Ocaña González, Frank Dana, Guillaume Desmottes, He Junyan, James +Hilliard, Jan Alexander Steffens (heftig), Jan Schmidt, Jordan Petridis, +Mathieu Duponchelle, Matthew Waters, medithe, Mengkejiergeli Ba, Nicolas +Beland, Nirbheek Chauhan, Patricia Muscalu, Pawel Stawicki, Philippe +Normand, Piotr Brzeziński, Rajneesh Soni, Robert Rosengren, Sanchayan +Maity, Sebastian Dröge, Seungha Yang, Simon Himmelbauer, Thibault +Saunier, Tim-Philipp Müller, Tristan van Berkom, U. Artie Eoff, Víctor +Manuel Jáquez Leal, Vivia Nikolaidou, Xuchen Yang, Yinhang Liu, + +… 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.22.1 + +- List of Merge Requests applied in 1.22.1 +- List of Issues fixed in 1.22.1 + Schedule for 1.24 Our next major feature release will be 1.24, and 1.23 will be the
View file
gst-plugins-bad-1.22.0.tar.xz/RELEASE -> gst-plugins-bad-1.22.1.tar.xz/RELEASE
Changed
@@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-bad 1.22.0. +This is GStreamer gst-plugins-bad 1.22.1. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework!
View file
gst-plugins-bad-1.22.0.tar.xz/docs/plugins/gst_plugins_cache.json -> gst-plugins-bad-1.22.1.tar.xz/docs/plugins/gst_plugins_cache.json
Changed
@@ -1113,7 +1113,7 @@ "long-name": "AV1 Decoder", "pad-templates": { "sink": { - "caps": "video/x-av1:\n", + "caps": "video/x-av1:\n stream-format: obu-stream\n alignment: tu\n", "direction": "sink", "presence": "always" }, @@ -1149,7 +1149,7 @@ "presence": "always" }, "src": { - "caps": "video/x-av1:\n alignment: tu\n", + "caps": "video/x-av1:\n stream-format: obu-stream\n alignment: tu\n", "direction": "src", "presence": "always" } @@ -225397,7 +225397,7 @@ "presence": "always" }, "src": { - "caps": "video/x-av1:\n width: 16, 8192 \n height: 16, 8192 \n alignment: tu\n", + "caps": "video/x-av1:\n width: 16, 8192 \n height: 16, 8192 \n stream-format: obu-stream\n alignment: tu\n", "direction": "src", "presence": "always" }
View file
gst-plugins-bad-1.22.0.tar.xz/ext/aom/gstav1dec.c -> gst-plugins-bad-1.22.1.tar.xz/ext/aom/gstav1dec.c
Changed
@@ -44,7 +44,8 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-av1") + GST_STATIC_CAPS ("video/x-av1, " + "stream-format = (string) obu-stream, " "alignment = (string) tu") ); static GstStaticPadTemplate gst_av1_dec_src_pad_template =
View file
gst-plugins-bad-1.22.0.tar.xz/ext/aom/gstav1enc.c -> gst-plugins-bad-1.22.1.tar.xz/ext/aom/gstav1enc.c
Changed
@@ -285,7 +285,8 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-av1, alignment = (string) tu") + GST_STATIC_CAPS ("video/x-av1, " + "stream-format = (string) obu-stream, " "alignment = (string) tu") ); static void
View file
gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstccconverter.c -> gst-plugins-bad-1.22.1.tar.xz/ext/closedcaption/gstccconverter.c
Changed
@@ -352,7 +352,6 @@ tmp = gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (res); - gst_caps_unref (filter); res = tmp; } @@ -363,6 +362,8 @@ GST_DEBUG_OBJECT (self, "filter %" GST_PTR_FORMAT, filter); GST_DEBUG_OBJECT (self, "to %" GST_PTR_FORMAT, res); + gst_clear_caps (&filter); + return res; }
View file
gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstceaccoverlay.c -> gst-plugins-bad-1.22.1.tar.xz/ext/closedcaption/gstceaccoverlay.c
Changed
@@ -1000,7 +1000,6 @@ ("received non-TIME newsegment event on text input")); } - gst_event_unref (event); ret = TRUE; /* wake up the video chain, it might be waiting for a text buffer or @@ -1027,7 +1026,6 @@ GST_CEA_CC_OVERLAY_BROADCAST (overlay); GST_CEA_CC_OVERLAY_UNLOCK (overlay); - gst_event_unref (event); ret = TRUE; break; } @@ -1039,7 +1037,6 @@ gst_cea_cc_overlay_pop_text (overlay); gst_segment_init (&overlay->cc_segment, GST_FORMAT_TIME); GST_CEA_CC_OVERLAY_UNLOCK (overlay); - gst_event_unref (event); ret = TRUE; break; case GST_EVENT_FLUSH_START: @@ -1048,7 +1045,6 @@ overlay->cc_flushing = TRUE; GST_CEA_CC_OVERLAY_BROADCAST (overlay); GST_CEA_CC_OVERLAY_UNLOCK (overlay); - gst_event_unref (event); ret = TRUE; break; case GST_EVENT_EOS: @@ -1059,14 +1055,18 @@ * a text segment update */ GST_CEA_CC_OVERLAY_BROADCAST (overlay); GST_CEA_CC_OVERLAY_UNLOCK (overlay); - gst_event_unref (event); ret = TRUE; break; default: - ret = gst_pad_event_default (pad, parent, event); break; } + if (ret) { + gst_event_unref (event); + } else { + ret = gst_pad_event_default (pad, parent, event); + } + return ret; }
View file
gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlhttpsrc.c -> gst-plugins-bad-1.22.1.tar.xz/ext/curl/gstcurlhttpsrc.c
Changed
@@ -1116,6 +1116,7 @@ gst_curl_setopt_str (s, handle, CURLOPT_NOPROXY, s->no_proxy_list); gst_curl_setopt_str (s, handle, CURLOPT_PROXYUSERNAME, s->proxy_user); gst_curl_setopt_str (s, handle, CURLOPT_PROXYPASSWORD, s->proxy_pass); + gst_curl_setopt_generic (s, handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY); for (i = 0; i < s->number_cookies; i++) { gst_curl_setopt_str (s, handle, CURLOPT_COOKIELIST, s->cookiesi);
View file
gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/gstwebrtcstats.c -> gst-plugins-bad-1.22.1.tar.xz/ext/webrtc/gstwebrtcstats.c
Changed
@@ -792,6 +792,9 @@ if (wpad->received_caps) caps = gst_caps_ref (wpad->received_caps); + else + caps = gst_pad_get_current_caps (pad); + GST_DEBUG_OBJECT (pad, "Pad caps are: %" GST_PTR_FORMAT, caps); if (caps && gst_caps_is_fixed (caps)) { GstStructure *caps_s = gst_caps_get_structure (caps, 0); @@ -974,6 +977,7 @@ ts_stats.source_stats->n_values, ts_stats.stream->transport); ts_stats.s = s; + ts_stats.clock_rate = clock_rate; transport_stream_find_ssrc_map_item (ts_stats.stream, &ts_stats, (FindSsrcMapFunc) webrtc_stats_get_from_transport);
View file
gst-plugins-bad-1.22.0.tar.xz/ext/wpe/WPEThreadedView.cpp -> gst-plugins-bad-1.22.1.tar.xz/ext/wpe/WPEThreadedView.cpp
Changed
@@ -296,6 +296,7 @@ GVariant *params = webkit_user_message_get_parameters (message); gboolean res = TRUE; + GST_TRACE_OBJECT(src, "Handling message %s", name); if (!g_strcmp0(name, "gstwpe.new_stream")) { guint32 id = g_variant_get_uint32 (g_variant_get_child_value (params, 0)); const gchar *capsstr = g_variant_get_string (g_variant_get_child_value (params, 1), NULL);
View file
gst-plugins-bad-1.22.0.tar.xz/ext/wpe/wpe-extension/gstwpeextension.c -> gst-plugins-bad-1.22.1.tar.xz/ext/wpe/wpe-extension/gstwpeextension.c
Changed
@@ -30,6 +30,9 @@ #include <gio/gunixfdlist.h> #include <wpe/webkit-web-extension.h> +GST_DEBUG_CATEGORY_STATIC (wpe_extension_debug); +#define GST_CAT_DEFAULT wpe_extension_debug + G_MODULE_EXPORT void webkit_web_extension_initialize (WebKitWebExtension * extension); @@ -42,13 +45,16 @@ gst_init (NULL, NULL); + GST_DEBUG_CATEGORY_INIT (wpe_extension_debug, "wpewebextension", 0, + "GstWPE WebExtension"); + /* Register our own audio sink to */ gst_element_register (NULL, "gstwpeaudiosink", GST_RANK_PRIMARY + 500, gst_wpe_audio_sink_get_type ()); gst_object_unref (g_object_new (gst_wpe_bus_msg_forwarder_get_type (), NULL)); global_extension = extension; - GST_INFO_OBJECT (global_extension, "Setting as global extension."); + GST_INFO ("Setting as global extension."); } void
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c
Changed
@@ -697,7 +697,7 @@ } if (!size) { - return ret = GST_AV1_PARSER_NO_MORE_DATA; + ret = GST_AV1_PARSER_NO_MORE_DATA; goto error; } @@ -1781,7 +1781,8 @@ &bit_reader, &(metadata->timecode)); break; default: - return GST_AV1_PARSER_BITSTREAM_ERROR; + GST_WARNING ("Unknown metadata type %u", metadata->metadata_type); + return GST_AV1_PARSER_OK; } if (retval != GST_AV1_PARSER_OK)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.c
Changed
@@ -1492,8 +1492,7 @@ gboolean have_space = TRUE; GstBitWriter bw; - g_return_val_if_fail (primary_pic_type >= 0 - && primary_pic_type <= 7, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (primary_pic_type <= 7, GST_H264_BIT_WRITER_ERROR); g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.c
Changed
@@ -1792,8 +1792,8 @@ g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); - g_return_val_if_fail (nal_type >= GST_H265_NAL_SLICE_TRAIL_N && - nal_type <= GST_H265_NAL_SLICE_CRA_NUT, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_type <= GST_H265_NAL_SLICE_CRA_NUT, + GST_H265_BIT_WRITER_ERROR); gst_bit_writer_init_with_data (&bw, data, *size, FALSE);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c
Changed
@@ -1889,7 +1889,8 @@ for (j = 0; j <= vps->max_layer_id; j++) { /* layer_id_included_flagij */ /* FIXME: need to parse this when we can support parsing multi-layer info. */ - nal_reader_skip (&nr, 1); + if (!nal_reader_skip (&nr, 1)) + goto error; } } @@ -2762,8 +2763,10 @@ } if (!slice->dependent_slice_segment_flag) { - for (i = 0; i < pps->num_extra_slice_header_bits; i++) - nal_reader_skip (&nr, 1); + for (i = 0; i < pps->num_extra_slice_header_bits; i++) { + if (!nal_reader_skip (&nr, 1)) + goto error; + } READ_UE_MAX (&nr, slice->type, 63); if (pps->output_flag_present_flag)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstav1decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gstav1decoder.c
Changed
@@ -119,6 +119,7 @@ GstAV1DecoderPrivate *priv; gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = priv = gst_av1_decoder_get_instance_private (self);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth264decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gsth264decoder.c
Changed
@@ -340,6 +340,7 @@ GstH264DecoderPrivate *priv; gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = priv = gst_h264_decoder_get_instance_private (self);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth265decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gsth265decoder.c
Changed
@@ -218,6 +218,7 @@ GstH265DecoderPrivate *priv; gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = priv = gst_h265_decoder_get_instance_private (self);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.c
Changed
@@ -329,6 +329,7 @@ gst_mpeg2_decoder_init (GstMpeg2Decoder * self) { gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = gst_mpeg2_decoder_get_instance_private (self);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp8decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gstvp8decoder.c
Changed
@@ -102,6 +102,7 @@ gst_vp8_decoder_init (GstVp8Decoder * self) { gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = gst_vp8_decoder_get_instance_private (self); }
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp9decoder.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/codecs/gstvp9decoder.c
Changed
@@ -140,6 +140,7 @@ gst_vp9_decoder_init (GstVp9Decoder * self) { gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); self->priv = gst_vp9_decoder_get_instance_private (self);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvaallocator.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/va/gstvaallocator.c
Changed
@@ -414,7 +414,8 @@ return NULL; } - va_sync_surface (self->display, surface); + if (!va_sync_surface (self->display, surface)) + return NULL; return self->parent_map (gmem, maxsize, flags); }
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkmemory.c -> gst-plugins-bad-1.22.1.tar.xz/gst-libs/gst/vulkan/gstvkmemory.c
Changed
@@ -142,6 +142,27 @@ static void _vk_mem_unmap_full (GstVulkanMemory * mem, GstMapInfo * info) { + if ((info->flags & GST_MAP_WRITE) + && !(mem->properties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { + GError *error = NULL; + VkResult err; + VkMappedMemoryRange range = { + .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, + /* .pNext = */ + .memory = mem->mem_ptr, + .offset = mem->vk_offset, + .size = mem->mem.size, + }; + + err = vkFlushMappedMemoryRanges (mem->device->device, 1u, &range); + if (gst_vulkan_error_to_g_error (err, &error, + "vkFlushMappedMemoryRanges") < 0) { + GST_CAT_WARNING (GST_CAT_VULKAN_MEMORY, "Failed to flush memory: %s", + error->message); + g_clear_error (&error); + } + } + vkUnmapMemory (mem->device->device, mem->mem_ptr); }
View file
gst-plugins-bad-1.22.0.tar.xz/gst-plugins-bad.doap -> gst-plugins-bad-1.22.1.tar.xz/gst-plugins-bad.doap
Changed
@@ -35,6 +35,16 @@ <release> <Version> + <revision>1.22.1</revision> + <branch>1.22</branch> + <name></name> + <created>2023-03-04</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.22.1.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.22.0</revision> <branch>main</branch> <name></name>
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gstcodectimestamper.c -> gst-plugins-bad-1.22.1.tar.xz/gst/codectimestamper/gstcodectimestamper.c
Changed
@@ -445,7 +445,7 @@ GST_BUFFER_PTS (frame->buffer) = frame->pts; GST_BUFFER_DTS (frame->buffer) = dts; - GST_TRACE_OBJECT (self, "Output %" GST_PTR_FORMAT, frame->buffer); + GST_LOG_OBJECT (self, "Output %" GST_PTR_FORMAT, frame->buffer); ret = gst_pad_push (self->srcpad, g_steal_pointer (&frame->buffer)); @@ -477,15 +477,15 @@ { GstCodecTimestamperPrivate *priv = self->priv; + GST_DEBUG_OBJECT (self, "Draining"); + while (gst_queue_array_get_length (priv->queue) > 0) { GstCodecTimestamperFrame *frame = (GstCodecTimestamperFrame *) gst_queue_array_pop_head_struct (priv->queue); gst_codec_timestamper_output_frame (self, frame); } - priv->time_adjustment = GST_CLOCK_TIME_NONE; - priv->last_dts = GST_CLOCK_TIME_NONE; - priv->last_pts = GST_CLOCK_TIME_NONE; + GST_DEBUG_OBJECT (self, "Drained"); } static gint @@ -509,7 +509,7 @@ gst_codec_timestamper_frame_init (&frame); - GST_TRACE_OBJECT (self, "Handle %" GST_PTR_FORMAT, buffer); + GST_LOG_OBJECT (self, "Handle %" GST_PTR_FORMAT, buffer); pts = GST_BUFFER_PTS (buffer); dts = GST_BUFFER_DTS (buffer); @@ -517,15 +517,24 @@ if (!GST_CLOCK_TIME_IS_VALID (priv->time_adjustment)) { GstClockTime start_time = GST_CLOCK_TIME_NONE; - if (GST_CLOCK_TIME_IS_VALID (pts)) + if (GST_CLOCK_TIME_IS_VALID (pts)) { + GST_DEBUG_OBJECT (self, "Got valid PTS: %" GST_TIME_FORMAT, + GST_TIME_ARGS (pts)); start_time = MAX (pts, priv->in_segment.start); - else if (GST_CLOCK_TIME_IS_VALID (dts)) + } else if (GST_CLOCK_TIME_IS_VALID (dts)) { + GST_DEBUG_OBJECT (self, "Got valid DTS: %" GST_TIME_FORMAT, + GST_TIME_ARGS (dts)); start_time = MAX (dts, priv->in_segment.start); - else + } else { + GST_WARNING_OBJECT (self, "Both PTS and DTS are invalid"); start_time = priv->in_segment.start; + } - if (start_time < min_pts) + if (start_time < min_pts) { priv->time_adjustment = min_pts - start_time; + GST_DEBUG_OBJECT (self, "Updating time-adjustment %" GST_TIME_FORMAT, + GST_TIME_ARGS (priv->time_adjustment)); + } } if (GST_CLOCK_TIME_IS_VALID (priv->time_adjustment)) { @@ -557,6 +566,10 @@ frame.events = priv->current_frame_events; priv->current_frame_events = NULL; + GST_LOG_OBJECT (self, "Enqueue frame, buffer pts %" GST_TIME_FORMAT + ", adjusted pts %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_PTS (buffer)), GST_TIME_ARGS (pts)); + gst_queue_array_push_tail_struct (priv->queue, &frame); if (GST_CLOCK_TIME_IS_VALID (frame.pts)) { g_array_append_val (priv->timestamp_queue, frame.pts);
View file
gst-plugins-bad-1.22.0.tar.xz/gst/mpegdemux/gstmpegdemux.c -> gst-plugins-bad-1.22.1.tar.xz/gst/mpegdemux/gstmpegdemux.c
Changed
@@ -712,6 +712,16 @@ gst_ps_demux_send_segment (demux, stream, pts); + /* Ignores DTS if PTS < DTS. Maybe additional sanity checking is possible + * by comparing 33bits timestap rollover case, but PTS < DTS is already + * invalid case */ + if (GST_CLOCK_TIME_IS_VALID (pts) && GST_CLOCK_TIME_IS_VALID (dts) && + dts > pts) { + GST_WARNING_OBJECT (demux, "PTS (%" GST_TIME_FORMAT ") < DTS (%" + GST_TIME_FORMAT ")", GST_TIME_ARGS (pts), GST_TIME_ARGS (dts)); + dts = GST_CLOCK_TIME_NONE; + } + /* OK, sent new segment now prepare the buffer for sending */ GST_BUFFER_PTS (buf) = pts; GST_BUFFER_DTS (buf) = dts;
View file
gst-plugins-bad-1.22.0.tar.xz/gst/transcode/gsturitranscodebin.c -> gst-plugins-bad-1.22.1.tar.xz/gst/transcode/gsturitranscodebin.c
Changed
@@ -603,13 +603,13 @@ break; case PROP_AUDIO_FILTER: GST_OBJECT_LOCK (self); - gst_object_unref (self->audio_filter); + gst_clear_object (&self->audio_filter); self->audio_filter = g_value_dup_object (value); GST_OBJECT_UNLOCK (self); break; case PROP_VIDEO_FILTER: GST_OBJECT_LOCK (self); - gst_object_unref (self->video_filter); + gst_clear_object (&self->video_filter); self->video_filter = g_value_dup_object (value); GST_OBJECT_UNLOCK (self); break;
View file
gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gsth265parse.c -> gst-plugins-bad-1.22.1.tar.xz/gst/videoparsers/gsth265parse.c
Changed
@@ -2368,6 +2368,60 @@ GstH265Profile p; p = gst_h265_get_profile_from_sps (sps); + /* gst_h265_get_profile_from_sps() method will determine profile + * as defined in spec, with allowing slightly broken profile-tier-level + * bits, then it might not be able to cover all cases. + * If it's still unknown, do guess again */ + if (p == GST_H265_PROFILE_INVALID) { + GST_WARNING_OBJECT (h265parse, "Unknown profile, guessing"); + switch (sps->chroma_format_idc) { + case 0: + if (sps->bit_depth_luma_minus8 == 0) { + p = GST_H265_PROFILE_MONOCHROME; + } else if (sps->bit_depth_luma_minus8 <= 2) { + p = GST_H265_PROFILE_MONOCHROME_10; + } else if (sps->bit_depth_luma_minus8 <= 4) { + p = GST_H265_PROFILE_MONOCHROME_12; + } else { + p = GST_H265_PROFILE_MONOCHROME_16; + } + break; + case 1: + if (sps->bit_depth_luma_minus8 == 0) { + p = GST_H265_PROFILE_MAIN; + } else if (sps->bit_depth_luma_minus8 <= 2) { + p = GST_H265_PROFILE_MAIN_10; + } else if (sps->bit_depth_luma_minus8 <= 4) { + p = GST_H265_PROFILE_MAIN_12; + } else { + p = GST_H265_PROFILE_MAIN_444_16_INTRA; + } + break; + case 2: + if (sps->bit_depth_luma_minus8 <= 2) { + p = GST_H265_PROFILE_MAIN_422_10; + } else if (sps->bit_depth_luma_minus8 <= 4) { + p = GST_H265_PROFILE_MAIN_422_12; + } else { + p = GST_H265_PROFILE_MAIN_444_16_INTRA; + } + break; + case 3: + if (sps->bit_depth_luma_minus8 == 0) { + p = GST_H265_PROFILE_MAIN_444; + } else if (sps->bit_depth_luma_minus8 <= 2) { + p = GST_H265_PROFILE_MAIN_444_10; + } else if (sps->bit_depth_luma_minus8 <= 4) { + p = GST_H265_PROFILE_MAIN_444_12; + } else { + p = GST_H265_PROFILE_MAIN_444_16_INTRA; + } + break; + default: + break; + } + } + profile = gst_h265_profile_to_string (p); if (s && gst_structure_has_field (s, "profile")) {
View file
gst-plugins-bad-1.22.0.tar.xz/meson.build -> gst-plugins-bad-1.22.1.tar.xz/meson.build
Changed
@@ -1,5 +1,5 @@ project('gst-plugins-bad', 'c', 'cpp', - version : '1.22.0', + version : '1.22.1', meson_version : '>= 0.62', default_options : 'warning_level=1', 'buildtype=debugoptimized' )
View file
gst-plugins-bad-1.22.0.tar.xz/po/fur.po -> gst-plugins-bad-1.22.1.tar.xz/po/fur.po
Changed
@@ -1,25 +1,26 @@ # Friulian translation for gst-plugins-bad package of GStreamer project # This file is put in the public domain. -# Fabio Tomat <f.t.public@gmail.com>, 2016. +# Fabio Tomat <f.t.public@gmail.com>, 2023. # msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 1.10.0\n" +"Project-Id-Version: gst-plugins-bad 1.21.90\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2016-12-30 13:28+0100\n" -"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n" +"POT-Creation-Date: 2023-02-22 11:52+0000\n" +"PO-Revision-Date: 2023-01-24 22:38+0000\n" +"Last-Translator: Fabio T. <f.t.public@gmail.com>\n" "Language-Team: Friulian <f.t.public@gmail.com>\n" "Language: fur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Editor: HaiPO 1.4 beta\n" "X-Generator: Poedit 1.8.11\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "No URL set." -msgstr "" +msgstr "Nissun URL configurât." msgid "OpenCV failed to load template image" msgstr "OpenCV nol è rivât a cjariâ la imagjin model" @@ -152,13 +153,11 @@ #~ msgid "No file name specified for writing." #~ msgstr "Nissun non di file specificât pe scriture." -#, c-format #~ msgid "" #~ "Given file name \"%s\" can't be converted to local file name encoding." #~ msgstr "" #~ "Il non di file furnît \"%s\" nol pues jessi convertît te codifiche non " #~ "file locâl." -#, c-format #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "Impussibil vierzi il file \"%s\" pe scriture."
View file
gst-plugins-bad-1.22.0.tar.xz/po/gst-plugins-bad-1.0.pot -> gst-plugins-bad-1.22.1.tar.xz/po/gst-plugins-bad-1.0.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.22.0\n" +"Project-Id-Version: gst-plugins-bad-1.22.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-23 19:35+0000\n" +"POT-Creation-Date: 2023-03-04 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,7 +17,7 @@ "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ext/curl/gstcurlhttpsrc.c:1439 +#: ext/curl/gstcurlhttpsrc.c:1440 msgid "No URL set." msgstr ""
View file
gst-plugins-bad-1.22.0.tar.xz/po/gst-plugins-bad.pot -> gst-plugins-bad-1.22.1.tar.xz/po/gst-plugins-bad.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.22.0\n" +"Project-Id-Version: gst-plugins-bad-1.22.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-23 19:35+0000\n" +"POT-Creation-Date: 2023-03-04 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,7 +17,7 @@ "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ext/curl/gstcurlhttpsrc.c:1439 +#: ext/curl/gstcurlhttpsrc.c:1440 msgid "No URL set." msgstr ""
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfav1enc.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/amfcodec/gstamfav1enc.cpp
Changed
@@ -283,7 +283,7 @@ #define DOC_SRC_CAPS \ "video/x-av1, width = (int) 128, 4096 , height = (int) 128, 4096 , " \ - "profile = (string) main, alignment= (string) tu" + "profile = (string) main, stream-format = (string) obu-stream, alignment= (string) tu" typedef struct _GstAmfAv1Enc { @@ -824,7 +824,7 @@ GstTagList *tags; caps = gst_caps_from_string ("video/x-av1, profile = (string) main, " - "alignment = (string) tu"); + "stream-format = (string) obu-stream, alignment = (string) tu"); output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), caps, state); @@ -1081,8 +1081,8 @@ + ", " + std::to_string (max_height) + " "; sink_caps_str = "video/x-raw, format = (string) NV12, " + resolution_str; - src_caps_str = "video/x-av1, " + resolution_str + ", profile = (string) main, " - "alignment = (string) tu"; + src_caps_str = "video/x-av1, " + resolution_str + ", profile = (string) main" + ", stream-format = (string) obu-stream, alignment = (string) tu"; system_caps = gst_caps_from_string (sink_caps_str.c_str ()); sink_caps = gst_caps_copy (system_caps);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/avfvideosrc.m -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/avfvideosrc.m
Changed
@@ -176,6 +176,10 @@ AVCaptureConnection *connection; CMClockRef inputClock; + NSCondition *permissionCond; + BOOL permissionRequestPending; + BOOL permissionStopRequest; + dispatch_queue_t mainQueue; dispatch_queue_t workerQueue; NSConditionLock *bufQueueLock; @@ -244,7 +248,6 @@ - (BOOL)unlockStop; - (BOOL)query:(GstQuery *)query; - (void)setContext:(GstContext *)context; -- (GstStateChangeReturn)changeState:(GstStateChange)transition; - (GstFlowReturn)create:(GstBuffer **)buf; - (GstCaps *)fixate:(GstCaps *)caps; - (BOOL)decideAllocation:(GstQuery *)query; @@ -332,6 +335,8 @@ workerQueue = dispatch_queue_create ("org.freedesktop.gstreamer.avfvideosrc.output", NULL); + permissionCond = NSCondition alloc init; + gst_base_src_set_live (baseSrc, TRUE); gst_base_src_set_format (baseSrc, GST_FORMAT_TIME); } @@ -343,6 +348,8 @@ { mainQueue = NULL; workerQueue = NULL; + + permissionCond = nil; } - (BOOL)openDeviceInput @@ -350,6 +357,52 @@ NSString *mediaType = AVMediaTypeVideo; NSError *err; + // Since Mojave, permissions are now supposed to be explicitly granted + // before capturing from the camera + if (@available(macOS 10.14, *)) { + // Check if permission has already been granted (or denied) + AVAuthorizationStatus authStatus = AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo; + switch (authStatus) { + case AVAuthorizationStatusDenied: + // The user has explicitly denied permission for media capture. + GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, + ("Device video access permission has been explicitly denied before"), ("Authorization status: %d", (int)authStatus)); + return NO; + case AVAuthorizationStatusRestricted: + // The user is not allowed to access media capture devices. + GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, + ("Device video access permission cannot be granted by the user"), ("Authorization status: %d", (int)authStatus)); + return NO; + case AVAuthorizationStatusAuthorized: + // The user has explicitly granted permission for media capture, + // or explicit user permission is not necessary for the media type in question. + GST_DEBUG_OBJECT (element, "Device video access permission has already been granted"); + break; + case AVAuthorizationStatusNotDetermined: + // Explicit user permission is required for media capture, + // but the user has not yet granted or denied such permission. + GST_DEBUG_OBJECT (element, "Requesting device video access permission"); + + permissionCond lock; + permissionRequestPending = YES; + permissionCond unlock; + + AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { + GST_DEBUG_OBJECT (element, "Device video access permission %s", granted ? "granted" : "not granted"); + // Check if permission has been granted + if (!granted) { + GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, + ("Device video access permission has been denied"), ("Authorization status: %d", (int)AVAuthorizationStatusDenied)); + } + permissionCond lock; + permissionRequestPending = NO; + permissionCond broadcast; + permissionCond unlock; + }; + break; + } + } + if (deviceIndex == DEFAULT_DEVICE_INDEX) { #ifdef HAVE_IOS if (deviceType != DEFAULT_DEVICE_TYPE && position != DEFAULT_POSITION) { @@ -453,60 +506,6 @@ GST_DEBUG_OBJECT (element, "Opening device"); - // Since Mojave, permissions are now supposed to be explicitly granted - // before performing anything on a device - if (@available(macOS 10.14, *)) { - if (captureScreen) - goto checked; - - // Check if permission has already been granted (or denied) - AVAuthorizationStatus authStatus = AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo; - switch (authStatus) { - case AVAuthorizationStatusDenied: - // The user has explicitly denied permission for media capture. - GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, - ("Device video access permission has been explicitly denied before"), ("Authorization status: %d", (int)authStatus)); - return success; - case AVAuthorizationStatusRestricted: - // The user is not allowed to access media capture devices. - GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, - ("Device video access permission cannot be granted by the user"), ("Authorization status: %d", (int)authStatus)); - return success; - case AVAuthorizationStatusAuthorized: - // The user has explicitly granted permission for media capture, - // or explicit user permission is not necessary for the media type in question. - GST_DEBUG_OBJECT (element, "Device video access permission has already been granted"); - break; - case AVAuthorizationStatusNotDetermined: - ; - // Explicit user permission is required for media capture, - // but the user has not yet granted or denied such permission. - dispatch_semaphore_t sema = dispatch_semaphore_create(0); - dispatch_sync (mainQueue, ^{ - AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { - GST_DEBUG_OBJECT (element, "Device video access permission %s", granted ? "granted" : "not granted"); - dispatch_semaphore_signal(sema); - }; - }); - // Block on dialog being answered - if (!NSThread isMainThread) { - dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); - } else { - while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { - NSRunLoop currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:NSDate dateWithTimeIntervalSinceNow:0; - } - } - // Check if permission has been granted - AVAuthorizationStatus videoAuthorizationStatus = AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo; - if (videoAuthorizationStatus != AVAuthorizationStatusAuthorized) { - GST_ELEMENT_ERROR (element, RESOURCE, NOT_AUTHORIZED, - ("Device video access permission has just been denied"), ("Authorization status: %d", (int)videoAuthorizationStatus)); - return success; - } - } - } - -checked: dispatch_sync (mainQueue, ^{ BOOL ret; @@ -535,11 +534,10 @@ connection.videoOrientation = GstAVFVideoSourceOrientation2AVCaptureVideoOrientation(orientation); #endif inputClock = ((AVCaptureInputPort *)connection.inputPorts0).clock; - *successPtr = YES; }); - GST_DEBUG_OBJECT (element, "Opening device %s", success ? "succeed" : "failed"); + GST_DEBUG_OBJECT (element, "Opening device %s", success ? "succeeded" : "failed"); return success; } @@ -915,8 +913,24 @@ gst_caps_replace (&caps, new_caps); GST_INFO_OBJECT (element, "configured caps %"GST_PTR_FORMAT, caps); - if (!session isRunning) - session startRunning; + if (!session isRunning) { + BOOL stopping = NO; + + /* If permissions are still pending, wait for a response before + * starting the capture running, or else we'll get black frames */ + permissionCond lock; + if (permissionRequestPending && !permissionStopRequest) { + GST_DEBUG_OBJECT (element, "Waiting for pending device access permission."); + do { + permissionCond wait; + } while (permissionRequestPending && !permissionStopRequest); + } + stopping = permissionStopRequest; + permissionCond unlock; + + if (!stopping) + session startRunning; + } /* Unlock device configuration only after session is started so the session * won't reset the capture formats */ @@ -928,6 +942,14 @@ - (BOOL)start { + permissionCond lock; + permissionRequestPending = NO; + permissionStopRequest = NO; + permissionCond unlock; + + if (!self openDevice) + return NO; + bufQueueLock = NSConditionLock alloc initWithCondition:NO_BUFFERS; bufQueue = NSMutableArray alloc initWithCapacity:BUFFER_QUEUE_SIZE; stopRequest = NO; @@ -958,6 +980,8 @@ gst_gl_context_helper_free (ctxh); ctxh = NULL; + self closeDevice; + return YES; } @@ -990,6 +1014,11 @@ stopRequest = YES; bufQueueLock unlockWithCondition:HAS_BUFFER_OR_STOP_REQUEST; + permissionCond lock; + permissionStopRequest = YES; + permissionCond broadcast; + permissionCond unlock; + return YES; } @@ -999,24 +1028,11 @@ stopRequest = NO; bufQueueLock unlockWithCondition:(bufQueue count == 0) ? NO_BUFFERS : HAS_BUFFER_OR_STOP_REQUEST; - return YES; -} - -- (GstStateChangeReturn)changeState:(GstStateChange)transition -{ - GstStateChangeReturn ret; - - if (transition == GST_STATE_CHANGE_NULL_TO_READY) { - if (!self openDevice) - return GST_STATE_CHANGE_FAILURE; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - if (transition == GST_STATE_CHANGE_READY_TO_NULL) - self closeDevice; + permissionCond lock; + permissionStopRequest = NO; + permissionCond unlock; - return ret; + return YES; } - (void)captureOutput:(AVCaptureOutput *)captureOutput @@ -1290,8 +1306,6 @@ GValue * value, GParamSpec * pspec); static void gst_avf_video_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static GstStateChangeReturn gst_avf_video_src_change_state ( - GstElement * element, GstStateChange transition); static GstCaps * gst_avf_video_src_get_caps (GstBaseSrc * basesrc, GstCaps * filter); static gboolean gst_avf_video_src_set_caps (GstBaseSrc * basesrc, @@ -1323,7 +1337,6 @@ gobject_class->get_property = gst_avf_video_src_get_property; gobject_class->set_property = gst_avf_video_src_set_property; - gstelement_class->change_state = gst_avf_video_src_change_state; gstelement_class->set_context = gst_avf_video_src_set_context; gstbasesrc_class->get_caps = gst_avf_video_src_get_caps; @@ -1340,7 +1353,7 @@ gst_element_class_set_metadata (gstelement_class, "Video Source (AVFoundation)", "Source/Video/Hardware", - "Reads frames from an iOS AVFoundation device", + "Reads frames from an iOS/MacOS AVFoundation device", "Ole André Vadla Ravnås <oleavr@soundrop.com>"); gst_element_class_add_static_pad_template (gstelement_class, &src_template); @@ -1392,24 +1405,24 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_X, g_param_spec_uint ("screen-crop-x", "Screen capture crop X", - "Horizontal coordinate of top left corner of the screen capture area", + "Horizontal coordinate of top left corner of the screen capture area", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_Y, g_param_spec_uint ("screen-crop-y", "Screen capture crop Y", - "Vertical coordinate of top left corner of the screen capture area", + "Vertical coordinate of top left corner of the screen capture area", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_WIDTH, g_param_spec_uint ("screen-crop-width", "Screen capture crop width", - "Width of the screen capture area (0 = maximum)", + "Width of the screen capture area (0 = maximum)", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_HEIGHT, g_param_spec_uint ("screen-crop-height", "Screen capture crop height", - "Height of the screen capture area (0 = maximum)", + "Height of the screen capture area (0 = maximum)", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif GST_DEBUG_CATEGORY_INIT (gst_avf_video_src_debug, "avfvideosrc", - 0, "iOS AVFoundation video source"); + 0, "iOS/MacOS AVFoundation video source"); gst_type_mark_as_plugin_api (GST_TYPE_AVF_VIDEO_SOURCE_POSITION, 0); gst_type_mark_as_plugin_api (GST_TYPE_AVF_VIDEO_SOURCE_ORIENTATION, 0); @@ -1540,16 +1553,6 @@ } } -static GstStateChangeReturn -gst_avf_video_src_change_state (GstElement * element, GstStateChange transition) -{ - GstStateChangeReturn ret; - - ret = GST_AVF_VIDEO_SRC_IMPL (element) changeState: transition; - - return ret; -} - static GstCaps * gst_avf_video_src_get_caps (GstBaseSrc * basesrc, GstCaps * filter) {
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/meson.build -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/meson.build
Changed
@@ -115,7 +115,7 @@ objcpp_args : gst_plugins_bad_args + applemedia_args + applemedia_objc_args + applemedia_objcpp_args, link_args : noseh_link_args, include_directories : configinc, libsinc, - dependencies : gstvideo_dep, gstaudio_dep, gstpbutils_dep, gst_dep, gstbase_dep, gstgl_dep, gstglproto_dep + applemedia_frameworks, + dependencies : gstvideo_dep, gstaudio_dep, gstpbutils_dep, gst_dep, gstbase_dep, gstgl_dep, gstglproto_dep, gstcodecparsers_dep + applemedia_frameworks, override_options : 'cpp_std=c++11', install : true, install_dir : plugins_install_dir,
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtdec.c -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/vtdec.c
Changed
@@ -169,7 +169,7 @@ { GstCaps *caps = gst_caps_from_string (VIDEO_SRC_CAPS); /* RGBA64_LE is kCVPixelFormatType_64RGBALE, only available on macOS 11.3+ */ - if (GST_VTUTIL_HAVE_64ARGBALE) + if (GST_VTUTIL_HAVE_64RGBALE) caps = gst_vtutil_caps_append_video_format (caps, "RGBA64_LE"); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps)); @@ -299,7 +299,7 @@ return vfmt; break; case GST_VIDEO_FORMAT_RGBA64_LE: - if (GST_VTUTIL_HAVE_64ARGBALE) { + if (GST_VTUTIL_HAVE_64RGBALE) { if (prores) return vfmt; } else { @@ -697,7 +697,7 @@ cv_format = kCVPixelFormatType_64ARGB; break; case GST_VIDEO_FORMAT_RGBA64_LE: - if (GST_VTUTIL_HAVE_64ARGBALE) + if (GST_VTUTIL_HAVE_64RGBALE) cv_format = kCVPixelFormatType_64RGBALE; else /* Codepath will never be hit on macOS older than Big Sur (11.3) */ @@ -1033,7 +1033,7 @@ } } - if (drain) + if (drain || flush) VTDecompressionSessionWaitForAsynchronousFrames (vtdec->session); /* push a buffer if there are enough frames to guarantee that we push in PTS @@ -1066,54 +1066,6 @@ return ret; } -static gboolean -parse_h264_profile_and_level_from_codec_data (GstVtdec * vtdec, - GstBuffer * codec_data, int *profile, int *level) -{ - GstMapInfo map; - guint8 *data; - gint size; - gboolean ret = TRUE; - - gst_buffer_map (codec_data, &map, GST_MAP_READ); - data = map.data; - size = map.size; - - /* parse the avcC data */ - if (size < 7) - goto avcc_too_small; - - /* parse the version, this must be 1 */ - if (data0 != 1) - goto wrong_version; - - /* AVCProfileIndication */ - /* profile_compat */ - /* AVCLevelIndication */ - if (profile) - *profile = data1; - - if (level) - *level = data3; - -out: - gst_buffer_unmap (codec_data, &map); - - return ret; - -avcc_too_small: - GST_ELEMENT_ERROR (vtdec, STREAM, DECODE, (NULL), - ("invalid codec_data buffer length")); - ret = FALSE; - goto out; - -wrong_version: - GST_ELEMENT_ERROR (vtdec, STREAM, DECODE, (NULL), - ("wrong avcC version in codec_data")); - ret = FALSE; - goto out; -} - static int get_dpb_max_mb_s_from_level (GstVtdec * vtdec, int level) { @@ -1170,47 +1122,126 @@ vtdec->reorder_queue_length = 0; } + GST_DEBUG_OBJECT (vtdec, "Reorder queue length: %d", + vtdec->reorder_queue_length); + return TRUE; +} + +static gboolean +parse_h264_decoder_config_record (GstVtdec * vtdec, GstBuffer * codec_data, + GstH264DecoderConfigRecord ** config) +{ + GstH264NalParser *parser = gst_h264_nal_parser_new (); + GstMapInfo map; + gboolean ret = TRUE; + + gst_buffer_map (codec_data, &map, GST_MAP_READ); + + if (gst_h264_parser_parse_decoder_config_record (parser, map.data, map.size, + config) != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (vtdec, "Failed to parse codec-data"); + ret = FALSE; + } + + gst_h264_nal_parser_free (parser); + gst_buffer_unmap (codec_data, &map); + return ret; +} + +static gboolean +get_h264_dpb_size_from_sps (GstVtdec * vtdec, GstH264NalUnit * nalu, + gint * dpb_size) +{ + GstH264ParserResult result; + GstH264SPS sps; + gint width_mb, height_mb; + gint max_dpb_frames, max_dpb_size, max_dpb_mbs; + + result = gst_h264_parse_sps (nalu, &sps); + if (result != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (vtdec, "Failed to parse SPS, result %d", result); + return FALSE; + } + + max_dpb_mbs = get_dpb_max_mb_s_from_level (vtdec, sps.level_idc); + if (max_dpb_mbs == -1) { + GST_ELEMENT_ERROR (vtdec, STREAM, DECODE, (NULL), + ("invalid level found in SPS, could not compute max_dpb_mbs")); + gst_h264_sps_clear (&sps); + return FALSE; + } + + /* This formula is specified in sections A.3.1.h and A.3.2.f of the 2009 + * edition of the standard */ + width_mb = sps.width / 16; + height_mb = sps.height / 16; + max_dpb_frames = MIN (max_dpb_mbs / (width_mb * height_mb), + GST_VTDEC_DPB_MAX_SIZE); + + if (sps.vui_parameters_present_flag + && sps.vui_parameters.bitstream_restriction_flag) + max_dpb_frames = MAX (1, sps.vui_parameters.max_dec_frame_buffering); + + /* Some non-conforming H264 streams may request a number of frames + * larger than the calculated limit. + * See https://chromium-review.googlesource.com/c/chromium/src/+/760276/ + */ + max_dpb_size = MAX (max_dpb_frames, sps.num_ref_frames); + if (max_dpb_size > GST_VTDEC_DPB_MAX_SIZE) { + GST_WARNING_OBJECT (vtdec, "Too large calculated DPB size %d", + max_dpb_size); + max_dpb_size = GST_VTDEC_DPB_MAX_SIZE; + } + + *dpb_size = max_dpb_size; + + gst_h264_sps_clear (&sps); return TRUE; } static gboolean compute_h264_decode_picture_buffer_length (GstVtdec * vtdec, - GstBuffer * codec_data, int *length) + GstBuffer * codec_data, gint * length) { - int profile, level; - int dpb_mb_size = 16; - int max_dpb_size_frames = 16; - int max_dpb_mb_s = -1; - int width_in_mb_s = GST_ROUND_UP_16 (vtdec->video_info.width) / dpb_mb_size; - int height_in_mb_s = GST_ROUND_UP_16 (vtdec->video_info.height) / dpb_mb_size; + GstH264DecoderConfigRecord *config = NULL; + GstH264NalUnit *nalu; + guint8 profile, level; + gboolean ret = TRUE; + gint new_length; + guint i; *length = 0; - if (!parse_h264_profile_and_level_from_codec_data (vtdec, codec_data, - &profile, &level)) + if (vtdec->video_info.width == 0 || vtdec->video_info.height == 0) return FALSE; - if (vtdec->video_info.width == 0 || vtdec->video_info.height == 0) + if (!parse_h264_decoder_config_record (vtdec, codec_data, &config)) return FALSE; + profile = config->profile_indication; + level = config->level_indication; GST_INFO_OBJECT (vtdec, "parsed profile %d, level %d", profile, level); + if (profile == 66) { /* baseline or constrained-baseline, we don't need to reorder */ - return TRUE; + goto out; } - max_dpb_mb_s = get_dpb_max_mb_s_from_level (vtdec, level); - if (max_dpb_mb_s == -1) { - GST_ELEMENT_ERROR (vtdec, STREAM, DECODE, (NULL), - ("invalid level in codec_data, could not compute max_dpb_mb_s")); - return FALSE; + for (i = 0; i < config->sps->len; i++) { + nalu = &g_array_index (config->sps, GstH264NalUnit, i); + + if (nalu->type != GST_H264_NAL_SPS) + continue; + + if (!get_h264_dpb_size_from_sps (vtdec, nalu, &new_length)) + GST_WARNING_OBJECT (vtdec, "Failed to get DPB size from SPS"); + else + *length = MAX (*length, new_length); } - /* this formula is specified in sections A.3.1.h and A.3.2.f of the 2009 - * edition of the standard */ - *length = MIN (floor (max_dpb_mb_s / (width_in_mb_s * height_in_mb_s)), - max_dpb_size_frames); - return TRUE; +out: + gst_h264_decoder_config_record_free (config); + return ret; } static gboolean
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtdec.h -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/vtdec.h
Changed
@@ -30,6 +30,8 @@ #if defined(APPLEMEDIA_MOLTENVK) #include <gst/vulkan/vulkan.h> #endif +#define GST_USE_UNSTABLE_API +#include <gst/codecparsers/gsth264parser.h> G_BEGIN_DECLS @@ -42,6 +44,8 @@ typedef struct _GstVtdec GstVtdec; typedef struct _GstVtdecClass GstVtdecClass; +#define GST_VTDEC_DPB_MAX_SIZE 16 + struct _GstVtdec { GstVideoDecoder base_vtdec;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtenc.c -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/vtenc.c
Changed
@@ -70,6 +70,7 @@ #include "corevideobuffer.h" #include "vtutil.h" #include <gst/pbutils/codec-utils.h> +#include <sys/sysctl.h> #define VTENC_DEFAULT_BITRATE 0 #define VTENC_DEFAULT_FRAME_REORDERING TRUE @@ -201,8 +202,7 @@ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ NV12, I420 }")); #else static GstStaticCaps sink_caps = -GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE - ("{ AYUV64, UYVY, NV12, I420, ARGB64_BE }")); +GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV64, UYVY, NV12, I420 }")); #endif @@ -231,9 +231,37 @@ { GstCaps *caps = gst_static_caps_get (&sink_caps); - /* RGBA64_LE is kCVPixelFormatType_64RGBALE, only available on macOS 11.3+ */ - if (GST_VTUTIL_HAVE_64ARGBALE) - caps = gst_vtutil_caps_append_video_format (caps, "RGBA64_LE"); +#ifndef HAVE_IOS + gboolean enable_argb = TRUE; + int retval; + char cpu_name30; + size_t cpu_len = 30; + + if (__builtin_available (macOS 13.0, *)) { + /* Can't negate a __builtin_available check */ + } else { + /* Disable ARGB64/RGBA64 if we're on M1 Pro/Max and macOS < 13.0 + * due to a bug within VideoToolbox which causes encoding to fail. */ + retval = sysctlbyname ("machdep.cpu.brand_string", &cpu_name, &cpu_len, + NULL, 0); + + if (retval == 0 && + (strstr (cpu_name, "M1 Pro") != NULL || + strstr (cpu_name, "M1 Max") != NULL)) { + GST_WARNING + ("Disabling ARGB64/RGBA64 caps due to a bug in VideoToolbox " + "on M1 Pro/Max running macOS < 13.0."); + enable_argb = FALSE; + } + } + + if (enable_argb) { + caps = gst_vtutil_caps_append_video_format (caps, "ARGB64_BE"); + /* RGBA64_LE is kCVPixelFormatType_64RGBALE, only available on macOS 11.3+ */ + if (GST_VTUTIL_HAVE_64RGBALE) + caps = gst_vtutil_caps_append_video_format (caps, "RGBA64_LE"); + } +#endif gst_element_class_add_pad_template (element_class, gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); } @@ -1208,11 +1236,22 @@ const GstVTEncoderDetails *codec_details = GST_VTENC_CLASS_GET_CODEC_DETAILS (G_OBJECT_GET_CLASS (self)); + /* Apple's M1 hardware encoding fails when provided with an interlaced ProRes source. + * It's most likely a bug in VideoToolbox, as no such limitation has been officially mentioned anywhere. + * For now let's disable HW encoding entirely when such case occurs. */ + gboolean enable_hw = !(GST_VIDEO_INFO_IS_INTERLACED (&self->video_info) + && codec_details->format_id == GST_kCMVideoCodecType_Some_AppleProRes); + + if (!enable_hw) + GST_WARNING_OBJECT (self, + "Interlaced content detected, disabling HW-accelerated encoding due to https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1429"); + encoder_spec = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); gst_vtutil_dict_set_boolean (encoder_spec, - kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, true); + kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, + enable_hw); if (codec_details->require_hardware) gst_vtutil_dict_set_boolean (encoder_spec, kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder, @@ -1706,7 +1745,7 @@ pixel_format_type = kCVPixelFormatType_4444AYpCbCr16; break; case GST_VIDEO_FORMAT_RGBA64_LE: - if (GST_VTUTIL_HAVE_64ARGBALE) + if (GST_VTUTIL_HAVE_64RGBALE) pixel_format_type = kCVPixelFormatType_64RGBALE; else /* Codepath will never be hit on macOS older than Big Sur (11.3) */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtutil.h -> gst-plugins-bad-1.22.1.tar.xz/sys/applemedia/vtutil.h
Changed
@@ -35,7 +35,7 @@ #if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < 110300 #define kCVPixelFormatType_64RGBALE 'l64r' #endif -#define GST_VTUTIL_HAVE_64ARGBALE __builtin_available(macOS 11.3, *) +#define GST_VTUTIL_HAVE_64RGBALE __builtin_available(macOS 11.3, *) G_BEGIN_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11overlaycompositor.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/d3d11/gstd3d11overlaycompositor.cpp
Changed
@@ -211,8 +211,8 @@ subresource_data.SysMemPitch = stride; subresource_data.SysMemSlicePitch = 0; - texture_desc.Width = width; - texture_desc.Height = height; + texture_desc.Width = vmeta->width; + texture_desc.Height = vmeta->height; texture_desc.MipLevels = 1; texture_desc.ArraySize = 1; texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11videosink.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/d3d11/gstd3d11videosink.cpp
Changed
@@ -1430,6 +1430,7 @@ GST_LOG_OBJECT (self, "End drawing"); self->drawing = FALSE; } else { + gst_d3d11_window_show (self->window); ret = gst_d3d11_window_render (self->window, self->prepared_buffer); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/d3d11/gstd3d11window.cpp
Changed
@@ -815,6 +815,19 @@ } void +gst_d3d11_window_show (GstD3D11Window * window) +{ + GstD3D11WindowClass *klass; + + g_return_if_fail (GST_IS_D3D11_WINDOW (window)); + + klass = GST_D3D11_WINDOW_GET_CLASS (window); + + if (klass->show) + klass->show (window); +} + +void gst_d3d11_window_set_render_rectangle (GstD3D11Window * window, const GstVideoRectangle * rect) {
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window.h -> gst-plugins-bad-1.22.1.tar.xz/sys/d3d11/gstd3d11window.h
Changed
@@ -121,6 +121,8 @@ { GstObjectClass object_class; + void (*show) (GstD3D11Window * window); + void (*update_swap_chain) (GstD3D11Window * window); void (*change_fullscreen_mode) (GstD3D11Window * window); @@ -168,6 +170,8 @@ GType gst_d3d11_window_get_type (void); +void gst_d3d11_window_show (GstD3D11Window * window); + void gst_d3d11_window_set_render_rectangle (GstD3D11Window * window, const GstVideoRectangle * rect);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window_win32.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/d3d11/gstd3d11window_win32.cpp
Changed
@@ -43,6 +43,7 @@ #define WM_GST_D3D11_CONSTRUCT_INTERNAL_WINDOW (WM_USER + 2) #define WM_GST_D3D11_DESTROY_INTERNAL_WINDOW (WM_USER + 3) #define WM_GST_D3D11_MOVE_WINDOW (WM_USER + 4) +#define WM_GST_D3D11_SHOW_WINDOW (WM_USER + 5) static LRESULT CALLBACK window_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -66,6 +67,8 @@ GMainContext *main_context; GMainLoop *loop; + gboolean visible; + GSource *msg_source; GIOChannel *msg_io_channel; @@ -102,6 +105,7 @@ static void gst_d3d11_window_win32_constructed (GObject * object); static void gst_d3d11_window_win32_dispose (GObject * object); +static void gst_d3d11_window_win32_show (GstD3D11Window * window); static void gst_d3d11_window_win32_update_swap_chain (GstD3D11Window * window); static void gst_d3d11_window_win32_change_fullscreen_mode (GstD3D11Window * window); @@ -143,6 +147,7 @@ gobject_class->constructed = gst_d3d11_window_win32_constructed; gobject_class->dispose = gst_d3d11_window_win32_dispose; + window_class->show = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_show); window_class->update_swap_chain = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_update_swap_chain); window_class->change_fullscreen_mode = @@ -211,32 +216,9 @@ GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); HWND hwnd; GstFlowReturn ret; - gint width, height; - - switch (window->method) { - case GST_VIDEO_ORIENTATION_90R: - case GST_VIDEO_ORIENTATION_90L: - case GST_VIDEO_ORIENTATION_UL_LR: - case GST_VIDEO_ORIENTATION_UR_LL: - width = display_height; - height = display_width; - break; - default: - width = display_width; - height = display_height; - break; - } - if (!self->setup_external_hwnd) { - RECT rect; - GetClientRect (self->internal_hwnd, &rect); - width += 2 * GetSystemMetrics (SM_CXSIZEFRAME); - height += - 2 * GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION); - MoveWindow (self->internal_hwnd, rect.left, rect.top, width, height, FALSE); - ShowWindow (self->internal_hwnd, SW_SHOW); + if (!self->setup_external_hwnd) goto done; - } hwnd = (HWND) window->external_handle; if (!IsWindow (hwnd)) { @@ -592,6 +574,9 @@ } self->device_handle = 0; + self->internal_hwnd = 0; + self->visible = FALSE; + self->internal_hwnd = CreateWindowExA (0, "GSTD3D11", "Direct3D11 renderer", @@ -838,6 +823,9 @@ } } break; + case WM_GST_D3D11_SHOW_WINDOW: + ShowWindow (self->internal_hwnd, SW_SHOW); + break; default: break; } @@ -929,7 +917,6 @@ SWP_FRAMECHANGED | SWP_NOACTIVATE); MoveWindow (self->internal_hwnd, rect.left, rect.top, rect.right, rect.bottom, FALSE); - ShowWindow (self->internal_hwnd, SW_SHOW); GstD3D11SRWLockGuard lk (&self->lock); self->overlay_state = GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_OPENED; @@ -1125,6 +1112,51 @@ return TRUE; } +static void +gst_d3d11_window_win32_show (GstD3D11Window * window) +{ + GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); + gint width, height; + + switch (window->method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + width = GST_VIDEO_INFO_HEIGHT (&window->render_info); + height = GST_VIDEO_INFO_WIDTH (&window->render_info); + break; + default: + width = GST_VIDEO_INFO_WIDTH (&window->render_info); + height = GST_VIDEO_INFO_HEIGHT (&window->render_info); + break; + } + + if (!self->visible) { + /* if no parent the real size has to be set now because this has not been done + * when at window creation */ + if (!self->external_hwnd) { + RECT rect; + GetClientRect (self->internal_hwnd, &rect); + width += 2 * GetSystemMetrics (SM_CXSIZEFRAME); + height += + 2 * GetSystemMetrics (SM_CYSIZEFRAME) + + GetSystemMetrics (SM_CYCAPTION); + MoveWindow (self->internal_hwnd, rect.left, rect.top, width, + height, FALSE); + ShowWindow (self->internal_hwnd, SW_SHOW); + } else if (self->internal_hwnd) { + /* ShowWindow will throw message to message pumping thread (app thread) + * synchroniously, which can be blocked at the moment. + * Post message to internal hwnd and do that from message pumping thread + */ + PostMessageA (self->internal_hwnd, WM_GST_D3D11_SHOW_WINDOW, 0, 0); + } + + self->visible = TRUE; + } +} + static GstFlowReturn gst_d3d11_window_win32_present (GstD3D11Window * window, guint present_flags) {
View file
gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdk.c -> gst-plugins-bad-1.22.1.tar.xz/sys/msdk/gstmsdk.c
Changed
@@ -141,7 +141,7 @@ GST_DEBUG_CATEGORY_INIT (gst_msdkvp9dec_debug, "msdkvp9dec", 0, "msdkvp9dec"); GST_DEBUG_CATEGORY_INIT (gst_msdkvp9enc_debug, "msdkvp9enc", 0, "msdkvp9enc"); GST_DEBUG_CATEGORY_INIT (gst_msdkav1dec_debug, "msdkav1dec", 0, "msdkav1dec"); - GST_DEBUG_CATEGORY_INIT (gst_msdkav1dec_debug, "msdkav1enc", 0, "msdkav1enc"); + GST_DEBUG_CATEGORY_INIT (gst_msdkav1enc_debug, "msdkav1enc", 0, "msdkav1enc"); plugin_add_dependencies (plugin);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvencoder.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/gstnvencoder.cpp
Changed
@@ -73,6 +73,7 @@ NV_ENC_INITIALIZE_PARAMS init_params; NV_ENC_CONFIG config; gpointer session; + guint lookahead; GstVideoCodecState *input_state; @@ -84,6 +85,7 @@ GArray *task_pool; GQueue free_tasks; + GQueue pending_tasks; GQueue output_tasks; GMutex lock; @@ -171,6 +173,7 @@ (GDestroyNotify) gst_nv_encoder_task_clear); g_queue_init (&priv->free_tasks); + g_queue_init (&priv->pending_tasks); g_queue_init (&priv->output_tasks); g_mutex_init (&priv->lock); @@ -253,6 +256,7 @@ } g_queue_clear (&priv->free_tasks); + g_queue_clear (&priv->pending_tasks); g_queue_clear (&priv->output_tasks); priv->last_flow = GST_FLOW_OK; @@ -349,6 +353,7 @@ NV_ENC_PIC_PARAMS pic_params = { 0, }; NVENCSTATUS status; GstNvEncoderTask *task; + GstNvEncoderTask *pending_task; if (!priv->session || !priv->encoding_thread) return TRUE; @@ -380,6 +385,12 @@ gst_nv_encoder_device_unlock (self); GST_NV_ENCODER_LOCK (self); + while ((pending_task = + (GstNvEncoderTask *) g_queue_pop_head (&priv->pending_tasks)) != + nullptr) { + g_queue_push_tail (&priv->output_tasks, pending_task); + } + g_queue_push_tail (&priv->output_tasks, task); g_cond_broadcast (&priv->cond); GST_NV_ENCODER_UNLOCK (self); @@ -578,6 +589,11 @@ features = gst_caps_get_features (caps, 0); min_buffers = gst_nv_encoder_get_task_size (self); + if (min_buffers == 0) { + GstNvEncoderClass *klass = GST_NV_ENCODER_GET_CLASS (self); + + min_buffers = klass->calculate_min_buffers (self); + } switch (priv->subclass_device_mode) { case GST_NV_ENCODER_DEVICE_AUTO_SELECT: @@ -873,8 +889,38 @@ } gst_video_codec_frame_set_user_data (frame, task, NULL); - g_queue_push_tail (&priv->output_tasks, task); - g_cond_broadcast (&priv->cond); + + /* On Windows and if async encoding is enabled, output thread will wait + * for completion event. But on Linux, async encoding is not supported. + * So, we should wait for NV_ENC_SUCCESS in case of sync mode + * (it would introduce latency though). + * Otherwise nvEncLockBitstream() will return error */ + if (task->event_handle) { + /* Windows only path */ + g_queue_push_tail (&priv->output_tasks, task); + g_cond_broadcast (&priv->cond); + } else { + g_queue_push_tail (&priv->pending_tasks, task); + if (status == NV_ENC_SUCCESS) { + bool notify = false; + + /* XXX: nvEncLockBitstream() will return NV_ENC_ERR_INVALID_PARAM + * if lookahead is enabled. See also + * https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/494 + */ + while (g_queue_get_length (&priv->pending_tasks) > priv->lookahead) { + GstNvEncoderTask *pending_task = + (GstNvEncoderTask *) g_queue_pop_head (&priv->pending_tasks); + + g_queue_push_tail (&priv->output_tasks, pending_task); + notify = true; + } + + if (notify) + g_cond_broadcast (&priv->cond); + } + } + GST_NV_ENCODER_UNLOCK (self); return GST_FLOW_OK; @@ -1283,6 +1329,7 @@ } } + priv->lookahead = priv->config.rcParams.lookaheadDepth; task_pool_size = gst_nv_encoder_calculate_task_pool_size (self, &priv->config); g_array_set_size (priv->task_pool, task_pool_size);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvencoder.h -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/gstnvencoder.h
Changed
@@ -222,6 +222,8 @@ const GstVideoInfo * info, GstBuffer * buffer, GstNvEncoderDeviceData * data); + + guint (*calculate_min_buffers) (GstNvEncoder * encoder); }; GType gst_nv_encoder_get_type (void);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh264encoder.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/gstnvh264encoder.cpp
Changed
@@ -227,6 +227,7 @@ static gboolean gst_nv_h264_encoder_select_device (GstNvEncoder * encoder, const GstVideoInfo * info, GstBuffer * buffer, GstNvEncoderDeviceData * data); +static guint gst_nv_h264_encoder_calculate_min_buffers (GstNvEncoder * encoder); static void gst_nv_h264_encoder_class_init (GstNvH264EncoderClass * klass, gpointer data) @@ -467,6 +468,8 @@ GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_check_reconfigure); nvenc_class->select_device = GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_select_device); + nvenc_class->calculate_min_buffers = + GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_calculate_min_buffers); klass->device_caps = cdata->device_caps; klass->cuda_device_id = cdata->cuda_device_id; @@ -1738,6 +1741,24 @@ return TRUE; } +static guint +gst_nv_h264_encoder_calculate_min_buffers (GstNvEncoder * encoder) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + guint num_buffers; + + /* At least 4 surfaces are required as documented by Nvidia Encoder guide */ + num_buffers = 4; + + /* lookahead depth */ + num_buffers += self->rc_lookahead; + + /* B frames + 1 */ + num_buffers += self->bframes + 1; + + return num_buffers; +} + static GstNvEncoderClassData * gst_nv_h264_encoder_create_class_data (GstObject * device, gpointer session, GstNvEncoderDeviceMode device_mode)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh265encoder.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/gstnvh265encoder.cpp
Changed
@@ -232,6 +232,7 @@ static gboolean gst_nv_h265_encoder_select_device (GstNvEncoder * encoder, const GstVideoInfo * info, GstBuffer * buffer, GstNvEncoderDeviceData * data); +static guint gst_nv_h265_encoder_calculate_min_buffers (GstNvEncoder * encoder); static void gst_nv_h265_encoder_class_init (GstNvH265EncoderClass * klass, gpointer data) @@ -468,6 +469,8 @@ GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_check_reconfigure); nvenc_class->select_device = GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_select_device); + nvenc_class->calculate_min_buffers = + GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_calculate_min_buffers); klass->device_caps = cdata->device_caps; klass->cuda_device_id = cdata->cuda_device_id; @@ -1750,6 +1753,24 @@ return TRUE; } +static guint +gst_nv_h265_encoder_calculate_min_buffers (GstNvEncoder * encoder) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + guint num_buffers; + + /* At least 4 surfaces are required as documented by Nvidia Encoder guide */ + num_buffers = 4; + + /* lookahead depth */ + num_buffers += self->rc_lookahead; + + /* B frames + 1 */ + num_buffers += self->bframes + 1; + + return num_buffers; +} + static GstNvEncoderClassData * gst_nv_h265_encoder_create_class_data (GstObject * device, gpointer session, GstNvEncoderDeviceMode device_mode)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvvp9dec.c -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/gstnvvp9dec.c
Changed
@@ -480,7 +480,7 @@ dpb->pic_listi); if (!other_frame) { GST_ERROR_OBJECT (self, "Couldn't get decoder frame from picture"); - return FALSE; + return GST_FLOW_ERROR; } ref_frame_mapi = other_frame->index;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/plugin.c -> gst-plugins-bad-1.22.1.tar.xz/sys/nvcodec/plugin.c
Changed
@@ -65,6 +65,7 @@ plugin_init (GstPlugin * plugin) { CUresult cuda_ret; + const char *err_name = NULL, *err_desc = NULL; gint dev_count = 0; guint i; gboolean nvdec_available = TRUE; @@ -102,7 +103,8 @@ } if (!gst_cuvid_load_library (api_major_ver, api_minor_ver)) { - GST_WARNING ("Failed to load nvdec library"); + GST_WARNING ("Failed to load nvdec library version %u.%u", api_major_ver, + api_minor_ver); nvdec_available = FALSE; } @@ -111,12 +113,19 @@ cuda_ret = CuInit (0); if (cuda_ret != CUDA_SUCCESS) { - GST_WARNING ("Failed to init cuda, ret: 0x%x", (gint) cuda_ret); + CuGetErrorName (cuda_ret, &err_name); + CuGetErrorString (cuda_ret, &err_desc); + GST_ERROR ("Failed to init cuda, cuInit ret: 0x%x: %s: %s", + (int) cuda_ret, err_name, err_desc); return TRUE; } - if (CuDeviceGetCount (&dev_count) != CUDA_SUCCESS || !dev_count) { - GST_WARNING ("No available device, ret: 0x%x", (gint) cuda_ret); + cuda_ret = CuDeviceGetCount (&dev_count); + if (cuda_ret != CUDA_SUCCESS || !dev_count) { + CuGetErrorName (cuda_ret, &err_name); + CuGetErrorString (cuda_ret, &err_desc); + GST_ERROR ("No available device, cuDeviceGetCount ret: 0x%x: %s %s", + (int) cuda_ret, err_name, err_desc); return TRUE; } @@ -152,7 +161,7 @@ CUcontext cuda_ctx; if (!context) { - GST_WARNING ("Failed to create context for deevice %d", i); + GST_WARNING ("Failed to create context for device %d", i); continue; }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvav1enc.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/qsv/gstqsvav1enc.cpp
Changed
@@ -122,7 +122,7 @@ #define DOC_SRC_CAPS \ "video/x-av1, width = (int) 16, 8192 , height = (int) 16, 8192 , " \ - "alignment = (string) tu" + "stream-format = (string) obu-stream, alignment = (string) tu" typedef struct _GstQsvAV1EncClassData { @@ -561,7 +561,7 @@ } caps = gst_caps_from_string ("video/x-av1, profile = (string) main, " - "alignment= (string) tu"); + "stream-format = (string) obu-stream, alignment= (string) tu"); out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), caps, state); gst_video_codec_state_unref (out_state); @@ -778,7 +778,7 @@ #endif std::string src_caps_str = "video/x-av1, profile = (string) main, " - "alignment = (string) tu"; + "stream-format = (string) obu-stream, alignment = (string) tu"; src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " ";
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstjpegdecoder.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstjpegdecoder.c
Changed
@@ -90,6 +90,8 @@ gst_jpeg_decoder_init (GstJpegDecoder * self) { gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (self), TRUE); + self->priv = gst_jpeg_decoder_get_instance_private (self); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaav1dec.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvaav1dec.c
Changed
@@ -300,7 +300,11 @@ return NULL; } - gst_buffer_pool_set_active (pool, TRUE); + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_WARNING_OBJECT (self, "Failed to activate internal pool"); + gst_object_unref (pool); + return NULL; + } return pool; }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabaseenc.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvabaseenc.c
Changed
@@ -229,7 +229,10 @@ gst_object_unref (allocator); - gst_buffer_pool_set_active (base->priv->raw_pool, TRUE); + if (!gst_buffer_pool_set_active (base->priv->raw_pool, TRUE)) { + GST_WARNING_OBJECT (base, "Failed to activate sinkpad pool"); + return NULL; + } return base->priv->raw_pool; } @@ -690,8 +693,10 @@ { GST_ELEMENT_ERROR (venc, STREAM, ENCODE, ("Failed to reorder the input frame."), (NULL)); - gst_clear_buffer (&frame->output_buffer); - gst_video_encoder_finish_frame (venc, frame); + if (frame) { + gst_clear_buffer (&frame->output_buffer); + gst_video_encoder_finish_frame (venc, frame); + } return GST_FLOW_ERROR; } error_encode:
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabasetransform.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvabasetransform.c
Changed
@@ -768,7 +768,10 @@ if (self->priv->sinkpad_caps) { caps = self->priv->sinkpad_caps; - gst_video_info_from_caps (&in_info, caps); + if (!gst_video_info_from_caps (&in_info, caps)) { + GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps); + return NULL; + } } else { caps = self->in_caps; in_info = self->in_info;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaencoder.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvaencoder.c
Changed
@@ -397,7 +397,11 @@ GST_ERROR_OBJECT (self, "Failed to create reconstruct pool"); goto error; } - gst_buffer_pool_set_active (recon_pool, TRUE); + + if (!gst_buffer_pool_set_active (recon_pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to activate reconstruct pool"); + goto error; + } status = vaCreateContext (dpy, config, coded_width, coded_height, VA_PROGRESSIVE, NULL, 0, &context);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah264dec.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvah264dec.c
Changed
@@ -363,7 +363,7 @@ GstVaDecodePicture *va_pic; VAIQMatrixBufferH264 iq_matrix = { 0, }; VAPictureParameterBufferH264 pic_param; - guint i, n; + guint i; GArray *ref_list = self->ref_list; va_pic = gst_h264_picture_get_user_data (picture); @@ -454,9 +454,15 @@ /* We need the first 2 entries (Y intra and Y inter for YCbCr 4:2:2 and * less, and the full 6 entries for 4:4:4, see Table 7-2 of the spec for - * more details */ - n = (pps->sequence->chroma_format_idc == 3) ? 6 : 2; - for (i = 0; i < n; i++) { + * more details. + * But VA API only define the first 2 entries, so we may lose scaling + * list info for 4:4:4 stream. */ + if (pps->sequence->chroma_format_idc == 3) + GST_WARNING_OBJECT (self, "We do not have scaling list entries " + "for U/V planes in 4:4:4 stream. It may have artifact if " + "those scaling lists are not default value."); + + for (i = 0; i < 2; i++) { gst_h264_quant_matrix_8x8_get_raster_from_zigzag (iq_matrix.ScalingList8x8 i, pps->scaling_lists_8x8i); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah264enc.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvah264enc.c
Changed
@@ -1200,11 +1200,13 @@ BitDepthC = 10; MbWidthC = 8; MbHeightC = 8; + break; case VA_RT_FORMAT_YUV422_10: BitDepthY = 10; BitDepthC = 10; MbWidthC = 8; MbHeightC = 16; + break; case VA_RT_FORMAT_YUV444_10: BitDepthY = 10; BitDepthC = 10;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah265enc.c -> gst-plugins-bad-1.22.1.tar.xz/sys/va/gstvah265enc.c
Changed
@@ -3382,8 +3382,7 @@ GST_INFO_OBJECT (self, "target bitrate computed to %u kbps", bitrate); - self->prop.bitrate = bitrate; - g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_BITRATE); + update_property_uint (base, &self->prop.bitrate, bitrate, PROP_BITRATE); } /* Adjust the setting based on RC mode. */ @@ -4284,10 +4283,8 @@ self->features.use_trellis = FALSE; } - if (self->prop.use_trellis != self->features.use_trellis) { - self->prop.use_trellis = self->features.use_trellis; - g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_TRELLIS); - } + update_property_bool (base, &self->prop.use_trellis, + self->features.use_trellis, PROP_TRELLIS); } /* We need to decide the profile and entrypoint before call this.
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.cpp
Changed
@@ -713,7 +713,10 @@ } if (self->running) { - if (gst_wasapi2_result (hr)) { + if (gst_wasapi2_result (hr) && + /* In case of normal loopback capture, this method is called from + * silence feeding thread. Don't schedule again in that case */ + self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, &self->callback_key); @@ -761,17 +764,16 @@ if (!gst_wasapi2_result (hr)) return hr; - if (padding_frames >= self->buffer_size) { + if (padding_frames >= self->loopback_buffer_size) { GST_INFO_OBJECT (self, "Padding size %d is larger than or equal to buffer size %d", - padding_frames, self->buffer_size); + padding_frames, self->loopback_buffer_size); return S_OK; } - can_write = self->buffer_size - padding_frames; + can_write = self->loopback_buffer_size - padding_frames; - GST_TRACE_OBJECT (self, - "Writing %d silent frames offset at %" G_GUINT64_FORMAT, can_write); + GST_TRACE_OBJECT (self, "Writing %d silent frames", can_write); hr = render_client->GetBuffer (can_write, &data); if (!gst_wasapi2_result (hr)) @@ -797,6 +799,12 @@ hr = gst_wasapi2_ring_buffer_fill_loopback_silence (self); + /* On Windows versions prior to Windows 10, a pull-mode capture client will + * not receive any events when a stream is initialized with event-driven + * buffering */ + if (gst_wasapi2_result (hr)) + hr = gst_wasapi2_ring_buffer_io_callback (self); + if (self->running) { if (gst_wasapi2_result (hr)) { hr = MFPutWaitingWorkItem (self->loopback_event_handle, 0, @@ -1229,13 +1237,15 @@ goto error; } - hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, - &self->callback_key); - if (!gst_wasapi2_result (hr)) { - GST_ERROR_OBJECT (self, "Failed to put waiting item"); - client_handle->Stop (); - self->running = FALSE; - goto error; + if (self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { + hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, + &self->callback_key); + if (!gst_wasapi2_result (hr)) { + GST_ERROR_OBJECT (self, "Failed to put waiting item"); + client_handle->Stop (); + self->running = FALSE; + goto error; + } } return TRUE;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcutils.cpp -> gst-plugins-bad-1.22.1.tar.xz/sys/win32ipc/protocol/win32ipcutils.cpp
Changed
@@ -23,6 +23,7 @@ */ #include "win32ipcutils.h" +#include <cctype> #include <string> #include <locale> #include <codecvt>
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/h265parse.c -> gst-plugins-bad-1.22.1.tar.xz/tests/check/elements/h265parse.c
Changed
@@ -332,6 +332,70 @@ GST_END_TEST; +/* 8bits 4:4:4 encoded stream, and profile-level-tier is not spec compliant. + * extracted from the file reported at + * https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1009 + */ +static const guint8 broken_profile_codec_data = { + 0x01, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0xf0, 0x00, 0xfc, 0xff, 0xf8, 0xf8, 0x00, 0x00, 0x0f, 0x03, 0x20, + 0x00, 0x01, 0x00, 0x18, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x24, 0x08, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x99, 0xac, 0x09, 0x21, 0x00, 0x01, 0x00, 0x2c, 0x42, 0x01, 0x01, + 0x24, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x99, 0x90, 0x00, 0x3c, 0x04, 0x00, 0x44, 0x0f, 0x84, + 0x72, 0xd6, 0x94, 0x84, 0xb2, 0x5c, 0x40, 0x20, 0x00, 0x00, 0x03, 0x00, + 0x20, 0x00, 0x00, 0x07, 0x81, 0x22, 0x00, 0x01, 0x00, 0x08, 0x44, 0x01, + 0xc0, 0xf7, 0x18, 0x30, 0x0c, 0xc9 +}; + +GST_START_TEST (test_parse_fallback_profile) +{ + GstHarness *h = gst_harness_new ("h265parse"); + GstCaps *caps; + GstBuffer *codec_data; + GstEvent *event; + + codec_data = gst_buffer_new_memdup (broken_profile_codec_data, + sizeof (broken_profile_codec_data)); + + caps = gst_caps_from_string ("video/x-h265, stream-format=(string)hvc1, " + "alignment=(string)au"); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + gst_buffer_unref (codec_data); + + gst_harness_set_src_caps (h, caps); + while ((event = gst_harness_pull_event (h)) != NULL) { + GstStructure *s; + const gchar *profile; + + if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS) { + gst_event_unref (event); + continue; + } + + gst_event_parse_caps (event, &caps); + s = gst_caps_get_structure (caps, 0); + profile = gst_structure_get_string (s, "profile"); + + /* h265parse must provide profile */ + fail_unless (profile); + + /* must not be main profile at least. + * main-444 is expected but we might update the profile parsing + * logic later. At least it should not be main profile + */ + fail_if (g_strcmp0 (profile, "main") == 0); + + gst_event_unref (event); + break; + } + + gst_harness_teardown (h); +} + +GST_END_TEST; + static Suite * h265parse_suite (void) { @@ -344,6 +408,7 @@ tcase_add_test (tc_chain, test_parse_split); tcase_add_test (tc_chain, test_parse_detect_stream); tcase_add_test (tc_chain, test_parse_detect_stream_with_hdr_sei); + tcase_add_test (tc_chain, test_parse_fallback_profile); return s; }
View file
gst-plugins-bad-1.22.0.tar.xz/tools/gst-transcoder.c -> gst-plugins-bad-1.22.1.tar.xz/tools/gst-transcoder.c
Changed
@@ -362,7 +362,12 @@ g_option_context_add_main_entries (ctx, options, NULL); g_option_context_add_group (ctx, gst_init_get_option_group ()); - if (!g_option_context_parse (ctx, &argc, &argv, &err)) { +#ifdef G_OS_WIN32 + if (!g_option_context_parse_strv (ctx, &argv, &err)) +#else + if (!g_option_context_parse (ctx, &argc, &argv, &err)) +#endif + { g_print ("Error initializing: %s\n", GST_STR_NULL (err->message)); g_clear_error (&err); g_option_context_free (ctx); @@ -468,9 +473,21 @@ int main (int argc, char *argv) { + int ret; + +#ifdef G_OS_WIN32 + argv = g_win32_get_command_line (); +#endif + #if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE - return gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL); + ret = gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL); #else - return real_main (argc, argv); + ret = real_main (argc, argv); +#endif + +#ifdef G_OS_WIN32 + g_strfreev (argv); #endif + + return ret; }
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
.