diff options
author | Steve Block <steveblock@google.com> | 2010-02-05 14:27:46 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-02-15 10:49:50 +0000 |
commit | 5e2bc6953fe6923165b8a5d7679939693a1d58d6 (patch) | |
tree | 6ccb8c24bc2bf5e8f413e6cfae250b729b426631 /WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp | |
parent | 4a00f4fccc3cb7e9996749a05631f5d7b9de756e (diff) | |
download | external_webkit-5e2bc6953fe6923165b8a5d7679939693a1d58d6.zip external_webkit-5e2bc6953fe6923165b8a5d7679939693a1d58d6.tar.gz external_webkit-5e2bc6953fe6923165b8a5d7679939693a1d58d6.tar.bz2 |
Merge webkit.org at r54340 : Initial merge by git
Change-Id: Ib489d2ff91186ea3652522e1d586e54416a2cf44
Diffstat (limited to 'WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp')
-rw-r--r-- | WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp | 152 |
1 files changed, 108 insertions, 44 deletions
diff --git a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp index 41f90f0..0372021 100644 --- a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp +++ b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp @@ -32,6 +32,7 @@ #include "Document.h" #include "Frame.h" #include "FrameView.h" +#include "GOwnPtrGtk.h" #include "GraphicsContext.h" #include "IntRect.h" #include "KURL.h" @@ -131,63 +132,87 @@ gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpo void mediaPlayerPrivateSourceChangedCallback(GObject *object, GParamSpec *pspec, gpointer data) { MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data); - GstElement* element; + GOwnPtr<GstElement> element; - g_object_get(mp->m_playBin, "source", &element, NULL); - gst_object_replace((GstObject**) &mp->m_source, (GstObject*) element); + g_object_get(mp->m_playBin, "source", &element.outPtr(), NULL); + gst_object_replace((GstObject**) &mp->m_source, (GstObject*) element.get()); - if (element) { - GParamSpec* pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(element), "cookies"); + if (!element) + return; - // First check if the source element has a cookies property - // of the format we expect - if (!pspec || pspec->value_type != G_TYPE_STRV) - return; + GOwnPtr<char> location; + g_object_get(element.get(), "location", &location.outPtr(), NULL); - // Then get the cookies for the URI and set them - SoupSession* session = webkit_get_default_session(); - SoupCookieJar* cookieJar = SOUP_COOKIE_JAR(soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR)); + // Do injection only for elements dealing with uris. + if (!gst_uri_is_valid(location.get())) + return; - char* location; - g_object_get(element, "location", &location, NULL); + GOwnPtr<SoupURI> uri(soup_uri_new(location.get())); - SoupURI* uri = soup_uri_new(location); - g_free(location); + // Do injection only for http(s) uris. + if (!SOUP_URI_VALID_FOR_HTTP(uri)) + return; - // Let Apple web servers know we want to access their nice movie trailers. - if (g_str_equal(uri->host, "movies.apple.com")) - g_object_set(element, "user-agent", "Quicktime/7.2.0", NULL); + // Let Apple web servers know we want to access their nice movie trailers. + if (g_str_equal(uri->host, "movies.apple.com")) + g_object_set(element.get(), "user-agent", "Quicktime/7.2.0", NULL); + + // Set the HTTP referer. + Frame* frame = mp->m_player->frameView() ? mp->m_player->frameView()->frame() : 0; + Document* document = frame ? frame->document() : 0; + if (document) { + GstStructure* extraHeaders = gst_structure_new("extra-headers", + "Referer", G_TYPE_STRING, + document->documentURI().utf8().data(), 0); + g_object_set(element.get(), "extra-headers", extraHeaders, NULL); + gst_structure_free(extraHeaders); + } - char* cookies = soup_cookie_jar_get_cookies(cookieJar, uri, FALSE); - soup_uri_free(uri); + // Deal with the cookies from now on. + GParamSpec* cookiesParamSpec = g_object_class_find_property(G_OBJECT_GET_CLASS(element.get()), "cookies"); - char* cookiesStrv[] = {cookies, NULL}; - g_object_set(element, "cookies", cookiesStrv, NULL); - g_free(cookies); + // First check if the source element has a cookies property + // of the format we expect + if (!cookiesParamSpec || cookiesParamSpec->value_type != G_TYPE_STRV) + return; - Frame* frame = mp->m_player->frameView() ? mp->m_player->frameView()->frame() : 0; - Document* document = frame ? frame->document() : 0; - if (document) { - GstStructure* extraHeaders = gst_structure_new("extra-headers", - "Referer", G_TYPE_STRING, - document->documentURI().utf8().data(), 0); - g_object_set(element, "extra-headers", extraHeaders, NULL); - gst_structure_free(extraHeaders); - } - } + // Then get the cookies for the URI and set them + SoupSession* session = webkit_get_default_session(); + SoupSessionFeature* cookieJarFeature = soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR); + if (!cookieJarFeature) + return; - gst_object_unref(element); + SoupCookieJar* cookieJar = SOUP_COOKIE_JAR(cookieJarFeature); + GOwnPtr<char> cookies(soup_cookie_jar_get_cookies(cookieJar, uri.get(), FALSE)); + char* cookiesStrv[] = {cookies.get(), 0}; + g_object_set(element.get(), "cookies", cookiesStrv, NULL); } void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data) { + // This is called when playbin receives the notify::volume signal. MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data); mp->volumeChanged(); } -gboolean notifyVolumeIdleCallback(MediaPlayer* mp) +gboolean notifyVolumeIdleCallback(gpointer data) { - mp->volumeChanged(); + MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data); + mp->volumeChangedCallback(); + return FALSE; +} + +void mediaPlayerPrivateMuteChangedCallback(GObject *element, GParamSpec *pspec, gpointer data) +{ + // This is called when playbin receives the notify::mute signal. + MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data); + mp->muteChanged(); +} + +gboolean notifyMuteIdleCallback(gpointer data) +{ + MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data); + mp->muteChangedCallback(); return FALSE; } @@ -291,8 +316,9 @@ MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player) , m_seeking(false) , m_playbackRate(1) , m_errorOccured(false) - , m_volumeIdleId(-1) + , m_volumeIdleId(0) , m_mediaDuration(0.0) + , m_muteIdleId(0) { doGstInit(); } @@ -301,7 +327,12 @@ MediaPlayerPrivate::~MediaPlayerPrivate() { if (m_volumeIdleId) { g_source_remove(m_volumeIdleId); - m_volumeIdleId = -1; + m_volumeIdleId = 0; + } + + if (m_muteIdleId) { + g_source_remove(m_muteIdleId); + m_muteIdleId = 0; } if (m_buffer) @@ -532,16 +563,20 @@ void MediaPlayerPrivate::setVolume(float volume) g_object_set(m_playBin, "volume", static_cast<double>(volume), NULL); } +void MediaPlayerPrivate::volumeChangedCallback() +{ + double volume; + g_object_get(m_playBin, "volume", &volume, NULL); + m_player->volumeChanged(static_cast<float>(volume)); +} + void MediaPlayerPrivate::volumeChanged() { - if (m_volumeIdleId) { + if (m_volumeIdleId) g_source_remove(m_volumeIdleId); - m_volumeIdleId = -1; - } - m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, m_player); + m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, this); } - void MediaPlayerPrivate::setRate(float rate) { // Avoid useless playback rate update. @@ -922,6 +957,34 @@ void MediaPlayerPrivate::durationChanged() m_player->durationChanged(); } +bool MediaPlayerPrivate::supportsMuting() const +{ + return true; +} + +void MediaPlayerPrivate::setMuted(bool muted) +{ + if (!m_playBin) + return; + + g_object_set(m_playBin, "mute", muted, NULL); +} + +void MediaPlayerPrivate::muteChangedCallback() +{ + gboolean muted; + g_object_get(m_playBin, "mute", &muted, NULL); + m_player->muteChanged(static_cast<bool>(muted)); +} + +void MediaPlayerPrivate::muteChanged() +{ + if (m_muteIdleId) + g_source_remove(m_muteIdleId); + + m_muteIdleId = g_idle_add((GSourceFunc) notifyMuteIdleCallback, this); +} + void MediaPlayerPrivate::loadingFailed(MediaPlayer::NetworkState error) { m_errorOccured = true; @@ -1140,6 +1203,7 @@ void MediaPlayerPrivate::createGSTPlayBin(String url) g_signal_connect(m_playBin, "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this); g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this); + g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this); m_videoSink = webkit_video_sink_new(); |