Hello community,

here is the log from the commit of package gstreamer-plugins-good for 
openSUSE:Factory checked in at 2020-11-09 13:56:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-good (Old)
 and      /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.11331 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gstreamer-plugins-good"

Mon Nov  9 13:56:41 2020 rev:72 rq:846451 version:1.18.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gstreamer-plugins-good/gstreamer-plugins-good.changes
    2020-10-27 18:58:08.238707983 +0100
+++ 
/work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.11331/gstreamer-plugins-good.changes
 2020-11-09 13:57:51.503905614 +0100
@@ -1,0 +2,28 @@
+Tue Oct 27 16:38:53 UTC 2020 - Antonio Larrosa <[email protected]>
+
+- Update to 1.18.1:
+  + Highlighted bugfixes in 1.18.1
+    - important security fixes
+    - bug fixes and memory leak fixes
+    - various stability and reliability improvements
+  + gst-plugins-good changes:
+    - v4l2object: Only offer inactive pools and if needed
+    - vpx: Fix the check to unfixed/unknown framerate to set
+      bitrate
+    - qmlglsink: fix crash when created/destroyed in quick
+      succession
+    - rtputils: Count metas with an empty tag list for
+      copying/keeping
+    - rtpbin: Remove the rtpjitterbuffer with the stream
+    - rtph26*depay: drop FU's without a corresponding start bit
+    - imagefreeze: Response caps query from srcpad
+    - rtpmp4gdepay: Allow lower-case "aac-hbr" instead of correct
+      "AAC-hbr"
+    - rtspsrc: Fix push-backchannel-buffer parameter mismatch
+    - jpegdec: check buffer size before dereferencing
+    - flvmux: Move stream skipping to
+      GstAggregatorPadClass.skip_buffer
+    - v4l2object: plug memory leak
+    - splitmuxsink: fix sink pad release while PLAYING
+
+-------------------------------------------------------------------

Old:
----
  gst-plugins-good-1.18.0.tar.xz

New:
----
  gst-plugins-good-1.18.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gstreamer-plugins-good.spec ++++++
--- /var/tmp/diff_new_pack.S2vRCL/_old  2020-11-09 13:57:52.167904166 +0100
+++ /var/tmp/diff_new_pack.S2vRCL/_new  2020-11-09 13:57:52.167904166 +0100
@@ -29,7 +29,7 @@
 %define ENABLE_EXPERIMENTAL 1
 
 Name:           gstreamer-plugins-good
-Version:        1.18.0
+Version:        1.18.1
 Release:        0
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 License:        LGPL-2.1-or-later
@@ -108,7 +108,7 @@
 Requires:       gstreamer-plugins-base >= %{gstreamer_req_version}
 Recommends:     %{name}-gtk
 Enhances:       gstreamer
-Conflicts:      gstreamer-plugins-ugly < 1.18.0
+Conflicts:      gstreamer-plugins-ugly < 1.18.1
 # Generic name, never used in SuSE: I wish it had been used I would have used 
it then I wouldn't have to keep copy pasting and actually type it.
 Provides:       gst-plugins-good = %{version}
 %if 0%{?ENABLE_AALIB}

++++++ _service ++++++
--- /var/tmp/diff_new_pack.S2vRCL/_old  2020-11-09 13:57:52.203904088 +0100
+++ /var/tmp/diff_new_pack.S2vRCL/_new  2020-11-09 13:57:52.203904088 +0100
@@ -4,7 +4,7 @@
     <param name="filename">gst-plugins-good</param>
     <!--<param name="versionformat">@PARENT_TAG@+git%cd.%h</param>-->
     <param name="versionformat">@PARENT_TAG@</param>
-    <param name="revision">1.18.0</param>
+    <param name="revision">1.18.1</param>
     <param name="scm">git</param>
   </service>
   <service name="recompress" mode="disabled">

++++++ gst-plugins-good-1.18.0.tar.xz -> gst-plugins-good-1.18.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/ChangeLog 
new/gst-plugins-good-1.18.1/ChangeLog
--- old/gst-plugins-good-1.18.0/ChangeLog       2020-09-08 01:05:16.235363500 
+0200
+++ new/gst-plugins-good-1.18.1/ChangeLog       2020-10-26 12:12:12.620011800 
+0100
@@ -1,11 +1,190 @@
+=== release 1.18.1 ===
+
+2020-10-26 11:12:10 +0000  Tim-Philipp Müller <[email protected]>
+
+       * ChangeLog:
+       * NEWS:
+       * RELEASE:
+       * gst-plugins-good.doap:
+       * meson.build:
+         Release 1.18.1
+
+2020-10-23 10:32:18 -0400  Nicolas Dufresne <[email protected]>
+
+       * sys/v4l2/gstv4l2object.c:
+         Revert "v4l2object: Only offer inactive pools and if needed"
+         This reverts commit 85b9893e963ea5d342289e318daeefba35ff4a07.
+         This change caused a regression reported in #796. Basically the pool 
get
+         deactivated by basesrc and the encoder does not recover. Recovering 
with
+         current design would cause insertion of an unwanted keyframe.
+         This is being reverted in 1.18 only, a proper solution is wanted for 
1.20.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/785>
+
+2020-10-22 15:29:01 -0300  Thibault Saunier <[email protected]>
+
+       * ext/vpx/gstvpxenc.c:
+         vpx: Fix the check to unfixed/unknown framerate to set bitrate
+         0/1 means unknown framerate not X/0 (which is illegal).
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/783>
+
+2020-10-16 16:05:45 -0700  Bastien Reboulet <[email protected]>
+
+       * ext/qt/qtitem.cc:
+         qmlglsink: fix crash when created/destroyed in quick succession
+         The crash is caused by a race condition where the render thread
+         calls a method on the QtGLVideoItem instance that was
+         previously destroyed by the main thread.
+         Also, less frequently, QtGLVideoItem::onSceneGraphInitialized
+         is called when QQuickItem::window is null, also causing a crash.
+         Fixes #798
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/781>
+
+2020-10-22 09:17:26 -0400  Arun Raghavan <[email protected]>
+
+       * gst/rtp/gstrtputils.c:
+         rtputils: Count metas with an empty tag list for copying/keeping
+         The GstMetaInfos registered in core do not set their tags to NULL, but
+         instead use an empty list (non-NULL list with a single NULL value).
+         Let's check explicitly for that so as to not miss some metas.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/780>
+
+2020-09-23 15:25:36 -0400  Nicolas Dufresne <[email protected]>
+
+       * gst/rtpmanager/gstrtpbin.c:
+         rtpbin: Remove the rtpjitterbuffer with the stream
+         Since !348, the jitterbuffer was only removed with the session. This 
restores
+         the original behaviour and removes the jitterbuffer when the stream is
+         removed. This avoid accumulating jitterbuffer objects into the bin 
when a
+         session is reused.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/765>
+
+2020-09-23 13:26:51 -0400  Nicolas Dufresne <[email protected]>
+
+       * gst/rtpmanager/gstrtpbin.c:
+         rtpbin: Cleanup dead code
+         The rtpjitterbuffer is now part of the session elements, we no longer 
need
+         to do the ref_sink dance when signalling it. It is already owned by 
the bin
+         when signalled. Also, the code that handles generic session elements 
already
+         handle the ref_sink() calls since:
+         03dc22951bacb6fdc3868c8f801e6a52c33a745f
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/765>
+
+2020-09-18 16:09:20 +1000  Matthew Waters <[email protected]>
+
+       * gst/rtp/gstrtph264depay.c:
+       * gst/rtp/gstrtph264depay.h:
+       * gst/rtp/gstrtph265depay.c:
+       * gst/rtp/gstrtph265depay.h:
+       * tests/check/elements/rtph264.c:
+         rtph26*depay: drop FU's without a corresponding start bit
+         If we have not received a FU with a start bit set, any subsequent FU
+         data is not useful at all and would result in an invalid stream.
+         This case is constructed from multiple requirements in
+         RFC 3984 Section 5.8 and RFC 7798 Section 4.4.3.  Following are 
excerpts
+         from RFC 3984 but RFC 7798 contains similar language.
+         The FU in a single FU case is forbidden:
+         A fragmented NAL unit MUST NOT be transmitted in one FU; i.e., the
+         Start bit and End bit MUST NOT both be set to one in the same FU
+         header.
+         and dropping is possible:
+         If a fragmentation unit is lost, the receiver SHOULD discard all
+         following fragmentation units in transmission order corresponding to
+         the same fragmented NAL unit.
+         The jump in seqnum case is supported by this from the specification
+         instead of implementing the forbidden_zero_bit mangling:
+         If a fragmentation unit is lost, the receiver SHOULD discard all
+         following fragmentation units in transmission order corresponding to
+         the same fragmented NAL unit.
+         A receiver in an endpoint or in a MANE MAY aggregate the first n-1
+         fragments of a NAL unit to an (incomplete) NAL unit, even if fragment
+         n of that NAL unit is not received.  In this case, the
+         forbidden_zero_bit of the NAL unit MUST be set to one to indicate a
+         syntax violation.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/764>
+
+2020-09-20 21:06:19 +0900  Seungha Yang <[email protected]>
+
+       * gst/imagefreeze/gstimagefreeze.c:
+         imagefreeze: Response caps query from srcpad
+         ... and chain up to default query handler for unhandled query types.
+         Unhandled query shouldn't be returned with FALSE if there's no 
special needs.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/763>
+
+2020-09-14 10:15:35 +0300  Sebastian Dröge <[email protected]>
+
+       * docs/gst_plugins_cache.json:
+       * gst/rtp/gstrtpmp4gdepay.c:
+         rtpmp4gdepay: Allow lower-case "aac-hbr" instead of correct "AAC-hbr"
+         Various live555 based products are using the wrong "mode" string or
+         seem to assume case-insensitive matching, which is wrong.
+         Examples for this are the Yuan SC6C0N1 mini and the Kiloview E2.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/762>
+
+2020-09-07 23:20:58 +0800  Ricky Tang <[email protected]>
+
+       * docs/gst_plugins_cache.json:
+       * gst/rtsp/gstrtspsrc.c:
+         rtspsrc: Fix push-backchannel-buffer parameter mismatch
+         When using python, signal parameter must match with function.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/761>
+
+2020-09-10 11:24:32 +0200  Jérôme Laheurte <[email protected]>
+
+       * ext/jpeg/gstjpegdec.c:
+         jpegdec: check buffer size before dereferencing. Fixes #541
+         Some cameras (Panacast) have buggy drivers/firmware which send
+         invalid JPEG frames, containing no data, which makes jpegdec
+         crash because it assumes the frame is at least 2 bytes long.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/760>
+
+2020-09-10 11:11:00 +0200  Jan Alexander Steffens (heftig) 
<[email protected]>
+
+       * gst/flv/gstflvmux.c:
+         flvmux: Improve logging of gst_flv_mux_buffer_to_tag_internal
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/759>
+
+2020-09-09 15:12:53 +0200  Jan Alexander Steffens (heftig) 
<[email protected]>
+
+       * gst/flv/gstflvmux.c:
+         flvmux: Move stream skipping to GstAggregatorPadClass.skip_buffer
+         Besides looking like the correct place to put this, it allows us to 
drop
+         the entire aggregator queue. The old implementation only dropped at 
most
+         one buffer for each call of aggregate.
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/759>
+
+2020-09-08 17:35:50 +0200  Havard Graff <[email protected]>
+
+       * sys/v4l2/gstv4l2object.c:
+         v4l2object: plug memory-leak
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/758>
+
+2020-09-08 20:57:33 +0200  Mathieu Duponchelle <[email protected]>
+
+       * gst/multifile/gstsplitmuxsink.c:
+         splitmuxsink: fix sink pad release while PLAYING
+         - Release the split mux lock while removing the probes
+         - Flush the sinkpad to unblock other pads
+         - Turn check_completed_gop into a do while statement, when
+         waking up we want to recheck whether the current GOP is
+         ready for sending
+         Part-of: 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/756>
+
+2020-09-08 17:44:17 +0100  Tim-Philipp Müller <[email protected]>
+
+       * docs/gst_plugins_cache.json:
+       * meson.build:
+         Back to development
+
 === release 1.18.0 ===
 
 2020-09-08 00:05:14 +0100  Tim-Philipp Müller <[email protected]>
 
