Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gstreamer-rtsp-server for openSUSE:Factory checked in at 2022-02-09 20:38:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gstreamer-rtsp-server (Old) and /work/SRC/openSUSE:Factory/.gstreamer-rtsp-server.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-rtsp-server" Wed Feb 9 20:38:56 2022 rev:32 rq:952077 version:1.18.6 Changes: -------- --- /work/SRC/openSUSE:Factory/gstreamer-rtsp-server/gstreamer-rtsp-server.changes 2022-01-22 08:19:10.394503849 +0100 +++ /work/SRC/openSUSE:Factory/.gstreamer-rtsp-server.new.1898/gstreamer-rtsp-server.changes 2022-02-09 20:39:45.562456244 +0100 @@ -1,0 +2,15 @@ +Fri Feb 4 19:45:17 UTC 2022 - Bj??rn Lie <bjorn....@gmail.com> + +- Update to version 1.18.6: + + rtsp-stream: fix get_rates raciness + + rtsp-media: Only unprepare a media if it was not already + unpreparing anyway + + rtsp-media: Unprepare suspended medias too + + rtsp-client: make sure sessmedia will not get freed while used + + rtsp-media: Also mark receive-only (RECORD) medias as prepared + when unsuspending + + rtsp-session: Don't unref medias twice if it is removed inside + + examples: Fix leak in appsrc2 example +- Drop service, use source url, upstream changes in git. + +------------------------------------------------------------------- Old: ---- _service gst-rtsp-server-1.18.5.tar.xz New: ---- gst-rtsp-server-1.18.6.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gstreamer-rtsp-server.spec ++++++ --- /var/tmp/diff_new_pack.sugAjJ/_old 2022-02-09 20:39:46.142457631 +0100 +++ /var/tmp/diff_new_pack.sugAjJ/_new 2022-02-09 20:39:46.150457651 +0100 @@ -20,15 +20,13 @@ %define _name gst-rtsp-server Name: gstreamer-rtsp-server -Version: 1.18.5 +Version: 1.18.6 Release: 0 Summary: GStreamer-based RTSP server library License: LGPL-2.0-or-later Group: Productivity/Multimedia/Other URL: https://gstreamer.freedesktop.org -# Disable tarball source url, use _service -#Source0: %%{url}/src/gst-rtsp-server/%%{_name}-%%{version}.tar.xz -Source0: %{_name}-%{version}.tar.xz +Source0: %{url}/src/gst-rtsp-server/%{_name}-%{version}.tar.xz Source99: gstreamer-rtsp-server-rpmlintrc BuildRequires: hotdoc ++++++ gst-rtsp-server-1.18.5.tar.xz -> gst-rtsp-server-1.18.6.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/ChangeLog new/gst-rtsp-server-1.18.6/ChangeLog --- old/gst-rtsp-server-1.18.5/ChangeLog 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/ChangeLog 2022-02-02 16:08:18.000000000 +0100 @@ -1,3 +1,91 @@ +=== release 1.18.6 === + +2022-02-02 15:08:18 +0000 Tim-Philipp M??ller <t...@centricular.com> + + * ChangeLog: + * NEWS: + * RELEASE: + * gst-rtsp-server.doap: + * meson.build: + Release 1.18.6 + +2021-10-07 13:00:10 +0300 Sebastian Dr??ge <sebast...@centricular.com> + + * gst/rtsp-server/rtsp-media.c: + rtsp-media: Unprepare suspended medias too + Previously suspended medias immediately reached the UNPREPARED state + without going through the media's unprepare() vfunc. This didn't allow + the media subclass to do any additional cleanup, and for example the + shutdown-eos property of GstRTSPMedia was ignored. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/221> + +2022-01-20 17:13:36 -0600 Michael Gruner <michael.gru...@ridgerun.com> + + * examples/test-appsrc2.c: + gst-rtsp-server: Fix leak in appsrc2 example + In the need-data appsrc callback, a buffer is pulled from the + appsink. This buffer is then copied so that metadata is writable. + The copy is pushed to the appsrc but it doesn't take ownership + of the buffer so we need to manually unref it. The original buffer + is finally unreffed when the sample is freed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/220> + +2021-12-16 21:04:53 +0100 Mathieu Duponchelle <math...@centricular.com> + + * gst/rtsp-server/rtsp-stream.c: + rtsp-stream: fix get_rates raciness + Prior to this patch, we considered that a stream was blocking + whenever a pad probe was triggered for either the RTP pad or + the RTCP pad. + This led to situations where we subsequently unblocked and expected + to find a segment on the RTP pad, which was racy. + Instead, we now only consider that the stream is blocking when + the pad probe for the RTP pad has triggered with a blockable object + (buffer, buffer list, gap event). + The RTCP pad is simply blocked without affecting the state of the + stream otherwise. + Fixes #929 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/218> + +2021-10-06 18:19:29 +0300 Sebastian Dr??ge <sebast...@centricular.com> + + * gst/rtsp-server/rtsp-media.c: + rtsp-media: Only unprepare a media if it was not already unpreparing anyway + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/216> + +2021-10-03 23:25:23 +0200 Ognyan Tonchev <ogn...@axis.com> + + * gst/rtsp-server/rtsp-client.c: + * gst/rtsp-server/rtsp-session.c: + * gst/rtsp-server/rtsp-session.h: + rtsp-client: make sure sessmedia will not get freed while used + handle_*_request() functions were all retrieving the session media from + the session by calling gst_rtsp_session_get_media () which is a transfer-none + call. If a session timeout happens at that time, the session media may get freed + making the pointer invalid.. + Fixes #757 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/215> + +2021-10-05 19:37:40 +0300 Sebastian Dr??ge <sebast...@centricular.com> + + * gst/rtsp-server/rtsp-media.c: + rtsp-media: Also mark receive-only (RECORD) medias as prepared when unsuspending + Previously the status was only changed for other medias. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/214> + +2021-10-01 13:51:37 +0300 Sebastian Dr??ge <sebast...@centricular.com> + + * gst/rtsp-server/rtsp-session.c: + rtsp-session: Don't unref medias twice if it is removed inside gst_rtsp_session_filter() while the mutex is shortly released + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/757 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/213> + +2021-09-09 00:13:01 +0100 Tim-Philipp M??ller <t...@centricular.com> + + * docs/gst_plugins_cache.json: + * meson.build: + Back to development + === release 1.18.5 === 2021-09-08 20:04:14 +0100 Tim-Philipp M??ller <t...@centricular.com> @@ -5,6 +93,7 @@ * ChangeLog: * NEWS: * RELEASE: + * docs/gst_plugins_cache.json: * gst-rtsp-server.doap: * meson.build: Release 1.18.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/NEWS new/gst-rtsp-server-1.18.6/NEWS --- old/gst-rtsp-server-1.18.5/NEWS 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/NEWS 2022-02-02 16:08:18.000000000 +0100 @@ -2,13 +2,13 @@ GStreamer 1.18.0 was originally released on 8 September 2020. -The latest bug-fix release in the 1.18 series is 1.18.5 and was released -on 8 September 2021. +The latest bug-fix release in the 1.18 series is 1.18.6 and was released +on 2 February 2022. See https://gstreamer.freedesktop.org/releases/1.18/ for the latest version of this document. -Last updated: Wednesday 8 September 2021, 11:00 UTC (log) +Last updated: Wednesday 2 February 2022, 11:30 UTC (log) Introduction @@ -2103,9 +2103,8 @@ Known Issues - GStreamer 1.18 versions <= 1.18.4 would fail to build on Linux with - Meson 0.58 due to an issue with the include directories. Either - apply the patch or build with an older Meson version (<= 0.57) until - there is a GStreamer 1.18.5 release that includes the fix. + Meson 0.58 due to an issue with the include directories. + GStreamer >= 1.18.5 includes a fix for this. Contributors @@ -3183,16 +3182,180 @@ - List of Merge Requests applied in 1.18.5 - List of Issues fixed in 1.18.5 +1.18.6 + +The sixth 1.18 bug-fix release (1.18.6) was released on 2 February 2022. + +This release only contains bugfixes and security fixes and it should be +safe to update from 1.18.x. + +Highlighted bugfixes in 1.18.6 + +- tagdemux: Fix crash when presented with malformed files (security + fix) +- video-converter: Fix broken gamma remap with high bitdepth YUV + output +- shout2send: Fix issues with libshout >= 2.4.2 +- mxfdemux: fix regression with VANC tracks that only contains packet + types we don???t handle +- Better plugin loading error reporting on Windows +- Fixes for deprecations in Python 3.10 +- build fixes, memory leak fixes, reliability fixes +- security fixes + +gstreamer + +- gstplugin: Fix for UWP build +- gstplugin: Better warnings on plugin load failure on Windows +- gst-ptp-helper: Do not disable multicast loopback +- concat: fix qos event handling +- pluginfeature: Fix object leak +- baseparse: fix invalid avg_bitrate after reset +- multiqueue: Fix query unref race on flush +- gst: Initialize optional event/message fields when parsing +- bitwriter: Fix the trailing bits lost when getting its data. +- multiqueue: never consider a queue that is not waiting +- input-selector: Use proper segments when cleaning cached buffers + +gst-plugins-base + +- tagdemux: Fix crash when presented with malformed files (security + fix) +- videoencoder: make sure the buffer is writable before modifying + metadata +- video-converter: Fix for broken gamma remap with high bitdepth YUV + output +- sdpmessage: fix mapping single char fmtp params +- oggdemux: fix a race in push mode when performing the duration seek +- uridecodebin: Fix critical warnings +- audio-converter: Fix resampling when there???s nothing to output +- tcp: fix build on Solaris +- uridecodebin3: Nullify current item after all play items are freed. +- audio-resampler: Fix segfault when we can???t output any frames +- urisourcebin: Handle sources with dynamic pads and pads already + present +- playbin2/3: autoplug/caps: don???t expand caps to ANY +- uridecodebin3/urisourcebin: Reusability fixes +- rtspconnection: Only reset timeout when socket is unused +- gstvideoaggregator.c: fix build with gcc 4.8 + +gst-plugins-good + +- rtspsrc: Fix critical while serializing timeout element message +- multifilesrc: fix caps leak +- shout2: Add compatibility for libshout >= 2.4.2 shout_open return + values +- v4l2: Update fmt if padded height is greater than fmt height +- v4l2bufferpool: set video alignment of video meta +- qtmux: fix deadlock in gst_qt_mux_prepare_moov_recovery +- matroska: Add support for muxing/demuxing ffv1 +- qtdemux: Try to build AAC codec-data whenever it???s possible + +gst-plugins-bad + +- interlace: Fix a double-unref on shutdown +- webrtcbin: Chain up to parent constructed method +- webrtc: fix log error message in function + gst_webrtc_bin_set_local_description +- mxfdemux: don???t error out if VANC track only contains packets we + don???t handle +- av1parser: Fix data type of film grain param +- assrender: Support RFC8081 mime types +- pitch: Specify layout as required for negotiation +- magicleap: update lumin_rt libraries names to the latest official + version +- codecs: h265decoder: Fix per-slice leak +- mpeg4videoparse: fix criticals trying to insert configs that don???t + exist yet +- webrtcbin: Always set SINK/SRC flags +- mpegtspacketizer: memcmp potentially seen_before data +- zxing: update to support version 1.1.1 + +gst-plugins-ugly + +- No changes + +gst-libav + +- avcodecmap: Add support for GBRA_10LE/BE + +gst-rtsp-server + +- rtsp-stream: fix get_rates raciness +- rtsp-media: Only unprepare a media if it was not already unpreparing + anyway +- rtsp-media: Unprepare suspended medias too +- rtsp-client: make sure sessmedia will not get freed while used +- rtsp-media: Also mark receive-only (RECORD) medias as prepared when + unsuspending +- rtsp-session: Don???t unref medias twice if it is removed inside??? +- examples: Fix leak in appsrc2 example + +gstreamer-vaapi + +- libs: video-format: Check if formats map is not NULL +- vaapidecode: Autogenerate caps template +- vaapipostproc: copy over metadata also when using system allocated + buffer + +gst-python + +- Avoid treating float as int (fix for Python 3.10) + +gst-editing-services + +- meson: Remove duplicate definition of ???examples??? option + +gst-devtools + +- No changes + +gst-integration-testsuites + +- No changes + +gst-build + +- env: Fix deprecations from python 3.10 +- Various fixes for macOS +- update FFmpeg wrap to 4.3.3 + +Cerbero build tool and packaging changes in 1.18.6 + +- Some fixes for Fedora 34 +- cerbero: Backport fix for removed loop param of PriorityQueue() +- cerbero: Fix support for Fedora 35 +- Add support for Visual Studio 2022 +- openssl.recipe: Fix crash on iOS TestFlight +- UnixBootstrapper: remove sudo as root user +- bzip2.recipe: bump version to 1.0.8 +- openssl.recipe: upgrade to version 1.1.1l + +Contributors to 1.18.6 + +Antonio Ospite, C??lestin Marot, Dave Pich??, Erlend Eriksen, Fabrice +Fontaine, Guillaume Desmottes, Haihua Hu, He Junyan, Jakub Adam, Jan +Alexander Steffens (heftig), Jan Schmidt, Jeremy Cline, Jordan Petridis, +Mathieu Duponchelle, Matthew Waters, Mengkejiergeli Ba, Michael Gruner, +Nirbheek Chauhan, Ognyan Tonchev, Pascal Hache, Rafa?? Dzi??giel, +Sebastian Dr??ge, Seungha Yang, St??phane Cerveau, Teng En Ung,Thibault +Saunier, Thomas Klausner, Tim-Philipp M??ller, Tobias Reineke, Tobias +Ronge, Tomasz Andrzejak, Trung Do, V??ctor Manuel J??quez Leal, Vivia +Nikolaidou, + +??? 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.18.6 + +- List of Merge Requests applied in 1.18.6 +- List of Issues fixed in 1.18.6 + Schedule for 1.20 -Our next major feature release will be 1.20, and 1.19 will be the -unstable development version leading up to the stable 1.20 release. The -development of 1.19/1.20 will happen in the git master branch. - -The plan for the 1.20 development cycle is yet to be confirmed, but it -is now expected that feature freeze will take place some time in -September/October 2021, with the first 1.20 stable release hopefully -towards the end of October 2021. +Our next major feature release will be 1.20, and will be released in +early February 2022. You can track its progress on the 1.20 Release +Notes page. 1.20 will be backwards-compatible to the stable 1.18, 1.16, 1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/RELEASE new/gst-rtsp-server-1.18.6/RELEASE --- old/gst-rtsp-server-1.18.5/RELEASE 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/RELEASE 2022-02-02 16:08:18.000000000 +0100 @@ -1,4 +1,4 @@ -This is GStreamer gst-rtsp-server 1.18.5. +This is GStreamer gst-rtsp-server 1.18.6. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework! @@ -82,7 +82,7 @@ For help and support, please subscribe to and send questions to the gstreamer-devel mailing list (see below for details). -There is also a #gstreamer IRC channel on the Freenode IRC network. +There is also a #gstreamer IRC channel on the OFTC IRC network. ==== Developers ==== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/docs/gst_plugins_cache.json new/gst-rtsp-server-1.18.6/docs/gst_plugins_cache.json --- old/gst-rtsp-server-1.18.5/docs/gst_plugins_cache.json 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/docs/gst_plugins_cache.json 2022-02-02 16:08:18.000000000 +0100 @@ -321,7 +321,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "GStreamer/1.18.5", + "default": "GStreamer/1.18.6", "mutable": "null", "readable": true, "type": "gchararray", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/examples/test-appsrc2.c new/gst-rtsp-server-1.18.6/examples/test-appsrc2.c --- old/gst-rtsp-server-1.18.5/examples/test-appsrc2.c 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/examples/test-appsrc2.c 2022-02-02 16:08:18.000000000 +0100 @@ -63,6 +63,7 @@ GST_BUFFER_PTS (buffer) = pts; GST_BUFFER_DTS (buffer) = dts; g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret); + gst_buffer_unref (buffer); } /* we don't need the appsink sample anymore */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-client.c new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-client.c --- old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-client.c 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-client.c 2022-02-02 16:08:18.000000000 +0100 @@ -1445,7 +1445,7 @@ path = klass->make_path_from_uri (client, ctx->uri); /* get a handle to the configuration of the media in the session */ - sessmedia = gst_rtsp_session_get_media (session, path, &matched); + sessmedia = gst_rtsp_session_dup_media (session, path, &matched); if (!sessmedia) goto not_found; @@ -1480,6 +1480,7 @@ /* unmanage the media in the session, returns false if all media session * are torn down. */ keep_session = gst_rtsp_session_release_media (session, sessmedia); + g_object_unref (sessmedia); /* construct the response now */ code = GST_RTSP_STS_OK; @@ -1530,6 +1531,7 @@ send_generic_response (client, GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED, ctx); g_free (path); + g_object_unref (sessmedia); return FALSE; } sig_failed: @@ -1539,6 +1541,7 @@ send_generic_response (client, sig_result, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } } @@ -1697,7 +1700,7 @@ path = klass->make_path_from_uri (client, ctx->uri); /* get a handle to the configuration of the media in the session */ - sessmedia = gst_rtsp_session_get_media (session, path, &matched); + sessmedia = gst_rtsp_session_dup_media (session, path, &matched); if (!sessmedia) goto not_found; @@ -1744,6 +1747,7 @@ /* the state is now READY */ gst_rtsp_session_media_set_rtsp_state (sessmedia, GST_RTSP_STATE_READY); + g_object_unref (sessmedia); g_signal_emit (client, gst_rtsp_client_signals[SIGNAL_PAUSE_REQUEST], 0, ctx); @@ -1777,6 +1781,7 @@ GST_ERROR ("client %p: no aggregate path %s", client, path); send_generic_response (client, GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED, ctx); + g_object_unref (sessmedia); g_free (path); return FALSE; } @@ -1786,6 +1791,7 @@ gst_rtsp_status_as_text (sig_result)); send_generic_response (client, sig_result, ctx); gst_rtsp_media_unlock (media); + g_object_unref (sessmedia); g_object_unref (media); return FALSE; } @@ -1795,6 +1801,7 @@ send_generic_response (client, GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE, ctx); gst_rtsp_media_unlock (media); + g_object_unref (sessmedia); g_object_unref (media); return FALSE; } @@ -1803,6 +1810,7 @@ GST_ERROR ("client %p: pausing not supported", client); send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, ctx); gst_rtsp_media_unlock (media); + g_object_unref (sessmedia); g_object_unref (media); return FALSE; } @@ -2066,7 +2074,7 @@ path = klass->make_path_from_uri (client, uri); /* get a handle to the configuration of the media in the session */ - sessmedia = gst_rtsp_session_get_media (session, path, &matched); + sessmedia = gst_rtsp_session_dup_media (session, path, &matched); if (!sessmedia) goto not_found; @@ -2161,6 +2169,7 @@ gst_rtsp_session_media_set_state (sessmedia, GST_STATE_PLAYING); gst_rtsp_session_media_set_rtsp_state (sessmedia, GST_RTSP_STATE_PLAYING); + g_object_unref (sessmedia); g_signal_emit (client, gst_rtsp_client_signals[SIGNAL_PLAY_REQUEST], 0, ctx); @@ -2193,6 +2202,7 @@ GST_ERROR ("client %p: no aggregate path %s", client, path); send_generic_response (client, GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED, ctx); + g_object_unref (sessmedia); g_free (path); return FALSE; } @@ -2203,6 +2213,7 @@ send_generic_response (client, sig_result, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } invalid_state: @@ -2212,6 +2223,7 @@ ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } pipeline_error: @@ -2221,6 +2233,7 @@ ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } unsuspend_failed: @@ -2229,6 +2242,7 @@ send_generic_response (client, GST_RTSP_STS_SERVICE_UNAVAILABLE, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } invalid_mode: @@ -2237,6 +2251,7 @@ send_generic_response (client, code, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } unsupported_mode: @@ -2245,6 +2260,7 @@ send_generic_response (client, GST_RTSP_STS_METHOD_NOT_ALLOWED, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } get_rates_error: @@ -2253,6 +2269,7 @@ send_generic_response (client, GST_RTSP_STS_INTERNAL_SERVER_ERROR, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } adjust_play_response_failed: @@ -2261,6 +2278,7 @@ send_generic_response (client, code, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } rtp_info_error: @@ -2269,6 +2287,7 @@ send_generic_response (client, GST_RTSP_STS_INTERNAL_SERVER_ERROR, ctx); gst_rtsp_media_unlock (media); g_object_unref (media); + g_object_unref (sessmedia); return FALSE; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-media.c new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-media.c --- old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-media.c 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-media.c 2022-02-02 16:08:18.000000000 +0100 @@ -4083,12 +4083,15 @@ priv->prepare_count--; if (priv->prepare_count > 0) goto is_busy; + if (priv->status == GST_RTSP_MEDIA_STATUS_UNPREPARING) + goto is_unpreparing; GST_INFO ("unprepare media %p", media); set_target_state (media, GST_STATE_NULL, FALSE); success = TRUE; - if (priv->status == GST_RTSP_MEDIA_STATUS_PREPARED) { + if (priv->status == GST_RTSP_MEDIA_STATUS_PREPARED + || priv->status == GST_RTSP_MEDIA_STATUS_SUSPENDED) { GstRTSPMediaClass *klass; klass = GST_RTSP_MEDIA_GET_CLASS (media); @@ -4108,6 +4111,12 @@ GST_INFO ("media %p was already unprepared", media); return TRUE; } +is_unpreparing: + { + g_rec_mutex_unlock (&priv->state_lock); + GST_INFO ("media %p is already unpreparing", media); + return TRUE; + } is_busy: { GST_INFO ("media %p still prepared %d times", media, priv->prepare_count); @@ -4614,9 +4623,8 @@ switch (priv->suspend_mode) { case GST_RTSP_SUSPEND_MODE_NONE: - if (gst_rtsp_media_is_receive_only (media)) - break; - if (media_streams_blocking (media)) { + if (!gst_rtsp_media_is_receive_only (media) + && media_streams_blocking (media)) { g_rec_mutex_unlock (&priv->state_lock); if (gst_rtsp_media_get_status (media) == GST_RTSP_MEDIA_STATUS_ERROR) { g_rec_mutex_lock (&priv->state_lock); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-session.c new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-session.c --- old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-session.c 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-session.c 2022-02-02 16:08:18.000000000 +0100 @@ -343,20 +343,9 @@ return more; } -/** - * gst_rtsp_session_get_media: - * @sess: a #GstRTSPSession - * @path: the path for the media - * @matched: (out): the amount of matched characters - * - * Get the session media for @path. @matched will contain the number of matched - * characters of @path. - * - * Returns: (transfer none) (nullable): the configuration for @path in @sess. - */ -GstRTSPSessionMedia * -gst_rtsp_session_get_media (GstRTSPSession * sess, const gchar * path, - gint * matched) +static GstRTSPSessionMedia * +_gst_rtsp_session_get_media (GstRTSPSession * sess, const gchar * path, + gint * matched, gboolean dup) { GstRTSPSessionPrivate *priv; GstRTSPSessionMedia *result; @@ -384,6 +373,9 @@ } } } + + if (result && dup) + result = g_object_ref (result); g_mutex_unlock (&priv->lock); *matched = best; @@ -392,6 +384,45 @@ } /** + * gst_rtsp_session_get_media: + * @sess: a #GstRTSPSession + * @path: the path for the media + * @matched: (out): the amount of matched characters + * + * Gets the session media for @path. @matched will contain the number of matched + * characters of @path. + * + * Returns: (transfer none) (nullable): the configuration for @path in @sess. + */ +GstRTSPSessionMedia * +gst_rtsp_session_get_media (GstRTSPSession * sess, const gchar * path, + gint * matched) +{ + return _gst_rtsp_session_get_media (sess, path, matched, FALSE); +} + +/** + * gst_rtsp_session_dup_media: + * @sess: a #GstRTSPSession + * @path: the path for the media + * @matched: (out): the amount of matched characters + * + * Gets the session media for @path, increasing its reference count. @matched + * will contain the number of matched characters of @path. + * + * Returns: (transfer full) (nullable): the configuration for @path in @sess, + * should be unreferenced when no longer needed. + * + * Since: 1.20 + */ +GstRTSPSessionMedia * +gst_rtsp_session_dup_media (GstRTSPSession * sess, const gchar * path, + gint * matched) +{ + return _gst_rtsp_session_get_media (sess, path, matched, TRUE); +} + +/** * gst_rtsp_session_filter: * @sess: a #GstRTSPSession * @func: (scope call) (allow-none): a callback @@ -454,19 +485,38 @@ res = func (sess, media, user_data); g_mutex_lock (&priv->lock); - } else + } else { res = GST_RTSP_FILTER_REF; + } changed = (cookie != priv->medias_cookie); switch (res) { case GST_RTSP_FILTER_REMOVE: - if (changed) - priv->medias = g_list_remove (priv->medias, media); - else + if (changed) { + GList *l; + + walk = NULL; + + for (l = priv->medias; l; l = l->next) { + if (l->data == media) { + walk = l; + break; + } + } + } + + /* The media might have been removed from the list while the mutex was + * unlocked above. In that case there's nothing else to do here as the + * only reference to the media owned by this function is in the + * visited hash table and that is released in the end + */ + if (walk) { priv->medias = g_list_delete_link (priv->medias, walk); + g_object_unref (media); + } + cookie = ++priv->medias_cookie; - g_object_unref (media); break; case GST_RTSP_FILTER_REF: result = g_list_prepend (result, g_object_ref (media)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-session.h new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-session.h --- old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-session.h 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-session.h 2022-02-02 16:08:18.000000000 +0100 @@ -141,7 +141,12 @@ GstRTSPSessionMedia * gst_rtsp_session_get_media (GstRTSPSession *sess, const gchar *path, gint * matched); +/* get media in a session, increasing its reference count */ +GST_RTSP_SERVER_API +GstRTSPSessionMedia * gst_rtsp_session_dup_media (GstRTSPSession *sess, + const gchar *path, + gint * matched); /** * GstRTSPSessionFilterFunc: * @sess: a #GstRTSPSession object diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-stream.c new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-stream.c --- old/gst-rtsp-server-1.18.5/gst/rtsp-server/rtsp-stream.c 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst/rtsp-server/rtsp-stream.c 2022-02-02 16:08:18.000000000 +0100 @@ -5219,7 +5219,7 @@ } static GstPadProbeReturn -pad_blocking (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) +rtp_pad_blocking (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) { GstRTSPStreamPrivate *priv; GstRTSPStream *stream; @@ -5306,6 +5306,41 @@ return ret; } +static GstPadProbeReturn +rtcp_pad_blocking (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) +{ + GstRTSPStreamPrivate *priv; + GstRTSPStream *stream; + GstPadProbeReturn ret = GST_PAD_PROBE_OK; + + stream = user_data; + priv = stream->priv; + + g_mutex_lock (&priv->lock); + + if ((info->type & GST_PAD_PROBE_TYPE_BUFFER) || + (info->type & GST_PAD_PROBE_TYPE_BUFFER_LIST)) { + GST_DEBUG_OBJECT (pad, "Now blocking on buffer"); + } else if ((info->type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM)) { + if (GST_EVENT_TYPE (info->data) == GST_EVENT_GAP) { + GST_DEBUG_OBJECT (pad, "Now blocking on gap event"); + ret = GST_PAD_PROBE_OK; + } else { + ret = GST_PAD_PROBE_PASS; + g_mutex_unlock (&priv->lock); + goto done; + } + } else { + g_assert_not_reached (); + } + + g_mutex_unlock (&priv->lock); + +done: + return ret; +} + + static void set_blocked (GstRTSPStream * stream, gboolean blocked) { @@ -5330,11 +5365,20 @@ priv->blocked_buffer = FALSE; priv->blocked_running_time = GST_CLOCK_TIME_NONE; priv->blocked_clock_rate = 0; - priv->blocked_id[i] = gst_pad_add_probe (priv->send_src[i], - GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER | - GST_PAD_PROBE_TYPE_BUFFER_LIST | - GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, pad_blocking, - g_object_ref (stream), g_object_unref); + + if (i == 0) { + priv->blocked_id[i] = gst_pad_add_probe (priv->send_src[i], + GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER | + GST_PAD_PROBE_TYPE_BUFFER_LIST | + GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, rtp_pad_blocking, + g_object_ref (stream), g_object_unref); + } else { + priv->blocked_id[i] = gst_pad_add_probe (priv->send_src[i], + GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER | + GST_PAD_PROBE_TYPE_BUFFER_LIST | + GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, rtcp_pad_blocking, + g_object_ref (stream), g_object_unref); + } } } } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/gst-rtsp-server.doap new/gst-rtsp-server-1.18.6/gst-rtsp-server.doap --- old/gst-rtsp-server-1.18.5/gst-rtsp-server.doap 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/gst-rtsp-server.doap 2022-02-02 16:08:18.000000000 +0100 @@ -32,6 +32,16 @@ <release> <Version> + <revision>1.18.6</revision> + <branch>1.18</branch> + <name></name> + <created>2022-02-02</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.18.6.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.18.5</revision> <branch>1.18</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.18.5/meson.build new/gst-rtsp-server-1.18.6/meson.build --- old/gst-rtsp-server-1.18.5/meson.build 2021-09-08 21:04:14.000000000 +0200 +++ new/gst-rtsp-server-1.18.6/meson.build 2022-02-02 16:08:18.000000000 +0100 @@ -1,5 +1,5 @@ project('gst-rtsp-server', 'c', - version : '1.18.5', + version : '1.18.6', meson_version : '>= 0.48', default_options : ['warning_level=1', 'buildtype=debugoptimized'])