Changeset 207885 in webkit
- Timestamp:
- Oct 26, 2016 1:44:40 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r207884 r207885 1 2016-10-26 Enrique Ocaña González <eocanha@igalia.com> 2 3 [GStreamer][MSE][EME] Remove MSE code from regular player and add EME support 4 https://bugs.webkit.org/show_bug.cgi?id=162911 5 6 Now that the MSE responsibility has been refactored to the dedicated 7 MediaPlayerPrivateGStreamerMSE subclass, the regular player no longer needs the MSE code, 8 just to expose some more methods to the subclass. Float timestamps have been migrated to 9 double. Also, small changes to accomodate the EME support are needed. 10 11 This patch is co-authored with Philippe Normand <philn@igalia.com> (EME support) and 12 Žan Doberšek <zandobersek@gmail.com> (double timestamps). 13 14 Reviewed by Xabier Rodriguez-Calvar. 15 16 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 17 (WebCore::busMessageCallback): 18 (WebCore::MediaPlayerPrivateGStreamer::registerMediaEngine): 19 (WebCore::initializeGStreamerAndRegisterWebKitElements): 20 (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): 21 (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): 22 (WebCore::MediaPlayerPrivateGStreamer::load): 23 (WebCore::MediaPlayerPrivateGStreamer::playbackPosition): 24 (WebCore::MediaPlayerPrivateGStreamer::durationMediaTime): 25 (WebCore::MediaPlayerPrivateGStreamer::currentMediaTime): 26 (WebCore::MediaPlayerPrivateGStreamer::seek): 27 (WebCore::MediaPlayerPrivateGStreamer::doSeek): 28 (WebCore::MediaPlayerPrivateGStreamer::paused): 29 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideo): 30 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudio): 31 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfText): 32 (WebCore::MediaPlayerPrivateGStreamer::buffered): 33 (WebCore::MediaPlayerPrivateGStreamer::handleMessage): 34 (WebCore::MediaPlayerPrivateGStreamer::processMpegTsSection): 35 (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): 36 (WebCore::MediaPlayerPrivateGStreamer::maxTimeSeekable): 37 (WebCore::MediaPlayerPrivateGStreamer::maxTimeLoaded): 38 (WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress): 39 (WebCore::MediaPlayerPrivateGStreamer::sourceChanged): 40 (WebCore::MediaPlayerPrivateGStreamer::didEnd): 41 (WebCore::MediaPlayerPrivateGStreamer::durationChanged): 42 (WebCore::MediaPlayerPrivateGStreamer::supportsType): 43 (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): 44 (WebCore::MediaPlayerPrivateGStreamer::handleSyncMessage): 45 (WebCore::MediaPlayerPrivateGStreamer::setAudioStreamProperties): Deleted. 46 (WebCore::MediaPlayerPrivateGStreamer::commitLoad): Deleted. 47 (WebCore::MediaPlayerPrivateGStreamer::pause): Deleted. 48 (WebCore::MediaPlayerPrivateGStreamer::videoChangedCallback): Deleted. 49 (WebCore::MediaPlayerPrivateGStreamer::videoSinkCapsChangedCallback): Deleted. 50 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps): Deleted. 51 (WebCore::MediaPlayerPrivateGStreamer::setRate): Deleted. 52 (WebCore::MediaPlayerPrivateGStreamer::processTableOfContentsEntry): Deleted. 53 (WebCore::MediaPlayerPrivateGStreamer::totalBytes): Deleted. 54 (WebCore::MediaPlayerPrivateGStreamer::loadNextLocation): Deleted. 55 (WebCore::MediaPlayerPrivateGStreamer::loadStateChanged): Deleted. 56 (WebCore::MediaPlayerPrivateGStreamer::timeChanged): Deleted. 57 (WebCore::mimeTypeSet): Deleted. 58 (WebCore::MediaPlayerPrivateGStreamer::createAudioSink): Deleted. 59 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 60 (WebCore::MediaPlayerPrivateGStreamer::configurePlaySink): 61 (WebCore::MediaPlayerPrivateGStreamer::isMediaSource): 62 (WebCore::MediaPlayerPrivateGStreamer::createWeakPtr): Deleted. 63 1 64 2016-10-26 Enrique Ocaña González <eocanha@igalia.com> 2 65 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r205180 r207885 4 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 5 5 * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org> 6 * Copyright (C) 2009, 2010, 2011, 2012, 2013 Igalia S.L6 * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L 7 7 * Copyright (C) 2014 Cable Television Laboratories, Inc. 8 * Copyright (C) 2015, 2016 Metrological Group B.V. 8 9 * 9 10 * This library is free software; you can redistribute it and/or … … 78 79 namespace WebCore { 79 80 81 static void busMessageCallback(GstBus*, GstMessage* message, MediaPlayerPrivateGStreamer* player) 82 { 83 player->handleMessage(message); 84 } 85 80 86 void MediaPlayerPrivateGStreamer::setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer* player, GObject* object) 81 87 { … … 100 106 if (isAvailable()) 101 107 registrar([](MediaPlayer* player) { return std::make_unique<MediaPlayerPrivateGStreamer>(player); }, 102 getSupportedTypes, supportsType, 0, 0, 0, 0);108 getSupportedTypes, supportsType, 0, 0, 0, supportsKeySystem); 103 109 } 104 110 … … 107 113 if (!initializeGStreamer()) 108 114 return false; 115 116 registerWebKitGStreamerElements(); 109 117 110 118 GRefPtr<GstElementFactory> srcFactory = adoptGRef(gst_element_factory_find("webkitwebsrc")); … … 114 122 } 115 123 116 #if ENABLE(MEDIA_SOURCE)117 GRefPtr<GstElementFactory> WebKitMediaSrcFactory = adoptGRef(gst_element_factory_find("webkitmediasrc"));118 if (!WebKitMediaSrcFactory)119 gst_element_register(0, "webkitmediasrc", GST_RANK_PRIMARY + 100, WEBKIT_TYPE_MEDIA_SRC);120 #endif121 124 return true; 122 125 } … … 133 136 MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) 134 137 : MediaPlayerPrivateGStreamerBase(player) 135 , m_ weakPtrFactory(this)136 , m_ source(0)137 , m_ seekTime(0)138 , m_buffering(false) 139 , m_bufferingPercentage(0) 140 , m_canFallBackToLastFinishedSeekPosition(false) 138 141 , m_changingRate(false) 142 , m_downloadFinished(false) 143 , m_errorOccured(false) 139 144 , m_isEndReached(false) 140 145 , m_isStreaming(false) 146 , m_durationAtEOS(0) 147 , m_paused(true) 148 , m_playbackRate(1) 149 , m_requestedState(GST_STATE_VOID_PENDING) 150 , m_resetPipeline(false) 151 , m_seeking(false) 152 , m_seekIsPending(false) 153 , m_seekTime(0) 154 , m_source(0) 155 , m_volumeAndMuteInitialized(false) 156 , m_weakPtrFactory(this) 141 157 , m_mediaLocations(0) 142 158 , m_mediaLocationCurrentIndex(0) 143 , m_resetPipeline(false)144 , m_paused(true)145 159 , m_playbackRatePause(false) 146 , m_seeking(false)147 , m_seekIsPending(false)148 160 , m_timeOfOverlappingSeek(-1) 149 , m_canFallBackToLastFinishedSeekPosition(false)150 , m_buffering(false)151 , m_playbackRate(1)152 161 , m_lastPlaybackRate(1) 153 , m_errorOccured(false)154 , m_downloadFinished(false)155 , m_durationAtEOS(0)156 162 , m_fillTimer(*this, &MediaPlayerPrivateGStreamer::fillTimerFired) 157 163 , m_maxTimeLoaded(0) 158 , m_bufferingPercentage(0)159 164 , m_preload(player->preload()) 160 165 , m_delayingLoad(false) 161 166 , m_maxTimeLoadedAtLastDidLoadingProgress(0) 162 , m_volumeAndMuteInitialized(false)163 167 , m_hasVideo(false) 164 168 , m_hasAudio(false) … … 169 173 , m_audioSourceProvider(std::make_unique<AudioSourceProviderGStreamer>()) 170 174 #endif 171 , m_requestedState(GST_STATE_VOID_PENDING)172 175 { 173 176 #if USE(GLIB) && !PLATFORM(EFL) … … 206 209 } 207 210 211 if (m_videoSink) { 212 GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink")); 213 g_signal_handlers_disconnect_matched(videoSinkPad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); 214 } 215 208 216 if (m_pipeline) { 209 217 GRefPtr<GstBus> bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline.get()))); 210 218 ASSERT(bus); 219 g_signal_handlers_disconnect_by_func(bus.get(), gpointer(busMessageCallback), this); 220 gst_bus_remove_signal_watch(bus.get()); 211 221 gst_bus_set_sync_handler(bus.get(), nullptr, nullptr, nullptr); 212 222 g_signal_handlers_disconnect_matched(m_pipeline.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); 213 223 gst_element_set_state(m_pipeline.get(), GST_STATE_NULL); 214 }215 216 if (m_videoSink) {217 GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_videoSink.get(), "sink"));218 g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast<gpointer>(videoSinkCapsChangedCallback), this);219 224 } 220 225 } … … 266 271 267 272 #if ENABLE(MEDIA_SOURCE) 268 void MediaPlayerPrivateGStreamer::load(const String& url, MediaSourcePrivateClient* mediaSource) 269 { 270 String mediasourceUri = String::format("mediasource%s", url.utf8().data()); 271 m_mediaSource = mediaSource; 272 load(mediasourceUri); 273 void MediaPlayerPrivateGStreamer::load(const String&, MediaSourcePrivateClient*) 274 { 275 notImplemented(); 273 276 } 274 277 #endif … … 294 297 } 295 298 296 floatMediaPlayerPrivateGStreamer::playbackPosition() const299 double MediaPlayerPrivateGStreamer::playbackPosition() const 297 300 { 298 301 if (m_isEndReached) { … … 304 307 return m_seekTime; 305 308 306 float mediaDuration = duration();309 MediaTime mediaDuration = durationMediaTime(); 307 310 if (mediaDuration) 308 return mediaDuration ;311 return mediaDuration.toDouble(); 309 312 return 0; 310 313 } … … 319 322 GST_DEBUG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position)); 320 323 321 floatresult = 0.0f;324 double result = 0.0f; 322 325 if (static_cast<GstClockTime>(position) != GST_CLOCK_TIME_NONE) { 323 326 GTimeVal timeValue; 324 327 GST_TIME_TO_TIMEVAL(position, timeValue); 325 result = static_cast< float>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0));328 result = static_cast<double>(timeValue.tv_sec + (timeValue.tv_usec / 1000000.0)); 326 329 } else if (m_canFallBackToLastFinishedSeekPosition) 327 330 result = m_seekTime; … … 414 417 } 415 418 416 float MediaPlayerPrivateGStreamer::duration() const419 MediaTime MediaPlayerPrivateGStreamer::durationMediaTime() const 417 420 { 418 421 if (!m_pipeline) 419 return 0.0f;422 return { }; 420 423 421 424 if (m_errorOccured) 422 return 0.0f;425 return { }; 423 426 424 427 if (m_durationAtEOS) 425 return m_durationAtEOS;428 return MediaTime::createWithFloat(m_durationAtEOS); 426 429 427 430 // The duration query would fail on a not-prerolled pipeline. 428 431 if (GST_STATE(m_pipeline.get()) < GST_STATE_PAUSED) 429 return 0.0f;432 return { }; 430 433 431 434 GstFormat timeFormat = GST_FORMAT_TIME; … … 435 438 if (failure) { 436 439 GST_DEBUG("Time duration query failed for %s", m_url.string().utf8().data()); 437 return numeric_limits<float>::infinity();440 return MediaTime::positiveInfiniteTime(); 438 441 } 439 442 440 443 GST_DEBUG("Duration: %" GST_TIME_FORMAT, GST_TIME_ARGS(timeLength)); 441 444 442 return static_cast<double>(timeLength) / GST_SECOND;445 return MediaTime::createWithDouble(static_cast<double>(timeLength) / GST_SECOND); 443 446 // FIXME: handle 3.14.9.5 properly 444 447 } 445 448 446 float MediaPlayerPrivateGStreamer::currentTime() const449 MediaTime MediaPlayerPrivateGStreamer::currentMediaTime() const 447 450 { 448 451 if (!m_pipeline) 449 return 0.0f;452 return { }; 450 453 451 454 if (m_errorOccured) 452 return 0.0f;455 return { }; 453 456 454 457 if (m_seeking) 455 return m_seekTime;458 return MediaTime::createWithFloat(m_seekTime); 456 459 457 460 // Workaround for … … 461 464 // this bug yet, hence this temporary workaround. 462 465 if (m_isEndReached && m_playbackRate < 0) 463 return 0.0f;464 465 return playbackPosition();466 return { }; 467 468 return MediaTime::createWithDouble(playbackPosition()); 466 469 } 467 470 … … 477 480 478 481 // Avoid useless seeking. 479 if ( time == currentTime())482 if (MediaTime::createWithFloat(time) == currentMediaTime()) 480 483 return; 481 484 … … 538 541 // avoid immediate EOS. 539 542 if (position < 0) 540 endTime = static_cast<gint64>(duration () * GST_SECOND);543 endTime = static_cast<gint64>(durationMediaTime().toDouble() * GST_SECOND); 541 544 else 542 545 endTime = position; … … 605 608 GstState state; 606 609 gst_element_get_state(m_pipeline.get(), &state, nullptr, 0); 607 return state == GST_STATE_PAUSED;610 return state <= GST_STATE_PAUSED; 608 611 } 609 612 … … 620 623 void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo() 621 624 { 625 if (UNLIKELY(!m_pipeline || !m_source)) 626 return; 627 622 628 gint numTracks = 0; 623 if (m_pipeline) 624 g_object_get(m_pipeline.get(), "n-video", &numTracks, nullptr); 629 bool useMediaSource = isMediaSource(); 630 GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); 631 g_object_get(element, "n-video", &numTracks, nullptr); 625 632 626 633 m_hasVideo = numTracks > 0; 634 if (m_hasVideo) 635 m_player->sizeChanged(); 636 637 if (useMediaSource) { 638 GST_DEBUG("Tracks managed by source element. Bailing out now."); 639 m_player->client().mediaPlayerEngineUpdated(m_player); 640 return; 641 } 627 642 628 643 #if ENABLE(VIDEO_TRACK) … … 673 688 void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio() 674 689 { 690 if (UNLIKELY(!m_pipeline || !m_source)) 691 return; 692 675 693 gint numTracks = 0; 676 if (m_pipeline) 677 g_object_get(m_pipeline.get(), "n-audio", &numTracks, nullptr); 694 bool useMediaSource = isMediaSource(); 695 GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); 696 g_object_get(element, "n-audio", &numTracks, nullptr); 678 697 679 698 m_hasAudio = numTracks > 0; 699 700 if (useMediaSource) { 701 GST_DEBUG("Tracks managed by source element. Bailing out now."); 702 m_player->client().mediaPlayerEngineUpdated(m_player); 703 return; 704 } 680 705 681 706 #if ENABLE(VIDEO_TRACK) … … 716 741 void MediaPlayerPrivateGStreamer::notifyPlayerOfText() 717 742 { 743 if (UNLIKELY(!m_pipeline || !m_source)) 744 return; 745 718 746 gint numTracks = 0; 719 if (m_pipeline) 720 g_object_get(m_pipeline.get(), "n-text", &numTracks, nullptr); 747 bool useMediaSource = isMediaSource(); 748 GstElement* element = useMediaSource ? m_source.get() : m_pipeline.get(); 749 g_object_get(element, "n-text", &numTracks, nullptr); 750 751 if (useMediaSource) { 752 GST_DEBUG("Tracks managed by source element. Bailing out now."); 753 return; 754 } 721 755 722 756 for (gint i = 0; i < numTracks; ++i) { … … 842 876 return timeRanges; 843 877 844 float mediaDuration(duration ());878 float mediaDuration(durationMediaTime().toDouble()); 845 879 if (!mediaDuration || std::isinf(mediaDuration)) 846 880 return timeRanges; … … 960 994 break; 961 995 case GST_MESSAGE_DURATION_CHANGED: 962 if (messageSourceIsPlaybin) 996 // Duration in MSE is managed by MediaSource, SourceBuffer and AppendPipeline. 997 if (messageSourceIsPlaybin && !isMediaSource()) 963 998 durationChanged(); 964 999 break; … … 1108 1143 const void* bytes = g_bytes_get_data(data.get(), &size); 1109 1144 1110 track->addDataCue( MediaTime::createWithDouble(currentTimeDouble()), MediaTime::createWithDouble(currentTimeDouble()), bytes, size);1145 track->addDataCue(currentMediaTime(), currentMediaTime(), bytes, size); 1111 1146 } 1112 1147 } … … 1182 1217 GST_DEBUG("[Buffering] Download buffer filled up to %f%%", fillStatus); 1183 1218 1184 float mediaDuration = duration ();1219 float mediaDuration = durationMediaTime().toDouble(); 1185 1220 1186 1221 // Update maxTimeLoaded only if the media duration is … … 1212 1247 return 0.0f; 1213 1248 1214 float mediaDuration = duration ();1249 float mediaDuration = durationMediaTime().toDouble(); 1215 1250 GST_DEBUG("maxTimeSeekable, duration: %f", mediaDuration); 1216 1251 // infinite duration means live stream … … 1228 1263 float loaded = m_maxTimeLoaded; 1229 1264 if (m_isEndReached) 1230 loaded = duration ();1265 loaded = durationMediaTime().toDouble(); 1231 1266 GST_DEBUG("maxTimeLoaded: %f", loaded); 1232 1267 return loaded; … … 1235 1270 bool MediaPlayerPrivateGStreamer::didLoadingProgress() const 1236 1271 { 1237 if ( !m_pipeline || !duration() || (!isMediaSource() && !totalBytes()))1272 if (UNLIKELY(!m_pipeline || !durationMediaTime() || (!isMediaSource() && !totalBytes()))) 1238 1273 return false; 1239 1274 float currentMaxTimeLoaded = maxTimeLoaded(); … … 1311 1346 if (WEBKIT_IS_WEB_SRC(m_source.get())) 1312 1347 webKitWebSrcSetMediaPlayer(WEBKIT_WEB_SRC(m_source.get()), m_player); 1313 #if ENABLE(MEDIA_SOURCE)1314 if (m_mediaSource && WEBKIT_IS_MEDIA_SRC(m_source.get())) {1315 MediaSourceGStreamer::open(m_mediaSource.get(), WEBKIT_MEDIA_SRC(m_source.get()));1316 }1317 #endif1318 1348 } 1319 1349 … … 1613 1643 // HTMLMediaElement. In some cases like reverse playback the 1614 1644 // position is not always reported as 0 for instance. 1615 float now = currentTime();1616 if (now > 0 && now <= duration())1645 MediaTime now = currentMediaTime(); 1646 if (now > MediaTime { } && now <= durationMediaTime()) 1617 1647 m_player->durationChanged(); 1618 1648 … … 1622 1652 if (!m_player->client().mediaPlayerIsLooping()) { 1623 1653 m_paused = true; 1624 m_durationAtEOS = duration ();1654 m_durationAtEOS = durationMediaTime().toDouble(); 1625 1655 changePipelineState(GST_STATE_READY); 1626 1656 m_downloadFinished = false; … … 1630 1660 void MediaPlayerPrivateGStreamer::durationChanged() 1631 1661 { 1632 float previousDuration = duration ();1662 float previousDuration = durationMediaTime().toDouble(); 1633 1663 1634 1664 // Avoid emiting durationchanged in the case where the previous 1635 1665 // duration was 0 because that case is already handled by the 1636 1666 // HTMLMediaElement. 1637 if (previousDuration && duration () != previousDuration)1667 if (previousDuration && durationMediaTime().toDouble() != previousDuration) 1638 1668 m_player->durationChanged(); 1639 1669 } … … 1790 1820 MediaPlayer::SupportsType MediaPlayerPrivateGStreamer::supportsType(const MediaEngineSupportParameters& parameters) 1791 1821 { 1822 MediaPlayer::SupportsType result = MediaPlayer::IsNotSupported; 1823 #if ENABLE(MEDIA_SOURCE) 1824 // MediaPlayerPrivateGStreamerMSE is in charge of mediasource playback, not us. 1825 if (parameters.isMediaSource) 1826 return result; 1827 #endif 1828 1792 1829 // MediaStream playback is handled by the OpenWebRTC player. 1793 1830 if (parameters.isMediaStream) 1794 return MediaPlayer::IsNotSupported; 1795 1831 return result; 1796 1832 1797 1833 if (parameters.type.isNull() || parameters.type.isEmpty()) 1798 return MediaPlayer::IsNotSupported;1834 return result; 1799 1835 1800 1836 // spec says we should not return "probably" if the codecs string is empty 1801 1837 if (mimeTypeSet().contains(parameters.type)) 1802 return parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported; 1803 return MediaPlayer::IsNotSupported; 1838 result = parameters.codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported; 1839 1840 return extendedSupportsType(parameters, result); 1804 1841 } 1805 1842 … … 1926 1963 auto& player = *static_cast<MediaPlayerPrivateGStreamer*>(userData); 1927 1964 1928 if (!player.handleSyncMessage(message)) { 1929 GRefPtr<GstMessage> protectedMessage(message); 1930 auto weakThis = player.createWeakPtr(); 1931 RunLoop::main().dispatch([weakThis, protectedMessage] { 1932 if (weakThis) 1933 weakThis->handleMessage(protectedMessage.get()); 1934 }); 1935 } 1936 gst_message_unref(message); 1937 return GST_BUS_DROP; 1965 if (player.handleSyncMessage(message)) { 1966 gst_message_unref(message); 1967 return GST_BUS_DROP; 1968 } 1969 1970 return GST_BUS_PASS; 1938 1971 }, this, nullptr); 1972 1973 // Let also other listeners subscribe to (application) messages in this bus. 1974 gst_bus_add_signal_watch(bus.get()); 1975 g_signal_connect(bus.get(), "message", G_CALLBACK(busMessageCallback), this); 1939 1976 1940 1977 g_object_set(m_pipeline.get(), "mute", m_player->muted(), nullptr); … … 1963 2000 1964 2001 g_object_set(m_pipeline.get(), "video-sink", createVideoSink(), "audio-sink", createAudioSink(), nullptr); 2002 2003 configurePlaySink(); 1965 2004 1966 2005 // On 1.4.2 and newer we use the audio-filter property instead. … … 2016 2055 } 2017 2056 2057 bool MediaPlayerPrivateGStreamer::handleSyncMessage(GstMessage* message) 2058 { 2059 return MediaPlayerPrivateGStreamerBase::handleSyncMessage(message); 2060 } 2061 2018 2062 } 2019 2063 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r203159 r207885 3 3 * Copyright (C) 2007 Collabora Ltd. All rights reserved. 4 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2009, 2010 Igalia S.L5 * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015, 2016 Igalia S.L 6 6 * Copyright (C) 2014 Cable Television Laboratories, Inc. 7 * Copyright (C) 2015, 2016 Metrological Group B.V. 7 8 * 8 9 * This library is free software; you can redistribute it and/or … … 41 42 #endif 42 43 43 #if ENABLE(MEDIA_SOURCE)44 #include "MediaSourceGStreamer.h"45 #endif46 47 44 typedef struct _GstBuffer GstBuffer; 48 45 typedef struct _GstMessage GstMessage; … … 63 60 class VideoTrackPrivateGStreamer; 64 61 62 #if ENABLE(MEDIA_SOURCE) 63 class MediaSourcePrivateClient; 64 #endif 65 65 66 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase { 66 67 public: 67 68 explicit MediaPlayerPrivateGStreamer(MediaPlayer*); 68 ~MediaPlayerPrivateGStreamer();69 virtual ~MediaPlayerPrivateGStreamer(); 69 70 70 71 static void registerMediaEngine(MediaEngineRegistrar); … … 92 93 bool seeking() const override; 93 94 94 float duration() const override;95 float currentTime() const override;95 MediaTime durationMediaTime() const override; 96 MediaTime currentMediaTime() const override; 96 97 void seek(float) override; 97 98 … … 112 113 void timeChanged(); 113 114 void didEnd(); 114 v oid durationChanged();115 virtual void durationChanged(); 115 116 void loadingFailed(MediaPlayer::NetworkState); 116 117 117 void sourceChanged(); 118 virtual void sourceChanged(); 119 118 120 GstElement* audioSink() const override; 121 virtual void configurePlaySink() { } 119 122 120 123 void simulateAudioInterruption() override; 121 124 122 bool changePipelineState(GstState);125 virtual bool changePipelineState(GstState); 123 126 124 127 #if ENABLE(WEB_AUDIO) 125 128 AudioSourceProvider* audioSourceProvider() override { return reinterpret_cast<AudioSourceProvider*>(m_audioSourceProvider.get()); } 126 129 #endif 130 131 bool isLiveStream() const override { return m_isStreaming; } 132 133 bool handleSyncMessage(GstMessage*) override; 127 134 128 135 private: … … 136 143 GstElement* createAudioSink() override; 137 144 138 floatplaybackPosition() const;139 140 v oid updateStates();141 v oid asyncStateChangeDone();145 double playbackPosition() const; 146 147 virtual void updateStates(); 148 virtual void asyncStateChangeDone(); 142 149 143 150 void createGSTPlayBin(); … … 146 153 void mediaLocationChanged(GstMessage*); 147 154 148 v oid setDownloadBuffering();155 virtual void setDownloadBuffering(); 149 156 void processBufferingStats(GstMessage*); 150 157 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS) … … 155 162 void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent); 156 163 #endif 157 bool doSeek(gint64 position, float rate, GstSeekFlags seekType);158 v oid updatePlaybackRate();164 virtual bool doSeek(gint64 position, float rate, GstSeekFlags seekType); 165 virtual void updatePlaybackRate(); 159 166 160 167 String engineDescription() const override { return "GStreamer"; } 161 bool isLiveStream() const override { return m_isStreaming; }162 168 bool didPassCORSAccessCheck() const override; 163 169 bool canSaveMediaData() const override; 164 170 165 #if ENABLE(MEDIA_SOURCE) 166 // TODO: Implement 167 unsigned long totalVideoFrames() override { return 0; } 168 unsigned long droppedVideoFrames() override { return 0; } 169 unsigned long corruptedVideoFrames() override { return 0; } 170 MediaTime totalFrameDelay() override { return MediaTime::zeroTime(); } 171 #endif 171 protected: 172 void cacheDuration(); 173 174 bool m_buffering; 175 int m_bufferingPercentage; 176 mutable float m_cachedPosition; 177 bool m_canFallBackToLastFinishedSeekPosition; 178 bool m_changingRate; 179 bool m_downloadFinished; 180 bool m_errorOccured; 181 mutable bool m_isEndReached; 182 mutable bool m_isStreaming; 183 mutable gfloat m_durationAtEOS; 184 bool m_paused; 185 float m_playbackRate; 186 GstState m_requestedState; 187 bool m_resetPipeline; 188 bool m_seeking; 189 bool m_seekIsPending; 190 float m_seekTime; 191 GRefPtr<GstElement> m_source; 192 bool m_volumeAndMuteInitialized; 172 193 173 194 void readyTimerFired(); … … 195 216 #endif 196 217 218 private: 197 219 WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory; 198 220 199 GRefPtr<GstElement> m_source;200 221 #if ENABLE(VIDEO_TRACK) 201 222 GRefPtr<GstElement> m_textAppSink; 202 223 GRefPtr<GstPad> m_textAppSinkPad; 203 224 #endif 204 float m_seekTime;205 bool m_changingRate;206 bool m_isEndReached;207 mutable bool m_isStreaming;208 225 GstStructure* m_mediaLocations; 209 226 int m_mediaLocationCurrentIndex; 210 bool m_resetPipeline;211 bool m_paused;212 227 bool m_playbackRatePause; 213 bool m_seeking;214 bool m_seekIsPending;215 228 float m_timeOfOverlappingSeek; 216 bool m_canFallBackToLastFinishedSeekPosition;217 bool m_buffering;218 float m_playbackRate;219 229 float m_lastPlaybackRate; 220 bool m_errorOccured;221 bool m_downloadFinished;222 float m_durationAtEOS;223 230 Timer m_fillTimer; 224 231 float m_maxTimeLoaded; 225 int m_bufferingPercentage;226 232 MediaPlayer::Preload m_preload; 227 233 bool m_delayingLoad; 228 234 mutable float m_maxTimeLoadedAtLastDidLoadingProgress; 229 bool m_volumeAndMuteInitialized;230 235 bool m_hasVideo; 231 236 bool m_hasAudio; … … 237 242 std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider; 238 243 #endif 239 GstState m_requestedState;240 244 GRefPtr<GstElement> m_autoAudioSink; 241 245 RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback; … … 249 253 HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks; 250 254 #endif 251 #if ENABLE(MEDIA_SOURCE) 252 RefPtr<MediaSourcePrivateClient> m_mediaSource; 253 bool isMediaSource() const { return m_mediaSource; } 254 #else 255 bool isMediaSource() const { return false; } 256 #endif 255 virtual bool isMediaSource() const { return false; } 257 256 }; 258 257 }
Note: See TracChangeset
for help on using the changeset viewer.