Changeset 50726 in webkit


Ignore:
Timestamp:
Nov 10, 2009 1:45:52 AM (15 years ago)
Author:
eric@webkit.org
Message:

2009-11-10 Philippe Normand <pnormand@igalia.com>

Reviewed by Jan Alonzo.

https://bugs.webkit.org/show_bug.cgi?id=31047
[GTK] Failing test media/video-played-ranges-1.html

Fix playback rate setter by remembering the rate was changed. Also
correctly handle reverse playback by doing a seek from end to
beginning of the media.

  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivate::MediaPlayerPrivate): (WebCore::MediaPlayerPrivate::currentTime): (WebCore::MediaPlayerPrivate::seek): (WebCore::MediaPlayerPrivate::hasAudio): (WebCore::MediaPlayerPrivate::setVolume): (WebCore::MediaPlayerPrivate::setRate): (WebCore::MediaPlayerPrivate::updateStates):
  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r50725 r50726  
     12009-11-10  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Jan Alonzo.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=31047
     6        [GTK] Failing test media/video-played-ranges-1.html
     7
     8        Fix playback rate setter by remembering the rate was changed. Also
     9        correctly handle reverse playback by doing a seek from end to
     10        beginning of the media.
     11
     12        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
     13        (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
     14        (WebCore::MediaPlayerPrivate::currentTime):
     15        (WebCore::MediaPlayerPrivate::seek):
     16        (WebCore::MediaPlayerPrivate::hasAudio):
     17        (WebCore::MediaPlayerPrivate::setVolume):
     18        (WebCore::MediaPlayerPrivate::setRate):
     19        (WebCore::MediaPlayerPrivate::updateStates):
     20        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
     21
    1222009-11-10  Oliver Hunt  <oliver@apple.com>
    223
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp

    r50424 r50726  
    100100}
    101101
     102static float playbackPosition(GstElement* playbin)
     103{
     104
     105    float ret = 0.0;
     106
     107    GstQuery* query = gst_query_new_position(GST_FORMAT_TIME);
     108    if (!gst_element_query(playbin, query)) {
     109        LOG_VERBOSE(Media, "Position query failed...");
     110        gst_query_unref(query);
     111        return ret;
     112    }
     113
     114    gint64 position;
     115    gst_query_parse_position(query, 0, &position);
     116
     117    // Position is available only if the pipeline is not in NULL or
     118    // READY state.
     119    if (position != GST_CLOCK_TIME_NONE)
     120        ret = (float) (position / 1000000000.0);
     121
     122    LOG_VERBOSE(Media, "Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
     123
     124    gst_query_unref(query);
     125
     126    return ret;
     127}
     128
    102129void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivate* playerPrivate)
    103130{
     
    138165    , m_source(0)
    139166    , m_seekTime(0)
     167    , m_changingRate(false)
    140168    , m_endTime(numeric_limits<float>::infinity())
    141169    , m_networkState(MediaPlayer::Empty)
     
    230258        return m_seekTime;
    231259
    232     float ret = 0.0;
    233 
    234     GstQuery* query = gst_query_new_position(GST_FORMAT_TIME);
    235     if (!gst_element_query(m_playBin, query)) {
    236         LOG_VERBOSE(Media, "Position query failed...");
    237         gst_query_unref(query);
    238         return ret;
    239     }
    240 
    241     gint64 position;
    242     gst_query_parse_position(query, 0, &position);
    243     ret = (float) (position / 1000000000.0);
    244     LOG_VERBOSE(Media, "Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
    245 
    246     gst_query_unref(query);
    247 
    248     return ret;
     260    return playbackPosition(m_playBin);
     261
    249262}
    250263
     
    272285        m_seeking = true;
    273286        m_seekTime = sec;
     287        // Wait some time for the seek to complete.
     288        gst_element_get_state(m_playBin, 0, 0, 40 * GST_MSECOND);
    274289    }
    275290}
     
    364379void MediaPlayerPrivate::setRate(float rate)
    365380{
    366     if (rate == 0.0) {
    367         gst_element_set_state(m_playBin, GST_STATE_PAUSED);
    368         return;
    369     }
     381    GstState state;
     382    GstState pending;
     383
     384    gst_element_get_state(m_playBin,
     385        &state, &pending, 250 * GST_NSECOND);
     386    if (state != GST_STATE_PLAYING && state != GST_STATE_PAUSED)
     387        return;
    370388
    371389    if (m_isStreaming)
    372390        return;
    373391
     392    m_changingRate = true;
     393    float currentPosition = playbackPosition(m_playBin) * GST_SECOND;
     394    GstSeekFlags flags = (GstSeekFlags)(GST_SEEK_FLAG_FLUSH);
     395    gint64 start, end;
     396    bool mute = false;
     397
    374398    LOG_VERBOSE(Media, "Set Rate to %f", rate);
    375     seek(currentTime());
     399    if (rate >= 0) {
     400        // Mute the sound if the playback rate is too extreme.
     401        // TODO: in other cases we should perform pitch adjustments.
     402        mute = (bool) (rate < 0.8 || rate > 2);
     403        start = currentPosition;
     404        end = GST_CLOCK_TIME_NONE;
     405    } else {
     406        start = 0;
     407        mute = true;
     408
     409        // If we are at beginning of media, start from the end to
     410        // avoid immediate EOS.
     411        if (currentPosition == 0 || currentPosition == -1)
     412            end = duration() * GST_SECOND;
     413        else
     414            end = currentPosition;
     415    }
     416
     417    LOG_VERBOSE(Media, "Need to mute audio: %d", (int) mute);
     418
     419    if (!gst_element_seek(m_playBin, rate, GST_FORMAT_TIME, flags,
     420                          GST_SEEK_TYPE_SET, start,
     421                          GST_SEEK_TYPE_SET, end))
     422        LOG_VERBOSE(Media, "Set rate to %f failed", rate);
     423    else {
     424        g_object_set(m_playBin, "mute", mute, NULL);
     425        // Wait some time for the seek to complete.
     426        gst_element_get_state(m_playBin, 0, 0, 40 * GST_MSECOND);
     427    }
    376428}
    377429
     
    507559        } else
    508560            m_paused = true;
     561
     562        if (m_changingRate) {
     563            m_player->rateChanged();
     564            m_changingRate = false;
     565        }
    509566
    510567        if (m_seeking) {
     
    567624
    568625void MediaPlayerPrivate::loadStateChanged()
    569 {
    570     updateStates();
    571 }
    572 
    573 void MediaPlayerPrivate::rateChanged()
    574626{
    575627    updateStates();
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h

    r50424 r50726  
    9191
    9292            void loadStateChanged();
    93             void rateChanged();
    9493            void sizeChanged();
    9594            void timeChanged();
     
    127126            GstElement* m_source;
    128127            GstClockTime m_seekTime;
     128            bool m_changingRate;
    129129            float m_endTime;
    130130            bool m_isEndReached;
Note: See TracChangeset for help on using the changeset viewer.