Changeset 52247 in webkit


Ignore:
Timestamp:
Dec 17, 2009 4:13:04 AM (14 years ago)
Author:
Philippe Normand
Message:

2009-12-16 Philippe Normand <pnormand@igalia.com>

Reviewed by Gustavo Noronha Silva.

[GTK] segfault during volume notification
https://bugs.webkit.org/show_bug.cgi?id=32603

Emit volumeChanged and durationChanged upon notification from
GStreamer. Also don't reset the volume property on playbin, it is
not needed as it is 1.0 by default both on playbin and in the
MediaPlayer.

  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp: (WebCore::mediaPlayerPrivateMessageCallback): (WebCore::mediaPlayerPrivateVolumeChangedCallback): (WebCore::notifyVolumeIdleCallback): (WebCore::doGstInit): (WebCore::MediaPlayerPrivate::isAvailable): (WebCore::MediaPlayerPrivate::MediaPlayerPrivate): (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate): (WebCore::MediaPlayerPrivate::volumeChanged): (WebCore::MediaPlayerPrivate::didEnd): (WebCore::MediaPlayerPrivate::durationChanged): (WebCore::mimeTypeCache): (WebCore::MediaPlayerPrivate::createGSTPlayBin):
  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:

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

Reviewed by Gustavo Noronha Silva.

[GStreamer] Should emit {networkState,readyState,volume,time,size,rate,duration}Changed signals
https://bugs.webkit.org/show_bug.cgi?id=30377