+       * .gitlab-ci.yml:
        * ChangeLog:
        * NEWS:
        * README:
        * RELEASE:
+       * docs/gst_plugins_cache.json:
        * gst-plugins-good.doap:
        * meson.build:
          Release 1.18.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/NEWS 
new/gst-plugins-good-1.18.1/NEWS
--- old/gst-plugins-good-1.18.0/NEWS    2020-09-08 01:05:16.235363500 +0200
+++ new/gst-plugins-good-1.18.1/NEWS    2020-10-26 12:12:12.620011800 +0100
@@ -1,11 +1,14 @@
 GStreamer 1.18 Release Notes
 
-GStreamer 1.18.0 was originally released on 7 September 2020.
+GStreamer 1.18.0 was originally released on 8 September 2020.
+
+The latest bug-fix release in the 1.18 series is 1.18.1 and was released
+on 26 October 2020.
 
 See https://gstreamer.freedesktop.org/releases/1.18/ for the latest
 version of this document.
 
-Last updated: Monday 7 September 2020, 10:30 UTC (log)
+Last updated: Monday 26 October 2020, 11:00 UTC (log)
 
 Introduction
 
@@ -28,7 +31,8 @@
 
 -   Active Format Description (AFD) and Bar Data support
 
--   ONVIF trick modes support in both GStreamer RTSP server and client
+-   RTSP server and client implementations gained ONVIF trick modes
+    support
 
 -   Hardware-accelerated video decoding on Windows via DXVA2 /
     Direct3D11
@@ -39,24 +43,25 @@
 -   qmlgloverlay: New overlay element that renders a QtQuick scene over
     the top of an input video stream
 
--   New imagesequencesrc element to easily create a video stream from a
+-   imagesequencesrc: New element to easily create a video stream from a
     sequence of jpeg or png images
 
--   dashsink: Add new sink to produce DASH content
+-   dashsink: New sink to produce DASH content
 
--   dvbsubenc: DVB Subtitle encoder element
+-   dvbsubenc: New DVB Subtitle encoder element
 
--   TV broadcast compliant MPEG-TS muxing with constant bitrate muxing
-    and SCTE-35 support
+-   MPEG-TS muxing now also supports TV broadcast compliant muxing with
+    constant bitrate muxing and SCTE-35 support
 
--   rtmp2: new RTMP client source and sink element implementation
+-   rtmp2: New RTMP client source and sink element from-scratch
+    implementation
 
--   svthevcenc: new SVT-HEVC-based H.265 video encoder
+-   svthevcenc: New SVT-HEVC-based H.265 video encoder
 
--   vaapioverlay compositor element using VA-API
+-   vaapioverlay: New compositor element using VA-API
 
--   rtpmanager support for Google’s Transport-Wide Congestion Control
-    (twcc) RTP extension
+-   rtpmanager gained support for Google’s Transport-Wide Congestion
+    Control (twcc) RTP extension
 
 -   splitmuxsink and splitmuxsrc gained support for auxiliary video
     streams
@@ -64,18 +69,18 @@
 -   webrtcbin now contains some initial support for renegotiation
     involving stream addition and removal
 
--   New RTP source and sink elements to easily set up RTP streaming via
-    rtp:// URIs
+-   RTP support was enhanced with new RTP source and sink elements to
+    easily set up RTP streaming via rtp:// URIs
 
--   New Audio Video Transport Protocol (AVTP) plugin for Time-Sensitive
-    Applications
+-   avtp: New Audio Video Transport Protocol (AVTP) plugin for
+    Time-Sensitive Applications
 
 -   Support for the Video Services Forum’s Reliable Internet Stream
     Transport (RIST) TR-06-1 Simple Profile
 
 -   Universal Windows Platform (UWP) support
 
--   rpicamsrc element for capturing from the Raspberry Pi camera
+-   rpicamsrc: New element for capturing from the Raspberry Pi camera
 
 -   RTSP Server TCP interleaved backpressure handling improvements as
     well as support for Scale/Speed headers
@@ -2179,7 +2184,208 @@
 
 1.18.0
 
