WebKit Bugzilla
Attachment 347257 Details for
Bug 188646
: [GStreamer][MSE] Remove parsers from playback pipeline
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188646-20180816152305.patch (text/plain), 8.89 KB, created by
Philippe Normand
on 2018-08-16 06:23:06 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Philippe Normand
Created:
2018-08-16 06:23:06 PDT
Size:
8.89 KB
patch
obsolete
>Subversion Revision: 234920 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index bed7d527e4e8841320390c0691d6a0422030411f..596042067168cbc888dc75e83007f4be24e016ac 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,21 @@ >+2018-08-16 Philippe Normand <philn@igalia.com> >+ >+ [GStreamer][MSE] Remove parsers from playback pipeline >+ https://bugs.webkit.org/show_bug.cgi?id=188646 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Decodebin already includes parsers in front of the decoders. >+ >+ No new tests, existing MSE tests cover this change. >+ >+ * platform/graphics/gstreamer/mse/PlaybackPipeline.cpp: >+ (WebCore::PlaybackPipeline::addSourceBuffer): >+ (WebCore::PlaybackPipeline::attachTrack): >+ * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: >+ (webKitMediaSrcLinkSourcePad): >+ * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamerPrivate.h: >+ > 2018-08-16 Antti Koivisto <antti@apple.com> > > Use OptionSet for ActivityState::Flags >diff --git a/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp b/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp >index d15e8addc45c08d35776ae6a4fb790a8f94d060b..7a941af45b10ef3b72f8546a2f6f175d2f6ee734 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp >+++ b/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp >@@ -120,7 +120,6 @@ MediaSourcePrivate::AddStatus PlaybackPipeline::addSourceBuffer(RefPtr<SourceBuf > > // No track has been attached yet. > stream->type = Invalid; >- stream->parser = nullptr; > stream->caps = nullptr; > stream->audioTrack = nullptr; > stream->videoTrack = nullptr; >@@ -178,96 +177,16 @@ void PlaybackPipeline::attachTrack(RefPtr<SourceBufferPrivateGStreamer> sourceBu > const char* mediaType = capsMediaType(caps); > GST_DEBUG_OBJECT(webKitMediaSrc, "Configured track %s: appsrc=%s, padId=%u, mediaType=%s", trackPrivate->id().string().utf8().data(), GST_ELEMENT_NAME(stream->appsrc), padId, mediaType); > >- GUniquePtr<gchar> parserBinName(g_strdup_printf("streamparser%u", padId)); >- >- if (areEncryptedCaps(caps)) { >- GST_DEBUG("It's encrypted content, parsers are not needed before decrypting the content"); >- stream->parser = nullptr; >- } else if (!g_strcmp0(mediaType, "video/x-h264")) { >- GRefPtr<GstCaps> filterCaps = adoptGRef(gst_caps_new_simple("video/x-h264", "alignment", G_TYPE_STRING, "au", nullptr)); >- GstElement* capsfilter = gst_element_factory_make("capsfilter", nullptr); >- g_object_set(capsfilter, "caps", filterCaps.get(), nullptr); >- >- stream->parser = gst_bin_new(parserBinName.get()); >- >- GstElement* parser = gst_element_factory_make("h264parse", nullptr); >- gst_bin_add_many(GST_BIN(stream->parser), parser, capsfilter, nullptr); >- gst_element_link_pads(parser, "src", capsfilter, "sink"); >- >- GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(parser, "sink")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("sink", pad.get())); >- >- pad = adoptGRef(gst_element_get_static_pad(capsfilter, "src")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("src", pad.get())); >- } else if (!g_strcmp0(mediaType, "video/x-h265")) { >- GRefPtr<GstCaps> filterCaps = adoptGRef(gst_caps_new_simple("video/x-h265", "alignment", G_TYPE_STRING, "au", nullptr)); >- GstElement* capsfilter = gst_element_factory_make("capsfilter", nullptr); >- g_object_set(capsfilter, "caps", filterCaps.get(), nullptr); >- >- stream->parser = gst_bin_new(parserBinName.get()); >- >- GstElement* parser = gst_element_factory_make("h265parse", nullptr); >- gst_bin_add_many(GST_BIN(stream->parser), parser, capsfilter, nullptr); >- gst_element_link_pads(parser, "src", capsfilter, "sink"); >- >- GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(parser, "sink")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("sink", pad.get())); >- >- pad = adoptGRef(gst_element_get_static_pad(capsfilter, "src")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("src", pad.get())); >- } else if (!g_strcmp0(mediaType, "audio/mpeg")) { >- gint mpegversion = -1; >- GstStructure* structure = gst_caps_get_structure(caps, 0); >- gst_structure_get_int(structure, "mpegversion", &mpegversion); >- >- GstElement* parser = nullptr; >- if (mpegversion == 1) >- parser = gst_element_factory_make("mpegaudioparse", nullptr); >- else if (mpegversion == 2 || mpegversion == 4) >- parser = gst_element_factory_make("aacparse", nullptr); >- else >- ASSERT_NOT_REACHED(); >- >- stream->parser = gst_bin_new(parserBinName.get()); >- gst_bin_add(GST_BIN(stream->parser), parser); >- >- GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(parser, "sink")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("sink", pad.get())); >- >- pad = adoptGRef(gst_element_get_static_pad(parser, "src")); >- gst_element_add_pad(stream->parser, gst_ghost_pad_new("src", pad.get())); >- } else if (!g_strcmp0(mediaType, "video/x-vp8") >- || !g_strcmp0(mediaType, "video/x-vp9") >- || !g_strcmp0(mediaType, "audio/x-opus") >- || !g_strcmp0(mediaType, "audio/x-vorbis")) >- stream->parser = nullptr; >- else { >- GST_ERROR_OBJECT(stream->parent, "Unsupported media format: %s", mediaType); >- return; >- } >- > GST_OBJECT_LOCK(webKitMediaSrc); > stream->type = Unknown; > GST_OBJECT_UNLOCK(webKitMediaSrc); > >- GRefPtr<GstPad> sourcePad; >- if (stream->parser) { >- gst_bin_add(GST_BIN(stream->parent), stream->parser); >- gst_element_sync_state_with_parent(stream->parser); >- >- GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(stream->parser, "sink")); >- sourcePad = adoptGRef(gst_element_get_static_pad(stream->appsrc, "src")); >- gst_pad_link(sourcePad.get(), sinkPad.get()); >- sourcePad = adoptGRef(gst_element_get_static_pad(stream->parser, "src")); >- } else { >- GST_DEBUG_OBJECT(m_webKitMediaSrc.get(), "Stream of type %s doesn't require a parser bin", mediaType); >- sourcePad = adoptGRef(gst_element_get_static_pad(stream->appsrc, "src")); >- } >+ GRefPtr<GstPad> sourcePad = adoptGRef(gst_element_get_static_pad(stream->appsrc, "src")); > ASSERT(sourcePad); > > // FIXME: Is padId the best way to identify the Stream? What about trackId? > g_object_set_data(G_OBJECT(sourcePad.get()), "padId", GINT_TO_POINTER(padId)); >- webKitMediaSrcLinkParser(sourcePad.get(), caps, stream); >+ webKitMediaSrcLinkSourcePad(sourcePad.get(), caps, stream); > > ASSERT(stream->parent->priv->mediaPlayerPrivate); > int signal = -1; >diff --git a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp >index b7ad89f363127ead7546b035cae8ccbe6665fdb1..e3d1d09fb49a2c60321bbe7218908f981de8dbc6 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp >+++ b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp >@@ -490,7 +490,7 @@ void webKitMediaSrcLinkStreamToSrcPad(GstPad* sourcePad, Stream* stream) > gst_element_add_pad(GST_ELEMENT(stream->parent), ghostpad); > } > >-void webKitMediaSrcLinkParser(GstPad* sourcePad, GstCaps* caps, Stream* stream) >+void webKitMediaSrcLinkSourcePad(GstPad* sourcePad, GstCaps* caps, Stream* stream) > { > ASSERT(caps && stream->parent); > if (!caps || !stream->parent) { >diff --git a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamerPrivate.h b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamerPrivate.h >index 9d7eab9f42de7db50da86b8aceb5fe51cf97ecdf..c7f3d979b327dc111f28b0788af813f2e27292ae 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamerPrivate.h >+++ b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamerPrivate.h >@@ -58,8 +58,6 @@ struct _Stream { > > // Fields filled when the track is attached. > WebCore::MediaSourceStreamTypeGStreamer type; >- // Might be 0, e.g. for VP8/VP9. >- GstElement* parser; > GRefPtr<GstCaps> caps; > > // Only audio, video or nothing at a given time. >@@ -141,7 +139,7 @@ gint64 webKitMediaSrcGetSize(WebKitMediaSrc*); > gboolean webKitMediaSrcQueryWithParent(GstPad*, GstObject*, GstQuery*); > void webKitMediaSrcUpdatePresentationSize(GstCaps*, Stream*); > void webKitMediaSrcLinkStreamToSrcPad(GstPad*, Stream*); >-void webKitMediaSrcLinkParser(GstPad*, GstCaps*, Stream*); >+void webKitMediaSrcLinkSourcePad(GstPad*, GstCaps*, Stream*); > void webKitMediaSrcFreeStream(WebKitMediaSrc*, Stream*); > void webKitMediaSrcCheckAllTracksConfigured(WebKitMediaSrc*); > GstURIType webKitMediaSrcUriGetType(GType);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
calvaris
:
review+
ews-watchlist
:
commit-queue-
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188646
: 347257 |
347333