Emit volumeChanged and durationChanged upon notification from
GStreamer.

  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp: (WebCore::mediaPlayerPrivateMessageCallback): (WebCore::mediaPlayerPrivateVolumeCallback): (WebCore::notify_volume_idle_cb): (WebCore::MediaPlayerPrivate::didEnd): (WebCore::MediaPlayerPrivate::durationChanged): (WebCore::MediaPlayerPrivate::createGSTPlayBin):
  • platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r52246 r52247  
     12009-11-11  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Gustavo Noronha Silva.
     4
     5        [GStreamer] Should emit {networkState,readyState,volume,time,size,rate,duration}Changed signals
     6        https://bugs.webkit.org/show_bug.cgi?id=30377
     7
     8        Emit volumeChanged and durationChanged upon notification from
     9        GStreamer.
     10
     11        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
     12        (WebCore::mediaPlayerPrivateMessageCallback):
     13        (WebCore::mediaPlayerPrivateVolumeCallback):
     14        (WebCore::notify_volume_idle_cb):
     15        (WebCore::MediaPlayerPrivate::didEnd):
     16        (WebCore::MediaPlayerPrivate::durationChanged):
     17        (WebCore::MediaPlayerPrivate::createGSTPlayBin):
     18        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
     19
     202009-12-16  Philippe Normand  <pnormand@igalia.com>
     21
     22        Reviewed by Gustavo Noronha Silva.
     23
     24        [GTK] segfault during volume notification
     25        https://bugs.webkit.org/show_bug.cgi?id=32603
     26
     27        Emit volumeChanged and durationChanged upon notification from
     28        GStreamer. Also don't reset the volume property on playbin, it is
     29        not needed as it is 1.0 by default both on playbin and in the
     30        MediaPlayer.
     31
     32        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
     33        (WebCore::mediaPlayerPrivateMessageCallback):
     34        (WebCore::mediaPlayerPrivateVolumeChangedCallback):
     35        (WebCore::notifyVolumeIdleCallback):
     36        (WebCore::doGstInit):
     37        (WebCore::MediaPlayerPrivate::isAvailable):
     38        (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
     39        (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
     40        (WebCore::MediaPlayerPrivate::volumeChanged):
     41        (WebCore::MediaPlayerPrivate::didEnd):
     42        (WebCore::MediaPlayerPrivate::durationChanged):
     43        (WebCore::mimeTypeCache):
     44        (WebCore::MediaPlayerPrivate::createGSTPlayBin):
     45        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
     46
    1472009-12-17  Martin Robinson  <martin.james.robinson@gmail.com>
    248
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp

    r52243 r52247  
    9292        LOG_VERBOSE(Media, "Buffering %d", percent);
    9393        break;
     94    case GST_MESSAGE_DURATION:
     95        LOG_VERBOSE(Media, "Duration changed");
     96        mp->durationChanged();
     97        break;
    9498    default:
    9599        LOG_VERBOSE(Media, "Unhandled GStreamer message type: %s",
     
    98102    }
    99103    return true;
     104}
     105
     106void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
     107{
     108    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
     109    mp->volumeChanged();
     110}
     111
     112gboolean notifyVolumeIdleCallback(MediaPlayer* mp)
     113{
     114    mp->volumeChanged();
     115    return FALSE;
    100116}
    101117
     
    147163static bool gstInitialized = false;
    148164
    149 static bool do_gst_init()
     165static bool doGstInit()
    150166{
    151167    // FIXME: We should pass the arguments from the command line
     
    166182bool MediaPlayerPrivate::isAvailable()
    167183{
    168     if (!do_gst_init())
     184    if (!doGstInit())
    169185        return false;
    170186
     
    194210    , m_seeking(false)
    195211    , m_errorOccured(false)
    196 {
    197     do_gst_init();
     212    , m_volumeIdleId(-1)
     213{
     214    doGstInit();
    198215}
    199216
    200217MediaPlayerPrivate::~MediaPlayerPrivate()
    201218{
     219    if (m_volumeIdleId) {
     220        g_source_remove(m_volumeIdleId);
     221        m_volumeIdleId = -1;
     222    }
     223
    202224    if (m_buffer)
    203225        gst_buffer_unref(m_buffer);
     
    405427}
    406428
     429void MediaPlayerPrivate::volumeChanged()
     430{
     431    if (m_volumeIdleId) {
     432        g_source_remove(m_volumeIdleId);
     433        m_volumeIdleId = -1;
     434    }
     435    m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, m_player);
     436}
     437
     438
    407439void MediaPlayerPrivate::setRate(float rate)
    408440{
     
    664696}
    665697
    666 void MediaPlayerPrivate::volumeChanged()
    667 {
    668     m_player->volumeChanged();
    669 }
    670 
    671698void MediaPlayerPrivate::didEnd()
    672699{
    673700    timeChanged();
     701}
     702
     703void MediaPlayerPrivate::durationChanged()
     704{
     705    m_player->durationChanged();
    674706}
    675707
     
    752784{
    753785
    754     do_gst_init();
     786    doGstInit();
    755787
    756788    static HashSet<String> cache;
     
    889921
    890922    g_object_set(G_OBJECT(m_playBin), "uri", url.utf8().data(),
    891         "volume", static_cast<double>(m_player->volume()), NULL);
     923                 NULL);
     924
     925    g_signal_connect(G_OBJECT(m_playBin), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
    892926
    893927    m_videoSink = webkit_video_sink_new();
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h

    r52191 r52247  
    4040namespace WebCore {
    4141
    42     class GraphicsContext;
    43     class IntSize;
    44     class IntRect;
    45     class String;
     42class GraphicsContext;
     43class IntSize;
     44class IntRect;
     45class String;
    4646
    47     gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpointer data);
     47gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpointer data);
     48void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data);
    4849
    49     class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
     50class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
    5051        friend gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpointer data);
    5152        friend void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivate* playerPrivate);
     
    7576            void setRate(float);
    7677            void setVolume(float);
     78            void volumeChanged();
    7779
    7880            int dataRate() const;
     
    9395            void sizeChanged();
    9496            void timeChanged();
    95             void volumeChanged();
    9697            void didEnd();
     98            void durationChanged();
    9799            void loadingFailed(MediaPlayer::NetworkState);
    98100
     
    139141            bool m_seeking;
    140142            bool m_errorOccured;
     143            guint m_volumeIdleId;
    141144    };
    142145}
Note: See TracChangeset for help on using the changeset viewer.