Hello community,
here is the log from the commit of package gstreamer-plugins-libav for
openSUSE:Factory checked in at 2020-11-09 13:56:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-libav (Old)
and /work/SRC/openSUSE:Factory/.gstreamer-plugins-libav.new.11331 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-libav"
Mon Nov 9 13:56:49 2020 rev:21 rq:846454 version:1.18.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/gstreamer-plugins-libav/gstreamer-plugins-libav.changes
2020-10-27 18:58:16.502713996 +0100
+++
/work/SRC/openSUSE:Factory/.gstreamer-plugins-libav.new.11331/gstreamer-plugins-libav.changes
2020-11-09 13:58:17.935847967 +0100
@@ -1,0 +2,14 @@
+Wed Oct 28 10:30:41 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-libav changes:
+ - 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
+
+-------------------------------------------------------------------
Old:
----
gst-libav-1.18.0.tar.xz
New:
----
gst-libav-1.18.1.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gstreamer-plugins-libav.spec ++++++
--- /var/tmp/diff_new_pack.6XwYbO/_old 2020-11-09 13:58:18.695846310 +0100
+++ /var/tmp/diff_new_pack.6XwYbO/_new 2020-11-09 13:58:18.699846301 +0100
@@ -18,7 +18,7 @@
%define gst_branch 1.0
Name: gstreamer-plugins-libav
-Version: 1.18.0
+Version: 1.18.1
Release: 0
Summary: A ffmpeg/libav plugin for GStreamer
License: GPL-2.0-or-later
++++++ gst-libav-1.18.0.tar.xz -> gst-libav-1.18.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ChangeLog
new/gst-libav-1.18.1/ChangeLog
--- old/gst-libav-1.18.0/ChangeLog 2020-09-08 01:08:13.142985000 +0200
+++ new/gst-libav-1.18.1/ChangeLog 2020-10-26 12:15:11.964274000 +0100
@@ -1,7 +1,110 @@
+=== release 1.18.1 ===
+
+2020-10-26 11:15:11 +0000 Tim-Philipp Müller <[email protected]>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * gst-libav.doap:
+ * meson.build:
+ Release 1.18.1
+
+2020-10-06 03:47:42 +0900 Seungha Yang <[email protected]>
+
+ * ext/libav/gstavaudenc.c:
+ * ext/libav/gstavaudenc.h:
+ * ext/libav/gstavutils.h:
+ * ext/libav/gstavvidenc.c:
+ * ext/libav/gstavvidenc.h:
+ avaudenc/avvidenc: Reopen encoding session if it's required
+ Since the commit
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/22b25b3ea5c,
+ ffmpeg will not clear draning flag for encoder by
avcodec_flush_buffers() API
+ by default. Allowed case is only if encoder has
AV_CODEC_CAP_ENCODER_FLUSH
+ capability flag. If it's not supported, we should re-open encoding
+ session, otherwise ffmpeg encoder will keep returning AVERROR_EOF
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/102>
+
+2020-10-01 11:18:58 +0300 Sebastian Dröge <[email protected]>
+
+ * ext/libav/gstavvidenc.c:
+ avvidenc: Call avcodec_flush_buffers() after draining to allow
accepting new input again
+ This is already done in all other codec elements.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/101>
+
+2020-09-30 16:13:28 +0300 Sebastian Dröge <[email protected]>
+
+ * ext/libav/gstavauddec.c:
+ * ext/libav/gstavaudenc.c:
+ * ext/libav/gstavviddec.c:
+ * ext/libav/gstavvidenc.c:
+ avauddec/audenc/videnc: Don't return GST_FLOW_EOS when draining
+ Same behaviour as for avviddec now. FFmpeg will return AVERROR_EOF
when it's
+ completely drained but we should not return that here or otherwise
+ upstream will receive EOS and not forward us more data.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/101>
+
+2020-09-16 03:13:09 +0900 Seungha Yang <[email protected]>
+
+ * ext/libav/gstavviddec.c:
+ avviddec: Don't return GST_FLOW_EOS from drain()/finish()
+ AVERROR_EOF means that it's fully drained, but it doesn't
+ mean that that end of stream.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
+
+2020-09-15 02:12:23 +0900 Seungha Yang <[email protected]>
+
+ * ext/libav/gstavauddec.c:
+ avauddec: Ensure finish_subframe() and finish_frame() are paired
+ audiodecoder baseclass implementation is expecting that
+ finish_subframe() is followed by finish_frame() in order clear
+ its internal state related to subframe.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
+
+2020-09-14 14:30:35 +0300 Sebastian Dröge <[email protected]>
+
+ * ext/libav/gstavauddec.c:
+ avauddec: Forward flow returns from draining instead of assuming OK
+ It might be useful for upstream to know that draining/finishing didn't
+ succeed, and why.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
+
+2020-09-14 14:24:51 +0300 Sebastian Dröge <[email protected]>
+
+ * ext/libav/gstavviddec.c:
+ avviddec: Forward flow returns from draining instead of assuming OK
+ It might be useful for upstream to know that draining/finishing didn't
+ succeed, and why.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
+
+2020-09-09 08:55:28 +0200 Edward Hervey <[email protected]>
+
+ * ext/libav/gstavauddec.c:
+ avauddec: Avoid dropping non-OK flow return
+ When sucessfully finishing out frames (or finishing configuration),
we must make
+ sure we don't override any failing GstFlowReturn that might have been
detected
+ previously.
+ Failure to do this would result in not propagating not-linked,
flushing,
+ etc...
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
+
+2016-09-26 20:06:54 -0400 Olivier Crête <[email protected]>
+
+ * docs/gst_plugins_cache.json:
+ * ext/libav/gstavcodecmap.c:
+ avcodecmap: Enable 24 bit WMA Lossless decoding
+ This now works with not so recent ffmpeg.
+ Part-of:
<https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/95>
+
+2020-09-08 17:44:35 +0100 Tim-Philipp Müller <[email protected]>
+
+ * meson.build:
+ Back to development
+
=== release 1.18.0 ===
2020-09-08 00:08:12 +0100 Tim-Philipp Müller <[email protected]>
+ * .gitlab-ci.yml:
* ChangeLog:
* NEWS:
* RELEASE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/NEWS new/gst-libav-1.18.1/NEWS
--- old/gst-libav-1.18.0/NEWS 2020-09-08 01:08:13.142985000 +0200
+++ new/gst-libav-1.18.1/NEWS 2020-10-26 12:15:11.964274000 +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-libav-1.18.0/RELEASE new/gst-libav-1.18.1/RELEASE
--- old/gst-libav-1.18.0/RELEASE 2020-09-08 01:08:13.142985000 +0200
+++ new/gst-libav-1.18.1/RELEASE 2020-10-26 12:15:11.964274000 +0100
@@ -1,4 +1,4 @@
-This is GStreamer gst-libav 1.18.0.
+This is GStreamer gst-libav 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-libav-1.18.0/docs/gst_plugins_cache.json
new/gst-libav-1.18.1/docs/gst_plugins_cache.json
--- old/gst-libav-1.18.0/docs/gst_plugins_cache.json 2020-09-08
01:08:13.166985000 +0200
+++ new/gst-libav-1.18.1/docs/gst_plugins_cache.json 2020-10-26
12:15:11.992273800 +0100
@@ -22978,7 +22978,7 @@
"long-name": "libav Windows Media Audio Lossless decoder",
"pad-templates": {
"sink": {
- "caps": "audio/x-wma:\n wmaversion: 4\n
depth: 16\n",
+ "caps": "audio/x-wma:\n wmaversion: 4\n",
"direction": "sink",
"presence": "always"
},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavauddec.c
new/gst-libav-1.18.1/ext/libav/gstavauddec.c
--- old/gst-libav-1.18.0/ext/libav/gstavauddec.c 2020-09-08
01:08:13.166985000 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavauddec.c 2020-10-26
12:15:11.992273800 +0100
@@ -57,7 +57,7 @@
static gboolean gst_ffmpegauddec_negotiate (GstFFMpegAudDec * ffmpegdec,
AVCodecContext * context, AVFrame * frame, gboolean force);
-static void gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec);
+static GstFlowReturn gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec);
#define GST_FFDEC_PARAMS_QDATA g_quark_from_static_string("avdec-params")
@@ -594,9 +594,10 @@
}
}
-static void
+static GstFlowReturn
gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec)
{
+ GstFlowReturn ret = GST_FLOW_OK;
gboolean got_any_frames = FALSE;
gboolean got_frame;
@@ -604,21 +605,34 @@
goto send_packet_failed;
do {
- GstFlowReturn ret;
-
got_frame = gst_ffmpegauddec_frame (ffmpegdec, &ret);
if (got_frame)
got_any_frames = TRUE;
} while (got_frame);
avcodec_flush_buffers (ffmpegdec->context);
- if (got_any_frames)
- gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1);
+ /* FFMpeg will return AVERROR_EOF if it's internal was fully drained
+ * then we are translating it to GST_FLOW_EOS. However, because this behavior
+ * is fully internal stuff of this implementation and gstaudiodecoder
+ * baseclass doesn't convert this GST_FLOW_EOS to GST_FLOW_OK,
+ * convert this flow returned here */
+ if (ret == GST_FLOW_EOS)
+ ret = GST_FLOW_OK;
+
+ if (got_any_frames) {
+ GstFlowReturn new_ret =
+ gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL,
1);
+
+ if (ret == GST_FLOW_OK)
+ ret = new_ret;
+ }
- return;
+done:
+ return ret;
send_packet_failed:
GST_WARNING_OBJECT (ffmpegdec, "send packet failed, could not drain
decoder");
+ goto done;
}
static void
@@ -651,8 +665,7 @@
goto not_negotiated;
if (inbuf == NULL) {
- gst_ffmpegauddec_drain (ffmpegdec);
- return GST_FLOW_OK;
+ return gst_ffmpegauddec_drain (ffmpegdec);
}
inbuf = gst_buffer_ref (inbuf);
@@ -723,8 +736,18 @@
} while (got_frame);
if (is_header || got_any_frames) {
- ret =
+ /* Even if previous return wasn't GST_FLOW_OK, we need to call
+ * _finish_frame() since baseclass is expecting that _finish_frame()
+ * is followed by _finish_subframe()
+ */
+ GstFlowReturn new_ret =
gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL,
1);
+
+ /* Only override the flow return value if previously did have a
GST_FLOW_OK.
+ * Failure to do this would result in skipping downstream issues caught in
+ * earlier steps. */
+ if (ret == GST_FLOW_OK)
+ ret = new_ret;
}
unmap:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavaudenc.c
new/gst-libav-1.18.1/ext/libav/gstavaudenc.c
--- old/gst-libav-1.18.0/ext/libav/gstavaudenc.c 2020-09-08
01:08:13.166985000 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavaudenc.c 2020-10-26
12:15:11.992273800 +0100
@@ -190,6 +190,9 @@
GstFFMpegAudEncClass *oclass =
(GstFFMpegAudEncClass *) G_OBJECT_GET_CLASS (ffmpegaudenc);
+ ffmpegaudenc->opened = FALSE;
+ ffmpegaudenc->need_reopen = FALSE;
+
gst_ffmpeg_avcodec_close (ffmpegaudenc->context);
if (avcodec_get_context_defaults3 (ffmpegaudenc->context,
oclass->in_plugin) < 0) {
@@ -208,6 +211,7 @@
/* close old session */
gst_ffmpeg_avcodec_close (ffmpegaudenc->context);
ffmpegaudenc->opened = FALSE;
+ ffmpegaudenc->need_reopen = FALSE;
return TRUE;
}
@@ -233,6 +237,8 @@
GstFFMpegAudEncClass *oclass =
(GstFFMpegAudEncClass *) G_OBJECT_GET_CLASS (ffmpegaudenc);
+ ffmpegaudenc->need_reopen = FALSE;
+
/* close old session */
if (ffmpegaudenc->opened) {
gst_ffmpeg_avcodec_close (ffmpegaudenc->context);
@@ -368,6 +374,7 @@
/* success! */
ffmpegaudenc->opened = TRUE;
+ ffmpegaudenc->need_reopen = FALSE;
return TRUE;
}
@@ -530,9 +537,21 @@
av_frame_unref (frame);
} else {
+ GstFFMpegAudEncClass *oclass =
+ (GstFFMpegAudEncClass *) G_OBJECT_GET_CLASS (ffmpegaudenc);
+
GST_LOG_OBJECT (ffmpegaudenc, "draining");
/* flushing the encoder */
res = avcodec_send_frame (ctx, NULL);
+
+ /* If AV_CODEC_CAP_ENCODER_FLUSH wasn't set, we need to re-open
+ * encoder */
+ if (!(oclass->in_plugin->capabilities & AV_CODEC_CAP_ENCODER_FLUSH)) {
+ GST_DEBUG_OBJECT (ffmpegaudenc, "Encoder needs reopen later");
+
+ /* we will reopen later handle_frame() */
+ ffmpegaudenc->need_reopen = TRUE;
+ }
}
if (res == 0) {
@@ -604,8 +623,17 @@
} while (got_packet);
}
+ /* NOTE: this may or may not work depending on capability */
avcodec_flush_buffers (ffmpegaudenc->context);
+ /* FFMpeg will return AVERROR_EOF if it's internal was fully drained
+ * then we are translating it to GST_FLOW_EOS. However, because this behavior
+ * is fully internal stuff of this implementation and gstaudioencoder
+ * baseclass doesn't convert this GST_FLOW_EOS to GST_FLOW_OK,
+ * convert this flow returned here */
+ if (ret == GST_FLOW_EOS)
+ ret = GST_FLOW_OK;
+
return ret;
}
@@ -624,6 +652,18 @@
if (!inbuf)
return gst_ffmpegaudenc_drain (ffmpegaudenc);
+ /* endoder was drained or flushed, and ffmpeg encoder doesn't support
+ * flushing. We need to re-open encoder then */
+ if (ffmpegaudenc->need_reopen) {
+ GST_DEBUG_OBJECT (ffmpegaudenc, "Open encoder again");
+
+ if (!gst_ffmpegaudenc_set_format (encoder,
+ gst_audio_encoder_get_audio_info (encoder))) {
+ GST_ERROR_OBJECT (ffmpegaudenc, "Couldn't re-open encoder");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ }
+
inbuf = gst_buffer_ref (inbuf);
GST_DEBUG_OBJECT (ffmpegaudenc,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavaudenc.h
new/gst-libav-1.18.1/ext/libav/gstavaudenc.h
--- old/gst-libav-1.18.0/ext/libav/gstavaudenc.h 2020-09-08
01:08:13.166985000 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavaudenc.h 2020-10-26
12:15:11.992273800 +0100
@@ -39,6 +39,7 @@
AVCodecContext *context;
AVCodecContext *refcontext;
gboolean opened;
+ gboolean need_reopen;
AVFrame *frame;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavcodecmap.c
new/gst-libav-1.18.1/ext/libav/gstavcodecmap.c
--- old/gst-libav-1.18.0/ext/libav/gstavcodecmap.c 2020-09-08
01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavcodecmap.c 2020-10-26
12:15:11.992273800 +0100
@@ -1220,10 +1220,9 @@
}
case AV_CODEC_ID_WMALOSSLESS:
{
- /* libav only supports a depth of 16 at the moment */
caps =
gst_ff_aud_caps_new (context, NULL, codec_id, encode, "audio/x-wma",
- "wmaversion", G_TYPE_INT, 4, "depth", G_TYPE_INT, 16, NULL);
+ "wmaversion", G_TYPE_INT, 4, NULL);
break;
}
case AV_CODEC_ID_WMAVOICE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavutils.h
new/gst-libav-1.18.1/ext/libav/gstavutils.h
--- old/gst-libav-1.18.0/ext/libav/gstavutils.h 2020-09-08 01:08:13.170985200
+0200
+++ new/gst-libav-1.18.1/ext/libav/gstavutils.h 2020-10-26 12:15:11.992273800
+0100
@@ -29,6 +29,26 @@
#include <gst/gst.h>
+/* Introduced since ffmpeg version 4.3
+ *
+ * Note: Not all ffmpeg encoders seem to be reusable after flushing/draining.
+ * So if ffmpeg encoder doesn't support it, we should reopen encoding session.
+ *
+ * Before ffmpeg 4.3, avcodec_flush_buffers() was implemented in
+ * libavcodec/decodec.c but it was moved to libavcodec/utils.c and it would be
+ * accepted if encoder supports AV_CODEC_CAP_ENCODER_FLUSH flag.
+ * That implies that avcodec_flush_buffers() wasn't intended to be working
+ * properly for encoders.
+ */
+#ifndef AV_CODEC_CAP_ENCODER_FLUSH
+/*
+ * This encoder can be flushed using avcodec_flush_buffers(). If this flag is
+ * not set, the encoder must be closed and reopened to ensure that no frames
+ * remain pending.
+ */
+#define AV_CODEC_CAP_ENCODER_FLUSH (1 << 21)
+#endif
+
/*
*Get the size of an picture
*/
@@ -79,7 +99,7 @@
return out;
}
-void
+void
gst_ffmpeg_init_pix_fmt_info(void);
int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavviddec.c
new/gst-libav-1.18.1/ext/libav/gstavviddec.c
--- old/gst-libav-1.18.0/ext/libav/gstavviddec.c 2020-09-08
01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavviddec.c 2020-10-26
12:15:11.992273800 +0100
@@ -1810,7 +1810,7 @@
gst_ffmpegviddec_drain (GstVideoDecoder * decoder)
{
GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
- GstFlowReturn ret;
+ GstFlowReturn ret = GST_FLOW_OK;
gboolean got_frame = FALSE;
if (!ffmpegdec->opened)
@@ -1824,8 +1824,16 @@
} while (got_frame && ret == GST_FLOW_OK);
avcodec_flush_buffers (ffmpegdec->context);
+ /* FFMpeg will return AVERROR_EOF if it's internal was fully drained
+ * then we are translating it to GST_FLOW_EOS. However, because this behavior
+ * is fully internal stuff of this implementation and gstvideodecoder
+ * baseclass doesn't convert this GST_FLOW_EOS to GST_FLOW_OK,
+ * convert this flow returned here */
+ if (ret == GST_FLOW_EOS)
+ ret = GST_FLOW_OK;
+
done:
- return GST_FLOW_OK;
+ return ret;
send_packet_failed:
GST_WARNING_OBJECT (ffmpegdec, "send packet failed, could not drain
decoder");
@@ -2003,12 +2011,15 @@
static GstFlowReturn
gst_ffmpegviddec_finish (GstVideoDecoder * decoder)
{
- gst_ffmpegviddec_drain (decoder);
+ GstFlowReturn flow_ret;
+
+ flow_ret = gst_ffmpegviddec_drain (decoder);
+
/* note that finish can and should clean up more drastically,
* but drain is also invoked on e.g. packet loss in GAP handling */
gst_ffmpegviddec_flush (decoder);
- return GST_FLOW_OK;
+ return flow_ret;
}
static gboolean
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavvidenc.c
new/gst-libav-1.18.1/ext/libav/gstavvidenc.c
--- old/gst-libav-1.18.0/ext/libav/gstavvidenc.c 2020-09-08
01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavvidenc.c 2020-10-26
12:15:11.996274000 +0100
@@ -243,6 +243,8 @@
GstFFMpegVidEncClass *oclass =
(GstFFMpegVidEncClass *) G_OBJECT_GET_CLASS (ffmpegenc);
+ ffmpegenc->need_reopen = FALSE;
+
/* close old session */
if (ffmpegenc->opened) {
gst_ffmpeg_avcodec_close (ffmpegenc->context);
@@ -622,6 +624,20 @@
ffmpegenc->context->ticks_per_frame, ffmpegenc->context->time_base);
send_frame:
+ if (!picture) {
+ GstFFMpegVidEncClass *oclass =
+ (GstFFMpegVidEncClass *) (G_OBJECT_GET_CLASS (ffmpegenc));
+
+ /* If AV_CODEC_CAP_ENCODER_FLUSH wasn't set, we need to re-open
+ * encoder */
+ if (!(oclass->in_plugin->capabilities & AV_CODEC_CAP_ENCODER_FLUSH)) {
+ GST_DEBUG_OBJECT (ffmpegenc, "Encoder needs reopen later");
+
+ /* we will reopen later handle_frame() */
+ ffmpegenc->need_reopen = TRUE;
+ }
+ }
+
res = avcodec_send_frame (ffmpegenc->context, picture);
if (picture)
@@ -710,6 +726,30 @@
GstFlowReturn ret;
gboolean got_packet;
+ /* endoder was drained or flushed, and ffmpeg encoder doesn't support
+ * flushing. We need to re-open encoder then */
+ if (ffmpegenc->need_reopen) {
+ gboolean reopen_ret;
+ GstVideoCodecState *input_state;
+
+ GST_DEBUG_OBJECT (ffmpegenc, "Open encoder again");
+
+ if (!ffmpegenc->input_state) {
+ GST_ERROR_OBJECT (ffmpegenc,
+ "Cannot re-open encoder without input state");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+
+ input_state = gst_video_codec_state_ref (ffmpegenc->input_state);
+ reopen_ret = gst_ffmpegvidenc_set_format (encoder, input_state);
+ gst_video_codec_state_unref (input_state);
+
+ if (!reopen_ret) {
+ GST_ERROR_OBJECT (ffmpegenc, "Couldn't re-open encoder");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ }
+
ret = gst_ffmpegvidenc_send_frame (ffmpegenc, frame);
if (ret != GST_FLOW_OK)
@@ -763,8 +803,17 @@
if (ret != GST_FLOW_OK)
break;
} while (got_packet);
+ avcodec_flush_buffers (ffmpegenc->context);
done:
+ /* FFMpeg will return AVERROR_EOF if it's internal was fully drained
+ * then we are translating it to GST_FLOW_EOS. However, because this behavior
+ * is fully internal stuff of this implementation and gstvideoencoder
+ * baseclass doesn't convert this GST_FLOW_EOS to GST_FLOW_OK,
+ * convert this flow returned here */
+ if (ret == GST_FLOW_EOS)
+ ret = GST_FLOW_OK;
+
return ret;
}
@@ -843,6 +892,9 @@
GstFFMpegVidEncClass *oclass =
(GstFFMpegVidEncClass *) G_OBJECT_GET_CLASS (ffmpegenc);
+ ffmpegenc->opened = FALSE;
+ ffmpegenc->need_reopen = FALSE;
+
/* close old session */
gst_ffmpeg_avcodec_close (ffmpegenc->context);
if (avcodec_get_context_defaults3 (ffmpegenc->context, oclass->in_plugin) <
0) {
@@ -863,6 +915,7 @@
gst_ffmpegvidenc_flush_buffers (ffmpegenc, FALSE);
gst_ffmpeg_avcodec_close (ffmpegenc->context);
ffmpegenc->opened = FALSE;
+ ffmpegenc->need_reopen = FALSE;
if (ffmpegenc->input_state) {
gst_video_codec_state_unref (ffmpegenc->input_state);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/ext/libav/gstavvidenc.h
new/gst-libav-1.18.1/ext/libav/gstavvidenc.h
--- old/gst-libav-1.18.0/ext/libav/gstavvidenc.h 2020-09-08
01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/ext/libav/gstavvidenc.h 2020-10-26
12:15:11.996274000 +0100
@@ -41,6 +41,7 @@
AVCodecContext *context;
AVFrame *picture;
gboolean opened;
+ gboolean need_reopen;
gboolean discont;
guint pass;
gfloat quantizer;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.18.0/gst-libav.doap
new/gst-libav-1.18.1/gst-libav.doap
--- old/gst-libav-1.18.0/gst-libav.doap 2020-09-08 01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/gst-libav.doap 2020-10-26 12:15:11.996274000 +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-libav/gst-libav-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-libav-1.18.0/meson.build
new/gst-libav-1.18.1/meson.build
--- old/gst-libav-1.18.0/meson.build 2020-09-08 01:08:13.170985200 +0200
+++ new/gst-libav-1.18.1/meson.build 2020-10-26 12:15:11.996274000 +0100
@@ -1,5 +1,5 @@
project('gst-libav', 'c', 'cpp',
- version : '1.18.0',
+ version : '1.18.1',
meson_version : '>= 0.48.0',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])