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);