Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog (236725 => 236726)
--- releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog 2018-10-02 10:45:28 UTC (rev 236725)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog 2018-10-02 11:08:48 UTC (rev 236726)
@@ -1,3 +1,31 @@
+2018-09-24 Alicia Boya García <ab...@igalia.com>
+
+ [MSE][GStreamer] Use no-more-pads event for noticing initialization segments
+ https://bugs.webkit.org/show_bug.cgi?id=189868
+
+ Reviewed by Xabier Rodriguez-Calvar.
+
+ Fixes the following YTTV 2018 tests:
+ 62.VideoDimensionVP9
+ 63.PlaybackStateVP9
+
+ This removes the hack that was making supporting multiple tracks in
+ the same file in MSE impossible.
+
+ For WebM, this GStreamer patch is required:
+ https://bugzilla.gnome.org/show_bug.cgi?id=797187
+ "matroskademux: Emit no-more-pads after parsing Tracks"
+
+ * platform/graphics/gstreamer/mse/AppendPipeline.cpp:
+ (WebCore::AppendPipeline::AppendPipeline):
+ (WebCore::AppendPipeline::handleApplicationMessage):
+ (WebCore::AppendPipeline::demuxerNoMorePads):
+ (WebCore::AppendPipeline::appsinkCapsChanged):
+ (WebCore::AppendPipeline::connectDemuxerSrcPadToAppsink):
+ (WebCore::AppendPipeline::appendPipelineDemuxerNoMorePadsFromAnyThread):
+ (WebCore::appendPipelineDemuxerNoMorePads):
+ * platform/graphics/gstreamer/mse/AppendPipeline.h:
+
2018-10-01 Alicia Boya García <ab...@igalia.com>
[MSE][GStreamer] Reset running time in PlaybackPipeline::flush()
Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp (236725 => 236726)
--- releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp 2018-10-02 10:45:28 UTC (rev 236725)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp 2018-10-02 11:08:48 UTC (rev 236726)
@@ -84,6 +84,7 @@
static GstPadProbeReturn appendPipelineDemuxerBlackHolePadProbe(GstPad*, GstPadProbeInfo*, gpointer);
static GstFlowReturn appendPipelineAppsinkNewSample(GstElement*, AppendPipeline*);
static void appendPipelineAppsinkEOS(GstElement*, AppendPipeline*);
+static void appendPipelineDemuxerNoMorePads(GstElement*, AppendPipeline*);
static GstPadProbeReturn matroskademuxForceSegmentStartToEqualZero(GstPad*, GstPadProbeInfo*, void*);
@@ -175,6 +176,7 @@
g_signal_connect(m_appsrc.get(), "need-data", G_CALLBACK(appendPipelineAppsrcNeedData), this);
g_signal_connect(m_demux.get(), "pad-added", G_CALLBACK(appendPipelineDemuxerPadAdded), this);
g_signal_connect(m_demux.get(), "pad-removed", G_CALLBACK(appendPipelineDemuxerPadRemoved), this);
+ g_signal_connect(m_demux.get(), "no-more-pads", G_CALLBACK(appendPipelineDemuxerNoMorePads), this);
g_signal_connect(m_appsink.get(), "new-sample", G_CALLBACK(appendPipelineAppsinkNewSample), this);
g_signal_connect(m_appsink.get(), "eos", G_CALLBACK(appendPipelineAppsinkEOS), this);
@@ -317,9 +319,22 @@
return;
}
+ if (gst_structure_has_name(structure, "demuxer-no-more-pads")) {
+ demuxerNoMorePads();
+ return;
+ }
+
ASSERT_NOT_REACHED();
}
+void AppendPipeline::demuxerNoMorePads()
+{
+ GST_TRACE("calling didReceiveInitializationSegment");
+ didReceiveInitializationSegment();
+ GST_TRACE("set pipeline to playing");
+ gst_element_set_state(m_pipeline.get(), GST_STATE_PLAYING);
+}
+
void AppendPipeline::handleStateChangeMessage(GstMessage* message)
{
ASSERT(WTF::isMainThread());
@@ -584,7 +599,6 @@
m_appsinkCaps = WTFMove(caps);
if (m_playerPrivate)
m_playerPrivate->trackDetected(this, m_track, previousCapsWereNull);
- didReceiveInitializationSegment();
gst_element_set_state(m_pipeline.get(), GST_STATE_PLAYING);
}
}
@@ -1025,6 +1039,10 @@
break;
}
+ m_appsinkCaps = WTFMove(caps);
+ if (m_playerPrivate)
+ m_playerPrivate->trackDetected(this, m_track, true);
+
m_padAddRemoveCondition.notifyOne();
}
@@ -1043,6 +1061,15 @@
GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_pipeline.get()), GST_DEBUG_GRAPH_SHOW_ALL, "pad-removed-after");
}
+void AppendPipeline::appendPipelineDemuxerNoMorePadsFromAnyThread()
+{
+ GST_TRACE("appendPipelineDemuxerNoMorePadsFromAnyThread");
+ GstStructure* structure = gst_structure_new_empty("demuxer-no-more-pads");
+ GstMessage* message = gst_message_new_application(GST_OBJECT(m_appsrc.get()), structure);
+ gst_bus_post(m_bus.get(), message);
+ GST_TRACE("appendPipelineDemuxerNoMorePadsFromAnyThread - posted to bus");
+}
+
static void appendPipelineAppsinkCapsChanged(GObject* appsinkPad, GParamSpec*, AppendPipeline* appendPipeline)
{
GstStructure* structure = gst_structure_new_empty("appsink-caps-changed");
@@ -1119,6 +1146,11 @@
appendPipeline->disconnectDemuxerSrcPadFromAppsinkFromAnyThread(demuxerSrcPad);
}
+static void appendPipelineDemuxerNoMorePads(GstElement*, AppendPipeline* appendPipeline)
+{
+ appendPipeline->appendPipelineDemuxerNoMorePadsFromAnyThread();
+}
+
static GstFlowReturn appendPipelineAppsinkNewSample(GstElement* appsink, AppendPipeline* appendPipeline)
{
return appendPipeline->handleNewAppsinkSample(appsink);
Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h (236725 => 236726)
--- releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h 2018-10-02 10:45:28 UTC (rev 236725)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h 2018-10-02 11:08:48 UTC (rev 236726)
@@ -81,6 +81,7 @@
WebCore::MediaSourceStreamTypeGStreamer streamType() { return m_streamType; }
void disconnectDemuxerSrcPadFromAppsinkFromAnyThread(GstPad*);
+ void appendPipelineDemuxerNoMorePadsFromAnyThread();
void connectDemuxerSrcPadToAppsinkFromAnyThread(GstPad*);
void connectDemuxerSrcPadToAppsink(GstPad*);
@@ -94,6 +95,7 @@
void handleAppsrcNeedDataReceived();
void removeAppsrcDataLeavingProbe();
void setAppsrcDataLeavingProbe();
+ void demuxerNoMorePads();
void consumeAppsinkAvailableSamples();
Added: releases/WebKitGTK/webkit-2.22/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch (0 => 236726)
--- releases/WebKitGTK/webkit-2.22/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch (rev 0)
+++ releases/WebKitGTK/webkit-2.22/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch 2018-10-02 11:08:48 UTC (rev 236726)
@@ -0,0 +1,48 @@
+From 7ceefec7141069b4adf4451a874766f8760c66d6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= <ab...@igalia.com>
+Date: Fri, 21 Sep 2018 22:24:02 +0200
+Subject: [PATCH] matroskademux: Emit no-more-pads after parsing Tracks
+
+Currently matroskademux does not emit no-more-pads until the first
+Cluster is parsed, even though the Tracks have already been parsed and
+from that point on there can be no more tracks.
+
+This is important in MSE because the browser needs to know when the MSE
+initialization segment has been completely parsed so that it can expose
+the tracks to the user. Some applications depend on this been done
+before they feed frames to the demuxer.
+
+As a consequence, historically WebKit has relied on hacks such as
+listening to the `pad-added` event, which made impossible to support
+multiple tracks in the same file. Let's fix that.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=797187
+---
+ gst/matroska/matroska-demux.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c
+index 77176fb62..683380bbf 100644
+--- a/gst/matroska/matroska-demux.c
++++ b/gst/matroska/matroska-demux.c
+@@ -3128,6 +3128,8 @@ gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux, GstEbmlRead * ebml)
+ DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret);
+
+ demux->tracks_parsed = TRUE;
++ GST_DEBUG_OBJECT (demux, "signaling no more pads");
++ gst_element_no_more_pads (GST_ELEMENT (demux));
+
+ return ret;
+ }
+@@ -5196,8 +5198,6 @@ gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id,
+ demux->common.offset = demux->first_cluster_offset;
+ }
+
+- GST_DEBUG_OBJECT (demux, "signaling no more pads");
+- gst_element_no_more_pads (GST_ELEMENT (demux));
+ /* send initial segment - we wait till we know the first
+ incoming timestamp, so we can properly set the start of
+ the segment. */
+--
+2.17.1
+