Changeset 140414 in webkit
- Timestamp:
- Jan 22, 2013, 4:55:22 AM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (modified) (39 diffs)
-
platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r140413 r140414 1 2013-01-22 Christophe Dumez <christophe.dumez@intel.com> 2 3 [gstreamer] MediaPlayerPrivateGStreamer should take ownership of the playbin 4 https://bugs.webkit.org/show_bug.cgi?id=107445 5 6 Reviewed by Philippe Normand. 7 8 In gstreamer 1.0, gst_element_factory_make() now returns a floating reference. 9 MediaPlayerPrivateGStreamer calls gst_element_factory_make() to create the 10 playbin object but does not take ownership of the object. As a consequence, 11 the object keeps floating until it is unref'd in the 12 MediaPlayerPrivateGStreamer destructor. 13 14 This patch uses a GRefPtr<GstElement> to store the playbin object and only 15 adopt the object returned by gst_element_factory_make() if gstreamer 0.10 16 is used. When gstreamer 1.0 is used, the returned object will not be adopted, 17 which will remove the floating reference. This way, we ensure that the 18 playbin object is owned by MediaPlayerPrivateGStreamer. 19 20 No new tests, no behavior change for layout tests. 21 22 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 23 (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): 24 (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): 25 (WebCore::MediaPlayerPrivateGStreamer::load): 26 (WebCore::MediaPlayerPrivateGStreamer::playbackPosition): 27 (WebCore::MediaPlayerPrivateGStreamer::changePipelineState): 28 (WebCore::MediaPlayerPrivateGStreamer::duration): 29 (WebCore::MediaPlayerPrivateGStreamer::seek): 30 (WebCore::MediaPlayerPrivateGStreamer::paused): 31 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideo): 32 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudio): 33 (WebCore::MediaPlayerPrivateGStreamer::setVolume): 34 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange): 35 (WebCore::MediaPlayerPrivateGStreamer::setRate): 36 (WebCore::MediaPlayerPrivateGStreamer::buffered): 37 (WebCore::MediaPlayerPrivateGStreamer::handleMessage): 38 (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): 39 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 40 (MediaPlayerPrivateGStreamer): 41 1 42 2013-01-22 Yury Semikhatsky <yurys@chromium.org> 2 43 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r139650 r140414 213 213 MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) 214 214 : m_player(player) 215 , m_playBin(0)216 215 , m_webkitVideoSink(0) 217 216 , m_fpsSink(0) … … 277 276 278 277 if (m_playBin) { 279 gst_element_set_state(m_playBin, GST_STATE_NULL); 280 gst_object_unref(GST_OBJECT(m_playBin)); 278 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 281 279 m_playBin = 0; 282 280 } … … 317 315 318 316 m_url = KURL(KURL(), cleanUrl); 319 g_object_set(m_playBin , "uri", cleanUrl.utf8().data(), NULL);317 g_object_set(m_playBin.get(), "uri", cleanUrl.utf8().data(), NULL); 320 318 321 319 LOG_MEDIA_MESSAGE("Load %s", cleanUrl.utf8().data()); … … 336 334 // GStreamer needs to have the pipeline set to a paused state to 337 335 // start providing anything useful. 338 gst_element_set_state(m_playBin , GST_STATE_PAUSED);336 gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); 339 337 340 338 if (!m_delayingLoad) … … 365 363 366 364 GstQuery* query = gst_query_new_position(GST_FORMAT_TIME); 367 if (!gst_element_query(m_playBin , query)) {365 if (!gst_element_query(m_playBin.get(), query)) { 368 366 LOG_MEDIA_MESSAGE("Position query failed..."); 369 367 gst_query_unref(query); … … 393 391 GstState pending; 394 392 395 gst_element_get_state(m_playBin , ¤tState, &pending, 0);393 gst_element_get_state(m_playBin.get(), ¤tState, &pending, 0); 396 394 LOG_MEDIA_MESSAGE("Current state: %s, pending: %s", gst_element_state_get_name(currentState), gst_element_state_get_name(pending)); 397 395 if (currentState == newState || pending == newState) 398 396 return true; 399 397 400 GstStateChangeReturn setStateResult = gst_element_set_state(m_playBin , newState);398 GstStateChangeReturn setStateResult = gst_element_set_state(m_playBin.get(), newState); 401 399 GstState pausedOrPlaying = newState == GST_STATE_PLAYING ? GST_STATE_PAUSED : GST_STATE_PLAYING; 402 400 if (currentState != pausedOrPlaying && setStateResult == GST_STATE_CHANGE_FAILURE) { … … 454 452 455 453 #ifdef GST_API_VERSION_1 456 bool failure = !gst_element_query_duration(m_playBin , timeFormat, &timeLength) || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE;454 bool failure = !gst_element_query_duration(m_playBin.get(), timeFormat, &timeLength) || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; 457 455 #else 458 bool failure = !gst_element_query_duration(m_playBin , &timeFormat, &timeLength) || timeFormat != GST_FORMAT_TIME || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE;456 bool failure = !gst_element_query_duration(m_playBin.get(), &timeFormat, &timeLength) || timeFormat != GST_FORMAT_TIME || static_cast<guint64>(timeLength) == GST_CLOCK_TIME_NONE; 459 457 #endif 460 458 if (failure) { … … 519 517 LOG_MEDIA_MESSAGE("Seek: %" GST_TIME_FORMAT, GST_TIME_ARGS(clockTime)); 520 518 521 if (!gst_element_seek(m_playBin , m_player->rate(),519 if (!gst_element_seek(m_playBin.get(), m_player->rate(), 522 520 GST_FORMAT_TIME, 523 521 (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), … … 539 537 540 538 GstState state; 541 gst_element_get_state(m_playBin , &state, 0, 0);539 gst_element_get_state(m_playBin.get(), &state, 0, 0); 542 540 return state == GST_STATE_PAUSED; 543 541 } … … 621 619 gint videoTracks = 0; 622 620 if (m_playBin) 623 g_object_get(m_playBin , "n-video", &videoTracks, NULL);621 g_object_get(m_playBin.get(), "n-video", &videoTracks, NULL); 624 622 625 623 m_hasVideo = videoTracks > 0; … … 643 641 gint audioTracks = 0; 644 642 if (m_playBin) 645 g_object_get(m_playBin , "n-audio", &audioTracks, NULL);643 g_object_get(m_playBin.get(), "n-audio", &audioTracks, NULL); 646 644 m_hasAudio = audioTracks > 0; 647 645 m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player); … … 653 651 return; 654 652 655 gst_stream_volume_set_volume(GST_STREAM_VOLUME(m_playBin ), GST_STREAM_VOLUME_FORMAT_CUBIC,653 gst_stream_volume_set_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC, 656 654 static_cast<double>(volume)); 657 655 } … … 664 662 return; 665 663 double volume; 666 volume = gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin ), GST_STREAM_VOLUME_FORMAT_CUBIC);664 volume = gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC); 667 665 // get_volume() can return values superior to 1.0 if the user 668 666 // applies software user gain via third party application (GNOME … … 688 686 GstState pending; 689 687 690 gst_element_get_state(m_playBin , &state, &pending, 0);688 gst_element_get_state(m_playBin.get(), &state, &pending, 0); 691 689 if ((state != GST_STATE_PLAYING && state != GST_STATE_PAUSED) 692 690 || (pending == GST_STATE_PAUSED)) … … 700 698 701 699 if (!rate) { 702 gst_element_set_state(m_playBin , GST_STATE_PAUSED);700 gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); 703 701 return; 704 702 } … … 730 728 LOG_MEDIA_MESSAGE("Need to mute audio: %d", (int) mute); 731 729 732 if (!gst_element_seek(m_playBin , rate, GST_FORMAT_TIME, flags,730 if (!gst_element_seek(m_playBin.get(), rate, GST_FORMAT_TIME, flags, 733 731 GST_SEEK_TYPE_SET, start, 734 732 GST_SEEK_TYPE_SET, end)) 735 733 LOG_MEDIA_MESSAGE("Set rate to %f failed", rate); 736 734 else 737 g_object_set(m_playBin , "mute", mute, NULL);735 g_object_set(m_playBin.get(), "mute", mute, NULL); 738 736 } 739 737 … … 761 759 GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT); 762 760 763 if (!gst_element_query(m_playBin , query)) {761 if (!gst_element_query(m_playBin.get(), query)) { 764 762 gst_query_unref(query); 765 763 return timeRanges.release(); … … 816 814 LOG_MEDIA_MESSAGE("Error %d: %s (url=%s)", err->code, err->message, m_url.string().utf8().data()); 817 815 818 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin ), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error");816 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin.get()), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error"); 819 817 820 818 error = MediaPlayer::Empty; … … 857 855 // Ignore state changes from internal elements. They are 858 856 // forwarded to playbin2 anyway. 859 if (GST_MESSAGE_SRC(message) == reinterpret_cast<GstObject*>(m_playBin )) {857 if (GST_MESSAGE_SRC(message) == reinterpret_cast<GstObject*>(m_playBin.get())) { 860 858 updateStates(); 861 859 … … 868 866 gst_element_state_get_name(newState)).utf8(); 869 867 870 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin ), GST_DEBUG_GRAPH_SHOW_ALL, dotFileName.data());868 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin.get()), GST_DEBUG_GRAPH_SHOW_ALL, dotFileName.data()); 871 869 } 872 870 break; … … 925 923 GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT); 926 924 927 if (!gst_element_query(m_playBin , query)) {925 if (!gst_element_query(m_playBin.get(), query)) { 928 926 gst_query_unref(query); 929 927 return; … … 1124 1122 GstElement* sinkPtr = 0; 1125 1123 1126 g_object_get(m_playBin , "audio-sink", &sinkPtr, NULL);1124 g_object_get(m_playBin.get(), "audio-sink", &sinkPtr, NULL); 1127 1125 m_webkitAudioSink = adoptGRef(sinkPtr); 1128 1126 … … 1134 1132 GstElement* srcPtr = 0; 1135 1133 1136 g_object_get(m_playBin , "source", &srcPtr, NULL);1134 g_object_get(m_playBin.get(), "source", &srcPtr, NULL); 1137 1135 m_source = adoptGRef(srcPtr); 1138 1136 … … 1147 1145 1148 1146 if (m_playBin) 1149 gst_element_set_state(m_playBin , GST_STATE_NULL);1147 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 1150 1148 } 1151 1149 … … 1163 1161 GstState pending; 1164 1162 1165 GstStateChangeReturn ret = gst_element_get_state(m_playBin ,1163 GstStateChangeReturn ret = gst_element_get_state(m_playBin.get(), 1166 1164 &state, &pending, 250 * GST_NSECOND); 1167 1165 … … 1219 1217 if (!m_paused) { 1220 1218 LOG_MEDIA_MESSAGE("[Buffering] Restarting playback."); 1221 gst_element_set_state(m_playBin , GST_STATE_PLAYING);1219 gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); 1222 1220 } 1223 1221 } else if (!m_buffering && (currentTime() < duration())) { … … 1234 1232 LOG_MEDIA_MESSAGE("[Buffering] Pausing stream for buffering."); 1235 1233 1236 gst_element_set_state(m_playBin , GST_STATE_PAUSED);1234 gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); 1237 1235 } 1238 1236 } else … … 1265 1263 if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto) { 1266 1264 setPreload(MediaPlayer::None); 1267 gst_element_set_state(m_playBin , GST_STATE_NULL);1268 gst_element_set_state(m_playBin , GST_STATE_PAUSED);1265 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 1266 gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); 1269 1267 } 1270 1268 1271 1269 // A live stream was paused, reset the pipeline. 1272 1270 if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream()) { 1273 gst_element_set_state(m_playBin , GST_STATE_NULL);1274 gst_element_set_state(m_playBin , GST_STATE_PLAYING);1271 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 1272 gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); 1275 1273 } 1276 1274 … … 1308 1306 m_seeking = false; 1309 1307 if (!m_paused) 1310 gst_element_set_state(m_playBin , GST_STATE_PLAYING);1308 gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); 1311 1309 } else if (!m_paused) 1312 gst_element_set_state(m_playBin , GST_STATE_PLAYING);1310 gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); 1313 1311 1314 1312 m_networkState = MediaPlayer::Loading; … … 1396 1394 1397 1395 gchar* currentLocation = 0; 1398 g_object_get(m_playBin , "uri", ¤tLocation, NULL);1396 g_object_get(m_playBin.get(), "uri", ¤tLocation, NULL); 1399 1397 1400 1398 KURL currentUrl(KURL(), currentLocation); … … 1420 1418 // Reset pipeline state. 1421 1419 m_resetPipeline = true; 1422 gst_element_set_state(m_playBin , GST_STATE_READY);1420 gst_element_set_state(m_playBin.get(), GST_STATE_READY); 1423 1421 1424 1422 GstState state; 1425 gst_element_get_state(m_playBin , &state, 0, 0);1423 gst_element_get_state(m_playBin.get(), &state, 0, 0); 1426 1424 if (state <= GST_STATE_READY) { 1427 1425 // Set the new uri and start playing. 1428 g_object_set(m_playBin , "uri", newUrl.string().utf8().data(), NULL);1429 gst_element_set_state(m_playBin , GST_STATE_PLAYING);1426 g_object_set(m_playBin.get(), "uri", newUrl.string().utf8().data(), NULL); 1427 gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING); 1430 1428 return true; 1431 1429 } … … 1470 1468 if (!m_player->mediaPlayerClient()->mediaPlayerIsLooping()) { 1471 1469 m_paused = true; 1472 gst_element_set_state(m_playBin , GST_STATE_NULL);1470 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 1473 1471 } 1474 1472 } … … 1481 1479 // And re-cache it if possible. 1482 1480 GstState state; 1483 gst_element_get_state(m_playBin , &state, 0, 0);1481 gst_element_get_state(m_playBin.get(), &state, 0, 0); 1484 1482 float newDuration = duration(); 1485 1483 … … 1515 1513 if (totalBytes() && !isLiveStream()) { 1516 1514 setPreload(MediaPlayer::Auto); 1517 gst_element_set_state(m_playBin , GST_STATE_NULL);1518 gst_element_set_state(m_playBin , GST_STATE_PAUSED);1515 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 1516 gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED); 1519 1517 } 1520 1518 } … … 1531 1529 return; 1532 1530 1533 g_object_set(m_playBin , "mute", muted, NULL);1531 g_object_set(m_playBin.get(), "mute", muted, NULL); 1534 1532 } 1535 1533 … … 1542 1540 1543 1541 gboolean muted; 1544 g_object_get(m_playBin , "mute", &muted, NULL);1542 g_object_get(m_playBin.get(), "mute", &muted, NULL); 1545 1543 m_player->muteChanged(static_cast<bool>(muted)); 1546 1544 } … … 1768 1766 1769 1767 GstPlayFlags flags; 1770 g_object_get(m_playBin , "flags", &flags, NULL);1768 g_object_get(m_playBin.get(), "flags", &flags, NULL); 1771 1769 if (m_preload == MediaPlayer::Auto) { 1772 1770 LOG_MEDIA_MESSAGE("Enabling on-disk buffering"); 1773 g_object_set(m_playBin , "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL);1771 g_object_set(m_playBin.get(), "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL); 1774 1772 } else { 1775 1773 LOG_MEDIA_MESSAGE("Disabling on-disk buffering"); 1776 g_object_set(m_playBin , "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL);1774 g_object_set(m_playBin.get(), "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL); 1777 1775 } 1778 1776 } … … 1795 1793 { 1796 1794 ASSERT(!m_playBin); 1795 1796 #ifdef GST_API_VERSION_1 1797 // In gstreamer 1.0, gst_element_factory_make returns a floating 1798 // reference so we should not adopt. 1797 1799 m_playBin = gst_element_factory_make(gPlaybinName, "play"); 1798 1799 #ifndef GST_API_VERSION_1 1800 m_gstGWorld = GStreamerGWorld::createGWorld(m_playBin );1800 #else 1801 m_playBin = adoptGRef(gst_element_factory_make(gPlaybinName, "play")); 1802 m_gstGWorld = GStreamerGWorld::createGWorld(m_playBin.get()); 1801 1803 #endif 1802 1804 1803 GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_playBin ));1805 GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_playBin.get())); 1804 1806 gst_bus_add_signal_watch(bus); 1805 1807 g_signal_connect(bus, "message", G_CALLBACK(mediaPlayerPrivateMessageCallback), this); 1806 1808 gst_object_unref(bus); 1807 1809 1808 g_object_set(m_playBin , "mute", m_player->muted(), NULL);1809 1810 g_signal_connect(m_playBin , "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);1811 g_signal_connect(m_playBin , "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);1812 g_signal_connect(m_playBin , "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);1813 g_signal_connect(m_playBin , "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this);1814 g_signal_connect(m_playBin , "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this);1810 g_object_set(m_playBin.get(), "mute", m_player->muted(), NULL); 1811 1812 g_signal_connect(m_playBin.get(), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this); 1813 g_signal_connect(m_playBin.get(), "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this); 1814 g_signal_connect(m_playBin.get(), "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this); 1815 g_signal_connect(m_playBin.get(), "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this); 1816 g_signal_connect(m_playBin.get(), "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this); 1815 1817 1816 1818 #ifndef GST_API_VERSION_1 … … 1893 1895 1894 1896 // Set the bin as video sink of playbin. 1895 g_object_set(m_playBin , "video-sink", m_videoSinkBin, NULL);1897 g_object_set(m_playBin.get(), "video-sink", m_videoSinkBin, NULL); 1896 1898 #else 1897 g_object_set(m_playBin , "video-sink", actualVideoSink, NULL);1899 g_object_set(m_playBin.get(), "video-sink", actualVideoSink, NULL); 1898 1900 #endif 1899 1901 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r137838 r140414 159 159 private: 160 160 MediaPlayer* m_player; 161 G stElement*m_playBin;161 GRefPtr<GstElement> m_playBin; 162 162 GstElement* m_webkitVideoSink; 163 163 GstElement* m_videoSinkBin;
Note:
See TracChangeset
for help on using the changeset viewer.