Changeset 202857 in webkit


Ignore:
Timestamp:
Jul 6, 2016 6:27:40 AM (8 years ago)
Author:
Philippe Normand
Message:

[GStreamer] duration query improvements
https://bugs.webkit.org/show_bug.cgi?id=159458

Reviewed by Carlos Garcia Campos.

Currently the player caches the result of the duration query but
this is overkill because it's cached by playbin already. The only
time where the player needs to cache the duration is when EOS was
reached because in that situation the query would fail.

No new tests, existing media tests cover this patch.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): Member variables update.
(WebCore::MediaPlayerPrivateGStreamer::load): Stop the fill timer
before loading a new URL, the same player can be used for
different assets.
(WebCore::MediaPlayerPrivateGStreamer::playbackPosition): Perform
a duration query, the duration value is no longer locally cached.
(WebCore::MediaPlayerPrivateGStreamer::duration): Return cached value only after EOS was reached.
(WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Perform
a duration query, the duration value is no longer locally cached.
(WebCore::MediaPlayerPrivateGStreamer::maxTimeSeekable): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::maxTimeLoaded): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::updateStates): Remove duration caching support.
(WebCore::MediaPlayerPrivateGStreamer::didEnd): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::durationChanged): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::cacheDuration): Deleted.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r202856 r202857  
     12016-07-06  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] duration query improvements
     4        https://bugs.webkit.org/show_bug.cgi?id=159458
     5
     6        Reviewed by Carlos Garcia Campos.
     7
     8        Currently the player caches the result of the duration query but
     9        this is overkill because it's cached by playbin already. The only
     10        time where the player needs to cache the duration is when EOS was
     11        reached because in that situation the query would fail.
     12
     13        No new tests, existing media tests cover this patch.
     14
     15        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     16        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): Member variables update.
     17        (WebCore::MediaPlayerPrivateGStreamer::load): Stop the fill timer
     18        before loading a new URL, the same player can be used for
     19        different assets.
     20        (WebCore::MediaPlayerPrivateGStreamer::playbackPosition): Perform
     21        a duration query, the duration value is no longer locally cached.
     22        (WebCore::MediaPlayerPrivateGStreamer::duration): Return cached value only after EOS was reached.
     23        (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Perform
     24        a duration query, the duration value is no longer locally cached.
     25        (WebCore::MediaPlayerPrivateGStreamer::maxTimeSeekable): Ditto.
     26        (WebCore::MediaPlayerPrivateGStreamer::maxTimeLoaded): Ditto.
     27        (WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress): Ditto.
     28        (WebCore::MediaPlayerPrivateGStreamer::updateStates): Remove duration caching support.
     29        (WebCore::MediaPlayerPrivateGStreamer::didEnd): Ditto.
     30        (WebCore::MediaPlayerPrivateGStreamer::durationChanged): Ditto.
     31        (WebCore::MediaPlayerPrivateGStreamer::cacheDuration): Deleted.
     32        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     33
    1342016-07-06  Manuel Rego Casasnovas  <rego@igalia.com>
    235
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r202611 r202857  
    152152    , m_lastPlaybackRate(1)
    153153    , m_errorOccured(false)
    154     , m_mediaDuration(0)
    155154    , m_downloadFinished(false)
     155    , m_durationAtEOS(0)
    156156    , m_fillTimer(*this, &MediaPlayerPrivateGStreamer::fillTimerFired)
    157157    , m_maxTimeLoaded(0)
     
    159159    , m_preload(player->preload())
    160160    , m_delayingLoad(false)
    161     , m_mediaDurationKnown(true)
    162161    , m_maxTimeLoadedAtLastDidLoadingProgress(0)
    163162    , m_volumeAndMuteInitialized(false)
     
    238237        createGSTPlayBin();
    239238
     239    if (m_fillTimer.isActive())
     240        m_fillTimer.stop();
     241
    240242    ASSERT(m_pipeline);
    241243
     
    257259    m_player->readyStateChanged();
    258260    m_volumeAndMuteInitialized = false;
     261    m_durationAtEOS = 0;
    259262
    260263    if (!m_delayingLoad)
     
    300303        if (m_seeking)
    301304            return m_seekTime;
    302         if (m_mediaDuration)
    303             return m_mediaDuration;
     305
     306        float mediaDuration = duration();
     307        if (mediaDuration)
     308            return mediaDuration;
    304309        return 0;
    305310    }
     
    417422        return 0.0f;
    418423
    419     // Media duration query failed already, don't attempt new useless queries.
    420     if (!m_mediaDurationKnown)
    421         return numeric_limits<float>::infinity();
    422 
    423     if (m_mediaDuration)
    424         return m_mediaDuration;
     424    if (m_durationAtEOS)
     425        return m_durationAtEOS;
     426
     427    // The duration query would fail on a not-prerolled pipeline.
     428    if (GST_STATE(m_pipeline.get()) < GST_STATE_PAUSED)
     429        return 0.0f;
    425430
    426431    GstFormat timeFormat = GST_FORMAT_TIME;
     
    435440    LOG_MEDIA_MESSAGE("Duration: %" GST_TIME_FORMAT, GST_TIME_ARGS(timeLength));
    436441
    437     m_mediaDuration = static_cast<double>(timeLength) / GST_SECOND;
    438     return m_mediaDuration;
     442    return static_cast<double>(timeLength) / GST_SECOND;
    439443    // FIXME: handle 3.14.9.5 properly
    440444}
     
    11781182    LOG_MEDIA_MESSAGE("[Buffering] Download buffer filled up to %f%%", fillStatus);
    11791183
    1180     if (!m_mediaDuration)
    1181         durationChanged();
     1184    float mediaDuration = duration();
    11821185
    11831186    // Update maxTimeLoaded only if the media duration is
    11841187    // available. Otherwise we can't compute it.
    1185     if (m_mediaDuration) {
     1188    if (mediaDuration) {
    11861189        if (fillStatus == 100.0)
    1187             m_maxTimeLoaded = m_mediaDuration;
     1190            m_maxTimeLoaded = mediaDuration;
    11881191        else
    1189             m_maxTimeLoaded = static_cast<float>((fillStatus * m_mediaDuration) / 100.0);
     1192            m_maxTimeLoaded = static_cast<float>((fillStatus * mediaDuration) / 100.0);
    11901193        LOG_MEDIA_MESSAGE("[Buffering] Updated maxTimeLoaded: %f", m_maxTimeLoaded);
    11911194    }
     
    12091212        return 0.0f;
    12101213
    1211     LOG_MEDIA_MESSAGE("maxTimeSeekable");
     1214    float mediaDuration = duration();
     1215    LOG_MEDIA_MESSAGE("maxTimeSeekable, duration: %f", mediaDuration);
    12121216    // infinite duration means live stream
    1213     if (std::isinf(duration()))
     1217    if (std::isinf(mediaDuration))
    12141218        return 0.0f;
    12151219
    1216     return duration();
     1220    return mediaDuration;
    12171221}
    12181222
     
    12231227
    12241228    float loaded = m_maxTimeLoaded;
    1225     if (m_isEndReached && m_mediaDuration)
    1226         loaded = m_mediaDuration;
     1229    if (m_isEndReached)
     1230        loaded = duration();
    12271231    LOG_MEDIA_MESSAGE("maxTimeLoaded: %f", loaded);
    12281232    return loaded;
     
    12311235bool MediaPlayerPrivateGStreamer::didLoadingProgress() const
    12321236{
    1233     if (!m_pipeline || !m_mediaDuration || (!isMediaSource() && !totalBytes()))
     1237    if (!m_pipeline || !duration() || (!isMediaSource() && !totalBytes()))
    12341238        return false;
    12351239    float currentMaxTimeLoaded = maxTimeLoaded();
     
    13751379            break;
    13761380
    1377         if (state <= GST_STATE_READY) {
    1378             m_resetPipeline = true;
    1379             m_mediaDuration = 0;
    1380         } else {
    1381             m_resetPipeline = false;
    1382             cacheDuration();
    1383         }
     1381        m_resetPipeline = state <= GST_STATE_READY;
    13841382
    13851383        bool didBuffering = m_buffering;
     
    16161614    // position is not always reported as 0 for instance.
    16171615    float now = currentTime();
    1618     if (now > 0 && now <= duration() && m_mediaDuration != now) {
    1619         m_mediaDurationKnown = true;
    1620         m_mediaDuration = now;
     1616    if (now > 0 && now <= duration())
    16211617        m_player->durationChanged();
    1622     }
    16231618
    16241619    m_isEndReached = true;
     
    16271622    if (!m_player->client().mediaPlayerIsLooping()) {
    16281623        m_paused = true;
     1624        m_durationAtEOS = duration();
    16291625        changePipelineState(GST_STATE_READY);
    16301626        m_downloadFinished = false;
     
    16321628}
    16331629
    1634 void MediaPlayerPrivateGStreamer::cacheDuration()
    1635 {
    1636     if (m_mediaDuration || !m_mediaDurationKnown)
    1637         return;
    1638 
    1639     float newDuration = duration();
    1640     if (std::isinf(newDuration)) {
    1641         // Only pretend that duration is not available if the the query failed in a stable pipeline state.
    1642         GstState state;
    1643         if (gst_element_get_state(m_pipeline.get(), &state, nullptr, 0) == GST_STATE_CHANGE_SUCCESS && state > GST_STATE_READY)
    1644             m_mediaDurationKnown = false;
    1645         return;
    1646     }
    1647 
    1648     m_mediaDuration = newDuration;
    1649 }
    1650 
    16511630void MediaPlayerPrivateGStreamer::durationChanged()
    16521631{
    1653     float previousDuration = m_mediaDuration;
    1654 
    1655     cacheDuration();
     1632    float previousDuration = duration();
     1633
    16561634    // Avoid emiting durationchanged in the case where the previous
    16571635    // duration was 0 because that case is already handled by the
    16581636    // HTMLMediaElement.
    1659     if (previousDuration && m_mediaDuration != previousDuration)
     1637    if (previousDuration && duration() != previousDuration)
    16601638        m_player->durationChanged();
    16611639}
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r202611 r202857  
    138138    float playbackPosition() const;
    139139
    140     void cacheDuration();
    141140    void updateStates();
    142141    void asyncStateChangeDone();
     
    220219    float m_lastPlaybackRate;
    221220    bool m_errorOccured;
    222     mutable gfloat m_mediaDuration;
    223221    bool m_downloadFinished;
     222    float m_durationAtEOS;
    224223    Timer m_fillTimer;
    225224    float m_maxTimeLoaded;
     
    227226    MediaPlayer::Preload m_preload;
    228227    bool m_delayingLoad;
    229     bool m_mediaDurationKnown;
    230228    mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
    231229    bool m_volumeAndMuteInitialized;
Note: See TracChangeset for help on using the changeset viewer.