-1.18.0 was released on 7 September 2020.
+1.18.0 was released on 8 September 2020.
+
+1.18.1
+
+The first 1.18 bug-fix release (1.18.1) was released on 26 October 2020.
+
+This release only contains bugfixes and it should be safe to update from
+1.18.0.
+
+Highlighted bugfixes in 1.18.1
+
+-   important security fixes
+-   bug fixes and memory leak fixes
+-   various stability and reliability improvements
+
+gstreamer
+
+-   aggregator: make peek() has() pop() drop() buffer API threadsafe
+-   gstvalue: don’t write to const char *
+-   meson: Disallow DbgHelp for UWP build
+-   info: Fix build on Windows ARM64 device
+-   build: use cpu_family for arch checks
+-   basetransform: Fix in/outbuf confusion of _default_transform_meta
+-   Fix documentation
+-   info: Load DbgHelp.dll using g_module_open()
+-   padtemplate: mark documentation caps as may be leaked
+-   gstmeta: intern registered impl string
+-   aggregator: Hold SRC_LOCK while unblocking via SRC_BROADCAST()
+-   ptp_helper_post_install.sh: deal with none
+-   skip elements/leak.c if tracer is not available
+-   aggregator: Wake up source pad in PAUSED<->PLAYING transitions
+-   input-selector: Wake up blocking pads when releasing them
+-   ptp: Also handle gnu/kfreebsd
+
+gst-plugins-base
+
+-   theoradec: Set telemetry options only if they are nonzero
+-   glslstage: delete shader on finalize of stage
+-   urisourcebin: Fix crash caused by use after free
+-   decodebin3: Store stream-start event on output pad before exposing
+    it
+-   Add some missing nullable annotations
+-   typefind/xdgmime: Validate mimetypes to be valid GstStructure names
+    before using them
+-   uridecodebin3: Forward upstream events to decodebin3 directly
+-   video-converter: Add fast paths from v210 to I420/YV12, Y42B, UYVY
+    and YUY2
+-   videoaggregator: Limit accepted caps by template caps
+-   gstrtpbuffer: fix header extension length validation
+-   decodebin3: only force streams-selected seqnum after a
+    select-streams
+-   videodecoder: don’t copy interlace-mode from reference state
+-   enable abi checks
+-   multihandlesink: Don’t pass NULL caps to gst_caps_is_equal
+-   audio: video: Fix in/outbuf confusion of transform_meta
+-   meson: Always wrap “prefix” option with join_paths() to make Windows
+    happy
+-   videoaggregator: ensure peek_next_sample() uses the correct caps
+-   meson: Actually build gstgl without implicit include dirs
+-   videoaggregator: Don’t require any pads to be configured for
+    negotiating source pad caps
+-   gst-libs: gl: Fix documentation typo and clarify
+    gl_memory_texsubimage
+-   audioaggregator: Reset offset if the output rate is renegotiated
+-   video-anc: Implement transform functions for AFD/Bar metas
+-   appsrc: Wake up the create() function on caps changes
+-   rtpbasepayload: do not forget delayed segment when forwarding gaps
+
+gst-plugins-good
+
+-   v4l2object: Only offer inactive pools and if needed
+-   vpx: Fix the check to unfixed/unknown framerate to set bitrate
+-   qmlglsink: fix crash when created/destroyed in quick succession
+-   rtputils: Count metas with an empty tag list for copying/keeping
+-   rtpbin: Remove the rtpjitterbuffer with the stream
+-   rtph26*depay: drop FU’s without a corresponding start bit
+-   imagefreeze: Response caps query from srcpad
+-   rtpmp4gdepay: Allow lower-case “aac-hbr” instead of correct
+    “AAC-hbr”
+-   rtspsrc: Fix push-backchannel-buffer parameter mismatch
+-   jpegdec: check buffer size before dereferencing
+-   flvmux: Move stream skipping to GstAggregatorPadClass.skip_buffer
+-   v4l2object: plug memory leak
+-   splitmuxsink: fix sink pad release while PLAYING
+
+gst-plugins-bad
+
+-   codecparsers: h264parser: guard against ref_pic_markings overflow
+-   v4l2codecs: Various fixes
+-   h265parse: Don’t enable passthrough by default
+-   srt: Fix “Fix timestamping”
+-   srt: Fixes for 1.4.2
+-   dtlsconnection: Ignore OpenSSL system call errors
+-   h265parse: set interlace-mode=interleaved on interlaced content
+-   Replace GPL v2 with LGPL v2 in COPYING file
+-   srt: Consume the error from gst_srt_object_write
+-   srt: Check socket state before retrieving payload size
+-   x265enc: fix deadlock on reconfig
+-   webrtc: Require gstreamer-sdp in the pkg-config file
+-   srtsrc: Fix timestamping
+-   mfvideosrc: Use only the first video stream per device
+-   srtobject: typecast SRTO_LINGER to linger
+-   decklink: Correctly order the different dependent mode tables
+-   wasapisrc: Make sure that wasapisrc produces data in loopback mode
+-   wpesrc: fix some caps leaks using the non-GL output
+-   smoothstreaming: clear live adapter on seek
+-   vtdec/vulkan: use Shared storage mode for IOSurface textures
+-   wpe: Move webview load waiting to WPEView
+-   wpe: Use proper callback for TLS errors signal handling
+-   kmssink: Do not source using padded width/height
+-   avtp: avtpaafdepay: fix crash when building caps
+-   opencv: set opencv_dep when option is disabled to fix the build
+-   line21encoder: miscellaneous enhancements
+-   Hls youtube issues with urisourcebin/queue2
+-   rtmp2: Replace stats queue with stats lock
+-   rtmp2sink: support EOS event for graceful connection shutdown
+-   mpegtsmux: Make handling of sinkpads thread-safe
+-   hlssink2: Actually release splitmuxsink’s pads
+-   mpegtsmux: Don’t create streams with reserved PID
+
+gst-plugins-ugly
+
+-   no changes
+
+gst-libav
+
+-   avaudenc/avvidenc: Reopen encoding session if it’s required
+-   avauddec/audenc/videnc: Don’t return GST_FLOW_EOS when draining
+-   avauddec/avviddec: Avoid dropping non-OK flow return
+-   avcodecmap: Enable 24 bit WMA Lossless decoding
+
+gst-rtsp-server
+
+-   rtsp-stream: collect rtp info when blocking
+-   rtsp-media: set a 0 storage size for TCP receivers
+-   rtsp-stream: preroll on gap events
+-   rtsp-media: do not unblock on unsuspend
+
+gstreamer-vaapi
+
+-   decoder: don’t reply src caps query with allowed if pad is fixed
+-   plugins: decode: fix a DMA caps typo in ensure_allowed_srcpad_caps
+
+gstreamer-sharp
+
+-   Add bindings for some missing 1.18 API
+
+gst-omx
+
+-   omxvideodec: support interlace-mode=interleaved input
+
+gst-python
+
+-   no changes
+
+gst-editing-services
+
+-   ges: Do not recreate auto-transitions when changing clip assets
+-   ges: Fix a copy/paste mistake in meson file
+
+gst-integration-testsuites
+
+-   medias: Update for h265parse passthrough behavior change
+-   update validate.test.h265parse.alternate test
+
+gst-build
+
+-   windows: Detect Strawberry Perl and error out early
+-   {pygobject,pycairo}.wrap: point to stable refs
+
+Cerbero build tool and packaging changes in 1.18.1
+
+-   Add macOS Big Sur support
+-   gst-plugins-bad: Ship rtpmanagerbad plugin
+-   gstreamer-1.0: Don’t enable DbgHelp for UWP build
+-   pango: fix font corruption on windows
+-   cairo: use thread local storage to grant one windows HDC per thread
+-   small fixes for Xcode 12
+-   cerbero: Re-add alsa-devel to bootstrap on Linux
+-   FreeType: update to 2.10.4 to fix security vulnerability
+
+Contributors to 1.18.1
+
+Aaron Boxer, Adam Williamson, Andrew Wesie, Arun Raghavan, Bastien
+Reboulet, Brent Gardner, Edward Hervey, François Laignel, Guillaume
+Desmottes, Havard Graff, He Junyan, Hosang Lee, Jacek Tomaszewski, Jakub
+Adam, Jan Alexander Steffens (heftig), Jan Schmidt, Jérôme Laheurte,
+Jordan Petridis, Marc Leeman, Marian Cichy, Marijn Suijten, Mathieu
+Duponchelle, Matthew Waters, Michael Tretter, Nazar Mokrynskyi, Nicolas
+Dufresne, Niklas Hambüchen, Nirbheek Chauhan, Olivier Crête, Philippe
+Normand, raghavendra, Ricky Tang, Sebastian Dröge, Seungha Yang,
+sohwan.park, Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller, Tom
+Schoonjans, Víctor Manuel Jáquez Leal, Will Miller, Xavier Claessens, Xℹ
+Ruoyao, Zebediah Figura,
+
+… 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.1
+
+-   List of Merge Requests applied in 1.18.1
+-   List of Issues fixed in 1.18.1
 
 Schedule for 1.20
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/RELEASE 
new/gst-plugins-good-1.18.1/RELEASE
--- old/gst-plugins-good-1.18.0/RELEASE 2020-09-08 01:05:16.235363500 +0200
+++ new/gst-plugins-good-1.18.1/RELEASE 2020-10-26 12:12:12.620011800 +0100
@@ -1,4 +1,4 @@
-This is GStreamer gst-plugins-good 1.18.0.
+This is GStreamer gst-plugins-good 1.18.1.
 
 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.18.0/docs/gst_plugins_cache.json 
new/gst-plugins-good-1.18.1/docs/gst_plugins_cache.json
--- old/gst-plugins-good-1.18.0/docs/gst_plugins_cache.json     2020-09-08 
01:05:16.239363400 +0200
+++ new/gst-plugins-good-1.18.1/docs/gst_plugins_cache.json     2020-10-26 
12:12:12.624011800 +0100
@@ -6595,7 +6595,7 @@
                         "construct": false,
                         "construct-only": false,
                         "controllable": false,
