Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gstreamer-plugins-good for openSUSE:Factory checked in at 2023-07-01 23:17:25 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-good (Old) and /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.13546 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-good" Sat Jul 1 23:17:25 2023 rev:94 rq:1096145 version:1.22.4 Changes: -------- --- /work/SRC/openSUSE:Factory/gstreamer-plugins-good/gstreamer-plugins-good.changes 2023-06-19 22:50:09.361419376 +0200 +++ /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.13546/gstreamer-plugins-good.changes 2023-07-01 23:17:27.190045192 +0200 @@ -1,0 +2,28 @@ +Mon Jun 26 14:23:55 UTC 2023 - Bjørn Lie <bjorn....@gmail.com> + +- Update to version 1.22.4: + + flacparse: Avoid integer overflow in available data check for + image tags. + + flvmux: use the correct timestamp to calculate wait times. + + isomp4: Fix (E)AC-3 channel count handling. + + jpegdec: fixes related to interlaced jpeg. + + pngdec: Fix wrong colours output from 16bit RGB images. + + qtmux, qtdemux: fix byte order for opus extension. + + rtspsrc: Do not try send dropped get/set parameter. + + qt5, qt6: Add more meson options and eliminate all automagic. + + qt: glrenderer: don't attempt to use QWindow from non-Qt main + thread. + + qml6glsink: Support building on win32. + + v4l2src: fix support for bayer format. + + v4l2: Change to query only up to + V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS. + + v4l2videodec: treat MPEG-1 format as MPEG-2. + + v4l2videoenc: support force keyframe event in v4l2 encoder. + + tests: rtpbin_buffer_list: fix possible unaligned write/read on + 32-bit ARM. +- Add libQt5Gui-private-headers-devel BuildRequires: New + explicit dependency. +- Rebase reduce-required-meson.patch. +- Drop adaptivedemux2-uri-data.patch: Fixed upstream. + +------------------------------------------------------------------- Old: ---- adaptivedemux2-uri-data.patch gst-plugins-good-1.22.3.tar.xz New: ---- gst-plugins-good-1.22.4.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gstreamer-plugins-good.spec ++++++ --- /var/tmp/diff_new_pack.4WFZas/_old 2023-07-01 23:17:27.942049701 +0200 +++ /var/tmp/diff_new_pack.4WFZas/_new 2023-07-01 23:17:27.950049749 +0200 @@ -26,7 +26,7 @@ %define gst_branch 1.0 Name: gstreamer-plugins-good -Version: 1.22.3 +Version: 1.22.4 Release: 0 Summary: GStreamer Streaming-Media Framework Plug-Ins License: LGPL-2.1-or-later @@ -36,7 +36,6 @@ Source1: gstreamer-plugins-good.appdata.xml Source99: baselibs.conf Patch0: reduce-required-meson.patch -Patch1: adaptivedemux2-uri-data.patch BuildRequires: Mesa-libGLESv2-devel BuildRequires: Mesa-libGLESv3-devel @@ -58,6 +57,7 @@ BuildRequires: python3-xml BuildRequires: zlib-devel +BuildRequires: libQt5Gui-private-headers-devel BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Gui) BuildRequires: pkgconfig(Qt5Qml) ++++++ gst-plugins-good-1.22.3.tar.xz -> gst-plugins-good-1.22.4.tar.xz ++++++ ++++ 2226 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ChangeLog new/gst-plugins-good-1.22.4/ChangeLog --- old/gst-plugins-good-1.22.3/ChangeLog 2023-05-19 10:24:53.834972900 +0200 +++ new/gst-plugins-good-1.22.4/ChangeLog 2023-06-20 18:45:41.851180600 +0200 @@ -1,3 +1,239 @@ +=== release 1.22.4 === + +2023-06-20 17:42:25 +0100 Tim-Philipp Müller <t...@centricular.com> + + * NEWS: + * RELEASE: + * docs/gst_plugins_cache.json: + * gst-plugins-good.doap: + * meson.build: + Release 1.22.4 + +2023-06-08 19:12:54 +0200 Jonas Kvinge <jo...@jkvinge.net> + + * ext/adaptivedemux2/gstadaptivedemux.c: + adaptivedemux2: Allow data dash+xml manifest for uri + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4853> + +2023-06-13 13:20:16 +0300 Sebastian Dröge <sebast...@centricular.com> + + * gst/audioparsers/gstflacparse.c: + flacparse: Avoid integer overflow in available data check for image tags + If the image length as stored in the file is some bogus integer then + adding it to the current byte readers position can overflow and wrongly + have the check for enough available data succeed. + This then later can cause NULL pointer dereferences or out of bounds + reads/writes when actually reading the image data. + Fixes ZDI-CAN-20775 + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2661 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4897> + +2023-06-19 15:11:30 +0200 François Laignel <franc...@centricular.com> + + * gst/isomp4/qtdemux.c: + * gst/isomp4/qtdemux_dump.c: + * gst/isomp4/qtdemux_dump.h: + * gst/isomp4/qtdemux_types.c: + qtdemux: parse Opus and dOps as qtdemux nodes and add size checks + This allows checking the nodes conformity and dumping parsed values. + Note: Audio Sample Entry version parsing and offset handling is handled as part + of `FOURCC_soun` common processing and in `qtdemux_parse_node`. + Also, only read `stream_count` and `coupled_count` when + `channel_mapping_family` != 0. See: + https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4891> + +2023-06-16 10:29:28 +0200 François Laignel <franc...@centricular.com> + + * gst/isomp4/qtdemux.c: + qtdemux: fix byte order for opus extension and version field type + The "Encapsulation of Opus in ISO Base Media File Format" [1] specifications, + § 4.3.2 Opus Specific Box, indicates that data must be stored as big-endian. + [1] https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4891> + +2023-06-16 10:02:16 +0200 François Laignel <franc...@centricular.com> + + * gst/isomp4/atoms.c: + qtmux: fix byte order for opus extension + The "Encapsulation of Opus in ISO Base Media File Format" [1] specifications, + § 4.3.2 Opus Specific Box, indicates that data must be stored as big-endian. + In `build_opus_extension`, `gst_byte_writer_put*_le ()` variants were used, + causing audio streams conversion to Opus in mp4 to offset samples due to the + PreSkip field incorrect value (29ms early in our test cases). + [1] https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4891> + +2023-05-30 15:10:11 +0200 Jan Alexander Steffens (heftig) <jan.steff...@ltnglobal.com> + + * gst/isomp4/gstqtmux.c: + * gst/isomp4/qtdemux.c: + isomp4: Fix (E)AC-3 channel count handling + The muxer used a fixed value of 2 channels because the TR 102 366 spec + says they're to be ignored. However, the demuxer still trusted them, + resulting in bad caps. + Make the muxer fill in the correct channel count anyway (FFmpeg already + does) and make the demuxer ignore the value. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4773> + +2023-04-20 17:31:32 -0400 Daniel Morin <daniel.mo...@collabora.com> + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + v4l2src: fix support for bayer format + - Define a new function that identify if the v4l2object is raw based + on pixel format + - Only consider setting delta flag on buffer if the video is not raw. + Sponsored by Living Optics Ltd. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4867> + +2023-06-12 19:24:15 +0100 Tim-Philipp Müller <t...@centricular.com> + + * tests/check/elements/rtpbin_buffer_list.c: + tests: rtpbin_buffer_list: fix possible unaligned read on 32-bit ARM + Fixes #2666 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4855> + +2023-05-30 17:52:34 +0900 ekwange <ekwa...@gmail.com> + + * sys/v4l2/v4l2_calls.c: + v4l2: Change to query only up to V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS + Fix to prevent infinite querying. + There are devices that exceed V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS + but do not return EINVAL. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4851> + +2023-06-05 07:29:57 +0200 Jochen Henneberg <j...@henneberg-systemdesign.com> + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Cleanup code for next pending command + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4799> + +2023-06-05 06:50:55 +0200 Jochen Henneberg <j...@henneberg-systemdesign.com> + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Do not try send dropped get/set parameter + If the set_get_param_q has been emptied we have to reset the cached + pending command to CMD_LOOP as we will not have the request parameters + anymore. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4799> + +2023-06-06 09:24:37 +0800 Hou Qi <qi....@nxp.com> + + * sys/v4l2/gstv4l2videodec.c: + v4l2videodec: treat MPEG 1 format as MPEG 2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4787> + +2023-05-18 14:23:49 +0530 Nirbheek Chauhan <nirbh...@centricular.com> + + * ext/qt6/gstqt6glutility.cc: + * ext/qt6/meson.build: + meson: Support building qml6glsink on win32 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4762> + +2023-05-03 21:05:54 +0530 Nirbheek Chauhan <nirbh...@centricular.com> + + * ext/qt/meson.build: + * ext/qt6/meson.build: + * meson_options.txt: + meson: Add more qt options and eliminate all automagic + The qt5 and qt6 plugins will now correctly error out if you enable the + option, and you can also now explicitly ensure that wayland, x11, + eglfs support is actually functional by enabling the options. It was + too easy to build non-functional support for these. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4776> + +2023-01-11 01:11:06 +0530 Nirbheek Chauhan <nirbh...@centricular.com> + + * ext/qt/meson.build: + meson: Add build_rpath for qt5 plugin on macOS + Without this, the plugin cannot be loaded in a devenv because the + RPATH is not added to the plugin dylib. This RPATH will be stripped on + install, which is what we want. + When deploying apps, people are supposed to use `macdeployqt` to + create an AppBundle that bundles Qt for you and sets the RPATHs + correctly to point to that bundled Qt. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4776> + +2023-06-01 16:21:47 +0200 Piotr BrzeziÅski <pi...@centricular.com> + + * ext/libpng/gstpngdec.c: + pngdec: Fix 16bit RGB images display + Due to the alpha value being inserted with _BEFORE, we were ending up + with ARGB instead of RGBA, thus displaying completely wrong colours. + According to libpng's manual, "to add an opaque alpha channel, use filler=0xff + or 0xffff and PNG_FILLER_AFTER which will generate RGBA pixels". + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4759> + +2023-05-29 17:01:01 +1000 Matthew Waters <matt...@centricular.com> + + * ext/qt/qtglrenderer.cc: + qt/glrenderer: don't attempt to use QWindow from non-Qt main thread + Use QObject::deleteLater() to schedule deletion in the main thread. + Remove the moveToThread of the QWindow. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4744> + +2023-05-24 16:17:46 +0200 Michael Olbrich <m.olbr...@pengutronix.de> + + * gst/flv/gstflvmux.c: + flvmux: use the correct timestamp to calculate wait times + Since c0bf793c05cf793aa18a8548cda702625e388115 ("flvmux: Set PTS based on + running time") the timestamp of the output buffer is already in running + time. So using that for 'srcpad->segment.position' does not work correctly + because gst_aggregator_simple_get_next_time() will convert it again with + gst_segment_to_running_time(). + This means that the timestamp returned by + gst_aggregator_simple_get_next_time() may be incorrect. For example, if + flvmux is added to a already runinng pipeline then the timestamp is too + small and gst_aggregator_wait_and_check() returns immediately. As a result, + buffers may be muxed in the wrong order. + To fix this, use the PTS of the incoming buffer instead of the outgoing + buffer. Also add the duration as get_next_time() is supposed to return the + timestamp of the next buffer, not the current one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4734> + +2020-08-31 16:38:48 +0200 Michael Olbrich <m.olbr...@pengutronix.de> + + * ext/jpeg/gstjpegdec.c: + jpegdec: be stricter when detecting interlaced video + There are broken(?) mjpeg videos that are incorrectly detected as + interlaced. This happens because 'info.height > height' (e.g. 1088 > 1080). + In the interlaced case info.height is approximately 'height * 2' but not + exactly because height is a multiple of DCTSIZE. Make the check more + restrictive but take the rounding effect into account. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4717> + +2020-08-31 16:12:33 +0200 Michael Olbrich <m.olbr...@pengutronix.de> + + * ext/jpeg/gstjpegdec.c: + jpegdec: decode the correct number of lines for interlaced frames + For interlaced jpeg, gst_jpeg_dec_decode_direct() is called twice, once for each + field. In this case, stride[n] is plane_stride[n] * 2 to ensure that only every + other line is written. So the loop must stop at height / num_fields. + If the frame is really interlaced then continuing beyound this, is not harmful, + because jpeg_read_raw_data() will do nothing and return 0, so am info message is + printed. + However, if the frame is not actually interlaced, just misdetected as interlaced + then there is still data available from the second half of the frame. Now + line[0][j] is set to the scratch buffer. If the scratch buffer is not allocated + (because the height is a multiple of v_samp[0] * DCTSIZE) then the result is a + segfault due to a null-pointer dereference. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4717> + +2023-05-05 15:12:46 +0800 YURI FEDOSEEV <yuri.fedos...@helixleisure.com> + + * sys/v4l2/gstv4l2videoenc.c: + v4l2videoenc: support force keyframe event in v4l2 encoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4702> + +2023-05-19 12:36:19 +0100 Tim-Philipp Müller <t...@centricular.com> + + * docs/gst_plugins_cache.json: + * meson.build: + Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4679> + === release 1.22.3 === 2023-05-19 09:23:19 +0100 Tim-Philipp Müller <t...@centricular.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/NEWS new/gst-plugins-good-1.22.4/NEWS --- old/gst-plugins-good-1.22.3/NEWS 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/NEWS 2023-06-20 18:42:25.000000000 +0200 @@ -2,13 +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.3 and was -released on 19 May 2023. +The latest bug-fix release in the stable 1.22 series is 1.22.4 and was +released on 20 June 2023. See https://gstreamer.freedesktop.org/releases/1.22/ for the latest version of this document. -Last updated: Friday 19 May 2023, 01:00 UTC (log) +Last updated: Tuesday 20 June 2023, 16:30 UTC (log) Introduction @@ -1831,6 +1831,183 @@ - List of Merge Requests applied in 1.22.3 - List of Issues fixed in 1.22.3 +1.22.4 + +The fourth 1.22 bug-fix release (1.22.4) was released on 20 June 2023. + +This release only contains bugfixes and security fixes and it should be +safe to update from 1.22.x. + +Highlighted bugfixes in 1.22.4 + +- Security fixes for flacparse, dvdspu, and subparse +- d3d11videosink: Fix error on pause and play +- decklink: Correctly handle SDK strings on macOS and free strings + after usage on Linux +- filesink: Fix buffered mode writing of buffer lists and buffers with + multiple memories +- gldownload: handle passthrough without a critical +- h265parse: Fix framerate handling regression +- oggdemux: vp8 fixes +- mp4mux, qtmux, qtdemux: Opus audio mapping fixes +- pngdec: Fix wrong colours output from 16bit RGB images +- ptp clock: Work around ptpd bug in default configuration +- srtpdec: fix critical warnings on shutdown +- v4l2src: fix support for bayer format +- v4l2videoenc: support force-keyframe event in v4l2 encoder +- vtenc: apply DTS offset to ensure DTS <= PTS +- gst-python: allow more functions to be called before gst_init() +- cerbero: fix vaapi variant; add qt6 build on windows; ensure errors + on unguarded use of new APIs, require macOS 10.13 +- packages: ship codecalpha, rtponvif, dvbsubenc, switchbin, + videosignal plugins; fix pango crash on 32-bit windows +- various bug fixes, memory leak fixes, and other stability and + reliability improvements + +gstreamer + +- filesink: Fix buffered mode writing of buffer lists and buffers with + multiple memories +- basesink: Clear EOS flag on STREAM-START event +- typefindhelper: downgrade bogus error level debug log message +- ptp: Correctly parse clock ID from the commandline parameters in the + helper +- ptp: Work around bug in ptpd in default configuration + +gst-plugins-base + +- alsasink: Fix stall for transition from PAUSED to READY with USB + speakerphone. +- appsink: unref buffer in prev sample early so buffers from v4l2 can + be released properly +- basetextoverlay: Fix typo in âtext-yâ property description +- gldownload: handle passthrough without a critical +- glfilter: add parent meta to output buffer for input buffer +- oggdemux: vp8: Push headers downstream and detect keyframe packets +- opus: Fix potential crash when getting unexpected channel position +- streamsynchronizer: reset eos on STREAM_START +- subparse: Look for the closing > of a tag after the opening < +- video: convertframe: Add D3D11 specific conversion path +- videometa: Only validate the alignment only when it contains some + info +- video-blend: Fix linking error with C++ + +gst-plugins-good + +- flacparse: Avoid integer overflow in available data check for image + tags +- flvmux: use the correct timestamp to calculate wait times +- isomp4: Fix (E)AC-3 channel count handling +- jpegdec: fixes related to interlaced jpeg +- pngdec: Fix wrong colours output from 16bit RGB images +- qtmux, qtdemux: fix byte order for opus extension +- rtspsrc: Do not try send dropped get/set parameter +- qt5, qt6: Add more meson options and eliminate all automagic +- qt: glrenderer: donât attempt to use QWindow from non-Qt main thread +- qml6glsink: Support building on win32 +- v4l2src: fix support for bayer format +- v4l2: Change to query only up to + V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS +- v4l2videodec: treat MPEG-1 format as MPEG-2 +- v4l2videoenc: support force keyframe event in v4l2 encoder +- tests: rtpbin_buffer_list: fix possible unaligned write/read on + 32-bit ARM + +gst-plugins-bad + +- asfmux: fix possible unaligned write on 32-bit ARM +- d3d11videosink: Fix error on pause and play +- d3dvideosink: Fix navigation event leak +- decklink: Correctly handle SDK strings on macOS and free strings + after usage on Linux +- dvdspu: Make sure enough data is allocated for the available data +- fdkaacdec: Support up to 5 rear channels +- h265parse: Fix framerate handling +- kmssink: Add STM32 LTDC and NXP i.MX8M Plus LCDIFv3 auto-detection +- sdpdemux: ensure that only one srcpad is created per stream +- srtpdec: fix critical warnings on shutdown +- testsrcbin: Remove spurious caps unref +- va: map the mbbrc to correct enum value in get_property() +- vtenc: apply DTS offset to ensure DTS <= PTS +- vtdec: time glitches on h264 playback +- waylandsink: Emit âmapâ signal boarder surface is ready + +gst-plugins-ugly + +- No changes + +gst-libav + +- No changes + +gst-rtsp-server + +- No changes + +gstreamer-vaapi + +- vaapidecodebin: donât load vaapipostproc if not available + +gstreamer-sharp + +- No changes + +gst-omx + +- No changes + +gst-python + +- python: More functions can be called before gst_init() + +gst-editing-services + +- ges: launcher: Never put sinks in a GstPipeline + +gst-validate + gst-integration-testsuites + +- No changes + +gst-examples + +- No changes + +Development build environment + +- No changes + +Cerbero build tool and packaging changes in 1.22.4 + +- Ship codecalpha, rtponvif, dvbsubenc, switchbin, videosignal plugins +- pango: Fix crash on Windows 32bit build +- qml6: Add support for building the qml6 plugin on Windows and bump + meson to 1.1.1 +- vaapi: update vaapi variant/recipe for meson option changes +- packages: Put libass in the same category as assrender +- cerbero: Donât extract if already extracted in fetch +- darwin: Ensure errors on unguarded use of new APIs, require macOS + 10.13 + +Contributors to 1.22.4 + +Andoni Morales Alastruey, Arun Raghavan, Colin Kinloch, Daniel Morin, +Edward Hervey, ekwange, Elliot Chen, François Laignel, Guillaume +Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Alexander Steffens +(heftig), Jochen Henneberg, Jordan Petridis, Kevin Song, Maksym +Khomenko, Marek Vasut, Mathieu Duponchelle, Matthew Waters, +Mengkejiergeli Ba, Michael Olbrich, Nicolas Beland, Nicolas Dufresne, +Nirbheek Chauhan, Philippe Normand, Piotr BrzeziÅski, Sebastian Dröge, +Seungha Yang, Thibault Saunier, Tim-Philipp Müller, VÃctor Manuel Jáquez +Leal, William Manley, Xavier Claessens, Yuri Fedoseev, + +⦠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.4 + +- List of Merge Requests applied in 1.22.4 +- List of Issues fixed in 1.22.4 + Schedule for 1.24 Our next major feature release will be 1.24, and 1.23 will be the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/RELEASE new/gst-plugins-good-1.22.4/RELEASE --- old/gst-plugins-good-1.22.3/RELEASE 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/RELEASE 2023-06-20 18:42:25.000000000 +0200 @@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-good 1.22.3. +This is GStreamer gst-plugins-good 1.22.4. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/docs/gst_plugins_cache.json new/gst-plugins-good-1.22.4/docs/gst_plugins_cache.json --- old/gst-plugins-good-1.22.3/docs/gst_plugins_cache.json 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/docs/gst_plugins_cache.json 2023-06-20 18:42:25.000000000 +0200 @@ -7027,7 +7027,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.3 FLV muxer", + "default": "GStreamer 1.22.4 FLV muxer", "mutable": "null", "readable": true, "type": "gchararray", @@ -7039,7 +7039,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.3 FLV muxer", + "default": "GStreamer 1.22.4 FLV muxer", "mutable": "null", "readable": true, "type": "gchararray", @@ -21257,7 +21257,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer/1.22.3", + "default": "GStreamer/1.22.4", "mutable": "null", "readable": true, "type": "gchararray", @@ -21816,7 +21816,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.3", + "default": "GStreamer 1.22.4", "mutable": "null", "readable": true, "type": "gchararray", @@ -23253,7 +23253,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer souphttpsrc 1.22.3 ", + "default": "GStreamer souphttpsrc 1.22.4 ", "mutable": "null", "readable": true, "type": "gchararray", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/adaptivedemux2/gstadaptivedemux.c new/gst-plugins-good-1.22.4/ext/adaptivedemux2/gstadaptivedemux.c --- old/gst-plugins-good-1.22.3/ext/adaptivedemux2/gstadaptivedemux.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/adaptivedemux2/gstadaptivedemux.c 2023-06-20 18:42:25.000000000 +0200 @@ -954,11 +954,12 @@ GST_DEBUG_OBJECT (demux, "Fetched manifest at URI: %s (base: %s)", demux->manifest_uri, GST_STR_NULL (demux->manifest_base_uri)); - if (!g_str_has_prefix (demux->manifest_uri, "http://") + if (!g_str_has_prefix (demux->manifest_uri, "data:") + && !g_str_has_prefix (demux->manifest_uri, "http://") && !g_str_has_prefix (demux->manifest_uri, "https://")) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (_("Invalid manifest URI")), - ("Manifest URI needs to use either http:// or https://")); + ("Manifest URI needs to use either data:, http:// or https://")); ret = FALSE; goto unlock_out; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/jpeg/gstjpegdec.c new/gst-plugins-good-1.22.4/ext/jpeg/gstjpegdec.c --- old/gst-plugins-good-1.22.3/ext/jpeg/gstjpegdec.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/jpeg/gstjpegdec.c 2023-06-20 18:42:25.000000000 +0200 @@ -880,7 +880,7 @@ gint lines, v_samp[3]; guchar *base[3], *last[3]; gint stride[3]; - guint height, field_height; + guint field_height; line[0] = y; line[1] = u; @@ -893,7 +893,7 @@ if (G_UNLIKELY (v_samp[0] > 2 || v_samp[1] > 2 || v_samp[2] > 2)) goto format_not_supported; - height = field_height = GST_VIDEO_FRAME_HEIGHT (frame); + field_height = GST_VIDEO_FRAME_HEIGHT (frame); /* XXX: division by 2 here might not be a good idea yes. But we are doing this * already in gst_jpeg_dec_handle_frame() for interlaced jpeg */ @@ -943,7 +943,7 @@ } else #endif { - for (i = 0; i < height; i += v_samp[0] * DCTSIZE) { + for (i = 0; i < field_height; i += v_samp[0] * DCTSIZE) { for (j = 0; j < (v_samp[0] * DCTSIZE); ++j) { /* Y */ line[0][j] = base[0] + (i + j) * stride[0]; @@ -1406,8 +1406,8 @@ /* is it interlaced MJPEG? (we really don't want to scan the jpeg data * to see if there are two SOF markers in the packet to detect this) */ if (gst_video_decoder_get_packetized (bdec) && - dec->input_state && - dec->input_state->info.height > height && + dec->input_state && height > DCTSIZE && + dec->input_state->info.height > (2 * (height - DCTSIZE)) && dec->input_state->info.height <= (height * 2) && dec->input_state->info.width == width) { GST_LOG_OBJECT (dec, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/libpng/gstpngdec.c new/gst-plugins-good-1.22.4/ext/libpng/gstpngdec.c --- old/gst-plugins-good-1.22.3/ext/libpng/gstpngdec.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/libpng/gstpngdec.c 2023-06-20 18:42:25.000000000 +0200 @@ -250,7 +250,7 @@ /* Add alpha channel if 16-bit depth, but not for GRAY images */ if ((bpc > 8) && (color_type != PNG_COLOR_TYPE_GRAY)) { - png_set_add_alpha (pngdec->png, 0xffff, PNG_FILLER_BEFORE); + png_set_add_alpha (pngdec->png, 0xffff, PNG_FILLER_AFTER); png_set_swap (pngdec->png); } #if 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/qt/meson.build new/gst-plugins-good-1.22.4/ext/qt/meson.build --- old/gst-plugins-good-1.22.3/ext/qt/meson.build 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/qt/meson.build 2023-06-20 18:42:25.000000000 +0200 @@ -22,6 +22,9 @@ # deciding whether to build the qt5 examples qt5qml_dep = dependency('', required: false) qt5_option = get_option('qt5') +qt5_egl = get_option('qt-egl') +qt5_wayland = get_option('qt-wayland') +qt5_x11 = get_option('qt-x11') qt5_method = get_option('qt-method') if qt5_option.disabled() @@ -68,18 +71,23 @@ # Look for the QPA platform native interface header qpa_header_path = join_paths(qt5qml_dep.version(), 'QtGui') qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h') -if cxx.has_header(qpa_header, dependencies : qt5qml_dep) +need_qpa_include = qt5_option.enabled() and (host_system == 'android' or qt5_wayland.enabled()) +if cxx.has_header(qpa_header, dependencies : qt5qml_dep, required: need_qpa_include) qt_defines += '-DHAVE_QT_QPA_HEADER' qt_defines += '-DQT_QPA_HEADER=' + '<@0@>'.format(qpa_header) have_qpa_include = true message('Found QtGui QPA header in ' + qpa_header_path) endif -# Try to come up with all the platform/winsys combinations that will work +## Try to come up with all the platform/winsys combinations that will work -if gst_gl_have_window_x11 and gst_gl_have_platform_glx - # FIXME: automagic - qt5x11extras = dependency('qt5', modules : ['X11Extras'], method: qt5_method, required : false) +# X11 windowing +qt5_x11 = qt5_x11 \ + .require(gstglx11_dep.found(), error_message: 'gstreamer-gl-x11-1.0 is required') \ + .require(gst_gl_have_window_x11, error_message: 'x11 windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_glx, error_message: 'glx platform support in gstreamer-gl is required') +if qt5_x11.allowed() + qt5x11extras = dependency('qt5', modules : ['X11Extras'], method: qt5_method, required: qt5_x11) if qt5x11extras.found() optional_deps += [qt5x11extras, gstglx11_dep] qt_defines += ['-DHAVE_QT_X11'] @@ -87,70 +95,105 @@ endif endif -if gst_gl_have_platform_egl - # Embedded linux (e.g. i.MX6) with or without windowing support +# Wayland windowing +qt5_wayland = qt5_wayland \ + .require(gstglwayland_dep.found(), error_message: 'gstreamer-gl-wayland-1.0 is required') \ + .require(gst_gl_have_window_wayland, error_message: 'wayland windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') \ + .require(have_qpa_include, error_message: 'QPA platform native interface header is required') +if qt5_wayland.allowed() + qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], method: qt5_method, required: qt5_wayland) + if qt5waylandextras.found() + optional_deps += [qt5waylandextras, gstglwayland_dep] + qt_defines += ['-DHAVE_QT_WAYLAND'] + have_qt_windowing = true + endif +endif + +# EGL windowing for Embedded linux (e.g. i.MX6) with or without windowing +# support +qt5_egl = qt5_egl \ + .require(host_system == 'linux') \ + .require(gstglegl_dep.found(), error_message: 'gstreamer-gl-egl-1.0 is required') \ + .require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') +if qt5_egl.allowed() qt_defines += ['-DHAVE_QT_EGLFS'] optional_deps += gstglegl_dep have_qt_windowing = true - if have_qpa_include - # Wayland windowing - if gst_gl_have_window_wayland - # FIXME: automagic - qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], method: qt5_method, required : false) - if qt5waylandextras.found() - optional_deps += [qt5waylandextras, gstglwayland_dep] - qt_defines += ['-DHAVE_QT_WAYLAND'] - have_qt_windowing = true - endif - endif - # Android windowing - if gst_gl_have_window_android - # FIXME: automagic - qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], method: qt5_method, required : false) - # for gl functions in QtGui/qopenglfunctions.h - # FIXME: automagic - glesv2_dep = cc.find_library('GLESv2', required : false) - if glesv2_dep.found() and qt5androidextras.found() - optional_deps += [qt5androidextras, glesv2_dep] - qt_defines += ['-DHAVE_QT_ANDROID'] - have_qt_windowing = true - # Needed for C++11 support in Cerbero. People building with Android - # in some other way need to add the necessary bits themselves. - optional_deps += dependency('gnustl', required : false) - endif +endif + +# Android windowing +if host_system == 'android' + qt5_android = qt5_option \ + .require(gst_gl_have_window_android, error_message: 'android windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') + if gst_gl_have_window_android + qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], method: qt5_method, required : qt5_android) + # for gl functions in QtGui/qopenglfunctions.h + glesv2_dep = cc.find_library('GLESv2', required : qt5_android) + if glesv2_dep.found() and qt5androidextras.found() + optional_deps += [qt5androidextras, glesv2_dep] + qt_defines += ['-DHAVE_QT_ANDROID'] + have_qt_windowing = true + # Needed for C++11 support in Cerbero. People building with Android + # in some other way need to add the necessary bits themselves. + optional_deps += dependency('gnustl', required : false) endif endif endif -if gst_gl_have_platform_wgl and gst_gl_have_window_win32 - # for wglMakeCurrent() - # FIXME: automagic - opengl32_dep = cc.find_library('opengl32', required : false) - if opengl32_dep.found() - qt_defines += ['-DHAVE_QT_WIN32'] - optional_deps += opengl32_dep - have_qt_windowing = true +# Win32 windowing +if host_system == 'windows' + qt5_win32 = qt5_option \ + .require(gst_gl_have_window_win32, error_message: 'win32 windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_wgl, error_message: 'wgl platform support in gstreamer-gl is required') + if qt5_win32.allowed() + # for wglMakeCurrent() + opengl32_dep = cc.find_library('opengl32', required : qt5_win32) + if opengl32_dep.found() + qt_defines += ['-DHAVE_QT_WIN32'] + optional_deps += opengl32_dep + have_qt_windowing = true + endif endif endif -if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl - # FIXME: automagic - qt5macextras = dependency('qt5', modules : ['MacExtras'], method: qt5_method, required : false) - if qt5macextras.found() - qt_defines += ['-DHAVE_QT_MAC'] - optional_deps += qt5macextras - have_qt_windowing = true +# macOS windowing +if host_system == 'darwin' + qt5_macos = qt5_option \ + .require(gst_gl_have_window_cocoa, error_message: 'cocoa windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_cgl, error_message: 'cgl platform support in gstreamer-gl is required') + if qt5_macos.allowed() + qt5macextras = dependency('qt5', modules : ['MacExtras'], method: qt5_method, required : qt5_macos) + if qt5macextras.found() + qt_defines += ['-DHAVE_QT_MAC'] + optional_deps += qt5macextras + have_qt_windowing = true + endif endif endif -if gst_gl_have_window_eagl and gst_gl_have_platform_eagl - if host_machine.system() == 'ios' +# iOS windowing +if host_system == 'ios' + qt5_ios = qt5_option \ + .require(gst_gl_have_window_eagl, error_message: 'eagl windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_eagl, error_message: 'eagl platform support in gstreamer-gl is required') + if qt5_ios.allowed() qt_defines += ['-DHAVE_QT_IOS'] have_qt_windowing = true endif endif -if have_qt_windowing +if qt5_option.require(have_qt_windowing).allowed() + # rpath is needed to be able to load the plugin on macOS inside the devenv + qmlgl_kwargs = {} + if host_system == 'darwin' + fs = import('fs') + qt_bindir = fs.parent(find_program('qmake').full_path()) + qt_libdir = fs.parent(qt_bindir) / 'lib' + qmlgl_kwargs += {'build_rpath': qt_libdir} + endif + # Build it! moc_files = qt5_mod.preprocess(moc_headers : moc_headers) gstqmlgl = library('gstqmlgl', sources, moc_files, @@ -159,6 +202,7 @@ include_directories: [configinc, libsinc], dependencies : [gst_dep, gstvideo_dep, gstgl_dep, gstglproto_dep, qt5qml_dep, optional_deps], override_options : ['cpp_std=c++11'], + kwargs: qmlgl_kwargs, install: true, install_dir : plugins_install_dir) plugins += [gstqmlgl] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/qt/qtglrenderer.cc new/gst-plugins-good-1.22.4/ext/qt/qtglrenderer.cc --- old/gst-plugins-good-1.22.3/ext/qt/qtglrenderer.cc 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/qt/qtglrenderer.cc 2023-06-20 18:42:25.000000000 +0200 @@ -152,7 +152,7 @@ delete data->m_context; data->m_context = nullptr; if (data->m_surface) - delete data->m_surface; + data->m_surface->deleteLater(); data->m_surface = nullptr; } @@ -281,7 +281,6 @@ g_mutex_lock (&m_sharedRenderData->lock); m_sharedRenderData->m_surface = new GstBackingSurface; m_sharedRenderData->m_surface->create(); - m_sharedRenderData->m_surface->moveToThread (m_sharedRenderData->m_renderThread); GST_TRACE ("%p created surface %p", m_sharedRenderData, m_sharedRenderData->m_surface); g_cond_broadcast (&m_sharedRenderData->cond); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/qt6/gstqt6glutility.cc new/gst-plugins-good-1.22.4/ext/qt6/gstqt6glutility.cc --- old/gst-plugins-good-1.22.3/ext/qt6/gstqt6glutility.cc 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/qt6/gstqt6glutility.cc 2023-06-20 18:42:25.000000000 +0200 @@ -254,7 +254,6 @@ gst_gl_display_filter_gl_api (display, gst_gl_context_get_gl_api (*wrap_glcontext)); gst_gl_context_activate (*wrap_glcontext, FALSE); } -#if 0 #if GST_GL_HAVE_WINDOW_WIN32 && GST_GL_HAVE_PLATFORM_WGL && defined (HAVE_QT_WIN32) g_return_val_if_fail (context != NULL, FALSE); @@ -289,7 +288,6 @@ } G_STMT_END; #endif -#endif return TRUE; } #if 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/ext/qt6/meson.build new/gst-plugins-good-1.22.4/ext/qt6/meson.build --- old/gst-plugins-good-1.22.3/ext/qt6/meson.build 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/ext/qt6/meson.build 2023-06-20 18:42:25.000000000 +0200 @@ -14,6 +14,9 @@ qt6qml_dep = dependency('', required: false) qt6_option = get_option('qt6') +qt6_egl = get_option('qt-egl') +qt6_wayland = get_option('qt-wayland') +qt6_x11 = get_option('qt-x11') qt6_method = get_option('qt-method') if qt6_option.disabled() @@ -53,83 +56,94 @@ # Look for the QPA platform native interface header qpa_header_path = join_paths(qt6qml_dep.version(), 'QtGui') qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h') -if cxx.has_header(qpa_header, dependencies : qt6qml_dep) +need_qpa_include = qt6_option.enabled() and (host_system == 'android' or qt6_wayland.enabled()) +if cxx.has_header(qpa_header, dependencies : qt6qml_dep, required: need_qpa_include) qt_defines += '-DHAVE_QT_QPA_HEADER' qt_defines += '-DQT_QPA_HEADER=' + '<@0@>'.format(qpa_header) have_qpa_include = true message('Found QtGui QPA header in ' + qpa_header_path) endif -# Try to come up with all the platform/winsys combinations that will work +## Try to come up with all the platform/winsys combinations that will work -if gst_gl_have_window_x11 and gst_gl_have_platform_glx - # FIXME: automagic +# X11 windowing +qt6_x11 = qt6_x11 \ + .require(gstglx11_dep.found(), error_message: 'gstreamer-gl-x11-1.0 is required') \ + .require(gst_gl_have_window_x11, error_message: 'x11 windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_glx, error_message: 'glx platform support in gstreamer-gl is required') +if qt6_x11.allowed() qt_defines += ['-DHAVE_QT_X11'] have_qt_windowing = true endif -if gst_gl_have_platform_egl - # Embedded linux (e.g. i.MX6) with or without windowing support +# Wayland windowing +qt6_wayland = qt6_wayland \ + .require(gstglwayland_dep.found(), error_message: 'gstreamer-gl-wayland-1.0 is required') \ + .require(gst_gl_have_window_wayland, error_message: 'wayland windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') \ + .require(have_qpa_include, error_message: 'QPA platform native interface header is required') +if qt6_wayland.allowed() + qt6waylandextras = dependency('qt6', modules : ['WaylandClient'], method: qt6_method, required: qt6_wayland) + if qt6waylandextras.found() + optional_deps += [qt6waylandextras, gstglwayland_dep] + qt_defines += ['-DHAVE_QT_WAYLAND'] + have_qt_windowing = true + endif +endif + +# EGL windowing for Embedded linux (e.g. i.MX6) with or without windowing +# support +qt6_egl = qt6_egl \ + .require(host_system == 'linux') \ + .require(gstglegl_dep.found(), error_message: 'gstreamer-gl-egl-1.0 is required') \ + .require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') +if qt6_egl.allowed() qt_defines += ['-DHAVE_QT_EGLFS'] optional_deps += gstglegl_dep have_qt_windowing = true - if have_qpa_include - # Wayland windowing - if gst_gl_have_window_wayland - # FIXME: automagic - qt6waylandextras = dependency('qt6', modules : ['WaylandClient'], method: qt6_method, required : false) - if qt6waylandextras.found() - optional_deps += [qt6waylandextras, gstglwayland_dep] - qt_defines += ['-DHAVE_QT_WAYLAND'] - have_qt_windowing = true - endif +endif + +# TODO: Android windowing + +# Win32 windowing +if host_system == 'windows' + qt6_win32 = qt6_option \ + .require(gst_gl_have_window_win32, error_message: 'win32 windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_wgl, error_message: 'wgl platform support in gstreamer-gl is required') + if qt6_win32.allowed() + # for wglMakeCurrent() + opengl32_dep = cc.find_library('opengl32', required : qt6_win32) + if opengl32_dep.found() + qt_defines += ['-DHAVE_QT_WIN32'] + optional_deps += opengl32_dep + have_qt_windowing = true endif - # Android windowing -# if gst_gl_have_window_android - # FIXME: automagic -# qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], method: qt6_method, required : false) - # for gl functions in QtGui/qopenglfunctions.h - # FIXME: automagic -# glesv2_dep = cc.find_library('GLESv2', required : false) -# if glesv2_dep.found() and qt5androidextras.found() -# optional_deps += [qt5androidextras, glesv2_dep] -# qt_defines += ['-DHAVE_QT_ANDROID'] -# have_qt_windowing = true - # Needed for C++11 support in Cerbero. People building with Android - # in some other way need to add the necessary bits themselves. -# optional_deps += dependency('gnustl', required : false) -# endif -# endif endif endif -#if gst_gl_have_platform_wgl and gst_gl_have_window_win32 - # for wglMakeCurrent() - # FIXME: automagic -# opengl32_dep = cc.find_library('opengl32', required : false) -# if opengl32_dep.found() -# qt_defines += ['-DHAVE_QT_WIN32'] -# optional_deps += opengl32_dep -# have_qt_windowing = true -# endif -#endif - -if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl - # FIXME: automagic - if host_machine.system() == 'darwin' +# macOS windowing +if host_system == 'darwin' + qt6_macos = qt6_option \ + .require(gst_gl_have_window_cocoa, error_message: 'cocoa windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_cgl, error_message: 'cgl platform support in gstreamer-gl is required') + if qt6_macos.allowed() qt_defines += ['-DHAVE_QT_MAC'] have_qt_windowing = true endif endif -if gst_gl_have_window_eagl and gst_gl_have_platform_eagl - if host_machine.system() == 'ios' +# iOS windowing +if host_system == 'ios' + qt6_ios = qt6_option \ + .require(gst_gl_have_window_eagl, error_message: 'eagl windowing support in gstreamer-gl is required') \ + .require(gst_gl_have_platform_eagl, error_message: 'eagl platform support in gstreamer-gl is required') + if qt6_ios.allowed() qt_defines += ['-DHAVE_QT_IOS'] have_qt_windowing = true endif endif -if have_qt_windowing +if qt6_option.require(have_qt_windowing).allowed() # Build it! moc_files = qt6_mod.preprocess(moc_headers : moc_headers) gstqml6gl = library('gstqml6', sources, moc_files, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/audioparsers/gstflacparse.c new/gst-plugins-good-1.22.4/gst/audioparsers/gstflacparse.c --- old/gst-plugins-good-1.22.3/gst/audioparsers/gstflacparse.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/audioparsers/gstflacparse.c 2023-06-20 18:42:25.000000000 +0200 @@ -1111,6 +1111,7 @@ GstMapInfo map; guint32 img_len = 0, img_type = 0; guint32 img_mimetype_len = 0, img_description_len = 0; + const guint8 *img_data; gst_buffer_map (buffer, &map, GST_MAP_READ); gst_byte_reader_init (&reader, map.data, map.size); @@ -1137,7 +1138,7 @@ if (!gst_byte_reader_get_uint32_be (&reader, &img_len)) goto error; - if (gst_byte_reader_get_pos (&reader) + img_len > map.size) + if (!gst_byte_reader_get_data (&reader, img_len, &img_data)) goto error; GST_INFO_OBJECT (flacparse, "Got image of %d bytes", img_len); @@ -1146,8 +1147,7 @@ if (flacparse->tags == NULL) flacparse->tags = gst_tag_list_new_empty (); - gst_tag_list_add_id3_image (flacparse->tags, - map.data + gst_byte_reader_get_pos (&reader), img_len, img_type); + gst_tag_list_add_id3_image (flacparse->tags, img_data, img_len, img_type); } gst_buffer_unmap (buffer, &map); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/flv/gstflvmux.c new/gst-plugins-good-1.22.4/gst/flv/gstflvmux.c --- old/gst-plugins-good-1.22.3/gst/flv/gstflvmux.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/flv/gstflvmux.c 2023-06-20 18:42:25.000000000 +0200 @@ -801,12 +801,6 @@ static GstFlowReturn gst_flv_mux_push (GstFlvMux * mux, GstBuffer * buffer) { - GstAggregator *agg = GST_AGGREGATOR (mux); - GstAggregatorPad *srcpad = GST_AGGREGATOR_PAD (agg->srcpad); - - if (GST_BUFFER_PTS_IS_VALID (buffer)) - srcpad->segment.position = GST_BUFFER_PTS (buffer); - /* pushing the buffer that rewrites the header will make it no longer be the * total output size in bytes, but it doesn't matter at that point */ mux->byte_count += gst_buffer_get_size (buffer); @@ -1660,6 +1654,8 @@ { GstBuffer *tag; GstFlowReturn ret; + GstClockTime pts = GST_BUFFER_PTS (buffer); + GstClockTime duration = GST_BUFFER_DURATION (buffer); GstClockTime dts = gst_flv_mux_segment_to_running_time (&GST_AGGREGATOR_PAD (pad)->segment, GST_BUFFER_DTS (buffer)); @@ -1678,6 +1674,14 @@ if (ret == GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (dts)) pad->last_timestamp = dts; + if (ret == GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (pts)) { + GstAggregator *agg = GST_AGGREGATOR (mux); + GstAggregatorPad *srcpad = GST_AGGREGATOR_PAD (agg->srcpad); + srcpad->segment.position = pts; + if (GST_CLOCK_TIME_IS_VALID (duration)) + srcpad->segment.position += duration; + } + return ret; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/atoms.c new/gst-plugins-good-1.22.4/gst/isomp4/atoms.c --- old/gst-plugins-good-1.22.3/gst/isomp4/atoms.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/atoms.c 2023-06-20 18:42:25.000000000 +0200 @@ -5706,9 +5706,9 @@ gst_byte_writer_init (&bw); hdl &= gst_byte_writer_put_uint8 (&bw, 0x00); /* version number */ hdl &= gst_byte_writer_put_uint8 (&bw, channels); - hdl &= gst_byte_writer_put_uint16_le (&bw, pre_skip); - hdl &= gst_byte_writer_put_uint32_le (&bw, rate); - hdl &= gst_byte_writer_put_uint16_le (&bw, output_gain); + hdl &= gst_byte_writer_put_uint16_be (&bw, pre_skip); + hdl &= gst_byte_writer_put_uint32_be (&bw, rate); + hdl &= gst_byte_writer_put_uint16_be (&bw, output_gain); hdl &= gst_byte_writer_put_uint8 (&bw, mapping_family); if (mapping_family > 0) { hdl &= gst_byte_writer_put_uint8 (&bw, stream_count); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/gstqtmux.c new/gst-plugins-good-1.22.4/gst/isomp4/gstqtmux.c --- old/gst-plugins-good-1.22.3/gst/isomp4/gstqtmux.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/gstqtmux.c 2023-06-20 18:42:25.000000000 +0200 @@ -6087,9 +6087,9 @@ } else if (strcmp (mimetype, "audio/x-ac3") == 0) { entry.fourcc = FOURCC_ac_3; - /* Fixed values according to TS 102 366 but it also mentions that - * they should be ignored */ - entry.channels = 2; + /* TS 102 366 mentions that these fields should be ignored, + * but be friendly and fill in the channel count like FFmpeg does */ + entry.channels = channels; entry.sample_size = 16; /* AC-3 needs an extension atom but its data can only be obtained from diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux.c new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux.c --- old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux.c 2023-06-20 18:42:25.000000000 +0200 @@ -8301,6 +8301,7 @@ case FOURCC_alac: case FOURCC_fLaC: case FOURCC_aavd: + case FOURCC_opus: { guint32 version; guint32 offset; @@ -8312,6 +8313,8 @@ min_size = 20; else if (fourcc == FOURCC_fLaC) min_size = 86; + else if (fourcc == FOURCC_opus) + min_size = 55; else min_size = 40; @@ -12647,6 +12650,16 @@ entry->bytes_per_packet = entry->bytes_per_sample; break; } + + /* According to TS 102 366, the channel count in + * a (E)AC3SampleEntry box is to be ignored */ + case 0x20736d: + case GST_MAKE_FOURCC ('e', 'c', '-', '3'): + case GST_MAKE_FOURCC ('s', 'a', 'c', '3'): // Nero Recode + case FOURCC_ac_3: + entry->n_channels = 0; + break; + default: break; } @@ -12873,34 +12886,95 @@ } case FOURCC_opus: { - const guint8 *dops_data; guint8 *channel_mapping = NULL; - guint32 rate; - guint8 channels; + guint32 dops_len, rate; + guint8 n_channels; guint8 channel_mapping_family; guint8 stream_count; guint8 coupled_count; guint8 i; - version = GST_READ_UINT16_BE (stsd_entry_data + 16); - if (version == 1) - dops_data = stsd_entry_data + 51; - else - dops_data = stsd_entry_data + 35; - - channels = GST_READ_UINT8 (dops_data + 10); - rate = GST_READ_UINT32_LE (dops_data + 13); - channel_mapping_family = GST_READ_UINT8 (dops_data + 19); - stream_count = GST_READ_UINT8 (dops_data + 20); - coupled_count = GST_READ_UINT8 (dops_data + 21); - - if (channels > 0) { - channel_mapping = g_malloc (channels * sizeof (guint8)); - for (i = 0; i < channels; i++) - channel_mapping[i] = GST_READ_UINT8 (dops_data + i + 22); + GNode *opus; + GNode *dops; + + opus = qtdemux_tree_get_child_by_type (stsd, FOURCC_opus); + if (opus == NULL) { + GST_WARNING_OBJECT (qtdemux, "Opus Sample Entry not found"); + goto corrupt_file; + } + + dops = qtdemux_tree_get_child_by_type (opus, FOURCC_dops); + if (dops == NULL) { + GST_WARNING_OBJECT (qtdemux, "Opus Specific Box not found"); + goto corrupt_file; + } + + /* Opus Specific Box content: + * 4 bytes: length + * 4 bytes: "dOps" + * 1 byte: Version; + * 1 byte: OutputChannelCount; + * 2 bytes: PreSkip (big-endians); + * 4 bytes: InputSampleRate (big-endians); + * 2 bytes: OutputGain (big-endians); + * 1 byte: ChannelMappingFamily; + * if (ChannelMappingFamily != 0) { + * 1 byte: StreamCount; + * 1 byte: CoupledCount; + * for (OutputChannel in 0..OutputChannelCount) { + * 1 byte: ChannelMapping; + * } + * } + */ + + dops_len = QT_UINT32 ((guint8 *) dops->data); + if (len < offset + dops_len) { + GST_WARNING_OBJECT (qtdemux, + "Opus Sample Entry has bogus size %" G_GUINT32_FORMAT, len); + goto corrupt_file; + } + if (dops_len < 19) { + GST_WARNING_OBJECT (qtdemux, + "Opus Specific Box has bogus size %" G_GUINT32_FORMAT, + dops_len); + goto corrupt_file; + } + + n_channels = GST_READ_UINT8 ((guint8 *) dops->data + 9); + rate = GST_READ_UINT32_BE ((guint8 *) dops->data + 12); + channel_mapping_family = GST_READ_UINT8 ((guint8 *) dops->data + 18); + + if (channel_mapping_family != 0) { + if (dops_len < 21 + n_channels) { + GST_WARNING_OBJECT (qtdemux, + "Opus Specific Box has bogus size %" G_GUINT32_FORMAT, + dops_len); + goto corrupt_file; + } + + stream_count = GST_READ_UINT8 ((guint8 *) dops->data + 19); + coupled_count = GST_READ_UINT8 ((guint8 *) dops->data + 20); + + if (n_channels > 0) { + channel_mapping = g_malloc (n_channels * sizeof (guint8)); + for (i = 0; i < n_channels; i++) + channel_mapping[i] = + GST_READ_UINT8 ((guint8 *) dops->data + i + 21); + } + } else if (n_channels == 1) { + stream_count = 1; + coupled_count = 0; + } else if (n_channels == 2) { + stream_count = 1; + coupled_count = 1; + } else { + GST_WARNING_OBJECT (qtdemux, + "Opus unexpected nb of channels %d without channel mapping", + n_channels); + goto corrupt_file; } - entry->caps = gst_codec_utils_opus_create_caps (rate, channels, + entry->caps = gst_codec_utils_opus_create_caps (rate, n_channels, channel_mapping_family, stream_count, coupled_count, channel_mapping); g_free (channel_mapping); @@ -13256,6 +13330,7 @@ } break; } + case FOURCC_opus: case FOURCC_lpcm: case FOURCC_in24: case FOURCC_in32: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_dump.c new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_dump.c --- old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_dump.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_dump.c 2023-06-20 18:42:25.000000000 +0200 @@ -1054,6 +1054,88 @@ } gboolean +qtdemux_dump_opus (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint16 version, data_ref_id, n_channels, sample_size; + guint32 sample_rate; + + if (!gst_byte_reader_skip (data, 6) || + !gst_byte_reader_get_uint16_be (data, &data_ref_id) || + !gst_byte_reader_get_uint16_be (data, &version) || + !gst_byte_reader_skip (data, 6) || + !gst_byte_reader_get_uint16_be (data, &n_channels) || + !gst_byte_reader_get_uint16_be (data, &sample_size) || + !gst_byte_reader_skip (data, 4) || + !gst_byte_reader_get_uint32_be (data, &sample_rate)) + return FALSE; + + GST_LOG ("%*s data reference: %d", depth, "", data_ref_id); + GST_LOG ("%*s version: %d", depth, "", version); + GST_LOG ("%*s channel count: %d", depth, "", n_channels); + GST_LOG ("%*s sample size: %d", depth, "", sample_size); + GST_LOG ("%*s sample rate: %d", depth, "", sample_rate >> 16); + + return TRUE; +} + +gboolean +qtdemux_dump_dops (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint8 version, n_channels, channel_mapping_family; + guint8 stream_count = 1, coupled_count = 0, i = 0; + guint8 *channel_mapping = NULL; + guint16 pre_skip, output_gain; + guint32 sample_rate; + + if (!gst_byte_reader_get_uint8 (data, &version) || + !gst_byte_reader_get_uint8 (data, &n_channels) || + !gst_byte_reader_get_uint16_be (data, &pre_skip) || + !gst_byte_reader_get_uint32_be (data, &sample_rate) || + !gst_byte_reader_get_uint16_be (data, &output_gain) || + !gst_byte_reader_get_uint8 (data, &channel_mapping_family)) + return FALSE; + + if (channel_mapping_family != 0) { + if (!gst_byte_reader_get_uint8 (data, &stream_count) || + !gst_byte_reader_get_uint8 (data, &coupled_count)) + return FALSE; + + if (n_channels > 0) { + channel_mapping = g_malloc (n_channels * sizeof (guint8)); + + for (i = 0; i < n_channels; i++) + if (!gst_byte_reader_get_uint8 (data, &channel_mapping[i])) { + g_free (channel_mapping); + return FALSE; + } + } + } + + GST_LOG ("%*s version: %d", depth, "", version); + GST_LOG ("%*s channel count: %d", depth, "", n_channels); + GST_LOG ("%*s pre skip: %d", depth, "", pre_skip); + GST_LOG ("%*s sample rate: %d", depth, "", sample_rate); + GST_LOG ("%*s output gain: %d", depth, "", output_gain); + GST_LOG ("%*s channel mapping family: %d", depth, "", + channel_mapping_family); + + if (channel_mapping_family != 0) { + GST_LOG ("%*s stream count: %d", depth, "", stream_count); + GST_LOG ("%*s coupled count: %d", depth, "", coupled_count); + + if (n_channels > 0) { + for (i = 0; i < n_channels; i++) + GST_LOG ("%*s channel mapping: %d -> %d", depth, "", i, + channel_mapping[i]); + + g_free (channel_mapping); + } + } + + return TRUE; +} + +gboolean qtdemux_dump_gmin (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_dump.h new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_dump.h --- old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_dump.h 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_dump.h 2023-06-20 18:42:25.000000000 +0200 @@ -89,6 +89,10 @@ int depth); gboolean qtdemux_dump_fLaC (GstQTDemux * qtdemux, GstByteReader * data, int depth); +gboolean qtdemux_dump_opus (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_dops (GstQTDemux * qtdemux, GstByteReader * data, + int depth); gboolean qtdemux_dump_gmin (GstQTDemux * qtdemux, GstByteReader * data, int depth); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_types.c new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_types.c --- old/gst-plugins-good-1.22.3/gst/isomp4/qtdemux_types.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/isomp4/qtdemux_types.c 2023-06-20 18:42:25.000000000 +0200 @@ -97,6 +97,8 @@ {FOURCC_alac, "alac", 0,}, {FOURCC_fLaC, "fLaC", 0, qtdemux_dump_fLaC}, {FOURCC_dfLa, "dfLa", 0, qtdemux_dump_dfLa}, + {FOURCC_opus, "opus", 0, qtdemux_dump_opus}, + {FOURCC_dops, "dOps", 0, qtdemux_dump_dops}, {FOURCC_wave, "wave", QT_FLAG_CONTAINER}, {FOURCC_appl, "appl", QT_FLAG_CONTAINER}, {FOURCC_cfhd, "cfhd", QT_FLAG_CONTAINER}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst/rtsp/gstrtspsrc.c new/gst-plugins-good-1.22.4/gst/rtsp/gstrtspsrc.c --- old/gst-plugins-good-1.22.3/gst/rtsp/gstrtspsrc.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst/rtsp/gstrtspsrc.c 2023-06-20 18:42:25.000000000 +0200 @@ -9341,21 +9341,33 @@ GST_OBJECT_LOCK (src); cmd = src->pending_cmd; - if (cmd == CMD_RECONNECT || cmd == CMD_PLAY || cmd == CMD_PAUSE - || cmd == CMD_LOOP || cmd == CMD_OPEN || cmd == CMD_GET_PARAMETER - || cmd == CMD_SET_PARAMETER) { - if (g_queue_is_empty (&src->set_get_param_q)) { - src->pending_cmd = CMD_LOOP; - } else { - ParameterRequest *next_req; - if (cmd == CMD_GET_PARAMETER || cmd == CMD_SET_PARAMETER) { - req = g_queue_pop_head (&src->set_get_param_q); + + switch (cmd) { + case CMD_CLOSE: + src->pending_cmd = CMD_WAIT; + break; + case CMD_GET_PARAMETER: + case CMD_SET_PARAMETER: + req = g_queue_pop_head (&src->set_get_param_q); + if (!req) + cmd = CMD_LOOP; + /* fall through */ + case CMD_OPEN: + case CMD_PLAY: + case CMD_PAUSE: + case CMD_LOOP: + case CMD_RECONNECT: + if (g_queue_is_empty (&src->set_get_param_q)) { + src->pending_cmd = CMD_LOOP; + } else { + ParameterRequest *next_req; + next_req = g_queue_peek_head (&src->set_get_param_q); + src->pending_cmd = next_req->cmd; } - next_req = g_queue_peek_head (&src->set_get_param_q); - src->pending_cmd = next_req ? next_req->cmd : CMD_LOOP; - } - } else - src->pending_cmd = CMD_WAIT; + break; + default: + break; + } GST_DEBUG_OBJECT (src, "got command %s", cmd_to_string (cmd)); /* we got the message command, so ensure communication is possible again */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/gst-plugins-good.doap new/gst-plugins-good-1.22.4/gst-plugins-good.doap --- old/gst-plugins-good-1.22.3/gst-plugins-good.doap 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/gst-plugins-good.doap 2023-06-20 18:42:25.000000000 +0200 @@ -34,6 +34,16 @@ <release> <Version> + <revision>1.22.4</revision> + <branch>1.22</branch> + <name></name> + <created>2023-06-20</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.22.4.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.22.3</revision> <branch>1.22</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/meson.build new/gst-plugins-good-1.22.4/meson.build --- old/gst-plugins-good-1.22.3/meson.build 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/meson.build 2023-06-20 18:42:25.000000000 +0200 @@ -1,5 +1,5 @@ project('gst-plugins-good', 'c', - version : '1.22.3', + version : '1.22.4', meson_version : '>= 0.62', default_options : [ 'warning_level=1', 'buildtype=debugoptimized' ]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/meson_options.txt new/gst-plugins-good-1.22.4/meson_options.txt --- old/gst-plugins-good-1.22.3/meson_options.txt 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/meson_options.txt 2023-06-20 18:42:25.000000000 +0200 @@ -87,6 +87,9 @@ # Qt plugin options option('qt-method', type: 'combo', value: 'auto', choices: ['auto', 'pkg-config', 'qmake'], description: 'Method to use to find Qt') +option('qt-egl', type: 'feature', value: 'auto', description: 'EGLFS support in the Qt plugins') +option('qt-wayland', type: 'feature', value: 'auto', description: 'Wayland support in the Qt plugins') +option('qt-x11', type: 'feature', value: 'auto', description: 'Wayland support in the Qt plugins') option('qt5', type : 'feature', value : 'auto', yield : true, description : 'Qt5 QML video sink plugin') option('qt6', type : 'feature', value : 'auto', yield : true, description : 'Qt6 QML video sink plugin') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2bufferpool.c new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2bufferpool.c --- old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2bufferpool.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2bufferpool.c 2023-06-20 18:42:25.000000000 +0200 @@ -1378,7 +1378,7 @@ break; } - if (GST_VIDEO_INFO_FORMAT (&obj->info) == GST_VIDEO_FORMAT_ENCODED) { + if (!gst_v4l2_object_is_raw (obj)) { if ((group->buffer.flags & V4L2_BUF_FLAG_KEYFRAME) || GST_V4L2_PIXELFORMAT (obj) == V4L2_PIX_FMT_MJPEG || GST_V4L2_PIXELFORMAT (obj) == V4L2_PIX_FMT_JPEG || diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2object.c new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2object.c --- old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2object.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2object.c 2023-06-20 18:42:25.000000000 +0200 @@ -1668,6 +1668,22 @@ return template; } +gboolean +gst_v4l2_object_is_raw (GstV4l2Object * v4l2object) +{ + gint i; + + if (GST_VIDEO_INFO_FORMAT (&v4l2object->info) != GST_VIDEO_FORMAT_ENCODED) + return TRUE; + + for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) { + if (gst_v4l2_formats[i].format == GST_V4L2_PIXELFORMAT (v4l2object)) { + return ! !(gst_v4l2_formats[i].flags & GST_V4L2_RAW); + } + } + return FALSE; +} + /* Add an 'alternate' variant of the caps with the feature */ static void add_alternate_variant (GstV4l2Object * v4l2object, GstCaps * caps, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2object.h new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2object.h --- old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2object.h 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2object.h 2023-06-20 18:42:25.000000000 +0200 @@ -320,6 +320,8 @@ GstFlowReturn gst_v4l2_object_poll (GstV4l2Object * v4l2object, GstClockTime timeout); gboolean gst_v4l2_object_subscribe_event (GstV4l2Object * v4l2object, guint32 event); +gboolean gst_v4l2_object_is_raw (GstV4l2Object * obj); + /* crop / compose */ gboolean gst_v4l2_object_set_crop (GstV4l2Object * obj, struct v4l2_rect *result); gboolean gst_v4l2_object_get_crop_bounds (GstV4l2Object * obj, struct v4l2_rect *bounds); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2videodec.c new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2videodec.c --- old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2videodec.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2videodec.c 2023-06-20 18:42:25.000000000 +0200 @@ -1384,12 +1384,20 @@ gint mpegversion = 0; gst_structure_get_int (s, "mpegversion", &mpegversion); - if (mpegversion == 2) { - SET_META ("MPEG2"); - cdata->codec = gst_v4l2_mpeg2_get_codec (); - } else { - SET_META ("MPEG4"); - cdata->codec = gst_v4l2_mpeg4_get_codec (); + switch (mpegversion) { + /* MPEG 2 decoders supports MPEG 1 format */ + case 1: + case 2: + SET_META ("MPEG2"); + cdata->codec = gst_v4l2_mpeg2_get_codec (); + break; + case 4: + SET_META ("MPEG4"); + cdata->codec = gst_v4l2_mpeg4_get_codec (); + break; + default: + g_warning ("Unsupported MPEG Video version %i", mpegversion); + break; } } else if (gst_structure_has_name (s, "video/x-h263")) { SET_META ("H263"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2videoenc.c new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2videoenc.c --- old/gst-plugins-good-1.22.3/sys/v4l2/gstv4l2videoenc.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/gstv4l2videoenc.c 2023-06-20 18:42:25.000000000 +0200 @@ -817,6 +817,17 @@ } if (frame->input_buffer) { + /* Process force keyframe event if it was passed */ + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + struct v4l2_control ctrl = { V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, 1 }; + if (self->v4l2output->ioctl (self->v4l2output->video_fd, VIDIOC_S_CTRL, + &ctrl) < 0) + GST_ELEMENT_WARNING (self, RESOURCE, FAILED, + (_("Failed to force keyframe.")), + ("VIDIOC_S_CTRL (V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME) failed: %s (%d)", + g_strerror (errno), errno)); + } + GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder); GST_LOG_OBJECT (encoder, "Passing buffer with frame number %u", frame->system_frame_number); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/sys/v4l2/v4l2_calls.c new/gst-plugins-good-1.22.4/sys/v4l2/v4l2_calls.c --- old/gst-plugins-good-1.22.3/sys/v4l2/v4l2_calls.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/sys/v4l2/v4l2_calls.c 2023-06-20 18:42:25.000000000 +0200 @@ -307,6 +307,10 @@ } else { GST_WARNING_OBJECT (e, "Failed querying control %d on device '%s'. " "(%d - %s)", n, v4l2object->videodev, errno, strerror (errno)); + if (n > (V4L2_CID_PRIVATE_BASE + V4L2_CID_MAX_CTRLS)) { + GST_DEBUG_OBJECT (e, "Finish control by reaching V4L2_CID_MAX_CTRLS"); + break; + } continue; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/gst-plugins-good-1.22.3/tests/check/elements/rtpbin_buffer_list.c new/gst-plugins-good-1.22.4/tests/check/elements/rtpbin_buffer_list.c --- old/gst-plugins-good-1.22.3/tests/check/elements/rtpbin_buffer_list.c 2023-05-19 10:23:19.000000000 +0200 +++ new/gst-plugins-good-1.22.4/tests/check/elements/rtpbin_buffer_list.c 2023-06-20 18:42:25.000000000 +0200 @@ -25,6 +25,12 @@ #include <gst/rtp/gstrtpbuffer.h> #include <gst/rtp/gstrtcpbuffer.h> +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define READ_UINT64(mem) GST_READ_UINT64_BE(mem) +#else +#define READ_UINT64(mem) GST_READ_UINT64_LE(mem) +#endif + /* UDP/IP is assumed for bandwidth calculation */ #define UDP_IP_HEADER_OVERHEAD 28 @@ -236,8 +242,8 @@ * most likely be changed in gstrtpbin. */ fail_unless (info.data != NULL); - fail_unless_equals_uint64 (*(guint64 *) info.data, - *(guint64 *) rtp_header[index]); + fail_unless_equals_uint64 (READ_UINT64 (info.data), + READ_UINT64 (rtp_header[index])); fail_unless (*(guint16 *) (info.data + 12) == *(guint16 *) (rtp_header[index] + 12)); ++++++ reduce-required-meson.patch ++++++ --- /var/tmp/diff_new_pack.4WFZas/_old 2023-07-01 23:17:28.818054952 +0200 +++ /var/tmp/diff_new_pack.4WFZas/_new 2023-07-01 23:17:28.822054976 +0200 @@ -1,10 +1,10 @@ -Index: gst-plugins-good-1.22.3/meson.build +Index: gst-plugins-good-1.22.4/meson.build =================================================================== ---- gst-plugins-good-1.22.3.orig/meson.build -+++ gst-plugins-good-1.22.3/meson.build +--- gst-plugins-good-1.22.4.orig/meson.build ++++ gst-plugins-good-1.22.4/meson.build @@ -1,6 +1,6 @@ project('gst-plugins-good', 'c', - version : '1.22.3', + version : '1.22.4', - meson_version : '>= 0.62', + meson_version : '>= 0.61', default_options : [ 'warning_level=1',