summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2010-02-05 14:27:46 +0000
committerSteve Block <steveblock@google.com>2010-02-15 10:49:50 +0000
commit5e2bc6953fe6923165b8a5d7679939693a1d58d6 (patch)
tree6ccb8c24bc2bf5e8f413e6cfae250b729b426631 /WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
parent4a00f4fccc3cb7e9996749a05631f5d7b9de756e (diff)
downloadexternal_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.cpp152
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();