Changeset 124217 in webkit


Ignore:
Timestamp:
Jul 31, 2012 10:16:24 AM (12 years ago)
Author:
Philippe Normand
Message:

[GStreamer] Live stream support is weak
https://bugs.webkit.org/show_bug.cgi?id=90084

Reviewed by Martin Robinson.

Make sure on-disk buffering is disabled for live streams. It is
enabled initially when loading any remote media file if preload is
set to Auto. Later on if the player detects that the media is live
it disables on-disk buffering. This patch also adds support for
caching the total size of the media.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
(WebCore::MediaPlayerPrivateGStreamer::load): Keep track of the
media url as an instance attribute.
(WebCore::MediaPlayerPrivateGStreamer::duration): Logging improvement.
(WebCore::MediaPlayerPrivateGStreamer::setRate): use the new
isLiveStream() method.
(WebCore::MediaPlayerPrivateGStreamer::buffered): Ditto.
(WebCore::MediaPlayerPrivateGStreamer::handleMessage): Indicate
source of duration message.
(WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Perform an
anonymous duration change emission, mostly to cache its value.
(WebCore::MediaPlayerPrivateGStreamer::totalBytes): Return
cached size when available.
(WebCore::MediaPlayerPrivateGStreamer::updateStates): Use the new
isLiveStream() method and handle state change corner cases for live streams.
(WebCore::MediaPlayerPrivateGStreamer::durationChanged): Cache
media total size and re-enable on-disk buffering if caching succeeds.
(WebCore::MediaPlayerPrivateGStreamer::movieLoadType): New
implementation handling on-disk buffered and live streaming cases.
(WebCore::MediaPlayerPrivateGStreamer::setPreload): Remember the
case where preload is updated from Auto to another value, do
on-disk buffering only for Auto preload attribute.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

(MediaPlayerPrivateGStreamer):
(WebCore::MediaPlayerPrivateGStreamer::isLiveStream): Utility
method, a stream is live if it goes to PAUSE without prerolling.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r124214 r124217  
     12012-07-07  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] Live stream support is weak
     4        https://bugs.webkit.org/show_bug.cgi?id=90084
     5
     6        Reviewed by Martin Robinson.
     7
     8        Make sure on-disk buffering is disabled for live streams. It is
     9        enabled initially when loading any remote media file if preload is
     10        set to Auto. Later on if the player detects that the media is live
     11        it disables on-disk buffering. This patch also adds support for
     12        caching the total size of the media.
     13
     14        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     15        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
     16        (WebCore::MediaPlayerPrivateGStreamer::load): Keep track of the
     17        media url as an instance attribute.
     18        (WebCore::MediaPlayerPrivateGStreamer::duration): Logging improvement.
     19        (WebCore::MediaPlayerPrivateGStreamer::setRate): use the new
     20        isLiveStream() method.
     21        (WebCore::MediaPlayerPrivateGStreamer::buffered): Ditto.
     22        (WebCore::MediaPlayerPrivateGStreamer::handleMessage): Indicate
     23        source of duration message.
     24        (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Perform an
     25        anonymous duration change emission, mostly to cache its value.
     26        (WebCore::MediaPlayerPrivateGStreamer::totalBytes): Return
     27        cached size when available.
     28        (WebCore::MediaPlayerPrivateGStreamer::updateStates): Use the new
     29        isLiveStream() method and handle state change corner cases for live streams.
     30        (WebCore::MediaPlayerPrivateGStreamer::durationChanged): Cache
     31        media total size and re-enable on-disk buffering if caching succeeds.
     32        (WebCore::MediaPlayerPrivateGStreamer::movieLoadType): New
     33        implementation handling on-disk buffered and live streaming cases.
     34        (WebCore::MediaPlayerPrivateGStreamer::setPreload): Remember the
     35        case where preload is updated from Auto to another value, do
     36        on-disk buffering only for Auto preload attribute.
     37        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     38        (MediaPlayerPrivateGStreamer):
     39        (WebCore::MediaPlayerPrivateGStreamer::isLiveStream): Utility
     40        method, a stream is live if it goes to PAUSE without prerolling.
     41
    1422012-07-17  Antonio Gomes  <agomes@rim.com>
    243
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r122670 r124217  
    236236    , m_videoTimerHandler(0)
    237237    , m_webkitAudioSink(0)
     238    , m_totalBytes(-1)
     239    , m_originalPreloadWasAutoAndWasOverridden(false)
    238240{
    239241    if (initializeGStreamerAndRegisterWebKitElements())
     
    293295        cleanUrl = cleanUrl.substring(0, kurl.pathEnd());
    294296
     297    m_url = KURL(KURL(), cleanUrl);
    295298    g_object_set(m_playBin, "uri", cleanUrl.utf8().data(), NULL);
    296299
     
    408411#endif
    409412    if (failure) {
    410         LOG_VERBOSE(Media, "Time duration query failed.");
     413        LOG_VERBOSE(Media, "Time duration query failed for %s", m_url.string().utf8().data());
    411414        return numeric_limits<float>::infinity();
    412415    }
     
    635638        return;
    636639
    637     if (m_isStreaming)
     640    if (isLiveStream())
    638641        return;
    639642
     
    693696{
    694697    RefPtr<TimeRanges> timeRanges = TimeRanges::create();
    695     if (m_errorOccured || m_isStreaming)
     698    if (m_errorOccured || isLiveStream())
    696699        return timeRanges.release();
    697700
     
    724727#else
    725728    float loaded = maxTimeLoaded();
    726     if (!m_errorOccured && !m_isStreaming && loaded > 0)
     729    if (!m_errorOccured && !isLiveStream() && loaded > 0)
    727730        timeRanges->add(0, loaded);
    728731#endif
     
    750753    }
    751754
     755    LOG_VERBOSE(Media, "Message received from element %s", GST_MESSAGE_SRC_NAME(message));
    752756    switch (GST_MESSAGE_TYPE(message)) {
    753757    case GST_MESSAGE_ERROR:
     
    755759            break;
    756760        gst_message_parse_error(message, &err.outPtr(), &debug.outPtr());
    757         LOG_VERBOSE(Media, "Error: %d, %s", err->code,  err->message);
     761        LOG_VERBOSE(Media, "Error %d: %s (url=%s)", err->code, err->message, m_url.string().utf8().data());
    758762
    759763        GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error");
     
    942946unsigned MediaPlayerPrivateGStreamer::totalBytes() const
    943947{
     948    if (m_errorOccured)
     949        return 0;
     950
     951    if (m_totalBytes != -1)
     952        return m_totalBytes;
     953
    944954    if (!m_source)
    945         return 0;
    946 
    947     if (m_errorOccured)
    948955        return 0;
    949956
     
    956963#endif
    957964        LOG_VERBOSE(Media, "totalBytes %" G_GINT64_FORMAT, length);
    958         return static_cast<unsigned>(length);
     965        m_totalBytes = static_cast<unsigned>(length);
     966        m_isStreaming = !length;
     967        return m_totalBytes;
    959968    }
    960969
     
    10041013
    10051014    LOG_VERBOSE(Media, "totalBytes %" G_GINT64_FORMAT, length);
    1006 
    1007     return static_cast<unsigned>(length);
     1015    m_totalBytes = static_cast<unsigned>(length);
     1016    m_isStreaming = !length;
     1017    return m_totalBytes;
    10081018}
    10091019
     
    11511161            m_paused = false;
    11521162
    1153             if (m_buffering) {
     1163            if (m_buffering && !isLiveStream()) {
    11541164                m_readyState = MediaPlayer::HaveCurrentData;
    11551165                m_networkState = MediaPlayer::Loading;
     
    11831193        // Change in progress
    11841194
    1185         if (!m_isStreaming && !m_buffering)
     1195        // On-disk buffering was attempted but the media is live. This
     1196        // can't work so disable on-disk buffering and reset the
     1197        // pipeline.
     1198        if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto) {
     1199            setPreload(MediaPlayer::None);
     1200            gst_element_set_state(m_playBin, GST_STATE_NULL);
     1201            gst_element_set_state(m_playBin, GST_STATE_PAUSED);
     1202        }
     1203
     1204        // A live stream was paused, reset the pipeline.
     1205        if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream()) {
     1206            gst_element_set_state(m_playBin, GST_STATE_NULL);
     1207            gst_element_set_state(m_playBin, GST_STATE_PLAYING);
     1208        }
     1209
     1210        if (!isLiveStream() && !m_buffering)
    11861211            return;
    11871212
     
    14141439    if (previousDuration && m_mediaDuration != previousDuration)
    14151440        m_player->durationChanged();
     1441
     1442    if (m_preload == MediaPlayer::None && m_originalPreloadWasAutoAndWasOverridden) {
     1443        m_totalBytes = -1;
     1444        if (totalBytes() && !isLiveStream()) {
     1445            setPreload(MediaPlayer::Auto);
     1446            gst_element_set_state(m_playBin, GST_STATE_NULL);
     1447            gst_element_set_state(m_playBin, GST_STATE_PAUSED);
     1448        }
     1449    }
    14161450}
    14171451
     
    16431677}
    16441678
     1679MediaPlayer::MovieLoadType MediaPlayerPrivateGStreamer::movieLoadType() const
     1680{
     1681    if (m_readyState == MediaPlayer::HaveNothing)
     1682        return MediaPlayer::Unknown;
     1683
     1684    if (isLiveStream())
     1685        return MediaPlayer::LiveStream;
     1686
     1687    return MediaPlayer::Download;
     1688}
     1689
    16451690void MediaPlayerPrivateGStreamer::setPreload(MediaPlayer::Preload preload)
    16461691{
     1692    m_originalPreloadWasAutoAndWasOverridden = m_preload != preload && m_preload == MediaPlayer::Auto;
     1693
     1694    m_preload = preload;
     1695
    16471696    ASSERT(m_playBin);
    1648 
    1649     m_preload = preload;
    16501697
    16511698    GstPlayFlags flags;
    16521699    g_object_get(m_playBin, "flags", &flags, NULL);
    1653     if (preload == MediaPlayer::None)
     1700    if (m_preload == MediaPlayer::Auto) {
     1701        LOG_VERBOSE(Media, "Enabling on-disk buffering");
     1702        g_object_set(m_playBin, "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL);
     1703    } else {
     1704        LOG_VERBOSE(Media, "Disabling on-disk buffering");
    16541705        g_object_set(m_playBin, "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL);
    1655     else
    1656         g_object_set(m_playBin, "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL);
     1706    }
    16571707
    16581708    if (m_delayingLoad && m_preload != MediaPlayer::None) {
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r123747 r124217  
    125125            unsigned videoDecodedByteCount() const;
    126126
     127            MediaPlayer::MovieLoadType movieLoadType() const;
     128
    127129        private:
    128130            MediaPlayerPrivateGStreamer(MediaPlayer*);
     
    152154
    153155            virtual String engineDescription() const { return "GStreamer"; }
     156            bool isLiveStream() const { return m_isStreaming; }
    154157
    155158        private:
     
    196199            guint m_videoTimerHandler;
    197200            GRefPtr<GstElement> m_webkitAudioSink;
     201            mutable long m_totalBytes;
    198202            GRefPtr<GstPad> m_videoSinkPad;
    199203            mutable IntSize m_videoSize;
     204            KURL m_url;
     205            bool m_originalPreloadWasAutoAndWasOverridden;
    200206    };
    201207}
Note: See TracChangeset for help on using the changeset viewer.