Hello community, here is the log from the commit of package libQtWebKit4 for openSUSE:Factory checked in at 2013-04-05 09:28:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libQtWebKit4 (Old) and /work/SRC/openSUSE:Factory/.libQtWebKit4.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libQtWebKit4", Maintainer is "dmuel...@suse.com" Changes: -------- --- /work/SRC/openSUSE:Factory/libQtWebKit4/libQtWebKit4.changes 2013-04-03 13:01:49.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libQtWebKit4.new/libQtWebKit4.changes 2013-04-05 09:28:09.000000000 +0200 @@ -1,0 +2,8 @@ +Tue Apr 2 14:06:42 UTC 2013 - hrvoje.sen...@gmail.com + +- Added buffer-ranges.patch, fixes buffering with gstreamer 1.0 + (webkit#105319) + and MediaPlayerPrivateGStreamer-should-take-ownership-of-the-playbin.patch + (webkit#107445) + +------------------------------------------------------------------- New: ---- MediaPlayerPrivateGStreamer-should-take-ownership-of-the-playbin.patch buffer-ranges.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libQtWebKit4.spec ++++++ --- /var/tmp/diff_new_pack.Hc4jnM/_old 2013-04-05 09:28:14.000000000 +0200 +++ /var/tmp/diff_new_pack.Hc4jnM/_new 2013-04-05 09:28:14.000000000 +0200 @@ -44,6 +44,10 @@ Patch8: qwebview-buildfixes.diff # PATCH-FEATURE-UPSTREAM Patch9: gstreamer-1.0.diff +# PATCH-FIX-UPSTREAM buffer-ranges.patch hrvoje.sen...@gmail.com -- Use different method for buffering with gstreamer 1.0 +Patch10: buffer-ranges.patch +# PATCH-FIX-UPSTREAM hrvoje.sen...@gmail.com -- Call gst_object_ref_sink() on the playbin object to take ownership of it +Patch11: MediaPlayerPrivateGStreamer-should-take-ownership-of-the-playbin.patch BuildRequires: bison BuildRequires: fdupes BuildRequires: flex @@ -113,6 +117,8 @@ %patch8 %if 0%{?suse_version} >= 1230 %patch9 -p1 +%patch10 -p1 +%patch11 -p1 %endif %build ++++++ MediaPlayerPrivateGStreamer-should-take-ownership-of-the-playbin.patch ++++++ >From e387c506a0dfe4b62a9e8beedc76d1abcc177c24 Mon Sep 17 00:00:00 2001 From: christophe.dumez <christophe.du...@intel.com> Date: Mon, 4 Mar 2013 11:26:04 +0100 Subject: [PATCH] [gstreamer] MediaPlayerPrivateGStreamer should take ownership of the playbin https://bugs.webkit.org/show_bug.cgi?id=107445 Reviewed by Philippe Normand. In gstreamer 1.0, gst_element_factory_make() now returns a floating reference. MediaPlayerPrivateGStreamer calls gst_element_factory_make() to create the playbin object but does not take ownership of the object. As a consequence, the object keeps floating until it is unref'd in the MediaPlayerPrivateGStreamer destructor. This patch uses a GRefPtr<GstElement> to store the playbin object and only adopt the object returned by gst_element_factory_make() if gstreamer 0.10 is used. When gstreamer 1.0 is used, the returned object will not be adopted, which will remove the floating reference. This way, we ensure that the playbin object is owned by MediaPlayerPrivateGStreamer. No new tests, no behavior change for layout tests. * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::load): (WebCore::MediaPlayerPrivateGStreamer::playbackPosition): (WebCore::MediaPlayerPrivateGStreamer::changePipelineState): (WebCore::MediaPlayerPrivateGStreamer::duration): (WebCore::MediaPlayerPrivateGStreamer::seek): (WebCore::MediaPlayerPrivateGStreamer::paused): (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideo): (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudio): (WebCore::MediaPlayerPrivateGStreamer::setVolume): (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange): (WebCore::MediaPlayerPrivateGStreamer::setRate): (WebCore::MediaPlayerPrivateGStreamer::buffered): (WebCore::MediaPlayerPrivateGStreamer::handleMessage): (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (MediaPlayerPrivateGStreamer): Change-Id: I441285d33189c4afc26e9608bc0993716c24d7ed git-svn-id: http://svn.webkit.org/repository/webkit/trunk@140414 268f45cc-cd09-0410-ab3c-d52691b4dbfc Reviewed-by: Jocelyn Turcotte <jocelyn.turco...@digia.com> --- .../gstreamer/MediaPlayerPrivateGStreamer.cpp | 128 ++++++++++---------- .../gstreamer/MediaPlayerPrivateGStreamer.h | 2 +- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp index 736fd5a..cd34c18 100644 --- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp +++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp @@ -204,7 +204,6 @@ bool MediaPlayerPrivateGStreamer::isAvai MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) : m_player(player) - , m_playBin(0) , m_webkitVideoSink(0) , m_fpsSink(0) , m_source(0) @@ -270,8 +269,7 @@ MediaPlayerPrivateGStreamer::~MediaPlaye #endif if (m_playBin) { - gst_element_set_state(m_playBin, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(m_playBin)); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); m_playBin = 0; } @@ -301,7 +299,7 @@ void MediaPlayerPrivateGStreamer::load(c cleanUrl = cleanUrl.substring(0, kurl.pathEnd()); m_url = KURL(KURL(), cleanUrl); - g_object_set(m_playBin, "uri", cleanUrl.utf8().data(), NULL); + g_object_set(m_playBin.get(), "uri", cleanUrl.utf8().data(), NULL); LOG_MEDIA_MESSAGE("Load %s", cleanUrl.utf8().data()); @@ -319,7 +317,7 @@ void MediaPlayerPrivateGStreamer::load(c // GStreamer needs to have the pipeline set to a paused state to // start providing anything useful. - gst_element_set_state(m_playBin, GST_STATE_PAUSED); + gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); if (!m_delayingLoad) commitLoad(); @@ -348,7 +346,7 @@ float MediaPlayerPrivateGStreamer::playb float ret = 0.0f; GstQuery* query = gst_query_new_position(GST_FORMAT_TIME); - if (!gst_element_query(m_playBin, query)) { + if (!gst_element_query(m_playBin.get(), query)) { LOG_MEDIA_MESSAGE("Position query failed..."); gst_query_unref(query); return ret; @@ -376,12 +374,12 @@ bool MediaPlayerPrivateGStreamer::change GstState currentState; GstState pending; - gst_element_get_state(m_playBin, ¤tState, &pending, 0); + gst_element_get_state(m_playBin.get(), ¤tState, &pending, 0); LOG_MEDIA_MESSAGE("Current state: %s, pending: %s", gst_element_state_get_name(currentState), gst_element_state_get_name(pending)); if (currentState == newState || pending == newState) return true; - GstStateChangeReturn setStateResult = gst_element_set_state(m_playBin, newState); + GstStateChangeReturn setStateResult = gst_element_set_state(m_playBin.get(), newState); GstState pausedOrPlaying = newState == GST_STATE_PLAYING ? GST_STATE_PAUSED : GST_STATE_PLAYING; if (currentState != pausedOrPlaying && setStateResult == GST_STATE_CHANGE_FAILURE) { loadingFailed(MediaPlayer::Empty); @@ -437,9 +435,9 @@ float MediaPlayerPrivateGStreamer::durat gint64 timeLength = 0; #ifdef GST_API_VERSION_1 - bool failure = !gst_element_query_duration(m_playBin, timeFormat, &timeLength) || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; + bool failure = !gst_element_query_duration(m_playBin.get(), timeFormat, &timeLength) || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; #else - bool failure = !gst_element_query_duration(m_playBin, &timeFormat, &timeLength) || timeFormat != GST_FORMAT_TIME || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; + bool failure = !gst_element_query_duration(m_playBin.get(), &timeFormat, &timeLength) || timeFormat != GST_FORMAT_TIME || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; #endif if (failure) { LOG_MEDIA_MESSAGE("Time duration query failed for %s", m_url.string().utf8().data()); @@ -502,7 +500,7 @@ void MediaPlayerPrivateGStreamer::seek(f GstClockTime clockTime = GST_TIMEVAL_TO_TIME(timeValue); LOG_MEDIA_MESSAGE("Seek: %" GST_TIME_FORMAT, GST_TIME_ARGS(clockTime)); - if (!gst_element_seek(m_playBin, m_player->rate(), + if (!gst_element_seek(m_playBin.get(), m_player->rate(), GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), GST_SEEK_TYPE_SET, clockTime, @@ -522,7 +520,7 @@ bool MediaPlayerPrivateGStreamer::paused } GstState state; - gst_element_get_state(m_playBin, &state, 0, 0); + gst_element_get_state(m_playBin.get(), &state, 0, 0); return state == GST_STATE_PAUSED; } @@ -604,7 +602,7 @@ void MediaPlayerPrivateGStreamer::notify gint videoTracks = 0; if (m_playBin) - g_object_get(m_playBin, "n-video", &videoTracks, NULL); + g_object_get(m_playBin.get(), "n-video", &videoTracks, NULL); m_hasVideo = videoTracks > 0; @@ -626,7 +624,7 @@ void MediaPlayerPrivateGStreamer::notify gint audioTracks = 0; if (m_playBin) - g_object_get(m_playBin, "n-audio", &audioTracks, NULL); + g_object_get(m_playBin.get(), "n-audio", &audioTracks, NULL); m_hasAudio = audioTracks > 0; m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player); } @@ -636,7 +634,7 @@ void MediaPlayerPrivateGStreamer::setVol if (!m_playBin) return; - gst_stream_volume_set_volume(GST_STREAM_VOLUME(m_playBin), GST_STREAM_VOLUME_FORMAT_CUBIC, + gst_stream_volume_set_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC, static_cast<double>(volume)); } @@ -647,7 +645,7 @@ void MediaPlayerPrivateGStreamer::notify if (!m_player || !m_playBin) return; double volume; - volume = gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin), GST_STREAM_VOLUME_FORMAT_CUBIC); + volume = gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC); // get_volume() can return values superior to 1.0 if the user // applies software user gain via third party application (GNOME // volume control for instance). @@ -671,7 +669,7 @@ void MediaPlayerPrivateGStreamer::setRat GstState state; GstState pending; - gst_element_get_state(m_playBin, &state, &pending, 0); + gst_element_get_state(m_playBin.get(), &state, &pending, 0); if ((state != GST_STATE_PLAYING && state != GST_STATE_PAUSED) || (pending == GST_STATE_PAUSED)) return; @@ -683,7 +681,7 @@ void MediaPlayerPrivateGStreamer::setRat m_changingRate = true; if (!rate) { - gst_element_set_state(m_playBin, GST_STATE_PAUSED); + gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); return; } @@ -713,12 +711,12 @@ void MediaPlayerPrivateGStreamer::setRat LOG_MEDIA_MESSAGE("Need to mute audio: %d", (int) mute); - if (!gst_element_seek(m_playBin, rate, GST_FORMAT_TIME, flags, + if (!gst_element_seek(m_playBin.get(), rate, GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, end)) LOG_MEDIA_MESSAGE("Set rate to %f failed", rate); else - g_object_set(m_playBin, "mute", mute, NULL); + g_object_set(m_playBin.get(), "mute", mute, NULL); } MediaPlayer::NetworkState MediaPlayerPrivateGStreamer::networkState() const @@ -744,7 +742,7 @@ PassRefPtr<TimeRanges> MediaPlayerPrivat GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT); - if (!gst_element_query(m_playBin, query)) { + if (!gst_element_query(m_playBin.get(), query)) { gst_query_unref(query); return timeRanges.release(); } @@ -799,7 +797,7 @@ gboolean MediaPlayerPrivateGStreamer::ha gst_message_parse_error(message, &err.outPtr(), &debug.outPtr()); LOG_MEDIA_MESSAGE("Error %d: %s (url=%s)", err->code, err->message, m_url.string().utf8().data()); - GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error"); + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin.get()), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error"); error = MediaPlayer::Empty; if (err->code == GST_STREAM_ERROR_CODEC_NOT_FOUND @@ -840,7 +838,7 @@ gboolean MediaPlayerPrivateGStreamer::ha // Ignore state changes from internal elements. They are // forwarded to playbin2 anyway. - if (GST_MESSAGE_SRC(message) == reinterpret_cast<GstObject*>(m_playBin)) { + if (GST_MESSAGE_SRC(message) == reinterpret_cast<GstObject*>(m_playBin.get())) { updateStates(); // Construct a filename for the graphviz dot file output. @@ -851,7 +849,7 @@ gboolean MediaPlayerPrivateGStreamer::ha gst_element_state_get_name(oldState), gst_element_state_get_name(newState)).utf8(); - GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin), GST_DEBUG_GRAPH_SHOW_ALL, dotFileName.data()); + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin.get()), GST_DEBUG_GRAPH_SHOW_ALL, dotFileName.data()); } break; case GST_MESSAGE_BUFFERING: @@ -908,7 +906,7 @@ void MediaPlayerPrivateGStreamer::fillTi { GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT); - if (!gst_element_query(m_playBin, query)) { + if (!gst_element_query(m_playBin.get(), query)) { gst_query_unref(query); return; } @@ -1107,7 +1105,7 @@ void MediaPlayerPrivateGStreamer::update GstElement* sinkPtr = 0; - g_object_get(m_playBin, "audio-sink", &sinkPtr, NULL); + g_object_get(m_playBin.get(), "audio-sink", &sinkPtr, NULL); m_webkitAudioSink = adoptGRef(sinkPtr); } @@ -1117,7 +1115,7 @@ void MediaPlayerPrivateGStreamer::source { GstElement* srcPtr = 0; - g_object_get(m_playBin, "source", &srcPtr, NULL); + g_object_get(m_playBin.get(), "source", &srcPtr, NULL); m_source = adoptGRef(srcPtr); if (WEBKIT_IS_WEB_SRC(m_source.get())) @@ -1130,7 +1128,7 @@ void MediaPlayerPrivateGStreamer::cancel return; if (m_playBin) - gst_element_set_state(m_playBin, GST_STATE_NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); } void MediaPlayerPrivateGStreamer::updateStates() @@ -1146,7 +1144,7 @@ void MediaPlayerPrivateGStreamer::update GstState state; GstState pending; - GstStateChangeReturn ret = gst_element_get_state(m_playBin, + GstStateChangeReturn ret = gst_element_get_state(m_playBin.get(), &state, &pending, 250 * GST_NSECOND); bool shouldUpdateAfterSeek = false; @@ -1195,7 +1193,7 @@ void MediaPlayerPrivateGStreamer::update if (!m_paused) { LOG_MEDIA_MESSAGE("[Buffering] Restarting playback."); - gst_element_set_state(m_playBin, GST_STATE_PLAYING); + gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); } } else if (!m_buffering && (currentTime() < duration())) { m_paused = true; @@ -1210,7 +1208,7 @@ void MediaPlayerPrivateGStreamer::update LOG_MEDIA_MESSAGE("[Buffering] Pausing stream for buffering."); - gst_element_set_state(m_playBin, GST_STATE_PAUSED); + gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); } } else m_paused = true; @@ -1241,14 +1239,14 @@ void MediaPlayerPrivateGStreamer::update // pipeline. if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto) { setPreload(MediaPlayer::None); - gst_element_set_state(m_playBin, GST_STATE_NULL); - gst_element_set_state(m_playBin, GST_STATE_PAUSED); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); } // A live stream was paused, reset the pipeline. if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream()) { - gst_element_set_state(m_playBin, GST_STATE_NULL); - gst_element_set_state(m_playBin, GST_STATE_PLAYING); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); } if (!isLiveStream() && !m_buffering) @@ -1284,9 +1282,9 @@ void MediaPlayerPrivateGStreamer::update shouldUpdateAfterSeek = true; m_seeking = false; if (!m_paused) - gst_element_set_state(m_playBin, GST_STATE_PLAYING); + gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); } else if (!m_paused) - gst_element_set_state(m_playBin, GST_STATE_PLAYING); + gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); m_networkState = MediaPlayer::Loading; break; @@ -1372,7 +1370,7 @@ bool MediaPlayerPrivateGStreamer::loadNe // append the value of new-location to it. gchar* currentLocation = 0; - g_object_get(m_playBin, "uri", ¤tLocation, NULL); + g_object_get(m_playBin.get(), "uri", ¤tLocation, NULL); KURL currentUrl(KURL(), currentLocation); g_free(currentLocation); @@ -1396,14 +1394,14 @@ bool MediaPlayerPrivateGStreamer::loadNe // Reset pipeline state. m_resetPipeline = true; - gst_element_set_state(m_playBin, GST_STATE_READY); + gst_element_set_state(m_playBin.get(), GST_STATE_READY); GstState state; - gst_element_get_state(m_playBin, &state, 0, 0); + gst_element_get_state(m_playBin.get(), &state, 0, 0); if (state <= GST_STATE_READY) { // Set the new uri and start playing. - g_object_set(m_playBin, "uri", newUrl.string().utf8().data(), NULL); - gst_element_set_state(m_playBin, GST_STATE_PLAYING); + g_object_set(m_playBin.get(), "uri", newUrl.string().utf8().data(), NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); return true; } } @@ -1446,7 +1444,7 @@ void MediaPlayerPrivateGStreamer::didEnd if (!m_player->mediaPlayerClient()->mediaPlayerIsLooping()) { m_paused = true; - gst_element_set_state(m_playBin, GST_STATE_NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); } } @@ -1457,7 +1455,7 @@ void MediaPlayerPrivateGStreamer::cacheD // And re-cache it if possible. GstState state; - gst_element_get_state(m_playBin, &state, 0, 0); + gst_element_get_state(m_playBin.get(), &state, 0, 0); float newDuration = duration(); if (state <= GST_STATE_READY) { @@ -1491,8 +1489,8 @@ void MediaPlayerPrivateGStreamer::durati m_totalBytes = -1; if (totalBytes() && !isLiveStream()) { setPreload(MediaPlayer::Auto); - gst_element_set_state(m_playBin, GST_STATE_NULL); - gst_element_set_state(m_playBin, GST_STATE_PAUSED); + gst_element_set_state(m_playBin.get(), GST_STATE_NULL); + gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); } } } @@ -1507,7 +1505,7 @@ void MediaPlayerPrivateGStreamer::setMut if (!m_playBin) return; - g_object_set(m_playBin, "mute", muted, NULL); + g_object_set(m_playBin.get(), "mute", muted, NULL); } void MediaPlayerPrivateGStreamer::notifyPlayerOfMute() @@ -1518,7 +1516,7 @@ void MediaPlayerPrivateGStreamer::notify return; gboolean muted; - g_object_get(m_playBin, "mute", &muted, NULL); + g_object_get(m_playBin.get(), "mute", &muted, NULL); m_player->muteChanged(static_cast<bool>(muted)); } @@ -1744,13 +1742,13 @@ void MediaPlayerPrivateGStreamer::setPre ASSERT(m_playBin); GstPlayFlags flags; - g_object_get(m_playBin, "flags", &flags, NULL); + g_object_get(m_playBin.get(), "flags", &flags, NULL); if (m_preload == MediaPlayer::Auto) { LOG_MEDIA_MESSAGE("Enabling on-disk buffering"); - g_object_set(m_playBin, "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL); + g_object_set(m_playBin.get(), "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL); } else { LOG_MEDIA_MESSAGE("Disabling on-disk buffering"); - g_object_set(m_playBin, "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL); + g_object_set(m_playBin.get(), "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL); } if (m_delayingLoad && m_preload != MediaPlayer::None) { @@ -1762,24 +1760,27 @@ void MediaPlayerPrivateGStreamer::setPre void MediaPlayerPrivateGStreamer::createGSTPlayBin() { ASSERT(!m_playBin); + + // gst_element_factory_make() returns a floating reference so + // we should not adopt. m_playBin = gst_element_factory_make(gPlaybinName, "play"); #ifndef GST_API_VERSION_1 - m_gstGWorld = GStreamerGWorld::createGWorld(m_playBin); + m_gstGWorld = GStreamerGWorld::createGWorld(m_playBin.get()); #endif - GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_playBin)); + GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_playBin.get())); gst_bus_add_signal_watch(bus); g_signal_connect(bus, "message", G_CALLBACK(mediaPlayerPrivateMessageCallback), this); gst_object_unref(bus); - g_object_set(m_playBin, "mute", m_player->muted(), NULL); + g_object_set(m_playBin.get(), "mute", m_player->muted(), NULL); - 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); - g_signal_connect(m_playBin, "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this); - g_signal_connect(m_playBin, "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this); + g_signal_connect(m_playBin.get(), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this); + g_signal_connect(m_playBin.get(), "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this); + g_signal_connect(m_playBin.get(), "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this); + g_signal_connect(m_playBin.get(), "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this); + g_signal_connect(m_playBin.get(), "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this); #ifndef GST_API_VERSION_1 m_webkitVideoSink = webkitVideoSinkNew(m_gstGWorld.get()); @@ -1862,9 +1863,9 @@ void MediaPlayerPrivateGStreamer::create gst_element_add_pad(m_videoSinkBin, gst_ghost_pad_new("sink", pad.get())); // Set the bin as video sink of playbin. - g_object_set(m_playBin, "video-sink", m_videoSinkBin, NULL); + g_object_set(m_playBin.get(), "video-sink", m_videoSinkBin, NULL); #else - g_object_set(m_playBin, "video-sink", actualVideoSink, NULL); + g_object_set(m_playBin.get(), "video-sink", actualVideoSink, NULL); #endif GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink, "sink")); diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h index d14d004..1f7b3f3 100644 --- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h +++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h @@ -157,7 +157,7 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface { private: MediaPlayer* m_player; - GstElement* m_playBin; + GRefPtr<GstElement> m_playBin; GstElement* m_webkitVideoSink; GstElement* m_videoSinkBin; GstElement* m_fpsSink; -- 1.7.1 ++++++ buffer-ranges.patch ++++++ >From c3934e3270b74e95b3d15657c0b34e0ff3aa6a13 Mon Sep 17 00:00:00 2001 From: Xabier Rodriguez Calvar <calva...@igalia.com> Date: Mon, 4 Mar 2013 11:25:18 +0100 Subject: [PATCH] [GStreamer] Buffering ranges are reported incorrectly with GStreamer 1.0 https://bugs.webkit.org/show_bug.cgi?id=105319 Patch by Xabier Rodriguez Calvar <calva...@igalia.com> on 2012-12-21 Reviewed by Philippe Normand. We add the gPercentMax constant to select between 100 and GST_FORMAT_PERCENT_MAX depending if we are compiling against GStreamer 0.10 or 1.0 and we use that in the corresponding method. Current tests should suffice. * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::buffered): Added the use of gPercentMax constant instead of 100 to have the different code paths for GStreamer 0.10 and 1.0. Change-Id: I04d57303e683353b8734c62ef5016fa965a9627b git-svn-id: http://svn.webkit.org/repository/webkit/trunk@138364 268f45cc-cd09-0410-ab3c-d52691b4dbfc Reviewed-by: Jocelyn Turcotte <jocelyn.turco...@digia.com> --- .../gstreamer/MediaPlayerPrivateGStreamer.cpp | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp index f2bd292..736fd5a 100644 --- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp +++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp @@ -74,10 +74,17 @@ typedef enum { GST_PLAY_FLAG_BUFFERING = 0x000000100 } GstPlayFlags; +// gPercentMax is used when parsing buffering ranges with +// gst_query_parse_nth_buffering_range as there was a bug in GStreamer +// 0.10 that was using 100 instead of GST_FORMAT_PERCENT_MAX. This was +// corrected in 1.0. gst_query_parse_buffering_range worked as +// expected with GST_FORMAT_PERCENT_MAX in both cases. #ifdef GST_API_VERSION_1 static const char* gPlaybinName = "playbin"; +static const gint64 gPercentMax = GST_FORMAT_PERCENT_MAX; #else static const char* gPlaybinName = "playbin2"; +static const gint64 gPercentMax = 100; #endif GST_DEBUG_CATEGORY_STATIC(webkit_media_player_debug); @@ -749,11 +756,11 @@ PassRefPtr<TimeRanges> MediaPlayerPrivateGStreamer::buffered() const return timeRanges.release(); } - gint64 rangeStart = 0, rangeStop = 0; for (guint index = 0; index < gst_query_get_n_buffering_ranges(query); index++) { + gint64 rangeStart = 0, rangeStop = 0; if (gst_query_parse_nth_buffering_range(query, index, &rangeStart, &rangeStop)) - timeRanges->add(static_cast<float>((rangeStart * mediaDuration) / 100), - static_cast<float>((rangeStop * mediaDuration) / 100)); + timeRanges->add(static_cast<float>((rangeStart * mediaDuration) / gPercentMax), + static_cast<float>((rangeStop * mediaDuration) / gPercentMax)); } // Fallback to the more general maxTimeLoaded() if no range has -- 1.7.1 -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org