-                        "default": "GStreamer 1.18.0 FLV muxer",
+                        "default": "GStreamer 1.18.1 FLV muxer",
                         "mutable": "null",
                         "readable": true,
                         "type": "gchararray",
@@ -6607,7 +6607,7 @@
                         "construct": false,
                         "construct-only": false,
                         "controllable": false,
-                        "default": "GStreamer 1.18.0 FLV muxer",
+                        "default": "GStreamer 1.18.1 FLV muxer",
                         "mutable": "null",
                         "readable": true,
                         "type": "gchararray",
@@ -15369,7 +15369,7 @@
                 "long-name": "RTP MPEG4 ES depayloader",
                 "pad-templates": {
                     "sink": {
-                        "caps": "application/x-rtp:\n          media: { 
(string)video, (string)audio, (string)application }\n     clock-rate: [ 1, 
2147483647 ]\n  encoding-name: MPEG4-GENERIC\n           mode: { 
(string)generic, (string)CELP-cbr, (string)CELP-vbr, (string)AAC-lbr, 
(string)AAC-hbr }\n",
+                        "caps": "application/x-rtp:\n          media: { 
(string)video, (string)audio, (string)application }\n     clock-rate: [ 1, 
2147483647 ]\n  encoding-name: MPEG4-GENERIC\n           mode: { 
(string)generic, (string)CELP-cbr, (string)CELP-vbr, (string)AAC-lbr, 
(string)AAC-hbr, (string)aac-hbr }\n",
                         "direction": "sink",
                         "presence": "always"
                     },
@@ -20636,7 +20636,7 @@
                         "construct": false,
                         "construct-only": false,
                         "controllable": false,
-                        "default": "GStreamer/1.18.0",
+                        "default": "GStreamer/1.18.1",
                         "mutable": "null",
                         "readable": true,
                         "type": "gchararray",
@@ -20776,7 +20776,7 @@
                             },
                             {
                                 "name": "arg1",
-                                "type": "GstBuffer"
+                                "type": "GstSample"
                             }
                         ],
                         "return-type": "GstFlowReturn",
@@ -22593,7 +22593,7 @@
                         "construct": false,
                         "construct-only": false,
                         "controllable": false,
-                        "default": "GStreamer souphttpsrc 1.18.0 ",
+                        "default": "GStreamer souphttpsrc 1.18.1 ",
                         "mutable": "null",
                         "readable": true,
                         "type": "gchararray",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/ext/jpeg/gstjpegdec.c 
new/gst-plugins-good-1.18.1/ext/jpeg/gstjpegdec.c
--- old/gst-plugins-good-1.18.0/ext/jpeg/gstjpegdec.c   2020-09-08 
01:05:16.243363400 +0200
+++ new/gst-plugins-good-1.18.1/ext/jpeg/gstjpegdec.c   2020-10-26 
12:12:12.632012000 +0100
@@ -1215,6 +1215,8 @@
 
   data = dec->current_frame_map.data;
   nbytes = dec->current_frame_map.size;
+  if (nbytes < 2)
+    goto need_more_data;
   has_eoi = ((data[nbytes - 2] == 0xff) && (data[nbytes - 1] == 0xd9));
 
   /* some cameras fail to send an end-of-image marker (EOI),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/ext/qt/qtitem.cc 
new/gst-plugins-good-1.18.1/ext/qt/qtitem.cc
--- old/gst-plugins-good-1.18.0/ext/qt/qtitem.cc        2020-09-08 
01:05:16.247363300 +0200
+++ new/gst-plugins-good-1.18.1/ext/qt/qtitem.cc        2020-10-26 
12:12:12.640011800 +0100
@@ -31,6 +31,7 @@
 
 #include <QtCore/QRunnable>
 #include <QtCore/QMutexLocker>
+#include <QtCore/QPointer>
 #include <QtGui/QGuiApplication>
 #include <QtQuick/QQuickWindow>
 #include <QtQuick/QSGSimpleTextureNode>
@@ -87,7 +88,7 @@
   void run();
 
 private:
-  QtGLVideoItem *item_;
+  QPointer<QtGLVideoItem> item_;
 };
 
 InitializeSceneGraph::InitializeSceneGraph(QtGLVideoItem *item) :
@@ -97,7 +98,8 @@
 
 void InitializeSceneGraph::run()
 {
-  item_->onSceneGraphInitialized();
+  if(item_)
+    item_->onSceneGraphInitialized();
 }
 
 QtGLVideoItem::QtGLVideoItem()
@@ -285,6 +287,9 @@
 void
 QtGLVideoItem::onSceneGraphInitialized ()
 {
+  if (this->window() == NULL)
+    return;
+
   GST_DEBUG ("%p scene graph initialization with Qt GL context %p", this,
       this->window()->openglContext ());
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/ext/vpx/gstvpxenc.c 
new/gst-plugins-good-1.18.1/ext/vpx/gstvpxenc.c
--- old/gst-plugins-good-1.18.0/ext/vpx/gstvpxenc.c     2020-09-08 
01:05:16.255363500 +0200
+++ new/gst-plugins-good-1.18.1/ext/vpx/gstvpxenc.c     2020-10-26 
12:12:12.644011700 +0100
@@ -803,7 +803,7 @@
     guint target_bitrate;
     guint fps_n, fps_d;
 
-    if (GST_VIDEO_INFO_FPS_D (&encoder->input_state->info) != 0) {
+    if (GST_VIDEO_INFO_FPS_N (&encoder->input_state->info) != 0) {
       fps_n = GST_VIDEO_INFO_FPS_N (&encoder->input_state->info);
       fps_d = GST_VIDEO_INFO_FPS_D (&encoder->input_state->info);
     } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/flv/gstflvmux.c 
new/gst-plugins-good-1.18.1/gst/flv/gstflvmux.c
--- old/gst-plugins-good-1.18.0/gst/flv/gstflvmux.c     2020-09-08 
01:05:16.271363300 +0200
+++ new/gst-plugins-good-1.18.1/gst/flv/gstflvmux.c     2020-10-26 
12:12:12.664012000 +0100
@@ -134,6 +134,8 @@
 static GstFlowReturn gst_flv_mux_update_src_caps (GstAggregator * aggregator,
     GstCaps * caps, GstCaps ** ret);
 static guint64 gst_flv_mux_query_upstream_duration (GstFlvMux * mux);
+static GstClockTime gst_flv_mux_segment_to_running_time (const GstSegment *
+    segment, GstClockTime t);
 
 static GstFlowReturn
 gst_flv_mux_pad_flush (GstAggregatorPad * pad, GstAggregator * aggregator)
@@ -147,6 +149,47 @@
   return GST_FLOW_OK;
 }
 
+static gboolean
+gst_flv_mux_skip_buffer (GstAggregatorPad * apad, GstAggregator * aggregator,
+    GstBuffer * buffer)
+{
+  GstFlvMuxPad *fpad = GST_FLV_MUX_PAD_CAST (apad);
+  GstFlvMux *mux = GST_FLV_MUX_CAST (aggregator);
+  GstClockTime t;
+
+  if (!mux->skip_backwards_streams)
+    return FALSE;
+
+  if (fpad->drop_deltas) {
+    if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) {
+      GST_INFO_OBJECT (fpad, "Waiting for keyframe, dropping %" GST_PTR_FORMAT,
+          buffer);
+      return TRUE;
+    } else {
+      /* drop-deltas is set and the buffer isn't delta, drop flag */
+      fpad->drop_deltas = FALSE;
+    }
+  }
+
+  if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS_OR_PTS (buffer))) {
+    t = gst_flv_mux_segment_to_running_time (&apad->segment,
+        GST_BUFFER_DTS_OR_PTS (buffer));
+
+    if (t < (GST_MSECOND * mux->last_dts)) {
+      GST_WARNING_OBJECT (fpad,
+          "Timestamp %" GST_TIME_FORMAT " going backwards from last used %"
+          GST_TIME_FORMAT ", dropping %" GST_PTR_FORMAT,
+          GST_TIME_ARGS (t), GST_TIME_ARGS (GST_MSECOND * mux->last_dts),
+          buffer);
+      /* Look for non-delta buffer */
+      fpad->drop_deltas = TRUE;
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
 static void
 gst_flv_mux_pad_class_init (GstFlvMuxPadClass * klass)
 {
@@ -156,6 +199,8 @@
   gobject_class->finalize = gst_flv_mux_pad_finalize;
 
   aggregatorpad_class->flush = GST_DEBUG_FUNCPTR (gst_flv_mux_pad_flush);
+  aggregatorpad_class->skip_buffer =
+      GST_DEBUG_FUNCPTR (gst_flv_mux_skip_buffer);
 }
 
 static void
@@ -1172,10 +1217,25 @@
   if (GST_CLOCK_STIME_IS_VALID (pad->dts)) {
     pts = pad->pts / GST_MSECOND;
     dts = pad->dts / GST_MSECOND;
+    GST_LOG_OBJECT (mux,
+        "Pad %s: Created dts %" GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT
+        " from rounding %" GST_TIME_FORMAT ", %" GST_TIME_FORMAT,
+        GST_PAD_NAME (pad), GST_TIME_ARGS (dts * GST_MSECOND),
+        GST_TIME_ARGS (pts * GST_MSECOND), GST_TIME_ARGS (pad->dts),
+        GST_TIME_ARGS (pad->pts));
   } else if (GST_CLOCK_TIME_IS_VALID (pad->last_timestamp)) {
     pts = dts = pad->last_timestamp / GST_MSECOND;
+    GST_DEBUG_OBJECT (mux,
+        "Pad %s: Created dts and pts %" GST_TIME_FORMAT
+        " from rounding last pad timestamp %" GST_TIME_FORMAT,
+        GST_PAD_NAME (pad), GST_TIME_ARGS (pts * GST_MSECOND),
+        GST_TIME_ARGS (pad->last_timestamp));
   } else {
     pts = dts = mux->last_dts;
+    GST_DEBUG_OBJECT (mux,
+        "Pad %s: Created dts and pts %" GST_TIME_FORMAT
+        " from last mux timestamp",
+        GST_PAD_NAME (pad), GST_TIME_ARGS (pts * GST_MSECOND));
   }
 
   /* We prevent backwards timestamps because they confuse librtmp,
@@ -1279,7 +1339,7 @@
     data[11] |= (pad->width << 1) & 0x02;
     data[11] |= (pad->channels << 0) & 0x01;
 
-    GST_DEBUG_OBJECT (mux, "Creating byte %02x with "
+    GST_LOG_OBJECT (mux, "Creating byte %02x with "
         "codec:%d, rate:%d, width:%d, channels:%d",
         data[11], pad->codec, pad->rate, pad->width, pad->channels);
 
@@ -1853,7 +1913,6 @@
 gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts,
     gboolean timeout)
 {
-  GstFlvMux *mux = GST_FLV_MUX (aggregator);
   GstFlvMuxPad *best = NULL;
   GstClockTime best_ts = GST_CLOCK_TIME_NONE;
   GstIterator *pads;
@@ -1866,7 +1925,6 @@
     switch (gst_iterator_next (pads, &padptr)) {
       case GST_ITERATOR_OK:{
         GstAggregatorPad *apad = g_value_get_object (&padptr);
-        GstFlvMuxPad *fpad = GST_FLV_MUX_PAD (apad);
         GstClockTime t = GST_CLOCK_TIME_NONE;
         GstBuffer *buffer;
 
@@ -1880,46 +1938,9 @@
           break;
         }
 
-        if (fpad->drop_deltas) {
-          if (mux->skip_backwards_streams
-              && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) {
-            GST_INFO_OBJECT (apad,
-                "Dropped buffer %" GST_PTR_FORMAT " until keyframe", buffer);
-            gst_buffer_unref (buffer);
-            gst_aggregator_pad_drop_buffer (apad);
-            if (!timeout) {
-              gst_object_replace ((GstObject **) & best, NULL);
-              best_ts = GST_CLOCK_TIME_NONE;
-              done = TRUE;
-            }
-            break;
-          } else {
-            /* drop-deltas is set and the buffer isn't delta, drop flag */
-            fpad->drop_deltas = FALSE;
-          }
-        }
-
         if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS_OR_PTS (buffer))) {
           t = gst_flv_mux_segment_to_running_time (&apad->segment,
               GST_BUFFER_DTS_OR_PTS (buffer));
-
-          if (mux->skip_backwards_streams
-              && (t < (GST_MSECOND * mux->last_dts))) {
-            GST_WARNING_OBJECT (mux,
-                "Timestamp %" GST_TIME_FORMAT " going "
-                "backwards from last known %" GST_TIME_FORMAT ", dropping",
-                GST_TIME_ARGS (t), GST_TIME_ARGS (GST_MSECOND * 
mux->last_dts));
-            gst_buffer_unref (buffer);
-            gst_aggregator_pad_drop_buffer (apad);
-            /* Look for non-delta buffer */
-            fpad->drop_deltas = TRUE;
-            if (!timeout) {
-              gst_object_replace ((GstObject **) & best, NULL);
-              best_ts = GST_CLOCK_TIME_NONE;
-              done = TRUE;
-            }
-            break;
-          }
         }
 
         if (!GST_CLOCK_TIME_IS_VALID (best_ts) ||
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-good-1.18.0/gst/imagefreeze/gstimagefreeze.c 
new/gst-plugins-good-1.18.1/gst/imagefreeze/gstimagefreeze.c
--- old/gst-plugins-good-1.18.0/gst/imagefreeze/gstimagefreeze.c        
2020-09-08 01:05:16.275363200 +0200
+++ new/gst-plugins-good-1.18.1/gst/imagefreeze/gstimagefreeze.c        
2020-10-26 12:12:12.668012000 +0100
@@ -76,8 +76,8 @@
     GstEvent * event);
 static gboolean gst_image_freeze_sink_setcaps (GstImageFreeze * self,
     GstCaps * caps);
