Changeset 207885 in webkit


Ignore:
Timestamp:
Oct 26, 2016 1:44:40 AM (8 years ago)
Author:
eocanha@igalia.com
Message:

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

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r207884 r207885  
     12016-10-26  Enrique Ocaña González  <eocanha@igalia.com>
     2
     3        [GStreamer][MSE][EME] Remove MSE code from regular player and add EME support
     4        https://bugs.webkit.org/show_bug.cgi?id=162911
     5
     6        Now that the MSE responsibility has been refactored to the dedicated
     7        MediaPlayerPrivateGStreamerMSE subclass, the regular player no longer needs the MSE code,
     8        just to expose some more methods to the subclass. Float timestamps have been migrated to
     9        double. Also, small changes to accomodate the EME support are needed.
     10
     11        This patch is co-authored with Philippe Normand <philn@igalia.com> (EME support) and
     12        Žan Doberšek <zandobersek@gmail.com> (double timestamps).
     13
     14        Reviewed by Xabier Rodriguez-Calvar.
     15
     16        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     17        (WebCore::busMessageCallback):
     18        (WebCore::MediaPlayerPrivateGStreamer::registerMediaEngine):
     19        (WebCore::initializeGStreamerAndRegisterWebKitElements):
     20        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
     21        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
     22        (WebCore::MediaPlayerPrivateGStreamer::load):
     23        (WebCore::MediaPlayerPrivateGStreamer::playbackPosition):
     24        (WebCore::MediaPlayerPrivateGStreamer::durationMediaTime):
     25        (WebCore::MediaPlayerPrivateGStreamer::currentMediaTime):
     26        (WebCore::MediaPlayerPrivateGStreamer::seek):
     27        (WebCore::MediaPlayerPrivateGStreamer::doSeek):
     28        (WebCore::MediaPlayerPrivateGStreamer::paused):
     29        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideo):
     30        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudio):
     31        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfText):
     32        (WebCore::MediaPlayerPrivateGStreamer::buffered):
     33        (WebCore::MediaPlayerPrivateGStreamer::handleMessage):
     34        (WebCore::MediaPlayerPrivateGStreamer::processMpegTsSection):
     35        (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired):
     36        (WebCore::MediaPlayerPrivateGStreamer::maxTimeSeekable):
     37        (WebCore::MediaPlayerPrivateGStreamer::maxTimeLoaded):
     38        (WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress):
     39        (WebCore::MediaPlayerPrivateGStreamer::sourceChanged):
     40        (WebCore::MediaPlayerPrivateGStreamer::didEnd):
     41        (WebCore::MediaPlayerPrivateGStreamer::durationChanged):
     42        (WebCore::MediaPlayerPrivateGStreamer::supportsType):
     43        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
     44        (WebCore::MediaPlayerPrivateGStreamer::handleSyncMessage):
     45        (WebCore::MediaPlayerPrivateGStreamer::setAudioStreamProperties): Deleted.
     46        (WebCore::MediaPlayerPrivateGStreamer::commitLoad): Deleted.
     47        (WebCore::MediaPlayerPrivateGStreamer::pause): Deleted.
     48        (WebCore::MediaPlayerPrivateGStreamer::videoChangedCallback): Deleted.
     49        (WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChangedCallback): Deleted.
     50        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps): Deleted.
     51        (WebCore::MediaPlayerPrivateGStreamer::setRate): Deleted.
     52        (WebCore::MediaPlayerPrivateGStreamer::processTableOfContentsEntry): Deleted.
     53        (WebCore::MediaPlayerPrivateGStreamer::totalBytes): Deleted.
     54        (WebCore::MediaPlayerPrivateGStreamer::loadNextLocation): Deleted.
     55        (WebCore::MediaPlayerPrivateGStreamer::loadStateChanged): Deleted.
     56        (WebCore::MediaPlayerPrivateGStreamer::timeChanged): Deleted.
     57        (WebCore::mimeTypeSet): Deleted.
     58        (WebCore::MediaPlayerPrivateGStreamer::createAudioSink): Deleted.
     59        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     60        (WebCore::MediaPlayerPrivateGStreamer::configurePlaySink):
     61        (WebCore::MediaPlayerPrivateGStreamer::isMediaSource):
     62        (WebCore::MediaPlayerPrivateGStreamer::createWeakPtr): Deleted.
     63
    1642016-10-26  Enrique Ocaña González  <eocanha@igalia.com>
    265
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r205180 r207885  
    44 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
    55 * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org>
    6  * Copyright (C) 2009, 2010, 2011, 2012, 2013 Igalia S.L
     6 * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L
    77 * Copyright (C) 2014 Cable Television Laboratories, Inc.
     8 * Copyright (C) 2015, 2016 Metrological Group B.V.
    89 *
    910 * This library is free software; you can redistribute it and/or
     
    7879namespace WebCore {
    7980
     81static void busMessageCallback(GstBus*, GstMessage* message, MediaPlayerPrivateGStreamer* player)
     82{
     83    player->handleMessage(message);
     84}
     85
    8086void MediaPlayerPrivateGStreamer::setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer* player, GObject* object)
    8187{
     
    100106    if (isAvailable())
    101107        registrar([](MediaPlayer* player) { return std::make_unique<MediaPlayerPrivateGStreamer>(player); },
    102             getSupportedTypes, supportsType, 0, 0, 0, 0);
     108            getSupportedTypes, supportsType, 0, 0, 0, supportsKeySystem);
    103109}
    104110
     
    107113    if (!initializeGStreamer())
    108114        return false;
     115
     116    registerWebKitGStreamerElements();
    109117
    110118    GRefPtr<GstElementFactory> srcFactory = adoptGRef(gst_element_factory_find("webkitwebsrc"));
     
    114122    }
    115123
    116 #if ENABLE(MEDIA_SOURCE)
    117     GRefPtr<GstElementFactory> WebKitMediaSrcFactory = adoptGRef(gst_element_factory_find("webkitmediasrc"));
    118     if (!WebKitMediaSrcFactory)
    119         gst_element_register(0, "webkitmediasrc", GST_RANK_PRIMARY + 100, WEBKIT_TYPE_MEDIA_SRC);
    120 #endif
    121124    return true;
    122125}
     
    133136MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player)
    134137    : MediaPlayerPrivateGStreamerBase(player)
    135     , m_weakPtrFactory(this)
    136     , m_source(0)
    137     , m_seekTime(0)
     138    , m_buffering(false)
     139    , m_bufferingPercentage(0)
     140    , m_canFallBackToLastFinishedSeekPosition(false)
    138141    , m_changingRate(false)
     142    , m_downloadFinished(false)
     143    , m_errorOccured(false)
    139144    , m_isEndReached(false)
    140145    , m_isStreaming(false)
     146    , m_durationAtEOS(0)
     147    , m_paused(true)
     148    , m_playbackRate(1)
     149    , m_requestedState(GST_STATE_VOID_PENDING)
     150    , m_resetPipeline(false)
     151    , m_seeking(false)
     152    , m_seekIsPending(false)
     153    , m_seekTime(0)
     154    , m_source(0)
     155    , m_volumeAndMuteInitialized(false)
     156    , m_weakPtrFactory(this)
    141157    , m_mediaLocations(0)
    142158    , m_mediaLocationCurrentIndex(0)
    143     , m_resetPipeline(false)
    144     , m_paused(true)
    145159    , m_playbackRatePause(false)
    146     , m_seeking(false)
    147     , m_seekIsPending(false)
    148160    , m_timeOfOverlappingSeek(-1)
    149     , m_canFallBackToLastFinishedSeekPosition(false)
    150     , m_buffering(false)
    151     , m_playbackRate(1)
    152161    , m_lastPlaybackRate(1)
    153     , m_errorOccured(false)
    154     , m_downloadFinished(false)
    155     , m_durationAtEOS(0)
    156162    , m_fillTimer(*this, &MediaPlayerPrivateGStreamer::fillTimerFired)
    157163    , m_maxTimeLoaded(0)
    158     , m_bufferingPercentage(0)
    159164    , m_preload(player->preload())
    160165    , m_delayingLoad(false)
    161166    , m_maxTimeLoadedAtLastDidLoadingProgress(0)
    162     , m_volumeAndMuteInitialized(false)
    163167    , m_hasVideo(false)
    164168    , m_hasAudio(false)
     
    169173    , m_audioSourceProvider(std::make_unique<AudioSourceProviderGStreamer>())
    170174#endif
    171     , m_requestedState(GST_STATE_VOID_PENDING)
    172175{
    173176#if USE(GLIB) && !PLATFORM(EFL)
     
    206209    }
    207210
     211    if (m_videoSink) {
     212        GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink"));
     213        g_signal_handlers_disconnect_matched(videoSinkPad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
     214    }
     215
    208216    if (m_pipeline) {
    209217        GRefPtr<GstBus> bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline.get())));
    210218        ASSERT(bus);
     219        g_signal_handlers_disconnect_by_func(bus.get(), gpointer(busMessageCallback), this);
     220        gst_bus_remove_signal_watch(bus.get());
    211221        gst_bus_set_sync_handler(bus.get(), nullptr, nullptr, nullptr);
    212222        g_signal_handlers_disconnect_matched(m_pipeline.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
    213223        gst_element_set_state(m_pipeline.get(), GST_STATE_NULL);
    214     }
    215 
    216     if (m_videoSink) {
    217         GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink"));
    218         g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast<gpointer>(videoSinkCapsChangedCallback), this);
    219224    }
    220225}
     
    266271
    267272#if ENABLE(MEDIA_SOURCE)
    268 void MediaPlayerPrivateGStreamer::load(const String& url, MediaSourcePrivateClient* mediaSource)
    269 {
    270     String mediasourceUri = String::format("mediasource%s", url.utf8().data());
    271     m_mediaSource = mediaSource;
    272     load(mediasourceUri);
     273void MediaPlayerPrivateGStreamer::load(const String&, MediaSourcePrivateClient*)
     274{
     275    notImplemented();
    273276}
    274277#endif
     
    294297}
    295298
    296 float MediaPlayerPrivateGStreamer::playbackPosition() const
     299double MediaPlayerPrivateGStreamer::playbackPosition() const
    297300{
    298301    if (m_isEndReached) {
     
    304307            return m_seekTime;
    305308
    306         float mediaDuration = duration();
     309        MediaTime mediaDuration = durationMediaTime();
    307310        if (mediaDuration)
    308             return mediaDuration;
     311            return mediaDuration.toDouble();
    309312        return 0;
    310313    }
     
    319322    GST_DEBUG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
    320323
    321     float result = 0.0f;
     324    double result = 0.0f;
    322325    if (static_cast<GstClockTime>(position) != GST_CLOCK_TIME_NONE) {
    323326        GTimeVal timeValue;
    324327        GST_TIME_TO_TIMEVAL(position, timeValue);
    325         result = static_cast<float>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0));
     328        result = static_cast<double>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0));
    326329    } else if (m_canFallBackToLastFinishedSeekPosition)
    327330        result = m_seekTime;
     
    414417}
    415418
    416 float MediaPlayerPrivateGStreamer::duration() const
     419MediaTime MediaPlayerPrivateGStreamer::durationMediaTime() const
    417420{
    418421    if (!m_pipeline)
    419         return 0.0f;
     422        return { };
    420423
    421424    if (m_errorOccured)
    422         return 0.0f;
     425        return { };
    423426
    424427    if (m_durationAtEOS)
    425         return m_durationAtEOS;
     428        return MediaTime::createWithFloat(m_durationAtEOS);
    426429
    427430    // The duration query would fail on a not-prerolled pipeline.
    428431    if (GST_STATE(m_pipeline.get()) < GST_STATE_PAUSED)
    429         return 0.0f;
     432        return { };
    430433
    431434    GstFormat timeFormat = GST_FORMAT_TIME;
     
    435438    if (failure) {
    436439        GST_DEBUG("Time duration query failed for %s", m_url.string().utf8().data());
    437         return numeric_limits<float>::infinity();
     440        return MediaTime::positiveInfiniteTime();
    438441    }
    439442
    440443    GST_DEBUG("Duration: %" GST_TIME_FORMAT, GST_TIME_ARGS(timeLength));
    441444
    442     return static_cast<double>(timeLength) / GST_SECOND;
     445    return MediaTime::createWithDouble(static_cast<double>(timeLength) / GST_SECOND);
    443446    // FIXME: handle 3.14.9.5 properly
    444447}
    445448
    446 float MediaPlayerPrivateGStreamer::currentTime() const
     449MediaTime MediaPlayerPrivateGStreamer::currentMediaTime() const
    447450{
    448451    if (!m_pipeline)
    449         return 0.0f;
     452        return { };
    450453
    451454    if (m_errorOccured)
    452         return 0.0f;
     455        return { };
    453456
    454457    if (m_seeking)
    455         return m_seekTime;
     458        return MediaTime::createWithFloat(m_seekTime);
    456459
    457460    // Workaround for
     
    461464    // this bug yet, hence this temporary workaround.
    462465    if (m_isEndReached && m_playbackRate < 0)
    463         return 0.0f;
    464 
    465     return playbackPosition();
     466        return { };
     467
     468    return MediaTime::createWithDouble(playbackPosition());
    466469}
    467470
     
    477480
    478481    // Avoid useless seeking.
    479     if (time == currentTime())
     482    if (MediaTime::createWithFloat(time) == currentMediaTime())
    480483        return;
    481484
     
    538541        // avoid immediate EOS.
    539542        if (position < 0)
    540             endTime = static_cast<gint64>(duration() * GST_SECOND);
     543            endTime = static_cast<gint64>(durationMediaTime().toDouble() * GST_SECOND);
    541544        else
    542545            endTime = position;
     
    605608    GstState state;
    606609    gst_element_get_state(m_pipeline.get(), &state, nullptr, 0);
    607     return state == GST_STATE_PAUSED;
     610    return state <= GST_STATE_PAUSED;
    608611}
    609612
     
    620623void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo()
    621624{
     625    if (UNLIKELY(!m_pipeline || !m_source))
     626        return;
     627
    622628    gint numTracks = 0;
    623     if (m_pipeline)
    624         g_object_get(m_pipeline.get(), "n-video", &numTracks, nullptr);
     629    bool useMediaSource = isMediaSource();
     630    GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get();
     631    g_object_get(element, "n-video", &numTracks, nullptr);
    625632
    626633    m_hasVideo = numTracks > 0;
     634    if (m_hasVideo)
     635        m_player->sizeChanged();
     636
     637    if (useMediaSource) {
     638        GST_DEBUG("Tracks managed by source element. Bailing out now.");
     639        m_player->client().mediaPlayerEngineUpdated(m_player);
     640        return;
     641    }
    627642
    628643#if ENABLE(VIDEO_TRACK)
     
    673688void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio()
    674689{
     690    if (UNLIKELY(!m_pipeline || !m_source))
     691        return;
     692
    675693    gint numTracks = 0;
    676     if (m_pipeline)
    677         g_object_get(m_pipeline.get(), "n-audio", &numTracks, nullptr);
     694    bool useMediaSource = isMediaSource();
     695    GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get();
     696    g_object_get(element, "n-audio", &numTracks, nullptr);
    678697
    679698    m_hasAudio = numTracks > 0;
     699
     700    if (useMediaSource) {
     701        GST_DEBUG("Tracks managed by source element. Bailing out now.");
     702        m_player->client().mediaPlayerEngineUpdated(m_player);
     703        return;
     704    }
    680705
    681706#if ENABLE(VIDEO_TRACK)
     
    716741void MediaPlayerPrivateGStreamer::notifyPlayerOfText()
    717742{
     743    if (UNLIKELY(!m_pipeline || !m_source))
     744        return;
     745
    718746    gint numTracks = 0;
    719     if (m_pipeline)
    720         g_object_get(m_pipeline.get(), "n-text", &numTracks, nullptr);
     747    bool useMediaSource = isMediaSource();
     748    GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get();
     749    g_object_get(element, "n-text", &numTracks, nullptr);
     750
     751    if (useMediaSource) {
     752        GST_DEBUG("Tracks managed by source element. Bailing out now.");
     753        return;
     754    }
    721755
    722756    for (gint i = 0; i < numTracks; ++i) {
     
    842876        return timeRanges;
    843877
    844     float mediaDuration(duration());
     878    float mediaDuration(durationMediaTime().toDouble());
    845879    if (!mediaDuration || std::isinf(mediaDuration))
    846880        return timeRanges;
     
    960994        break;
    961995    case GST_MESSAGE_DURATION_CHANGED:
    962         if (messageSourceIsPlaybin)
     996        // Duration in MSE is managed by MediaSource, SourceBuffer and AppendPipeline.
     997        if (messageSourceIsPlaybin && !isMediaSource())
    963998            durationChanged();
    964999        break;
     
    11081143        const void* bytes = g_bytes_get_data(data.get(), &size);
    11091144
    1110         track->addDataCue(MediaTime::createWithDouble(currentTimeDouble()), MediaTime::createWithDouble(currentTimeDouble()), bytes, size);
     1145        track->addDataCue(currentMediaTime(), currentMediaTime(), bytes, size);
    11111146    }
    11121147}
     
    11821217    GST_DEBUG("[Buffering] Download buffer filled up to %f%%", fillStatus);
    11831218
    1184     float mediaDuration = duration();
     1219    float mediaDuration = durationMediaTime().toDouble();
    11851220
    11861221    // Update maxTimeLoaded only if the media duration is
     
    12121247        return 0.0f;
    12131248
    1214     float mediaDuration = duration();
     1249    float mediaDuration = durationMediaTime().toDouble();
    12151250    GST_DEBUG("maxTimeSeekable, duration: %f", mediaDuration);
    12161251    // infinite duration means live stream
     
    12281263    float loaded = m_maxTimeLoaded;
    12291264    if (m_isEndReached)
    1230         loaded = duration();
     1265        loaded = durationMediaTime().toDouble();
    12311266    GST_DEBUG("maxTimeLoaded: %f", loaded);
    12321267    return loaded;
     
    12351270bool MediaPlayerPrivateGStreamer::didLoadingProgress() const
    12361271{
    1237     if (!m_pipeline || !duration() || (!isMediaSource() && !totalBytes()))
     1272    if (UNLIKELY(!m_pipeline || !durationMediaTime() || (!isMediaSource() && !totalBytes())))
    12381273        return false;
    12391274    float currentMaxTimeLoaded = maxTimeLoaded();
     
    13111346    if (WEBKIT_IS_WEB_SRC(m_source.get()))
    13121347        webKitWebSrcSetMediaPlayer(WEBKIT_WEB_SRC(m_source.get()), m_player);
    1313 #if ENABLE(MEDIA_SOURCE)
    1314     if (m_mediaSource && WEBKIT_IS_MEDIA_SRC(m_source.get())) {
    1315         MediaSourceGStreamer::open(m_mediaSource.get(), WEBKIT_MEDIA_SRC(m_source.get()));
    1316     }
    1317 #endif
    13181348}
    13191349
     
    16131643    // HTMLMediaElement. In some cases like reverse playback the
    16141644    // position is not always reported as 0 for instance.
    1615     float now = currentTime();
    1616     if (now > 0 && now <= duration())
     1645    MediaTime now = currentMediaTime();
     1646    if (now > MediaTime { } && now <= durationMediaTime())
    16171647        m_player->durationChanged();
    16181648
     
    16221652    if (!m_player->client().mediaPlayerIsLooping()) {
    16231653        m_paused = true;
    1624         m_durationAtEOS = duration();
     1654        m_durationAtEOS = durationMediaTime().toDouble();
    16251655        changePipelineState(GST_STATE_READY);
    16261656        m_downloadFinished = false;
     
    16301660void MediaPlayerPrivateGStreamer::durationChanged()
    16311661{
    1632     float previousDuration = duration();
     1662    float previousDuration = durationMediaTime().toDouble();
    16331663
    16341664    // Avoid emiting durationchanged in the case where the previous
    16351665    // duration was 0 because that case is already handled by the
    16361666    // HTMLMediaElement.
    1637     if (previousDuration && duration() != previousDuration)
     1667    if (previousDuration && durationMediaTime().toDouble() != previousDuration)
    16381668        m_player->durationChanged();
    16391669}
     
    17901820MediaPlayer::SupportsType MediaPlayerPrivateGStreamer::supportsType(const MediaEngineSupportParameters& parameters)
    17911821{
     1822    MediaPlayer::SupportsType result = MediaPlayer::IsNotSupported;
     1823#if ENABLE(MEDIA_SOURCE)
     1824    // MediaPlayerPrivateGStreamerMSE is in charge of mediasource playback, not us.
     1825    if (parameters.isMediaSource)
     1826        return result;
     1827#endif
     1828
    17921829    // MediaStream playback is handled by the OpenWebRTC player.
    17931830    if (parameters.isMediaStream)
    1794         return MediaPlayer::IsNotSupported;
    1795 
     1831        return result;
    17961832
    17971833    if (parameters.type.isNull() || parameters.type.isEmpty())
    1798         return MediaPlayer::IsNotSupported;
     1834        return result;
    17991835
    18001836    // spec says we should not return "probably" if the codecs string is empty
    18011837    if (mimeTypeSet().contains(parameters.type))
    1802         return parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported;
    1803     return MediaPlayer::IsNotSupported;
     1838        result = parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported;
     1839
     1840    return extendedSupportsType(parameters, result);
    18041841}
    18051842
     
    19261963        auto& player = *static_cast<MediaPlayerPrivateGStreamer*>(userData);
    19271964
    1928         if (!player.handleSyncMessage(message)) {
    1929             GRefPtr<GstMessage> protectedMessage(message);
    1930             auto weakThis = player.createWeakPtr();
    1931             RunLoop::main().dispatch([weakThis, protectedMessage] {
    1932                 if (weakThis)
    1933                     weakThis->handleMessage(protectedMessage.get());
    1934             });
    1935         }
    1936         gst_message_unref(message);
    1937         return GST_BUS_DROP;
     1965        if (player.handleSyncMessage(message)) {
     1966            gst_message_unref(message);
     1967            return GST_BUS_DROP;
     1968        }
     1969
     1970        return GST_BUS_PASS;
    19381971    }, this, nullptr);
     1972
     1973    // Let also other listeners subscribe to (application) messages in this bus.
     1974    gst_bus_add_signal_watch(bus.get());
     1975    g_signal_connect(bus.get(), "message", G_CALLBACK(busMessageCallback), this);
    19391976
    19401977    g_object_set(m_pipeline.get(), "mute", m_player->muted(), nullptr);
     
    19632000
    19642001    g_object_set(m_pipeline.get(), "video-sink", createVideoSink(), "audio-sink", createAudioSink(), nullptr);
     2002
     2003    configurePlaySink();
    19652004
    19662005    // On 1.4.2 and newer we use the audio-filter property instead.
     
    20162055}
    20172056
     2057bool MediaPlayerPrivateGStreamer::handleSyncMessage(GstMessage* message)
     2058{
     2059    return MediaPlayerPrivateGStreamerBase::handleSyncMessage(message);
     2060}
     2061
    20182062}
    20192063
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r203159 r207885  
    33 * Copyright (C) 2007 Collabora Ltd. All rights reserved.
    44 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
    5  * Copyright (C) 2009, 2010 Igalia S.L
     5 * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L
    66 * Copyright (C) 2014 Cable Television Laboratories, Inc.
     7 * Copyright (C) 2015, 2016 Metrological Group B.V.
    78 *
    89 * This library is free software; you can redistribute it and/or
     
    4142#endif
    4243
    43 #if ENABLE(MEDIA_SOURCE)
    44 #include "MediaSourceGStreamer.h"
    45 #endif
    46 
    4744typedef struct _GstBuffer GstBuffer;
    4845typedef struct _GstMessage GstMessage;
     
    6360class VideoTrackPrivateGStreamer;
    6461
     62#if ENABLE(MEDIA_SOURCE)
     63class MediaSourcePrivateClient;
     64#endif
     65
    6566class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
    6667public:
    6768    explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
    68     ~MediaPlayerPrivateGStreamer();
     69    virtual ~MediaPlayerPrivateGStreamer();
    6970
    7071    static void registerMediaEngine(MediaEngineRegistrar);
     
    9293    bool seeking() const override;
    9394
    94     float duration() const override;
    95     float currentTime() const override;
     95    MediaTime durationMediaTime() const override;
     96    MediaTime currentMediaTime() const override;
    9697    void seek(float) override;
    9798
     
    112113    void timeChanged();
    113114    void didEnd();
    114     void durationChanged();
     115    virtual void durationChanged();
    115116    void loadingFailed(MediaPlayer::NetworkState);
    116117
    117     void sourceChanged();
     118    virtual void sourceChanged();
     119
    118120    GstElement* audioSink() const override;
     121    virtual void configurePlaySink() { }
    119122
    120123    void simulateAudioInterruption() override;
    121124
    122     bool changePipelineState(GstState);
     125    virtual bool changePipelineState(GstState);
    123126
    124127#if ENABLE(WEB_AUDIO)
    125128    AudioSourceProvider* audioSourceProvider() override { return reinterpret_cast<AudioSourceProvider*>(m_audioSourceProvider.get()); }
    126129#endif
     130
     131    bool isLiveStream() const override { return m_isStreaming; }
     132
     133    bool handleSyncMessage(GstMessage*) override;
    127134
    128135private:
     
    136143    GstElement* createAudioSink() override;
    137144
    138     float playbackPosition() const;
    139 
    140     void updateStates();
    141     void asyncStateChangeDone();
     145    double playbackPosition() const;
     146
     147    virtual void updateStates();
     148    virtual void asyncStateChangeDone();
    142149
    143150    void createGSTPlayBin();
     
    146153    void mediaLocationChanged(GstMessage*);
    147154
    148     void setDownloadBuffering();
     155    virtual void setDownloadBuffering();
    149156    void processBufferingStats(GstMessage*);
    150157#if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
     
    155162    void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent);
    156163#endif
    157     bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
    158     void updatePlaybackRate();
     164    virtual bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
     165    virtual void updatePlaybackRate();
    159166
    160167    String engineDescription() const override { return "GStreamer"; }
    161     bool isLiveStream() const override { return m_isStreaming; }
    162168    bool didPassCORSAccessCheck() const override;
    163169    bool canSaveMediaData() const override;
    164170
    165 #if ENABLE(MEDIA_SOURCE)
    166     // TODO: Implement
    167     unsigned long totalVideoFrames() override { return 0; }
    168     unsigned long droppedVideoFrames() override { return 0; }
    169     unsigned long corruptedVideoFrames() override { return 0; }
    170     MediaTime totalFrameDelay() override { return MediaTime::zeroTime(); }
    171 #endif
     171protected:
     172    void cacheDuration();
     173
     174    bool m_buffering;
     175    int m_bufferingPercentage;
     176    mutable float m_cachedPosition;
     177    bool m_canFallBackToLastFinishedSeekPosition;
     178    bool m_changingRate;
     179    bool m_downloadFinished;
     180    bool m_errorOccured;
     181    mutable bool m_isEndReached;
     182    mutable bool m_isStreaming;
     183    mutable gfloat m_durationAtEOS;
     184    bool m_paused;
     185    float m_playbackRate;
     186    GstState m_requestedState;
     187    bool m_resetPipeline;
     188    bool m_seeking;
     189    bool m_seekIsPending;
     190    float m_seekTime;
     191    GRefPtr<GstElement> m_source;
     192    bool m_volumeAndMuteInitialized;
    172193
    173194    void readyTimerFired();
     
    195216#endif
    196217
     218private:
    197219    WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory;
    198220
    199     GRefPtr<GstElement> m_source;
    200221#if ENABLE(VIDEO_TRACK)
    201222    GRefPtr<GstElement> m_textAppSink;
    202223    GRefPtr<GstPad> m_textAppSinkPad;
    203224#endif
    204     float m_seekTime;
    205     bool m_changingRate;
    206     bool m_isEndReached;
    207     mutable bool m_isStreaming;
    208225    GstStructure* m_mediaLocations;
    209226    int m_mediaLocationCurrentIndex;
    210     bool m_resetPipeline;
    211     bool m_paused;
    212227    bool m_playbackRatePause;
    213     bool m_seeking;
    214     bool m_seekIsPending;
    215228    float m_timeOfOverlappingSeek;
    216     bool m_canFallBackToLastFinishedSeekPosition;
    217     bool m_buffering;
    218     float m_playbackRate;
    219229    float m_lastPlaybackRate;
    220     bool m_errorOccured;
    221     bool m_downloadFinished;
    222     float m_durationAtEOS;
    223230    Timer m_fillTimer;
    224231    float m_maxTimeLoaded;
    225     int m_bufferingPercentage;
    226232    MediaPlayer::Preload m_preload;
    227233    bool m_delayingLoad;
    228234    mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
    229     bool m_volumeAndMuteInitialized;
    230235    bool m_hasVideo;
    231236    bool m_hasAudio;
     
    237242    std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
    238243#endif
    239     GstState m_requestedState;
    240244    GRefPtr<GstElement> m_autoAudioSink;
    241245    RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;
     
    249253    HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
    250254#endif
    251 #if ENABLE(MEDIA_SOURCE)
    252     RefPtr<MediaSourcePrivateClient> m_mediaSource;
    253     bool isMediaSource() const { return m_mediaSource; }
    254 #else
    255     bool isMediaSource() const { return false; }
    256 #endif
     255    virtual bool isMediaSource() const { return false; }
    257256};
    258257}
Note: See TracChangeset for help on using the changeset viewer.