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 2024-01-05 21:40:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-good (Old) and /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.28375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-good" Fri Jan 5 21:40:06 2024 rev:99 rq:1136821 version:1.22.8 Changes: -------- --- /work/SRC/openSUSE:Factory/gstreamer-plugins-good/gstreamer-plugins-good.changes 2023-11-17 20:49:08.760276336 +0100 +++ /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.28375/gstreamer-plugins-good.changes 2024-01-05 21:40:15.139733011 +0100 @@ -1,0 +2,19 @@ +Thu Jan 4 07:54:19 UTC 2024 - Antonio Larrosa <alarr...@suse.com> + +- Update to version 1.22.8: + + dcaparse: keep upstream buffer meta + + rtpklvdepay: Recover after invalid fragmented KLV unit + + matroska-demux: fix accumulated base offset in segment seeks + + qtdemux: fix bug report URL + + qtdemux: Don't overflow sample index + + qtdemux: Fix reverse playback for pcm audio stream + + qtdemux: Ignore raw audio streams when adjusting seek + + qtdemux: Under-seeking to a key unit in certain (encoded by + Adobe products) ProRes movies (macOS x86_64 & arm64, + Windows x86_64, ...) + + rtpac3depay: should output audio/x-ac3 not audio/ac3 + + rtp: Fix incorrect RTP channel order lookup by name + + v4l2bufferpool: add lock as atomic operation for seek +- Rebase reduce-required-meson.patch + +------------------------------------------------------------------- Old: ---- gst-plugins-good-1.22.7.tar.xz New: ---- gst-plugins-good-1.22.8.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gstreamer-plugins-good.spec ++++++ --- /var/tmp/diff_new_pack.rLwqqu/_old 2024-01-05 21:40:15.987764019 +0100 +++ /var/tmp/diff_new_pack.rLwqqu/_new 2024-01-05 21:40:15.987764019 +0100 @@ -1,7 +1,7 @@ # # spec file for package gstreamer-plugins-good # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -26,7 +26,7 @@ %define gst_branch 1.0 Name: gstreamer-plugins-good -Version: 1.22.7 +Version: 1.22.8 Release: 0 Summary: GStreamer Streaming-Media Framework Plug-Ins License: LGPL-2.1-or-later ++++++ gst-plugins-good-1.22.7.tar.xz -> gst-plugins-good-1.22.8.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/ChangeLog new/gst-plugins-good-1.22.8/ChangeLog --- old/gst-plugins-good-1.22.7/ChangeLog 2023-11-13 12:07:52.976034200 +0100 +++ new/gst-plugins-good-1.22.8/ChangeLog 2023-12-18 13:13:04.650869600 +0100 @@ -1,3 +1,125 @@ +=== release 1.22.8 === + +2023-12-18 12:09:37 +0000 Tim-Philipp Müller <t...@centricular.com> + + * NEWS: + * RELEASE: + * docs/gst_plugins_cache.json: + * gst-plugins-good.doap: + * meson.build: + Release 1.22.8 + +2023-12-15 15:19:35 -0500 Arun Raghavan <a...@asymptotic.io> + + * gst/rtp/gstrtpchannels.c: + rtp: Fix incorrect RTP channel order lookup by name + The g_ascii_strcasecmp() logic is inverted, since it returns 0 on equality. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5817> + +2023-04-29 16:20:13 +0100 Tim-Philipp Müller <t...@centricular.com> + + * gst/matroska/matroska-demux.c: + * tests/check/elements/matroskademux.c: + matroska-demux: fix accumulated base offset in segment seeks + When doing a segment seek, the base offset in the new segment + would be increased by segment.position which is basically the + timestamp of the last packet. This does not include the duration + of the last packet though, so might be slightly shorter than the + actual duration of the clip or the requested segment. + Increase the base offset by the segment duration instead when + accumulating segments, which is more correct as it doesn't cut + off the last frame and makes the effective loop segment duration + consistent with the actual duration returned from a duration + query. + In case a segment stop was specified it's also possible that + some data was sent beyond the stop that's necessary for decoding + so the base offset increment should be based on that then and + not on the timestamp of the last buffer pushed out. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5787> + +2023-12-05 09:25:22 +0100 Guillaume Desmottes <guillaume.desmot...@onestream.live> + + * gst/isomp4/qtdemux_tags.c: + * meson.build: + qtdemux: fix bug report URL + Using PACKAGE_BUGREPORT as in other modules. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5786> + +2023-12-01 14:51:49 +0900 Hosang Lee <hosang10....@lge.com> + + * gst/isomp4/qtdemux.c: + qtdemux: Don't overflow sample index + Don't reduce sample index if it is already at 0. + Assigning -1 to a guint32 variable causes unexpected behavior. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5751> + +2023-12-01 15:05:41 +0900 Hosang Lee <hosang10....@lge.com> + + * gst/isomp4/qtdemux.c: + qtdemux: Fix reverse playback for pcm audio stream + Some raw lpcm or adpcm may have larger sample sizes than the max + buffer size value set. + Trimming the buffer causes bogus size error on reverse playback. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5745> + +2023-04-21 09:58:36 +0800 jeri.li <jeri...@mediatek.com> + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2bufferpool: add lock as atomic operation for seek + When seek flush, gst v4l2 buffer pool flush is not atomic which will + lead double enqueue buffer (qbuf) issue, and v4l2 buffer pool qbuf is + also not atomic which will lead no free buffer found in the pool. + 1. add lock for calculate enqueue number in streamon function + 2. add lock for v4l2 capture end streamoff in pool flush function + 3. lock the whole funciton of v4l2 buffer pool qbuf, then the buffer + pool index and qbuf operation are atomic + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5695> + +2023-06-07 14:38:18 +0200 Robin Gustavsson <robin.gustavs...@spiideo.com> + + * gst/rtp/gstrtpklvdepay.c: + * tests/check/elements/rtp-payloading.c: + rtpklvdepay: Recover after invalid fragmented KLV unit + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5686> + +2023-06-29 15:20:29 +0200 Piotr BrzeziÅski <pi...@centricular.com> + + * gst/isomp4/qtdemux.c: + qtdemux: Ignore raw audio streams when adjusting seek + Because we treat raw audio chunks/samples as keyframes, they were interfering + with seek time adjustment. + Became apparent when the accompanying video stream was I-frame only, + for example ProRes. + Since raw audio streams can be seeked freely, it's fine to just ignore them here, + giving priority to the real keyframes in the video stream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5674> + +2023-10-12 17:23:00 +0100 Tim-Philipp Müller <t...@centricular.com> + + * docs/gst_plugins_cache.json: + * gst/rtp/gstrtpac3depay.c: + rtpac3depay: should output audio/x-ac3 not audio/ac3 + audio/x-ac3 is the canonical media format in GStreamer. + audio/ac3 is sometimes accepted as input (e.g. in rtpac3pay + or ac3parse), but shouldn't be output. + Fixes #3038. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5662> + +2023-11-14 15:36:34 +0900 Dongyun Seo <dongyun....@lge.com> + + * gst/audioparsers/gstdcaparse.c: + dcaparse: keep upstream buffer meta + Some audio decoders cannot decode DTS stream if there is no + valid timestamp. So, keep upstream buffer meta. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5664> + +2023-11-13 14:57:09 +0000 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/5650> + === release 1.22.7 === 2023-11-13 11:04:22 +0000 Tim-Philipp Müller <t...@centricular.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/NEWS new/gst-plugins-good-1.22.8/NEWS --- old/gst-plugins-good-1.22.7/NEWS 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/NEWS 2023-12-18 13:09:37.000000000 +0100 @@ -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.7 and was -released on 13 November 2023. +The latest bug-fix release in the stable 1.22 series is 1.22.8 and was +released on 18 December 2023. See https://gstreamer.freedesktop.org/releases/1.22/ for the latest version of this document. -Last updated: Monday 13 November 2023, 10:00 UTC (log) +Last updated: Monday 18 December 2023, 11:00 UTC (log) Introduction @@ -2582,6 +2582,160 @@ - List of Merge Requests applied in 1.22.7 - List of Issues fixed in 1.22.7 +1.22.8 + +The eight 1.22 bug-fix release (1.22.8) was released on 18 December +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.8 + +- Security fixes for the AV1 video codec parser +- avdec video decoder: fix another possible deadlock with FFmpeg 6.1 +- qtdemux: reverse playback and seeking fixes for files with raw audio + streams +- v4l2: fix ânewly allocated buffer ⦠is not freeâ warning log flood +- GstPlay + GstPlayer library fixes +- dtls: Fix build failure on Windows when compiling against OpenSSL + 3.2.0 +- d3d11screencapturesrc: Fix wrong color with HDR enabled +- Cerbero build tool: More python 3.12 string escape warning fixes; + make sure to bundle build tools as well +- various bug fixes, build fixes, memory leak fixes, and other + stability and reliability improvements + +gstreamer + +- buffer: Unref memories before metas +- pad: Recheck pads when linking after temporary unlock +- baseparse: Fixes to buffers extracted from adapter + +gst-plugins-base + +- appsrc: Fix flow return when buffer is dropped +- audioringbuffer: Donât try to map MONO channel +- encoding-target: Properly free when missing type field in + parse_encoding_profile +- pbutils: Donât include default vp9 parameters in resulting codec + mime string +- videorate: Donât forget last_ts on caps changes + +gst-plugins-good + +- dcaparse: keep upstream buffer meta +- rtpklvdepay: Recover after invalid fragmented KLV unit +- matroska-demux: fix accumulated base offset in segment seeks +- qtdemux: fix bug report URL +- qtdemux: Donât overflow sample index +- qtdemux: Fix reverse playback for pcm audio stream +- qtdemux: Ignore raw audio streams when adjusting seek +- qtdemux: Under-seeking to a key unit in certain (encoded by Adobe + products) ProRes movies (macOS x86_64 & arm64, Windows x86_64, â¦) +- rtpac3depay: should output audio/x-ac3 not audio/ac3 +- rtp: Fix incorrect RTP channel order lookup by name +- v4l2bufferpool: add lock as atomic operation for seek + +gst-plugins-bad + +- aesenc: Fix IV length addition to output buffer length +- av1parser: Fix array sizes in scalability structure +- camerabin: Fix source updates with user filters +- codecparsers: av1: Clip max tile rows and cols values +- dtlscertificate: Define WINSOCKAPI before including windows.h +- d3d11: fix building with address sanitizer +- d3d11screencapturesrc: Fix wrong color with HDR enabled +- h264decoder: Fix GstVideoCodecFrame leak +- ladspa: Make RDF parsing truly optional +- rtponviftimestamp: Fix drop-out-of-segment=false mode +- qsvdecoder: Fix stream format detection +- webrtcsdp: Remove fingerprint validation that doesnât make sense +- GstPlay: Automatically flush the bus when disposing the signal + adapter +- GstPlayer: Without dispatcher emit signals directly instead of via + the default main context + +gst-plugins-ugly + +- No changes + +gst-plugins-rs + +- threadshare: Fix a deadlock in used-socket notification +- threadshare: Fix a typo while logging +- webrtcsink: donât panic on failure to request pad from webrtcbin +- ndi: Remove wrong Clone impl on RecvInstance +- ndi: Donât mark private type as public +- fallbacksrc: Fix timeout scheduling + +gst-libav + +- avviddec: Unlock stream lock while waiting for decoded frame. Fixes + potential deadlock +- avviddec: Calculate latency only for fixed framerate + +gst-rtsp-server + +- No changes + +gstreamer-vaapi + +- No changes + +gstreamer-sharp + +- No changes + +gst-omx + +- No changes + +gst-python + +- No changes + +gst-editing-services + +- No changes + +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.8 + +- cerbero: Fix some more python 3.12 string escape warnings +- cerbero: Fix bundle-source not including build-tools recipes, fix + CalledProcessError handling +- pango: Add Perl interpreter consistency check + +Contributors to 1.22.8 + +Alessandro Bono, Alexander Slobodeniuk, Arun Raghavan, Benjamin +Gaignard, Daniel Moberg, Dongyun Seo, Doug Nazar, Guillaume Desmottes, +Hosang Lee, Jan Alexander Steffens (heftig), jeri.li, Jimmy Ohn, L. E. +Segovia, Mathieu Duponchelle, Nicolas Dufresne, Nirbheek Chauhan, +Olivier Crête, Philippe Normand, Piotr BrzeziÅski, Rabindra Harlalka, +Robert Mader, Robin Gustavsson, Sebastian Dröge, Seungha Yang, Stefan +Brüns, Tim-Philipp Müller, Xavier Claessens, + +⦠and many others who have contributed bug reports, translations, sent +suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.22.8 + +- List of Merge Requests applied in 1.22.8 +- List of Issues fixed in 1.22.8 + 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' old/gst-plugins-good-1.22.7/RELEASE new/gst-plugins-good-1.22.8/RELEASE --- old/gst-plugins-good-1.22.7/RELEASE 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/RELEASE 2023-12-18 13:09:37.000000000 +0100 @@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-good 1.22.7. +This is GStreamer gst-plugins-good 1.22.8. 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' old/gst-plugins-good-1.22.7/docs/gst_plugins_cache.json new/gst-plugins-good-1.22.8/docs/gst_plugins_cache.json --- old/gst-plugins-good-1.22.7/docs/gst_plugins_cache.json 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/docs/gst_plugins_cache.json 2023-12-18 13:09:37.000000000 +0100 @@ -7027,7 +7027,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.7 FLV muxer", + "default": "GStreamer 1.22.8 FLV muxer", "mutable": "null", "readable": true, "type": "gchararray", @@ -7039,7 +7039,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.7 FLV muxer", + "default": "GStreamer 1.22.8 FLV muxer", "mutable": "null", "readable": true, "type": "gchararray", @@ -13721,7 +13721,7 @@ "presence": "always" }, "src": { - "caps": "audio/ac3:\n", + "caps": "audio/x-ac3:\n", "direction": "src", "presence": "always" } @@ -21257,7 +21257,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer/1.22.7", + "default": "GStreamer/1.22.8", "mutable": "null", "readable": true, "type": "gchararray", @@ -21816,7 +21816,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer 1.22.7", + "default": "GStreamer 1.22.8", "mutable": "null", "readable": true, "type": "gchararray", @@ -23253,7 +23253,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer souphttpsrc 1.22.7 ", + "default": "GStreamer souphttpsrc 1.22.8 ", "mutable": "null", "readable": true, "type": "gchararray", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/audioparsers/gstdcaparse.c new/gst-plugins-good-1.22.8/gst/audioparsers/gstdcaparse.c --- old/gst-plugins-good-1.22.7/gst/audioparsers/gstdcaparse.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/audioparsers/gstdcaparse.c 2023-12-18 13:09:37.000000000 +0100 @@ -505,6 +505,7 @@ size = gst_buffer_get_size (buffer); if (size >= 2) { newbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 2, size - 2); + gst_buffer_copy_into (newbuf, buffer, GST_BUFFER_COPY_METADATA, 0, -1); gst_buffer_unref (buffer); ret = dcaparse->baseparse_chainfunc (pad, parent, newbuf); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/isomp4/qtdemux.c new/gst-plugins-good-1.22.8/gst/isomp4/qtdemux.c --- old/gst-plugins-good-1.22.7/gst/isomp4/qtdemux.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/isomp4/qtdemux.c 2023-12-18 13:09:37.000000000 +0100 @@ -1144,6 +1144,10 @@ if (CUR_STREAM (str)->sparse && !use_sparse) continue; + /* raw audio streams can be ignored as we can seek anywhere within them */ + if (str->subtype == FOURCC_soun && str->need_clip) + continue; + seg_idx = gst_qtdemux_find_segment (qtdemux, str, desired_time); GST_DEBUG_OBJECT (qtdemux, "align segment %d", seg_idx); @@ -5016,7 +5020,12 @@ } /* Remember until where we want to go */ - str->to_sample = str->from_sample - 1; + if (str->from_sample == 0) { + GST_LOG_OBJECT (qtdemux, "already at sample 0"); + str->to_sample = 0; + } else { + str->to_sample = str->from_sample - 1; + } /* Define our time position */ target_ts = str->samples[k_index].timestamp + str->samples[k_index].pts_offset; @@ -15576,7 +15585,7 @@ if (g_str_has_prefix (name, "audio/x-raw")) { stream->need_clip = TRUE; stream->min_buffer_size = 1024 * entry->bytes_per_frame; - stream->max_buffer_size = 4096 * entry->bytes_per_frame; + stream->max_buffer_size = entry->rate * entry->bytes_per_frame; GST_DEBUG ("setting min/max buffer sizes to %d/%d", stream->min_buffer_size, stream->max_buffer_size); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/isomp4/qtdemux_tags.c new/gst-plugins-good-1.22.8/gst/isomp4/qtdemux_tags.c --- old/gst-plugins-good-1.22.7/gst/isomp4/qtdemux_tags.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/isomp4/qtdemux_tags.c 2023-12-18 13:09:37.000000000 +0100 @@ -763,7 +763,8 @@ namestr_dbg = g_strndup (namestr, namesize); GST_WARNING_OBJECT (demux, "This tag %s:%s type:%u is not mapped, " - "file a bug at bugzilla.gnome.org", meanstr_dbg, namestr_dbg, datatype); + "file a bug at %s", meanstr_dbg, namestr_dbg, datatype, + PACKAGE_BUGREPORT); g_free (namestr_dbg); g_free (meanstr_dbg); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/matroska/matroska-demux.c new/gst-plugins-good-1.22.8/gst/matroska/matroska-demux.c --- old/gst-plugins-good-1.22.7/gst/matroska/matroska-demux.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/matroska/matroska-demux.c 2023-12-18 13:09:37.000000000 +0100 @@ -6076,6 +6076,20 @@ if ((stop = demux->common.segment.stop) == -1) stop = demux->last_stop_end; + /* segment.position will still be at the last timestamp and won't always + * include the duration of the last packet. Expand that to the segment + * duration so that segment.base is increased correctly to include the + * length of the last packet when doing segment seeks. We need to do + * this before the segment-done event goes out so everything's ready + * for the next seek request coming in. */ + if (GST_CLOCK_TIME_IS_VALID (stop)) { + GST_DEBUG_OBJECT (demux, "End of segment, updating segment.position " + "from %" GST_TIME_FORMAT " to stop %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->common.segment.position), + GST_TIME_ARGS (stop)); + demux->common.segment.position = stop; + } + GST_LOG_OBJECT (demux, "Sending segment done, at end of segment"); msg = gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME, stop); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/rtp/gstrtpac3depay.c new/gst-plugins-good-1.22.8/gst/rtp/gstrtpac3depay.c --- old/gst-plugins-good-1.22.7/gst/rtp/gstrtpac3depay.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/rtp/gstrtpac3depay.c 2023-12-18 13:09:37.000000000 +0100 @@ -52,7 +52,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/ac3") + GST_STATIC_CAPS ("audio/x-ac3") ); static GstStaticPadTemplate gst_rtp_ac3_depay_sink_template = @@ -120,7 +120,7 @@ clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; - srccaps = gst_caps_new_empty_simple ("audio/ac3"); + srccaps = gst_caps_new_empty_simple ("audio/x-ac3"); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/rtp/gstrtpchannels.c new/gst-plugins-good-1.22.8/gst/rtp/gstrtpchannels.c --- old/gst-plugins-good-1.22.7/gst/rtp/gstrtpchannels.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/rtp/gstrtpchannels.c 2023-12-18 13:09:37.000000000 +0100 @@ -250,7 +250,7 @@ } /* compare names */ - if (g_ascii_strcasecmp (channel_orders[i].name, order)) { + if (!g_ascii_strcasecmp (channel_orders[i].name, order)) { res = &channel_orders[i]; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst/rtp/gstrtpklvdepay.c new/gst-plugins-good-1.22.8/gst/rtp/gstrtpklvdepay.c --- old/gst-plugins-good-1.22.7/gst/rtp/gstrtpklvdepay.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst/rtp/gstrtpklvdepay.c 2023-12-18 13:09:37.000000000 +0100 @@ -330,8 +330,8 @@ } } - /* If this is the first packet and looks like a start, clear resync flag */ - if (klvdepay->resync && klvdepay->last_marker_seq == -1 && start) + /* If this looks like a start, clear the resync flag */ + if (klvdepay->resync && start) klvdepay->resync = FALSE; if (marker) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/gst-plugins-good.doap new/gst-plugins-good-1.22.8/gst-plugins-good.doap --- old/gst-plugins-good-1.22.7/gst-plugins-good.doap 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/gst-plugins-good.doap 2023-12-18 13:09:37.000000000 +0100 @@ -34,6 +34,16 @@ <release> <Version> + <revision>1.22.8</revision> + <branch>1.22</branch> + <name></name> + <created>2023-12-18</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.22.8.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.22.7</revision> <branch>1.22</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/meson.build new/gst-plugins-good-1.22.8/meson.build --- old/gst-plugins-good-1.22.7/meson.build 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/meson.build 2023-12-18 13:09:37.000000000 +0100 @@ -1,5 +1,5 @@ project('gst-plugins-good', 'c', - version : '1.22.7', + version : '1.22.8', meson_version : '>= 0.62', default_options : [ 'warning_level=1', 'buildtype=debugoptimized' ]) @@ -231,6 +231,7 @@ cdata.set_quoted('PACKAGE', 'gst-plugins-good') cdata.set_quoted('GETTEXT_PACKAGE', 'gst-plugins-good-1.0') cdata.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) +cdata.set_quoted('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/new') warning_flags = [ '-Wmissing-declarations', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/po/gst-plugins-good-1.0.pot new/gst-plugins-good-1.22.8/po/gst-plugins-good-1.0.pot --- old/gst-plugins-good-1.22.7/po/gst-plugins-good-1.0.pot 2023-11-13 12:07:52.684029800 +0100 +++ new/gst-plugins-good-1.22.8/po/gst-plugins-good-1.0.pot 2023-12-18 13:13:04.362865700 +0100 @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-good-1.22.7\n" +"Project-Id-Version: gst-plugins-good-1.22.8\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 11:07+0000\n" +"POT-Creation-Date: 2023-12-18 12:13+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -99,39 +99,39 @@ msgid "This file contains no playable streams." msgstr "" -#: gst/isomp4/qtdemux.c:556 gst/isomp4/qtdemux.c:7408 gst/isomp4/qtdemux.c:7477 -#: gst/isomp4/qtdemux.c:7783 gst/isomp4/qtdemux.c:9181 +#: gst/isomp4/qtdemux.c:556 gst/isomp4/qtdemux.c:7417 gst/isomp4/qtdemux.c:7486 +#: gst/isomp4/qtdemux.c:7792 gst/isomp4/qtdemux.c:9190 msgid "This file is invalid and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:3045 +#: gst/isomp4/qtdemux.c:3049 msgid "Cannot play stream because it is encrypted with PlayReady DRM." msgstr "" -#: gst/isomp4/qtdemux.c:4364 gst/isomp4/qtdemux.c:8568 -#: gst/isomp4/qtdemux.c:8575 gst/isomp4/qtdemux.c:9883 -#: gst/isomp4/qtdemux.c:10325 gst/isomp4/qtdemux.c:10332 -#: gst/isomp4/qtdemux.c:13572 +#: gst/isomp4/qtdemux.c:4368 gst/isomp4/qtdemux.c:8577 +#: gst/isomp4/qtdemux.c:8584 gst/isomp4/qtdemux.c:9892 +#: gst/isomp4/qtdemux.c:10334 gst/isomp4/qtdemux.c:10341 +#: gst/isomp4/qtdemux.c:13581 msgid "This file is corrupt and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:4606 +#: gst/isomp4/qtdemux.c:4610 msgid "Invalid atom size." msgstr "" -#: gst/isomp4/qtdemux.c:4659 gst/isomp4/qtdemux.c:4666 +#: gst/isomp4/qtdemux.c:4663 gst/isomp4/qtdemux.c:4670 msgid "Cannot query file size" msgstr "" -#: gst/isomp4/qtdemux.c:4675 +#: gst/isomp4/qtdemux.c:4679 msgid "Cannot demux file" msgstr "" -#: gst/isomp4/qtdemux.c:4715 +#: gst/isomp4/qtdemux.c:4719 msgid "This file is incomplete and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:11466 +#: gst/isomp4/qtdemux.c:11475 msgid "The video in this file might not play correctly." msgstr "" @@ -208,7 +208,7 @@ msgid "Raspberry Pi Camera Module" msgstr "" -#: sys/v4l2/gstv4l2bufferpool.c:1858 +#: sys/v4l2/gstv4l2bufferpool.c:1861 #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/po/gst-plugins-good.pot new/gst-plugins-good-1.22.8/po/gst-plugins-good.pot --- old/gst-plugins-good-1.22.7/po/gst-plugins-good.pot 2023-11-13 12:07:52.684029800 +0100 +++ new/gst-plugins-good-1.22.8/po/gst-plugins-good.pot 2023-12-18 13:13:04.362865700 +0100 @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-good-1.22.7\n" +"Project-Id-Version: gst-plugins-good-1.22.8\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 11:07+0000\n" +"POT-Creation-Date: 2023-12-18 12:13+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -99,39 +99,39 @@ msgid "This file contains no playable streams." msgstr "" -#: gst/isomp4/qtdemux.c:556 gst/isomp4/qtdemux.c:7408 gst/isomp4/qtdemux.c:7477 -#: gst/isomp4/qtdemux.c:7783 gst/isomp4/qtdemux.c:9181 +#: gst/isomp4/qtdemux.c:556 gst/isomp4/qtdemux.c:7417 gst/isomp4/qtdemux.c:7486 +#: gst/isomp4/qtdemux.c:7792 gst/isomp4/qtdemux.c:9190 msgid "This file is invalid and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:3045 +#: gst/isomp4/qtdemux.c:3049 msgid "Cannot play stream because it is encrypted with PlayReady DRM." msgstr "" -#: gst/isomp4/qtdemux.c:4364 gst/isomp4/qtdemux.c:8568 -#: gst/isomp4/qtdemux.c:8575 gst/isomp4/qtdemux.c:9883 -#: gst/isomp4/qtdemux.c:10325 gst/isomp4/qtdemux.c:10332 -#: gst/isomp4/qtdemux.c:13572 +#: gst/isomp4/qtdemux.c:4368 gst/isomp4/qtdemux.c:8577 +#: gst/isomp4/qtdemux.c:8584 gst/isomp4/qtdemux.c:9892 +#: gst/isomp4/qtdemux.c:10334 gst/isomp4/qtdemux.c:10341 +#: gst/isomp4/qtdemux.c:13581 msgid "This file is corrupt and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:4606 +#: gst/isomp4/qtdemux.c:4610 msgid "Invalid atom size." msgstr "" -#: gst/isomp4/qtdemux.c:4659 gst/isomp4/qtdemux.c:4666 +#: gst/isomp4/qtdemux.c:4663 gst/isomp4/qtdemux.c:4670 msgid "Cannot query file size" msgstr "" -#: gst/isomp4/qtdemux.c:4675 +#: gst/isomp4/qtdemux.c:4679 msgid "Cannot demux file" msgstr "" -#: gst/isomp4/qtdemux.c:4715 +#: gst/isomp4/qtdemux.c:4719 msgid "This file is incomplete and cannot be played." msgstr "" -#: gst/isomp4/qtdemux.c:11466 +#: gst/isomp4/qtdemux.c:11475 msgid "The video in this file might not play correctly." msgstr "" @@ -208,7 +208,7 @@ msgid "Raspberry Pi Camera Module" msgstr "" -#: sys/v4l2/gstv4l2bufferpool.c:1858 +#: sys/v4l2/gstv4l2bufferpool.c:1861 #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/sys/v4l2/gstv4l2bufferpool.c new/gst-plugins-good-1.22.8/sys/v4l2/gstv4l2bufferpool.c --- old/gst-plugins-good-1.22.7/sys/v4l2/gstv4l2bufferpool.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/sys/v4l2/gstv4l2bufferpool.c 2023-12-18 13:09:37.000000000 +0100 @@ -682,9 +682,11 @@ guint num_queued; guint i, n = 0; + GST_OBJECT_LOCK (pool); num_queued = g_atomic_int_get (&pool->num_queued); if (num_queued < pool->num_allocated) n = pool->num_allocated - num_queued; + GST_OBJECT_UNLOCK (pool); /* For captures, we need to enqueue buffers before we start streaming, * so the driver don't underflow immediately. As we have put then back @@ -1147,6 +1149,8 @@ gint old_buffer_state; gint index; + GST_OBJECT_LOCK (pool); + index = group->buffer.index; old_buffer_state = @@ -1182,8 +1186,6 @@ } } - GST_OBJECT_LOCK (pool); - /* If the pool was orphaned, don't try to queue any returned buffers. * This is done with the objet lock in order to synchronize with * orphaning. */ @@ -1205,6 +1207,7 @@ already_queued: { GST_ERROR_OBJECT (pool, "the buffer %i was already queued", index); + GST_OBJECT_UNLOCK (pool); return GST_FLOW_ERROR; } was_orphaned: @@ -2281,7 +2284,9 @@ pool = GST_V4L2_BUFFER_POOL (bpool); + GST_OBJECT_LOCK (pool); gst_v4l2_buffer_pool_streamoff (pool); + GST_OBJECT_UNLOCK (pool); if (!V4L2_TYPE_IS_OUTPUT (pool->obj->type)) { ret = gst_v4l2_buffer_pool_flush_events (v4l2object); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/tests/check/elements/matroskademux.c new/gst-plugins-good-1.22.8/tests/check/elements/matroskademux.c --- old/gst-plugins-good-1.22.7/tests/check/elements/matroskademux.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/tests/check/elements/matroskademux.c 2023-12-18 13:09:37.000000000 +0100 @@ -1,5 +1,5 @@ /* GStreamer unit test for matroskademux - * Copyright (C) 2015 Tim-Philipp Müller <t...@centricular.com> + * Copyright (C) 2015, 2023 Tim-Philipp Müller <t...@centricular.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -307,6 +307,183 @@ GST_END_TEST; +static void +demux_pad_added_cb (GstElement * demux, GstPad * new_pad, gpointer user_data) +{ + GstElement *sink = GST_ELEMENT (user_data); + + fail_unless (gst_element_link (demux, sink)); +} + +static const gint64 PINKNOISE_MKV_DURATION = 116099773; + +static void +run_segment_looping_test (gint64 start, gint64 stop, gdouble rate) +{ + GstStateChangeReturn state_ret; + GstMessage *msg; + GstElement *src, *sink, *demux, *pipeline; + gboolean seek_ret; + GstBus *bus; + gchar *path; + + g_assert (start >= 0); + g_assert (stop >= -1); + g_assert (rate > 0.0); + + // only handle a rate for the middle segment case for now + g_assert (rate == 1.0 || stop != -1); + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "Failed to create pipeline!"); + + bus = gst_element_get_bus (pipeline); + + src = gst_element_factory_make ("filesrc", "filesrc"); + fail_unless (src != NULL, "Failed to create 'filesrc' element!"); + + demux = gst_element_factory_make ("matroskademux", "demux"); + fail_unless (demux != NULL, "Failed to create matroskademux element"); + + sink = gst_element_factory_make ("fakesink", "fakesink"); + fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + + gst_bin_add_many (GST_BIN (pipeline), src, demux, sink, NULL); + + fail_unless (gst_element_link (src, demux)); + + g_signal_connect (demux, "pad-added", G_CALLBACK (demux_pad_added_cb), sink); + + path = g_build_filename (GST_TEST_FILES_PATH, "pinknoise-vorbis.mkv", NULL); + GST_LOG ("reading file '%s'", path); + g_object_set (src, "location", path, NULL); + + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + if (state_ret == GST_STATE_CHANGE_ASYNC) { + GST_LOG ("waiting for pipeline to reach PAUSED state"); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + } + + GST_LOG ("PAUSED, let's play a little.."); + state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + GST_LOG ("Send FLUSHING seek with SEGMENT flag set.. " + "(start=%" G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ")", start, stop); + + if (stop == -1) { + seek_ret = gst_element_seek_simple (pipeline, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, start); + } else { + seek_ret = gst_element_seek (pipeline, rate, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, + GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); + } + fail_unless (seek_ret == TRUE); + + GST_LOG ("Waiting for pipeline to preroll again after flushing seek.."); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + + { + GstFormat fmt = GST_FORMAT_UNDEFINED; + gint64 segment_end = 0; + + GST_LOG ("Waiting for SEGMENT_DONE message.."); + msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_SEGMENT_DONE); + fail_unless (msg != NULL); + + gst_message_parse_segment_done (msg, &fmt, &segment_end); + fail_unless_equals_int (fmt, GST_FORMAT_TIME); + if (stop == -1) { + fail_unless_equals_int64 (segment_end, PINKNOISE_MKV_DURATION); + } else { + fail_unless_equals_int64 (segment_end, stop); + } + gst_clear_message (&msg); + } + + GST_LOG ("Send non-FLUSHING seek to start new segment loop.. " + "(start=%" G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ")", start, stop); + + /* No segment flag this time, so will be expecting an EOS at the end */ + if (stop == -1) { + seek_ret = gst_element_seek_simple (pipeline, GST_FORMAT_TIME, 0, start); + } else { + seek_ret = gst_element_seek (pipeline, rate, GST_FORMAT_TIME, 0, + GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); + } + fail_unless (seek_ret == TRUE); + + GST_LOG ("Waiting for EOS message.."); + msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_EOS); + fail_unless (msg != NULL); + gst_clear_message (&msg); + + { + GstPad *pad = gst_element_get_static_pad (sink, "sink"); + GstEvent *ev = gst_pad_get_sticky_event (pad, GST_EVENT_SEGMENT, 0); + const GstSegment *segment = NULL; + + gst_event_parse_segment (ev, &segment); + + GST_INFO ("segment %" GST_SEGMENT_FORMAT, segment); + + fail_unless_equals_int64 (segment->start, start); + if (stop == -1) { + fail_unless_equals_int64 (segment->stop, PINKNOISE_MKV_DURATION); + fail_unless_equals_int64 (segment->duration, PINKNOISE_MKV_DURATION); + fail_unless_equals_int64 (segment->base, PINKNOISE_MKV_DURATION); + } else { + fail_unless_equals_int64 (segment->stop, stop); + fail_unless_equals_int64 (segment->duration, PINKNOISE_MKV_DURATION); + fail_unless_equals_int64 (segment->base, (stop - start) / rate); + } + + gst_clear_event (&ev); + gst_clear_object (&pad); + } + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (pipeline); + gst_clear_object (&bus); + + g_free (path); +} + +/* Make sure segment seeks behave as expected, and the segment base offset + * is increased correctly by the clip duration rather than the last timestamp + * position. */ +GST_START_TEST (test_segment_looping) +{ + run_segment_looping_test (0, -1, 1.0); +} + +GST_END_TEST; + +/* If we do a segment seek on a middle segment of the clip, we expect the + * base offset of the next segment to be the duration of our selected segment, + * not the duration of the entire clip, since we only played that much then. */ +GST_START_TEST (test_segment_looping_middle_segment) +{ + run_segment_looping_test (50 * GST_MSECOND, 100 * GST_MSECOND, 1.0); +} + +GST_END_TEST; + +/* For positive non-1.0 rates the base offset of the next segment should be + * scaled accordingly, since it's in running time not stream time. */ +GST_START_TEST (test_segment_looping_middle_segment_with_rate) +{ + run_segment_looping_test (50 * GST_MSECOND, 100 * GST_MSECOND, 2.0); +} + +GST_END_TEST; + static Suite * matroskademux_suite (void) { @@ -316,6 +493,9 @@ suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_sub_terminator); tcase_add_test (tc_chain, test_toc_demux); + tcase_add_test (tc_chain, test_segment_looping); + tcase_add_test (tc_chain, test_segment_looping_middle_segment); + tcase_add_test (tc_chain, test_segment_looping_middle_segment_with_rate); return s; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-good-1.22.7/tests/check/elements/rtp-payloading.c new/gst-plugins-good-1.22.8/tests/check/elements/rtp-payloading.c --- old/gst-plugins-good-1.22.7/tests/check/elements/rtp-payloading.c 2023-11-13 12:04:22.000000000 +0100 +++ new/gst-plugins-good-1.22.8/tests/check/elements/rtp-payloading.c 2023-12-18 13:09:37.000000000 +0100 @@ -1162,6 +1162,95 @@ GST_END_TEST; +typedef struct +{ + gint buffer_count; + gint drop_index; +} KlvDepayProbeData; + +static GstPadProbeReturn +rtp_klv_do_packet_loss_depay_probe_cb (GstPad * pad, GstPadProbeInfo * info, + KlvDepayProbeData * data) +{ + GstPadProbeReturn ret = GST_PAD_PROBE_OK; + + if (info->type & GST_PAD_PROBE_TYPE_BUFFER_LIST) { + GstBufferList *buffer_list = info->data; + gint length = gst_buffer_list_length (buffer_list); + + if (data->drop_index >= 0) { + gint drop_offset = data->drop_index - data->buffer_count; + + if (0 <= drop_offset && drop_offset < length) + gst_buffer_list_remove (buffer_list, drop_offset, 1); + } + + data->buffer_count += length; + } else { + if (data->buffer_count == data->drop_index) + ret = GST_PAD_PROBE_DROP; + data->buffer_count++; + } + + return ret; +} + +GST_START_TEST (rtp_klv_fragmented_packet_loss) +{ + /* Number of KLV frames to push through the pipeline */ + const guint FRAME_COUNT = 5; + + /* Repeat frame data */ + int frame_data_size = sizeof (rtp_KLV_frame_data); + guint8 *frame_data = malloc (FRAME_COUNT * sizeof (rtp_KLV_frame_data)); + for (guint i = 0; i < FRAME_COUNT; i++) + memcpy (frame_data + i * frame_data_size, rtp_KLV_frame_data, + frame_data_size); + + /* Create RTP pipeline. */ + rtp_pipeline *p = + rtp_pipeline_create (frame_data, frame_data_size, FRAME_COUNT, + "meta/x-klv, parsed=(bool)true", "rtpklvpay", "rtpklvdepay"); + + if (p == NULL) { + return; + } + + /* Force super-small mtu of 60 to fragment KLV unit (4 fragments per unit) */ + g_object_set (p->rtppay, "mtu", 60, NULL); + + /* Drop the 7:th fragment on the depayloader's sink pad */ + KlvDepayProbeData sink_probe_data = {.buffer_count = 0,.drop_index = 7 }; + GstPad *depay_sink = gst_element_get_static_pad (p->rtpdepay, "sink"); + gst_pad_add_probe (depay_sink, + GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST, + (GstPadProbeCallback) rtp_klv_do_packet_loss_depay_probe_cb, + &sink_probe_data, NULL); + gst_object_unref (depay_sink); + + /* Count buffers on the depayloader's source pad */ + KlvDepayProbeData src_probe_data = {.buffer_count = 0,.drop_index = -1 }; + GstPad *depay_src = gst_element_get_static_pad (p->rtpdepay, "src"); + gst_pad_add_probe (depay_src, + GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST, + (GstPadProbeCallback) rtp_klv_do_packet_loss_depay_probe_cb, + &src_probe_data, NULL); + gst_object_unref (depay_src); + + /* Run RTP pipeline. */ + rtp_pipeline_run (p); + + /* Destroy RTP pipeline. */ + rtp_pipeline_destroy (p); + + free (frame_data); + + /* We should be able to decode all RTP buffers except for the second one */ + g_assert_cmpuint (src_probe_data.buffer_count, ==, FRAME_COUNT - 1); +} + +GST_END_TEST; + static const guint8 rtp_L16_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -1801,6 +1890,7 @@ tcase_add_test (tc_chain, rtp_h265_list_gt_mtu_hvc1); tcase_add_test (tc_chain, rtp_klv); tcase_add_test (tc_chain, rtp_klv_fragmented); + tcase_add_test (tc_chain, rtp_klv_fragmented_packet_loss); tcase_add_test (tc_chain, rtp_L16); tcase_add_test (tc_chain, rtp_L24); tcase_add_test (tc_chain, rtp_mp2t); ++++++ reduce-required-meson.patch ++++++ --- /var/tmp/diff_new_pack.rLwqqu/_old 2024-01-05 21:40:16.743791663 +0100 +++ /var/tmp/diff_new_pack.rLwqqu/_new 2024-01-05 21:40:16.743791663 +0100 @@ -1,10 +1,10 @@ -Index: gst-plugins-good-1.22.7/meson.build +Index: gst-plugins-good-1.22.8/meson.build =================================================================== ---- gst-plugins-good-1.22.7.orig/meson.build -+++ gst-plugins-good-1.22.7/meson.build +--- gst-plugins-good-1.22.8.orig/meson.build ++++ gst-plugins-good-1.22.8/meson.build @@ -1,6 +1,6 @@ project('gst-plugins-good', 'c', - version : '1.22.7', + version : '1.22.8', - meson_version : '>= 0.62', + meson_version : '>= 0.61', default_options : [ 'warning_level=1',