WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-162911-20161016190547.patch (text/plain), 32.43 KB, created by
Enrique Ocaña
on 2016-10-16 12:09:19 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Enrique Ocaña
Created:
2016-10-16 12:09:19 PDT
Size:
32.43 KB
patch
obsolete
>Subversion Revision: 207345 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 4c461ba9a98cf5860adb6acdf81a2993fda1991b..56ee576bdc2fcf821eedf1a4e35b93623257b468 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,5 +1,68 @@ > 2016-10-04 Enrique Ocaña González <eocanha@igalia.com> > >+ [GStreamer][MSE][EME] Remove MSE code from regular player and add EME support >+ https://bugs.webkit.org/show_bug.cgi?id=162911 >+ >+ Now that the MSE responsibility has been refactored to the dedicated >+ MediaPlayerPrivateGStreamerMSE subclass, the regular player no longer needs the MSE code, >+ just to expose some more methods to the subclass. Float timestamps have been migrated to >+ double. Also, small changes to accomodate the EME support are needed. >+ >+ This patch is co-authored with Philippe Normand <philn@igalia.com> (EME support) and >+ Žan Doberšek <zandobersek@gmail.com> (double timestamps). >+ >+ Reviewed by Xabier Rodriguez-Calvar. >+ >+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: >+ (WebCore::busMessageCallback): >+ (WebCore::MediaPlayerPrivateGStreamer::registerMediaEngine): >+ (WebCore::initializeGStreamerAndRegisterWebKitElements): >+ (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): >+ (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): >+ (WebCore::MediaPlayerPrivateGStreamer::load): >+ (WebCore::MediaPlayerPrivateGStreamer::playbackPosition): >+ (WebCore::MediaPlayerPrivateGStreamer::durationMediaTime): >+ (WebCore::MediaPlayerPrivateGStreamer::currentMediaTime): >+ (WebCore::MediaPlayerPrivateGStreamer::seek): >+ (WebCore::MediaPlayerPrivateGStreamer::doSeek): >+ (WebCore::MediaPlayerPrivateGStreamer::paused): >+ (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideo): >+ (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudio): >+ (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfText): >+ (WebCore::MediaPlayerPrivateGStreamer::buffered): >+ (WebCore::MediaPlayerPrivateGStreamer::handleMessage): >+ (WebCore::MediaPlayerPrivateGStreamer::processMpegTsSection): >+ (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): >+ (WebCore::MediaPlayerPrivateGStreamer::maxTimeSeekable): >+ (WebCore::MediaPlayerPrivateGStreamer::maxTimeLoaded): >+ (WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress): >+ (WebCore::MediaPlayerPrivateGStreamer::sourceChanged): >+ (WebCore::MediaPlayerPrivateGStreamer::didEnd): >+ (WebCore::MediaPlayerPrivateGStreamer::durationChanged): >+ (WebCore::MediaPlayerPrivateGStreamer::supportsType): >+ (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): >+ (WebCore::MediaPlayerPrivateGStreamer::handleSyncMessage): >+ (WebCore::MediaPlayerPrivateGStreamer::setAudioStreamProperties): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::commitLoad): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::pause): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::videoChangedCallback): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChangedCallback): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::setRate): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::processTableOfContentsEntry): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::totalBytes): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::loadNextLocation): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::loadStateChanged): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::timeChanged): Deleted. >+ (WebCore::mimeTypeSet): Deleted. >+ (WebCore::MediaPlayerPrivateGStreamer::createAudioSink): Deleted. >+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: >+ (WebCore::MediaPlayerPrivateGStreamer::configurePlaySink): >+ (WebCore::MediaPlayerPrivateGStreamer::isMediaSource): >+ (WebCore::MediaPlayerPrivateGStreamer::createWeakPtr): Deleted. >+ >+2016-10-04 Enrique Ocaña González <eocanha@igalia.com> >+ > [GStreamer][EME] Add EME support to base private player > https://bugs.webkit.org/show_bug.cgi?id=162908 > >diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >index 07846ca5fb6a3be29675e2b12050a1086c375248..f00558037f31ac736142b862b610373bd9f57351 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >@@ -3,8 +3,9 @@ > * Copyright (C) 2007 Collabora Ltd. All rights reserved. > * Copyright (C) 2007 Alp Toker <alp@atoker.com> > * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org> >- * Copyright (C) 2009, 2010, 2011, 2012, 2013 Igalia S.L >+ * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L > * Copyright (C) 2014 Cable Television Laboratories, Inc. >+ * Copyright (C) 2015, 2016 Metrological Group B.V. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Library General Public >@@ -77,6 +78,11 @@ using namespace std; > > namespace WebCore { > >+static void busMessageCallback(GstBus*, GstMessage* message, MediaPlayerPrivateGStreamer* player) >+{ >+ player->handleMessage(message); >+} >+ > void MediaPlayerPrivateGStreamer::setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer* player, GObject* object) > { > player->setAudioStreamProperties(object); >@@ -99,7 +105,7 @@ void MediaPlayerPrivateGStreamer::registerMediaEngine(MediaEngineRegistrar regis > { > if (isAvailable()) > registrar([](MediaPlayer* player) { return std::make_unique<MediaPlayerPrivateGStreamer>(player); }, >- getSupportedTypes, supportsType, 0, 0, 0, 0); >+ getSupportedTypes, supportsType, 0, 0, 0, supportsKeySystem); > } > > bool initializeGStreamerAndRegisterWebKitElements() >@@ -107,17 +113,14 @@ bool initializeGStreamerAndRegisterWebKitElements() > if (!initializeGStreamer()) > return false; > >+ registerWebKitGStreamerElements(); >+ > GRefPtr<GstElementFactory> srcFactory = adoptGRef(gst_element_factory_find("webkitwebsrc")); > if (!srcFactory) { > GST_DEBUG_CATEGORY_INIT(webkit_media_player_debug, "webkitmediaplayer", 0, "WebKit media player"); > gst_element_register(0, "webkitwebsrc", GST_RANK_PRIMARY + 100, WEBKIT_TYPE_WEB_SRC); > } > >-#if ENABLE(MEDIA_SOURCE) >- GRefPtr<GstElementFactory> WebKitMediaSrcFactory = adoptGRef(gst_element_factory_find("webkitmediasrc")); >- if (!WebKitMediaSrcFactory) >- gst_element_register(0, "webkitmediasrc", GST_RANK_PRIMARY + 100, WEBKIT_TYPE_MEDIA_SRC); >-#endif > return true; > } > >@@ -132,34 +135,35 @@ bool MediaPlayerPrivateGStreamer::isAvailable() > > MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) > : MediaPlayerPrivateGStreamerBase(player) >- , m_weakPtrFactory(this) >- , m_source(0) >- , m_seekTime(0) >+ , m_buffering(false) >+ , m_bufferingPercentage(0) >+ , m_canFallBackToLastFinishedSeekPosition(false) > , m_changingRate(false) >+ , m_downloadFinished(false) >+ , m_errorOccured(false) > , m_isEndReached(false) > , m_isStreaming(false) >- , m_mediaLocations(0) >- , m_mediaLocationCurrentIndex(0) >- , m_resetPipeline(false) >+ , m_durationAtEOS(0) > , m_paused(true) >- , m_playbackRatePause(false) >+ , m_playbackRate(1) >+ , m_requestedState(GST_STATE_VOID_PENDING) >+ , m_resetPipeline(false) > , m_seeking(false) > , m_seekIsPending(false) >+ , m_seekTime(0) >+ , m_source(0) >+ , m_volumeAndMuteInitialized(false) >+ , m_weakPtrFactory(this) >+ , m_mediaLocations(0) >+ , m_mediaLocationCurrentIndex(0) >+ , m_playbackRatePause(false) > , m_timeOfOverlappingSeek(-1) >- , m_canFallBackToLastFinishedSeekPosition(false) >- , m_buffering(false) >- , m_playbackRate(1) > , m_lastPlaybackRate(1) >- , m_errorOccured(false) >- , m_downloadFinished(false) >- , m_durationAtEOS(0) > , m_fillTimer(*this, &MediaPlayerPrivateGStreamer::fillTimerFired) > , m_maxTimeLoaded(0) >- , m_bufferingPercentage(0) > , m_preload(player->preload()) > , m_delayingLoad(false) > , m_maxTimeLoadedAtLastDidLoadingProgress(0) >- , m_volumeAndMuteInitialized(false) > , m_hasVideo(false) > , m_hasAudio(false) > , m_readyTimerHandler(RunLoop::main(), this, &MediaPlayerPrivateGStreamer::readyTimerFired) >@@ -168,7 +172,6 @@ MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) > #if ENABLE(WEB_AUDIO) > , m_audioSourceProvider(std::make_unique<AudioSourceProviderGStreamer>()) > #endif >- , m_requestedState(GST_STATE_VOID_PENDING) > { > #if USE(GLIB) && !PLATFORM(EFL) > m_readyTimerHandler.setPriority(G_PRIORITY_DEFAULT_IDLE); >@@ -205,18 +208,20 @@ MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer() > m_missingPluginsCallback = nullptr; > } > >+ if (m_videoSink) { >+ GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink")); >+ g_signal_handlers_disconnect_matched(videoSinkPad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); >+ } >+ > if (m_pipeline) { > GRefPtr<GstBus> bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline.get()))); > ASSERT(bus); >+ g_signal_handlers_disconnect_by_func(bus.get(), gpointer(busMessageCallback), this); >+ gst_bus_remove_signal_watch(bus.get()); > gst_bus_set_sync_handler(bus.get(), nullptr, nullptr, nullptr); > g_signal_handlers_disconnect_matched(m_pipeline.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); > gst_element_set_state(m_pipeline.get(), GST_STATE_NULL); > } >- >- if (m_videoSink) { >- GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink")); >- g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast<gpointer>(videoSinkCapsChangedCallback), this); >- } > } > > void MediaPlayerPrivateGStreamer::load(const String& urlString) >@@ -265,11 +270,9 @@ void MediaPlayerPrivateGStreamer::load(const String& urlString) > } > > #if ENABLE(MEDIA_SOURCE) >-void MediaPlayerPrivateGStreamer::load(const String& url, MediaSourcePrivateClient* mediaSource) >+void MediaPlayerPrivateGStreamer::load(const String&, MediaSourcePrivateClient*) > { >- String mediasourceUri = String::format("mediasource%s", url.utf8().data()); >- m_mediaSource = mediaSource; >- load(mediasourceUri); >+ notImplemented(); > } > #endif > >@@ -293,7 +296,7 @@ void MediaPlayerPrivateGStreamer::commitLoad() > updateStates(); > } > >-float MediaPlayerPrivateGStreamer::playbackPosition() const >+double MediaPlayerPrivateGStreamer::playbackPosition() const > { > if (m_isEndReached) { > // Position queries on a null pipeline return 0. If we're at >@@ -303,9 +306,9 @@ float MediaPlayerPrivateGStreamer::playbackPosition() const > if (m_seeking) > return m_seekTime; > >- float mediaDuration = duration(); >+ MediaTime mediaDuration = durationMediaTime(); > if (mediaDuration) >- return mediaDuration; >+ return mediaDuration.toDouble(); > return 0; > } > >@@ -318,11 +321,11 @@ float MediaPlayerPrivateGStreamer::playbackPosition() const > > GST_DEBUG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position)); > >- float result = 0.0f; >+ double result = 0.0f; > if (static_cast<GstClockTime>(position) != GST_CLOCK_TIME_NONE) { > GTimeVal timeValue; > GST_TIME_TO_TIMEVAL(position, timeValue); >- result = static_cast<float>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0)); >+ result = static_cast<double>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0)); > } else if (m_canFallBackToLastFinishedSeekPosition) > result = m_seekTime; > >@@ -413,20 +416,20 @@ void MediaPlayerPrivateGStreamer::pause() > loadingFailed(MediaPlayer::Empty); > } > >-float MediaPlayerPrivateGStreamer::duration() const >+MediaTime MediaPlayerPrivateGStreamer::durationMediaTime() const > { > if (!m_pipeline) >- return 0.0f; >+ return { }; > > if (m_errorOccured) >- return 0.0f; >+ return { }; > > if (m_durationAtEOS) >- return m_durationAtEOS; >+ return MediaTime::createWithFloat(m_durationAtEOS); > > // The duration query would fail on a not-prerolled pipeline. > if (GST_STATE(m_pipeline.get()) < GST_STATE_PAUSED) >- return 0.0f; >+ return { }; > > GstFormat timeFormat = GST_FORMAT_TIME; > gint64 timeLength = 0; >@@ -434,25 +437,25 @@ float MediaPlayerPrivateGStreamer::duration() const > bool failure = !gst_element_query_duration(m_pipeline.get(), timeFormat, &timeLength) || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; > if (failure) { > GST_DEBUG("Time duration query failed for %s", m_url.string().utf8().data()); >- return numeric_limits<float>::infinity(); >+ return MediaTime::positiveInfiniteTime(); > } > > GST_DEBUG("Duration: %" GST_TIME_FORMAT, GST_TIME_ARGS(timeLength)); > >- return static_cast<double>(timeLength) / GST_SECOND; >+ return MediaTime::createWithDouble(static_cast<double>(timeLength) / GST_SECOND); > // FIXME: handle 3.14.9.5 properly > } > >-float MediaPlayerPrivateGStreamer::currentTime() const >+MediaTime MediaPlayerPrivateGStreamer::currentMediaTime() const > { > if (!m_pipeline) >- return 0.0f; >+ return { }; > > if (m_errorOccured) >- return 0.0f; >+ return { }; > > if (m_seeking) >- return m_seekTime; >+ return MediaTime::createWithFloat(m_seekTime); > > // Workaround for > // https://bugzilla.gnome.org/show_bug.cgi?id=639941 In GStreamer >@@ -460,9 +463,9 @@ float MediaPlayerPrivateGStreamer::currentTime() const > // negative playback rate. There's no upstream accepted patch for > // this bug yet, hence this temporary workaround. > if (m_isEndReached && m_playbackRate < 0) >- return 0.0f; >+ return { }; > >- return playbackPosition(); >+ return MediaTime::createWithDouble(playbackPosition()); > } > > void MediaPlayerPrivateGStreamer::seek(float time) >@@ -476,7 +479,7 @@ void MediaPlayerPrivateGStreamer::seek(float time) > GST_INFO("[Seek] seek attempt to %f secs", time); > > // Avoid useless seeking. >- if (time == currentTime()) >+ if (MediaTime::createWithFloat(time) == currentMediaTime()) > return; > > if (isLiveStream()) >@@ -537,7 +540,7 @@ bool MediaPlayerPrivateGStreamer::doSeek(gint64 position, float rate, GstSeekFla > // If we are at beginning of media, start from the end to > // avoid immediate EOS. > if (position < 0) >- endTime = static_cast<gint64>(duration() * GST_SECOND); >+ endTime = static_cast<gint64>(durationMediaTime().toDouble() * GST_SECOND); > else > endTime = position; > } >@@ -604,7 +607,7 @@ bool MediaPlayerPrivateGStreamer::paused() const > > GstState state; > gst_element_get_state(m_pipeline.get(), &state, nullptr, 0); >- return state == GST_STATE_PAUSED; >+ return state <= GST_STATE_PAUSED; > } > > bool MediaPlayerPrivateGStreamer::seeking() const >@@ -619,11 +622,23 @@ void MediaPlayerPrivateGStreamer::videoChangedCallback(MediaPlayerPrivateGStream > > void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo() > { >+ if (UNLIKELY(!m_pipeline || !m_source)) >+ return; >+ > gint numTracks = 0; >- if (m_pipeline) >- g_object_get(m_pipeline.get(), "n-video", &numTracks, nullptr); >+ bool useMediaSource = isMediaSource(); >+ GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); >+ g_object_get(element, "n-video", &numTracks, nullptr); > > m_hasVideo = numTracks > 0; >+ if (m_hasVideo) >+ m_player->sizeChanged(); >+ >+ if (useMediaSource) { >+ GST_DEBUG("Tracks managed by source element. Bailing out now."); >+ m_player->client().mediaPlayerEngineUpdated(m_player); >+ return; >+ } > > #if ENABLE(VIDEO_TRACK) > for (gint i = 0; i < numTracks; ++i) { >@@ -672,12 +687,22 @@ void MediaPlayerPrivateGStreamer::audioChangedCallback(MediaPlayerPrivateGStream > > void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio() > { >+ if (UNLIKELY(!m_pipeline || !m_source)) >+ return; >+ > gint numTracks = 0; >- if (m_pipeline) >- g_object_get(m_pipeline.get(), "n-audio", &numTracks, nullptr); >+ bool useMediaSource = isMediaSource(); >+ GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); >+ g_object_get(element, "n-audio", &numTracks, nullptr); > > m_hasAudio = numTracks > 0; > >+ if (useMediaSource) { >+ GST_DEBUG("Tracks managed by source element. Bailing out now."); >+ m_player->client().mediaPlayerEngineUpdated(m_player); >+ return; >+ } >+ > #if ENABLE(VIDEO_TRACK) > for (gint i = 0; i < numTracks; ++i) { > GRefPtr<GstPad> pad; >@@ -715,9 +740,18 @@ void MediaPlayerPrivateGStreamer::textChangedCallback(MediaPlayerPrivateGStreame > > void MediaPlayerPrivateGStreamer::notifyPlayerOfText() > { >+ if (UNLIKELY(!m_pipeline || !m_source)) >+ return; >+ > gint numTracks = 0; >- if (m_pipeline) >- g_object_get(m_pipeline.get(), "n-text", &numTracks, nullptr); >+ bool useMediaSource = isMediaSource(); >+ GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); >+ g_object_get(element, "n-text", &numTracks, nullptr); >+ >+ if (useMediaSource) { >+ GST_DEBUG("Tracks managed by source element. Bailing out now."); >+ return; >+ } > > for (gint i = 0; i < numTracks; ++i) { > GRefPtr<GstPad> pad; >@@ -841,7 +875,7 @@ std::unique_ptr<PlatformTimeRanges> MediaPlayerPrivateGStreamer::buffered() cons > if (m_errorOccured || isLiveStream()) > return timeRanges; > >- float mediaDuration(duration()); >+ float mediaDuration(durationMediaTime().toDouble()); > if (!mediaDuration || std::isinf(mediaDuration)) > return timeRanges; > >@@ -959,7 +993,8 @@ void MediaPlayerPrivateGStreamer::handleMessage(GstMessage* message) > processBufferingStats(message); > break; > case GST_MESSAGE_DURATION_CHANGED: >- if (messageSourceIsPlaybin) >+ // Duration in MSE is managed by MediaSource, SourceBuffer and AppendPipeline. >+ if (messageSourceIsPlaybin && !isMediaSource()) > durationChanged(); > break; > case GST_MESSAGE_REQUEST_STATE: >@@ -1107,7 +1142,7 @@ void MediaPlayerPrivateGStreamer::processMpegTsSection(GstMpegtsSection* section > gsize size; > const void* bytes = g_bytes_get_data(data.get(), &size); > >- track->addDataCue(MediaTime::createWithDouble(currentTimeDouble()), MediaTime::createWithDouble(currentTimeDouble()), bytes, size); >+ track->addDataCue(currentMediaTime(), currentMediaTime(), bytes, size); > } > } > #endif >@@ -1181,7 +1216,7 @@ void MediaPlayerPrivateGStreamer::fillTimerFired() > > GST_DEBUG("[Buffering] Download buffer filled up to %f%%", fillStatus); > >- float mediaDuration = duration(); >+ float mediaDuration = durationMediaTime().toDouble(); > > // Update maxTimeLoaded only if the media duration is > // available. Otherwise we can't compute it. >@@ -1211,7 +1246,7 @@ float MediaPlayerPrivateGStreamer::maxTimeSeekable() const > if (m_errorOccured) > return 0.0f; > >- float mediaDuration = duration(); >+ float mediaDuration = durationMediaTime().toDouble(); > GST_DEBUG("maxTimeSeekable, duration: %f", mediaDuration); > // infinite duration means live stream > if (std::isinf(mediaDuration)) >@@ -1227,14 +1262,14 @@ float MediaPlayerPrivateGStreamer::maxTimeLoaded() const > > float loaded = m_maxTimeLoaded; > if (m_isEndReached) >- loaded = duration(); >+ loaded = durationMediaTime().toDouble(); > GST_DEBUG("maxTimeLoaded: %f", loaded); > return loaded; > } > > bool MediaPlayerPrivateGStreamer::didLoadingProgress() const > { >- if (!m_pipeline || !duration() || (!isMediaSource() && !totalBytes())) >+ if (UNLIKELY(!m_pipeline || !durationMediaTime() || (!isMediaSource() && !totalBytes()))) > return false; > float currentMaxTimeLoaded = maxTimeLoaded(); > bool didLoadingProgress = currentMaxTimeLoaded != m_maxTimeLoadedAtLastDidLoadingProgress; >@@ -1310,11 +1345,6 @@ void MediaPlayerPrivateGStreamer::sourceChanged() > > if (WEBKIT_IS_WEB_SRC(m_source.get())) > webKitWebSrcSetMediaPlayer(WEBKIT_WEB_SRC(m_source.get()), m_player); >-#if ENABLE(MEDIA_SOURCE) >- if (m_mediaSource && WEBKIT_IS_MEDIA_SRC(m_source.get())) { >- MediaSourceGStreamer::open(m_mediaSource.get(), WEBKIT_MEDIA_SRC(m_source.get())); >- } >-#endif > } > > void MediaPlayerPrivateGStreamer::cancelLoad() >@@ -1612,8 +1642,8 @@ void MediaPlayerPrivateGStreamer::didEnd() > // Synchronize position and duration values to not confuse the > // HTMLMediaElement. In some cases like reverse playback the > // position is not always reported as 0 for instance. >- float now = currentTime(); >- if (now > 0 && now <= duration()) >+ MediaTime now = currentMediaTime(); >+ if (now > MediaTime { } && now <= durationMediaTime()) > m_player->durationChanged(); > > m_isEndReached = true; >@@ -1621,7 +1651,7 @@ void MediaPlayerPrivateGStreamer::didEnd() > > if (!m_player->client().mediaPlayerIsLooping()) { > m_paused = true; >- m_durationAtEOS = duration(); >+ m_durationAtEOS = durationMediaTime().toDouble(); > changePipelineState(GST_STATE_READY); > m_downloadFinished = false; > } >@@ -1629,12 +1659,12 @@ void MediaPlayerPrivateGStreamer::didEnd() > > void MediaPlayerPrivateGStreamer::durationChanged() > { >- float previousDuration = duration(); >+ float previousDuration = durationMediaTime().toDouble(); > > // Avoid emiting durationchanged in the case where the previous > // duration was 0 because that case is already handled by the > // HTMLMediaElement. >- if (previousDuration && duration() != previousDuration) >+ if (previousDuration && durationMediaTime().toDouble() != previousDuration) > m_player->durationChanged(); > } > >@@ -1789,18 +1819,25 @@ void MediaPlayerPrivateGStreamer::getSupportedTypes(HashSet<String, ASCIICaseIns > > MediaPlayer::SupportsType MediaPlayerPrivateGStreamer::supportsType(const MediaEngineSupportParameters& parameters) > { >+ MediaPlayer::SupportsType result = MediaPlayer::IsNotSupported; >+#if ENABLE(MEDIA_SOURCE) >+ // MediaPlayerPrivateGStreamerMSE is in charge of mediasource playback, not us. >+ if (parameters.isMediaSource) >+ return result; >+#endif >+ > // MediaStream playback is handled by the OpenWebRTC player. > if (parameters.isMediaStream) >- return MediaPlayer::IsNotSupported; >- >+ return result; > > if (parameters.type.isNull() || parameters.type.isEmpty()) >- return MediaPlayer::IsNotSupported; >+ return result; > > // spec says we should not return "probably" if the codecs string is empty > if (mimeTypeSet().contains(parameters.type)) >- return parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported; >- return MediaPlayer::IsNotSupported; >+ result = parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported; >+ >+ return extendedSupportsType(parameters, result); > } > > void MediaPlayerPrivateGStreamer::setDownloadBuffering() >@@ -1925,18 +1962,18 @@ void MediaPlayerPrivateGStreamer::createGSTPlayBin() > gst_bus_set_sync_handler(bus.get(), [](GstBus*, GstMessage* message, gpointer userData) { > auto& player = *static_cast<MediaPlayerPrivateGStreamer*>(userData); > >- if (!player.handleSyncMessage(message)) { >- GRefPtr<GstMessage> protectedMessage(message); >- auto weakThis = player.createWeakPtr(); >- RunLoop::main().dispatch([weakThis, protectedMessage] { >- if (weakThis) >- weakThis->handleMessage(protectedMessage.get()); >- }); >+ if (player.handleSyncMessage(message)) { >+ gst_message_unref(message); >+ return GST_BUS_DROP; > } >- gst_message_unref(message); >- return GST_BUS_DROP; >+ >+ return GST_BUS_PASS; > }, this, nullptr); > >+ // Let also other listeners subscribe to (application) messages in this bus. >+ gst_bus_add_signal_watch(bus.get()); >+ g_signal_connect(bus.get(), "message", G_CALLBACK(busMessageCallback), this); >+ > g_object_set(m_pipeline.get(), "mute", m_player->muted(), nullptr); > > g_signal_connect_swapped(m_pipeline.get(), "notify::source", G_CALLBACK(sourceChangedCallback), this); >@@ -1963,6 +2000,8 @@ void MediaPlayerPrivateGStreamer::createGSTPlayBin() > > g_object_set(m_pipeline.get(), "video-sink", createVideoSink(), "audio-sink", createAudioSink(), nullptr); > >+ configurePlaySink(); >+ > // On 1.4.2 and newer we use the audio-filter property instead. > // See https://bugzilla.gnome.org/show_bug.cgi?id=735748 for > // the reason for using >= 1.4.2 instead of >= 1.4.0. >@@ -2015,6 +2054,11 @@ bool MediaPlayerPrivateGStreamer::canSaveMediaData() const > return false; > } > >+bool MediaPlayerPrivateGStreamer::handleSyncMessage(GstMessage* message) >+{ >+ return MediaPlayerPrivateGStreamerBase::handleSyncMessage(message); >+} >+ > } > > #endif // USE(GSTREAMER) >diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >index acd769fe29bd6ab312174b300b09c5697005fc20..18cbaaf019c2b73f5e0059bfd9bce99c2243c1d0 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >@@ -2,8 +2,9 @@ > * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. > * Copyright (C) 2007 Collabora Ltd. All rights reserved. > * Copyright (C) 2007 Alp Toker <alp@atoker.com> >- * Copyright (C) 2009, 2010 Igalia S.L >+ * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L > * Copyright (C) 2014 Cable Television Laboratories, Inc. >+ * Copyright (C) 2015, 2016 Metrological Group B.V. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Library General Public >@@ -40,10 +41,6 @@ > #include <wtf/text/AtomicStringHash.h> > #endif > >-#if ENABLE(MEDIA_SOURCE) >-#include "MediaSourceGStreamer.h" >-#endif >- > typedef struct _GstBuffer GstBuffer; > typedef struct _GstMessage GstMessage; > typedef struct _GstElement GstElement; >@@ -62,10 +59,14 @@ class InbandTextTrackPrivateGStreamer; > class MediaPlayerRequestInstallMissingPluginsCallback; > class VideoTrackPrivateGStreamer; > >+#if ENABLE(MEDIA_SOURCE) >+class MediaSourcePrivateClient; >+#endif >+ > class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase { > public: > explicit MediaPlayerPrivateGStreamer(MediaPlayer*); >- ~MediaPlayerPrivateGStreamer(); >+ virtual ~MediaPlayerPrivateGStreamer(); > > static void registerMediaEngine(MediaEngineRegistrar); > void handleMessage(GstMessage*); >@@ -91,8 +92,8 @@ public: > bool paused() const override; > bool seeking() const override; > >- float duration() const override; >- float currentTime() const override; >+ MediaTime durationMediaTime() const override; >+ MediaTime currentMediaTime() const override; > void seek(float) override; > > void setRate(float) override; >@@ -111,20 +112,26 @@ public: > void loadStateChanged(); > void timeChanged(); > void didEnd(); >- void durationChanged(); >+ virtual void durationChanged(); > void loadingFailed(MediaPlayer::NetworkState); > >- void sourceChanged(); >+ virtual void sourceChanged(); >+ > GstElement* audioSink() const override; >+ virtual void configurePlaySink() { } > > void simulateAudioInterruption() override; > >- bool changePipelineState(GstState); >+ virtual bool changePipelineState(GstState); > > #if ENABLE(WEB_AUDIO) > AudioSourceProvider* audioSourceProvider() override { return reinterpret_cast<AudioSourceProvider*>(m_audioSourceProvider.get()); } > #endif > >+ bool isLiveStream() const override { return m_isStreaming; } >+ >+ bool handleSyncMessage(GstMessage*) override; >+ > private: > static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&); > static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&); >@@ -135,17 +142,17 @@ private: > > GstElement* createAudioSink() override; > >- float playbackPosition() const; >+ double playbackPosition() const; > >- void updateStates(); >- void asyncStateChangeDone(); >+ virtual void updateStates(); >+ virtual void asyncStateChangeDone(); > > void createGSTPlayBin(); > > bool loadNextLocation(); > void mediaLocationChanged(GstMessage*); > >- void setDownloadBuffering(); >+ virtual void setDownloadBuffering(); > void processBufferingStats(GstMessage*); > #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS) > void processMpegTsSection(GstMpegtsSection*); >@@ -154,21 +161,35 @@ private: > void processTableOfContents(GstMessage*); > void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent); > #endif >- bool doSeek(gint64 position, float rate, GstSeekFlags seekType); >- void updatePlaybackRate(); >+ virtual bool doSeek(gint64 position, float rate, GstSeekFlags seekType); >+ virtual void updatePlaybackRate(); > > String engineDescription() const override { return "GStreamer"; } >- bool isLiveStream() const override { return m_isStreaming; } > bool didPassCORSAccessCheck() const override; > bool canSaveMediaData() const override; > >-#if ENABLE(MEDIA_SOURCE) >- // TODO: Implement >- unsigned long totalVideoFrames() override { return 0; } >- unsigned long droppedVideoFrames() override { return 0; } >- unsigned long corruptedVideoFrames() override { return 0; } >- MediaTime totalFrameDelay() override { return MediaTime::zeroTime(); } >-#endif >+protected: >+ void cacheDuration(); >+ >+ bool m_buffering; >+ int m_bufferingPercentage; >+ mutable float m_cachedPosition; >+ bool m_canFallBackToLastFinishedSeekPosition; >+ bool m_changingRate; >+ bool m_downloadFinished; >+ bool m_errorOccured; >+ mutable bool m_isEndReached; >+ mutable bool m_isStreaming; >+ mutable gfloat m_durationAtEOS; >+ bool m_paused; >+ float m_playbackRate; >+ GstState m_requestedState; >+ bool m_resetPipeline; >+ bool m_seeking; >+ bool m_seekIsPending; >+ float m_seekTime; >+ GRefPtr<GstElement> m_source; >+ bool m_volumeAndMuteInitialized; > > void readyTimerFired(); > >@@ -194,39 +215,23 @@ private: > static GstFlowReturn newTextSampleCallback(MediaPlayerPrivateGStreamer*); > #endif > >+private: > WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory; > >- GRefPtr<GstElement> m_source; > #if ENABLE(VIDEO_TRACK) > GRefPtr<GstElement> m_textAppSink; > GRefPtr<GstPad> m_textAppSinkPad; > #endif >- float m_seekTime; >- bool m_changingRate; >- bool m_isEndReached; >- mutable bool m_isStreaming; > GstStructure* m_mediaLocations; > int m_mediaLocationCurrentIndex; >- bool m_resetPipeline; >- bool m_paused; > bool m_playbackRatePause; >- bool m_seeking; >- bool m_seekIsPending; > float m_timeOfOverlappingSeek; >- bool m_canFallBackToLastFinishedSeekPosition; >- bool m_buffering; >- float m_playbackRate; > float m_lastPlaybackRate; >- bool m_errorOccured; >- bool m_downloadFinished; >- float m_durationAtEOS; > Timer m_fillTimer; > float m_maxTimeLoaded; >- int m_bufferingPercentage; > MediaPlayer::Preload m_preload; > bool m_delayingLoad; > mutable float m_maxTimeLoadedAtLastDidLoadingProgress; >- bool m_volumeAndMuteInitialized; > bool m_hasVideo; > bool m_hasAudio; > RunLoop::Timer<MediaPlayerPrivateGStreamer> m_readyTimerHandler; >@@ -236,7 +241,6 @@ private: > #if ENABLE(WEB_AUDIO) > std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider; > #endif >- GstState m_requestedState; > GRefPtr<GstElement> m_autoAudioSink; > RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback; > #if ENABLE(VIDEO_TRACK) >@@ -248,12 +252,7 @@ private: > #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS) > HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks; > #endif >-#if ENABLE(MEDIA_SOURCE) >- RefPtr<MediaSourcePrivateClient> m_mediaSource; >- bool isMediaSource() const { return m_mediaSource; } >-#else >- bool isMediaSource() const { return false; } >-#endif >+ virtual bool isMediaSource() const { return false; } > }; > } >
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
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 162911
:
290609
|
291768
|
292898