-static GstCaps *gst_image_freeze_sink_getcaps (GstImageFreeze * self,
-    GstCaps * filter);
+static GstCaps *gst_image_freeze_query_caps (GstImageFreeze * self,
+    GstPad * pad, GstCaps * filter);
 static gboolean gst_image_freeze_sink_query (GstPad * pad, GstObject * parent,
     GstQuery * query);
 static void gst_image_freeze_src_loop (GstPad * pad);
@@ -333,25 +333,26 @@
 }
 
 static GstCaps *
-gst_image_freeze_sink_getcaps (GstImageFreeze * self, GstCaps * filter)
+gst_image_freeze_query_caps (GstImageFreeze * self, GstPad * pad,
+    GstCaps * filter)
 {
   GstCaps *ret, *tmp, *templ;
-  GstPad *pad;
+  GstPad *otherpad;
 
-  pad = self->sinkpad;
+  otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad;
 
   if (filter) {
     filter = gst_caps_copy (filter);
     gst_image_freeze_remove_fps (self, filter);
   }
   templ = gst_pad_get_pad_template_caps (pad);
-  tmp = gst_pad_peer_query_caps (self->srcpad, filter);
+  tmp = gst_pad_peer_query_caps (otherpad, filter);
   if (tmp) {
-    GST_LOG_OBJECT (self, "peer caps %" GST_PTR_FORMAT, tmp);
+    GST_LOG_OBJECT (otherpad, "peer caps %" GST_PTR_FORMAT, tmp);
     ret = gst_caps_intersect (tmp, templ);
     gst_caps_unref (tmp);
   } else {
-    GST_LOG_OBJECT (self, "going to copy");
+    GST_LOG_OBJECT (otherpad, "going to copy");
     ret = gst_caps_copy (templ);
   }
   if (templ)
@@ -382,7 +383,7 @@
       GstCaps *caps;
 
       gst_query_parse_caps (query, &caps);
-      caps = gst_image_freeze_sink_getcaps (self, caps);
+      caps = gst_image_freeze_query_caps (self, pad, caps);
       gst_query_set_caps_result (query, caps);
       gst_caps_unref (caps);
       ret = TRUE;
@@ -580,8 +581,18 @@
       }
       ret = TRUE;
       break;
+    case GST_QUERY_CAPS:
+    {
+      GstCaps *caps;
+      gst_query_parse_caps (query, &caps);
+      caps = gst_image_freeze_query_caps (self, pad, caps);
+      gst_query_set_caps_result (query, caps);
+      gst_caps_unref (caps);
+      ret = TRUE;
+      break;
+    }
     default:
-      ret = FALSE;
+      ret = gst_pad_query_default (pad, parent, query);
       break;
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-good-1.18.0/gst/multifile/gstsplitmuxsink.c 
new/gst-plugins-good-1.18.1/gst/multifile/gstsplitmuxsink.c
--- old/gst-plugins-good-1.18.0/gst/multifile/gstsplitmuxsink.c 2020-09-08 
01:05:16.291363200 +0200
+++ new/gst-plugins-good-1.18.1/gst/multifile/gstsplitmuxsink.c 2020-10-26 
12:12:12.684012000 +0100
@@ -2453,64 +2453,66 @@
       return;
   }
 
