Title: [236399] trunk
Revision
236399
Author
ab...@igalia.com
Date
2018-09-24 06:31:19 -0700 (Mon, 24 Sep 2018)

Log Message

[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.

Source/WebCore:

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:

Tools:

Added patch from https://bugzilla.gnome.org/show_bug.cgi?id=797187

* gstreamer/jhbuild.modules:
* gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (236398 => 236399)


--- trunk/Source/WebCore/ChangeLog	2018-09-24 12:34:19 UTC (rev 236398)
+++ trunk/Source/WebCore/ChangeLog	2018-09-24 13:31:19 UTC (rev 236399)
@@ -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-09-24  Thibault Saunier  <tsaun...@igalia.com>
 
         [WPE][GTK][WebRTC] Fix leaks in the libwebrtc Decoder and Encoder

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp (236398 => 236399)


--- trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2018-09-24 12:34:19 UTC (rev 236398)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2018-09-24 13:31:19 UTC (rev 236399)
@@ -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*);
 
@@ -174,6 +175,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);
 
@@ -328,9 +330,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());
@@ -595,7 +610,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);
     }
 }
@@ -1041,6 +1055,10 @@
         break;
     }
 
+    m_appsinkCaps = WTFMove(caps);
+    if (m_playerPrivate)
+        m_playerPrivate->trackDetected(this, m_track, true);
+
     m_padAddRemoveCondition.notifyOne();
 }
 
@@ -1059,6 +1077,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");
@@ -1135,6 +1162,11 @@
     appendPipeline->disconnectDemuxerSrcPadFromAppsinkFromAnyThread(demuxerSrcPad);
 }
 
+static void appendPipelineDemuxerNoMorePads(GstElement*, AppendPipeline* appendPipeline)
+{
+    appendPipeline->appendPipelineDemuxerNoMorePadsFromAnyThread();
+}
+
 static GstFlowReturn appendPipelineAppsinkNewSample(GstElement* appsink, AppendPipeline* appendPipeline)
 {
     return appendPipeline->handleNewAppsinkSample(appsink);

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h (236398 => 236399)


--- trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h	2018-09-24 12:34:19 UTC (rev 236398)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h	2018-09-24 13:31:19 UTC (rev 236399)
@@ -80,6 +80,7 @@
     WebCore::MediaSourceStreamTypeGStreamer streamType() { return m_streamType; }
 
     void disconnectDemuxerSrcPadFromAppsinkFromAnyThread(GstPad*);
+    void appendPipelineDemuxerNoMorePadsFromAnyThread();
     void connectDemuxerSrcPadToAppsinkFromAnyThread(GstPad*);
     void connectDemuxerSrcPadToAppsink(GstPad*);
 
@@ -93,6 +94,7 @@
     void handleAppsrcNeedDataReceived();
     void removeAppsrcDataLeavingProbe();
     void setAppsrcDataLeavingProbe();
+    void demuxerNoMorePads();
 
     Ref<MediaSourceClientGStreamerMSE> m_mediaSourceClient;
     Ref<SourceBufferPrivateGStreamer> m_sourceBufferPrivate;

Modified: trunk/Tools/ChangeLog (236398 => 236399)


--- trunk/Tools/ChangeLog	2018-09-24 12:34:19 UTC (rev 236398)
+++ trunk/Tools/ChangeLog	2018-09-24 13:31:19 UTC (rev 236399)
@@ -1,4 +1,16 @@
 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.
+
+        Added patch from https://bugzilla.gnome.org/show_bug.cgi?id=797187
+
+        * gstreamer/jhbuild.modules:
+        * gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch: Added.
+
+2018-09-24  Alicia Boya García  <ab...@igalia.com>
         [MSE][GStreamer] Add patch to jhbuild: matroskademux: Allow Matroska headers to be read more than once
         https://bugs.webkit.org/show_bug.cgi?id=185731
 

Modified: trunk/Tools/gstreamer/jhbuild.modules (236398 => 236399)


--- trunk/Tools/gstreamer/jhbuild.modules	2018-09-24 12:34:19 UTC (rev 236398)
+++ trunk/Tools/gstreamer/jhbuild.modules	2018-09-24 13:31:19 UTC (rev 236399)
@@ -88,6 +88,7 @@
       <patch file="gst-plugins-good-0007-matroskademux-Allow-Matroska-headers-to-be-read-more.patch" strip="1" /> <!-- Merged as 9dc7859184d4b7ad1dd7e2b54704e994dbace329 (to be shipped in 1.14.4) -->
       <patch file="gst-plugins-good-0008-matroskademux-Refactor-track-parsing-out-from-adding.patch" strip="1" /> <!-- Merged as f279bc5336dda19741a5996a108da42dd3201366 (to be shipped in 1.14.4) -->
       <patch file="gst-plugins-good-0009-matroskademux-Parse-successive-Tracks-elements.patch" strip="1" /> <!-- Merged as 0e60076a390fd3ef53d350940b2c695ff7bbe008 (to be shipped in 1.14.4) -->
+      <patch file="gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch" strip="1" /> <!-- Merged as 7ceefec7141069b4adf4451a874766f8760c66d6 (to be shipped in 1.14.4) -->
     </branch>
   </autotools>
 

Added: trunk/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch (0 => 236399)


--- trunk/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch	                        (rev 0)
+++ trunk/Tools/gstreamer/patches/gst-plugins-good-0010-matroskademux-Emit-no-more-pads-after-parsing-Tracks.patch	2018-09-24 13:31:19 UTC (rev 236399)
@@ -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
+
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to