-  if (splitmux->input_state == SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT) {
-    gboolean ready = TRUE;
+  do {
+    if (splitmux->input_state == SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT) {
+      gboolean ready = TRUE;
 
-    /* Iterate each pad, and check that the input running time is at least
-     * up to the reference running time, and if so handle the collected GOP */
-    GST_LOG_OBJECT (splitmux, "Checking GOP collected, Max in running time %"
-        GST_STIME_FORMAT " ctx %p",
-        GST_STIME_ARGS (splitmux->max_in_running_time), ctx);
-    for (cur = g_list_first (splitmux->contexts); cur != NULL;
-        cur = g_list_next (cur)) {
-      MqStreamCtx *tmpctx = (MqStreamCtx *) (cur->data);
+      /* Iterate each pad, and check that the input running time is at least
+       * up to the reference running time, and if so handle the collected GOP 
*/
+      GST_LOG_OBJECT (splitmux, "Checking GOP collected, Max in running time %"
+          GST_STIME_FORMAT " ctx %p",
+          GST_STIME_ARGS (splitmux->max_in_running_time), ctx);
+      for (cur = g_list_first (splitmux->contexts); cur != NULL;
+          cur = g_list_next (cur)) {
+        MqStreamCtx *tmpctx = (MqStreamCtx *) (cur->data);
 
-      GST_LOG_OBJECT (splitmux,
-          "Context %p sink pad %" GST_PTR_FORMAT " @ TS %" GST_STIME_FORMAT
-          " EOS %d", tmpctx, tmpctx->sinkpad,
-          GST_STIME_ARGS (tmpctx->in_running_time), tmpctx->in_eos);
-
-      if (splitmux->max_in_running_time != GST_CLOCK_STIME_NONE &&
-          tmpctx->in_running_time < splitmux->max_in_running_time &&
-          !tmpctx->in_eos) {
         GST_LOG_OBJECT (splitmux,
-            "Context %p sink pad %" GST_PTR_FORMAT " not ready. We'll sleep",
-            tmpctx, tmpctx->sinkpad);
-        ready = FALSE;
-        break;
+            "Context %p sink pad %" GST_PTR_FORMAT " @ TS %" GST_STIME_FORMAT
+            " EOS %d", tmpctx, tmpctx->sinkpad,
+            GST_STIME_ARGS (tmpctx->in_running_time), tmpctx->in_eos);
+
+        if (splitmux->max_in_running_time != GST_CLOCK_STIME_NONE &&
+            tmpctx->in_running_time < splitmux->max_in_running_time &&
+            !tmpctx->in_eos) {
+          GST_LOG_OBJECT (splitmux,
+              "Context %p sink pad %" GST_PTR_FORMAT " not ready. We'll sleep",
+              tmpctx, tmpctx->sinkpad);
+          ready = FALSE;
+          break;
+        }
       }
-    }
-    if (ready) {
-      GST_DEBUG_OBJECT (splitmux,
-          "Collected GOP is complete. Processing (ctx %p)", ctx);
-      /* All pads have a complete GOP, release it into the multiqueue */
-      handle_gathered_gop (splitmux);
-
-      /* The user has requested a split, we can split now that the previous GOP
-       * has been collected to the correct location */
-      if (g_atomic_int_compare_and_exchange (&(splitmux->split_requested), 
TRUE,
-              FALSE)) {
-        g_atomic_int_set (&(splitmux->do_split_next_gop), TRUE);
+      if (ready) {
+        GST_DEBUG_OBJECT (splitmux,
+            "Collected GOP is complete. Processing (ctx %p)", ctx);
+        /* All pads have a complete GOP, release it into the multiqueue */
+        handle_gathered_gop (splitmux);
+
+        /* The user has requested a split, we can split now that the previous 
GOP
+         * has been collected to the correct location */
+        if (g_atomic_int_compare_and_exchange (&(splitmux->split_requested),
+                TRUE, FALSE)) {
+          g_atomic_int_set (&(splitmux->do_split_next_gop), TRUE);
+        }
       }
     }
-  }
 
-  /* If upstream reached EOS we are not expecting more data, no need to wait
-   * here. */
-  if (ctx->in_eos)
-    return;
-
-  /* Some pad is not yet ready, or GOP is being pushed
-   * either way, sleep and wait to get woken */
-  while (splitmux->input_state == SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT &&
-      !ctx->flushing &&
-      (ctx->in_running_time >= splitmux->max_in_running_time) &&
-      (splitmux->max_in_running_time != GST_CLOCK_STIME_NONE)) {
-
-    GST_LOG_OBJECT (splitmux, "Sleeping for GOP collection (ctx %p)", ctx);
-    GST_SPLITMUX_WAIT_INPUT (splitmux);
-    GST_LOG_OBJECT (splitmux, "Done waiting for complete GOP (ctx %p)", ctx);
-  }
+    /* If upstream reached EOS we are not expecting more data, no need to wait
+     * here. */
+    if (ctx->in_eos)
+      return;
+
+    /* Some pad is not yet ready, or GOP is being pushed
+     * either way, sleep and wait to get woken */
+
+    if (splitmux->input_state == SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT &&
+        !ctx->flushing &&
+        (ctx->in_running_time >= splitmux->max_in_running_time) &&
+        (splitmux->max_in_running_time != GST_CLOCK_STIME_NONE)) {
+      GST_LOG_OBJECT (splitmux, "Sleeping for GOP collection (ctx %p)", ctx);
+      GST_SPLITMUX_WAIT_INPUT (splitmux);
+      GST_LOG_OBJECT (splitmux, "Done waiting for complete GOP (ctx %p)", ctx);
+    }
+  } while (splitmux->input_state == SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT);
 }
 
 static GstPadProbeReturn
@@ -3160,12 +3162,18 @@
   /* Remove the context from our consideration */
   splitmux->contexts = g_list_remove (splitmux->contexts, ctx);
 
-  if (ctx->sink_pad_block_id)
+  GST_SPLITMUX_UNLOCK (splitmux);
+
+  if (ctx->sink_pad_block_id) {
     gst_pad_remove_probe (ctx->sinkpad, ctx->sink_pad_block_id);
+    gst_pad_send_event (ctx->sinkpad, gst_event_new_flush_start ());
+  }
 
   if (ctx->src_pad_block_id)
     gst_pad_remove_probe (ctx->srcpad, ctx->src_pad_block_id);
 
+  GST_SPLITMUX_LOCK (splitmux);
+
   /* Can release the context now */
   mq_stream_ctx_free (ctx);
   if (ctx == splitmux->reference_ctx)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtph264depay.c 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtph264depay.c
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtph264depay.c       2020-09-08 
01:05:16.299363400 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtph264depay.c       2020-10-26 
12:12:12.692011800 +0100
@@ -1035,6 +1035,7 @@
     gst_adapter_clear (rtph264depay->adapter);
     rtph264depay->wait_start = TRUE;
     rtph264depay->current_fu_type = 0;
+    rtph264depay->last_fu_seqnum = 0;
   }
 
   {
@@ -1194,6 +1195,7 @@
 
           rtph264depay->current_fu_type = nal_unit_type;
           rtph264depay->fu_timestamp = timestamp;
+          rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
 
           rtph264depay->wait_start = FALSE;
 
@@ -1221,6 +1223,25 @@
           /* and assemble in the adapter */
           gst_adapter_push (rtph264depay->adapter, outbuf);
         } else {
+          if (rtph264depay->current_fu_type == 0) {
+            /* previous FU packet missing start bit? */
+            GST_WARNING_OBJECT (rtph264depay, "missing FU start bit on an "
+                "earlier packet. Dropping.");
+            gst_adapter_clear (rtph264depay->adapter);
+            return NULL;
+          }
+          if (gst_rtp_buffer_compare_seqnum (rtph264depay->last_fu_seqnum,
+                  gst_rtp_buffer_get_seq (rtp)) != 1) {
+            /* jump in sequence numbers within an FU is cause for discarding */
+            GST_WARNING_OBJECT (rtph264depay, "Jump in sequence numbers from "
+                "%u to %u within Fragmentation Unit. Data was lost, dropping "
+                "stored.", rtph264depay->last_fu_seqnum,
+                gst_rtp_buffer_get_seq (rtp));
+            gst_adapter_clear (rtph264depay->adapter);
+            return NULL;
+          }
+          rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
+
           /* strip off FU indicator and FU header bytes */
           payload += 2;
           payload_len -= 2;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtph264depay.h 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtph264depay.h
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtph264depay.h       2020-09-08 
01:05:16.299363400 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtph264depay.h       2020-10-26 
12:12:12.692011800 +0100
@@ -59,6 +59,7 @@
 
   /* Work around broken payloaders wrt. FU-A & FU-B */
   guint8 current_fu_type;
+  guint16 last_fu_seqnum;
   GstClockTime fu_timestamp;
   gboolean fu_marker;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtph265depay.c 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtph265depay.c
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtph265depay.c       2020-09-08 
01:05:16.299363400 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtph265depay.c       2020-10-26 
12:12:12.692011800 +0100
@@ -1259,6 +1259,7 @@
     gst_adapter_clear (rtph265depay->adapter);
     rtph265depay->wait_start = TRUE;
     rtph265depay->current_fu_type = 0;
+    rtph265depay->last_fu_seqnum = 0;
   }
 
   {
@@ -1456,6 +1457,7 @@
 
           rtph265depay->current_fu_type = nal_unit_type;
           rtph265depay->fu_timestamp = timestamp;
+          rtph265depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
 
           rtph265depay->wait_start = FALSE;
 
@@ -1493,6 +1495,24 @@
           /* and assemble in the adapter */
           gst_adapter_push (rtph265depay->adapter, outbuf);
         } else {
+          if (rtph265depay->current_fu_type == 0) {
+            /* previous FU packet missing start bit? */
+            GST_WARNING_OBJECT (rtph265depay, "missing FU start bit on an "
+                "earlier packet. Dropping.");
+            gst_adapter_clear (rtph265depay->adapter);
+            return NULL;
+          }
+          if (gst_rtp_buffer_compare_seqnum (rtph265depay->last_fu_seqnum,
+                  gst_rtp_buffer_get_seq (rtp)) != 1) {
+            /* jump in sequence numbers within an FU is cause for discarding */
+            GST_WARNING_OBJECT (rtph265depay, "Jump in sequence numbers from "
+                "%u to %u within Fragmentation Unit. Data was lost, dropping "
+                "stored.", rtph265depay->last_fu_seqnum,
+                gst_rtp_buffer_get_seq (rtp));
+            gst_adapter_clear (rtph265depay->adapter);
+            return NULL;
+          }
+          rtph265depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
 
           GST_DEBUG_OBJECT (rtph265depay,
               "Following part of Fragmentation Unit");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtph265depay.h 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtph265depay.h
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtph265depay.h       2020-09-08 
01:05:16.299363400 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtph265depay.h       2020-10-26 
12:12:12.692011800 +0100
@@ -73,6 +73,7 @@
 
   /* Work around broken payloaders wrt. Fragmentation Units */
   guint8 current_fu_type;
+  guint16 last_fu_seqnum;
   GstClockTime fu_timestamp;
   gboolean fu_marker;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtpmp4gdepay.c 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtpmp4gdepay.c
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtpmp4gdepay.c       2020-09-08 
01:05:16.299363400 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtpmp4gdepay.c       2020-10-26 
12:12:12.692011800 +0100
@@ -53,7 +53,7 @@
         /* "streamtype = (string) { \"4\", \"5\" }, "  Not set by Wowza    4 = 
video, 5 = audio */
         /* "profile-level-id = (string) [1,MAX], " */
         /* "config = (string) [1,MAX]" */
-        "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", 
\"AAC-lbr\", \"AAC-hbr\" } "
+        "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", 
\"AAC-lbr\", \"AAC-hbr\", \"aac-hbr\" } "
         /* Optional general parameters */
         /* "objecttype = (string) [1,MAX], " */
         /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtp/gstrtputils.c 
new/gst-plugins-good-1.18.1/gst/rtp/gstrtputils.c
--- old/gst-plugins-good-1.18.0/gst/rtp/gstrtputils.c   2020-09-08 
01:05:16.303363300 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtp/gstrtputils.c   2020-10-26 
12:12:12.696011800 +0100
@@ -39,7 +39,7 @@
   const GstMetaInfo *info = (*meta)->info;
   const gchar *const *tags = gst_meta_api_type_get_tags (info->api);
 
-  if (info->transform_func && (!tags || (copy_tag != 0
+  if (info->transform_func && (!tags || !tags[0] || (copy_tag != 0
               && g_strv_length ((gchar **) tags) == 1
               && gst_meta_api_type_has_tag (info->api, copy_tag)))) {
     GstMetaTransformCopy copy_data = { FALSE, 0, -1 };
@@ -94,7 +94,8 @@
   const GstMetaInfo *info = (*meta)->info;
   const gchar *const *tags = gst_meta_api_type_get_tags (info->api);
 
-  if (!tags || (keep_tag != 0 && g_strv_length ((gchar **) tags) == 1
+  if (!tags || !tags[0] || (keep_tag != 0
+          && g_strv_length ((gchar **) tags) == 1
           && gst_meta_api_type_has_tag (info->api, keep_tag))) {
     GST_DEBUG_OBJECT (element, "keeping metadata %s", g_type_name (info->api));
   } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtpmanager/gstrtpbin.c 
new/gst-plugins-good-1.18.1/gst/rtpmanager/gstrtpbin.c
--- old/gst-plugins-good-1.18.0/gst/rtpmanager/gstrtpbin.c      2020-09-08 
01:05:16.307363300 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtpmanager/gstrtpbin.c      2020-10-26 
12:12:12.700012000 +0100
@@ -859,6 +859,7 @@
 
   g_slist_foreach (sess->elements, (GFunc) remove_bin_element, bin);
   g_slist_free (sess->elements);
+  sess->elements = NULL;
 
   g_slist_foreach (sess->streams, (GFunc) free_stream, bin);
   g_slist_free (sess->streams);
@@ -1790,19 +1791,12 @@
     g_object_set (buffer, "max-ts-offset-adjustment",
         rtpbin->max_ts_offset_adjustment, NULL);
 
-  /* need to sink the jitterbufer or otherwise signal handlers from bindings 
will
-   * take ownership of it and we don't own it anymore */
-  gst_object_ref_sink (buffer);
   g_signal_emit (rtpbin, gst_rtp_bin_signals[SIGNAL_NEW_JITTERBUFFER], 0,
       buffer, session->id, ssrc);
 
   if (!rtpbin->ignore_pt)
     gst_bin_add (GST_BIN_CAST (rtpbin), demux);
 
-  /* unref the jitterbuffer again, the bin has a reference now and
-   * we don't need it anymore */
-  gst_object_unref (buffer);
-
   /* link stuff */
   if (demux)
     gst_element_link_pads_full (buffer, "src", demux, "sink",
@@ -1856,6 +1850,7 @@
 static void
 free_stream (GstRtpBinStream * stream, GstRtpBin * bin)
 {
+  GstRtpBinSession *sess = stream->session;
   GSList *clients, *next_client;
 
   GST_DEBUG_OBJECT (bin, "freeing stream %p", stream);
@@ -1882,7 +1877,10 @@
   if (stream->buffer_ntpstop_sig)
     g_signal_handler_disconnect (stream->buffer, stream->buffer_ntpstop_sig);
 
+  sess->elements = g_slist_remove (sess->elements, stream->buffer);
+  remove_bin_element (stream->buffer, bin);
   gst_object_unref (stream->buffer);
+
   if (stream->demux)
     gst_bin_remove (GST_BIN_CAST (bin), stream->demux);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst/rtsp/gstrtspsrc.c 
new/gst-plugins-good-1.18.1/gst/rtsp/gstrtspsrc.c
--- old/gst-plugins-good-1.18.0/gst/rtsp/gstrtspsrc.c   2020-09-08 
01:05:16.311363200 +0200
+++ new/gst-plugins-good-1.18.1/gst/rtsp/gstrtspsrc.c   2020-10-26 
12:12:12.704012000 +0100
@@ -1131,7 +1131,7 @@
   /**
    * GstRTSPSrc::push-backchannel-buffer:
    * @rtspsrc: a #GstRTSPSrc
-   * @buffer: RTP buffer to send back
+   * @sample: RTP sample to send back
    *
    *
    */
@@ -1139,7 +1139,7 @@
       g_signal_new ("push-backchannel-buffer", G_TYPE_FROM_CLASS (klass),
       G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRTSPSrcClass,
           push_backchannel_buffer), NULL, NULL, NULL,
-      GST_TYPE_FLOW_RETURN, 2, G_TYPE_UINT, GST_TYPE_BUFFER);
+      GST_TYPE_FLOW_RETURN, 2, G_TYPE_UINT, GST_TYPE_SAMPLE);
 
   /**
    * GstRTSPSrc::get-parameter:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/gst-plugins-good.doap 
new/gst-plugins-good-1.18.1/gst-plugins-good.doap
--- old/gst-plugins-good-1.18.0/gst-plugins-good.doap   2020-09-08 
01:05:16.255363500 +0200
+++ new/gst-plugins-good-1.18.1/gst-plugins-good.doap   2020-10-26 
12:12:12.644011700 +0100
@@ -34,6 +34,16 @@
 
  <release>
   <Version>
+   <revision>1.18.1</revision>
+   <branch>1.18</branch>
+   <name></name>
+   <created>2020-10-26</created>
+   <file-release 
rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.18.1.tar.xz";
 />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
    <revision>1.18.0</revision>
    <branch>master</branch>
    <name></name>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/meson.build 
new/gst-plugins-good-1.18.1/meson.build
--- old/gst-plugins-good-1.18.0/meson.build     2020-09-08 01:05:16.319363000 
+0200
+++ new/gst-plugins-good-1.18.1/meson.build     2020-10-26 12:12:12.712011800 
+0100
@@ -1,5 +1,5 @@
 project('gst-plugins-good', 'c',
-  version : '1.18.0',
+  version : '1.18.1',
   meson_version : '>= 0.48',
   default_options : [ 'warning_level=1',
                       'buildtype=debugoptimized' ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/po/gst-plugins-good-1.0.pot 
new/gst-plugins-good-1.18.1/po/gst-plugins-good-1.0.pot
--- old/gst-plugins-good-1.18.0/po/gst-plugins-good-1.0.pot     2020-09-08 
01:05:16.987361700 +0200
+++ new/gst-plugins-good-1.18.1/po/gst-plugins-good-1.0.pot     2020-10-26 
12:12:13.192012500 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-good-1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-09-08 00:05+0100\n"
+"POT-Creation-Date: 2020-10-26 11:12+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <[email protected]>\n"
@@ -23,12 +23,12 @@
 
 #: ext/jpeg/gstjpegdec.c:944 ext/jpeg/gstjpegdec.c:1114
 #: ext/jpeg/gstjpegdec.c:1123 ext/jpeg/gstjpegdec.c:1133
-#: ext/jpeg/gstjpegdec.c:1142 ext/jpeg/gstjpegdec.c:1417
-#: ext/jpeg/gstjpegdec.c:1445
+#: ext/jpeg/gstjpegdec.c:1142 ext/jpeg/gstjpegdec.c:1419
+#: ext/jpeg/gstjpegdec.c:1447
 msgid "Failed to decode JPEG image"
 msgstr ""
 
-#: ext/jpeg/gstjpegdec.c:1405
+#: ext/jpeg/gstjpegdec.c:1407
 msgid "Failed to read memory"
 msgstr ""
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-good-1.18.0/sys/v4l2/gstv4l2object.c 
new/gst-plugins-good-1.18.1/sys/v4l2/gstv4l2object.c
--- old/gst-plugins-good-1.18.0/sys/v4l2/gstv4l2object.c        2020-09-08 
01:05:16.335363100 +0200
+++ new/gst-plugins-good-1.18.1/sys/v4l2/gstv4l2object.c        2020-10-26 
12:12:12.728011800 +0100
@@ -554,7 +554,7 @@
   g_return_if_fail (v4l2object != NULL);
 
   g_free (v4l2object->videodev);
-
+  g_free (v4l2object->par);
   g_free (v4l2object->channel);
 
   if (v4l2object->formats) {
@@ -4980,7 +4980,7 @@
 gboolean
 gst_v4l2_object_propose_allocation (GstV4l2Object * obj, GstQuery * query)
 {
-  GstBufferPool *pool = NULL;
+  GstBufferPool *pool;
   /* we need at least 2 buffers to operate */
   guint size, min, max;
   GstCaps *caps;
@@ -4999,12 +4999,11 @@
   switch (obj->mode) {
     case GST_V4L2_IO_MMAP:
     case GST_V4L2_IO_DMABUF:
-      if (need_pool && obj->pool) {
-        if (!gst_buffer_pool_is_active (obj->pool))
-          pool = gst_object_ref (obj->pool);
-      }
+      if ((pool = obj->pool))
+        gst_object_ref (pool);
       break;
     default:
+      pool = NULL;
       break;
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-good-1.18.0/tests/check/elements/rtph264.c 
new/gst-plugins-good-1.18.1/tests/check/elements/rtph264.c
--- old/gst-plugins-good-1.18.0/tests/check/elements/rtph264.c  2020-09-08 
01:05:16.347363200 +0200
+++ new/gst-plugins-good-1.18.1/tests/check/elements/rtph264.c  2020-10-26 
12:12:12.736012000 +0100
@@ -470,6 +470,127 @@
 
 GST_END_TEST;
 
+/* This was generated using pipeline:
+ * gst-launch-1.0 videotestsrc num-buffers=1 pattern=green \
+ *     ! video/x-raw,width=24,height=16 \
+ *     ! openh264enc ! rtph264pay mtu=32 ! fakesink dump=1
+ */
+/* RTP h264_idr FU-A */
+static guint8 rtp_h264_idr_fu_start[] = {
+  0x80, 0x60, 0x5f, 0xd2, 0x20, 0x3b, 0x6e, 0xcf,
+  0x6c, 0x54, 0x21, 0x8d, 0x7c, 0x85, 0xb8, 0x00,
+  0x04, 0x00, 0x00, 0x09, 0xff, 0xff, 0xf8, 0x22,
+  0x8a, 0x00, 0x1f, 0x1c, 0x00, 0x04, 0x1c, 0xe3,
+};
+
+static guint8 rtp_h264_idr_fu_middle[] = {
+  0x80, 0x60, 0x5f, 0xd3, 0x20, 0x3b, 0x6e, 0xcf,
+  0x6c, 0x54, 0x21, 0x8d, 0x7c, 0x05, 0x80, 0x00,
+  0x84, 0xdf, 0xf8, 0x7f, 0xe0, 0x8e, 0x28, 0x00,
+  0x08, 0x37, 0xf8, 0x80, 0x00, 0x20, 0x52, 0x00,
+};
+
+static guint8 rtp_h264_idr_fu_end[] = {
+  0x80, 0xe0, 0x5f, 0xd4, 0x20, 0x3b, 0x6e, 0xcf,
+  0x6c, 0x54, 0x21, 0x8d, 0x7c, 0x45, 0x02, 0x01,
+  0x91, 0x00, 0x00, 0x40, 0xf4, 0x00, 0x04, 0x08,
+  0x30,
+};
+
+GST_START_TEST (test_rtph264depay_fu_a)
+{
+  GstHarness *h = gst_harness_new ("rtph264depay");
+  GstBuffer *buffer;
+  GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
+  GstFlowReturn ret;
+
+  gst_harness_set_caps_str (h,
+      "application/x-rtp,media=video,clock-rate=90000,encoding-name=H264",
+      "video/x-h264,alignment=au,stream-format=byte-stream");
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_start,
+      sizeof (rtp_h264_idr_fu_start));
+  fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp));
+  gst_rtp_buffer_unmap (&rtp);
+
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+  fail_unless_equals_int (gst_harness_buffers_in_queue (h), 0);
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_middle,
+      sizeof (rtp_h264_idr_fu_middle));
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_end, sizeof (rtp_h264_idr_fu_end));
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+
+  fail_unless_equals_int (gst_harness_buffers_in_queue (h), 1);
+
+  buffer = gst_harness_pull (h);
+  fail_unless (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MARKER));
+  gst_buffer_unref (buffer);
+
+  gst_harness_teardown (h);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtph264depay_fu_a_missing_start)
+{
+  GstHarness *h = gst_harness_new ("rtph264depay");
+  GstBuffer *buffer;
+  GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
+  GstFlowReturn ret;
+  guint16 seq;
+
+  gst_harness_set_caps_str (h,
+      "application/x-rtp,media=video,clock-rate=90000,encoding-name=H264",
+      "video/x-h264,alignment=au,stream-format=byte-stream");
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_start,
+      sizeof (rtp_h264_idr_fu_start));
+
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_middle,
+      sizeof (rtp_h264_idr_fu_middle));
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_end, sizeof (rtp_h264_idr_fu_end));
+  fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp));
+  seq = gst_rtp_buffer_get_seq (&rtp);
+  gst_rtp_buffer_unmap (&rtp);
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+  fail_unless_equals_int (gst_harness_buffers_in_queue (h), 1);
+
+  /* A broken sender case seen in the wild where the seqnums are continuous
+   * but only contain a FU with an end-bit, no start-bit */
+  buffer =
+      wrap_static_buffer (rtp_h264_idr_fu_end, sizeof (rtp_h264_idr_fu_end));
+  fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_WRITE, &rtp));
+  gst_rtp_buffer_set_seq (&rtp, ++seq);
+  gst_rtp_buffer_unmap (&rtp);
+  ret = gst_harness_push (h, buffer);
+  fail_unless_equals_int (ret, GST_FLOW_OK);
+
+  fail_unless_equals_int (gst_harness_buffers_in_queue (h), 1);
+
+  gst_harness_teardown (h);
+}
+
+GST_END_TEST;
+
 
 /* As GStreamer does not have STAP-A yet, this was extracted from
  * issue #557 provided sample */
@@ -1344,6 +1465,8 @@
   tcase_add_test (tc_chain, test_rtph264depay_eos);
   tcase_add_test (tc_chain, test_rtph264depay_marker_to_flag);
   tcase_add_test (tc_chain, test_rtph264depay_stap_a_marker);
+  tcase_add_test (tc_chain, test_rtph264depay_fu_a);
+  tcase_add_test (tc_chain, test_rtph264depay_fu_a_missing_start);
 
   tc_chain = tcase_create ("rtph264pay");
   suite_add_tcase (s, tc_chain);


Reply via email to