Changeset 142005 in webkit
- Timestamp:
- Feb 6, 2013 10:15:30 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r141985 r142005 1 2013-02-06 Jonathon Jongsma <jonathon.jongsma@collabora.com> 2 3 [GStreamer] MediaPlayer's code is not easily reusable by other GStreamer-based players 4 https://bugs.webkit.org/show_bug.cgi?id=100261 5 6 Reviewed by Philippe Normand 7 8 * configure.ac: removed farstream requirement for now since it's 9 not actually used yet and makes it more difficult to build and test 10 1 11 2013-02-06 Mike West <mkwst@chromium.org> 2 12 -
trunk/Source/WebCore/ChangeLog
r142004 r142005 1 2013-02-06 Jonathon Jongsma <jonathon.jongsma@collabora.com> 2 3 [GStreamer] MediaPlayer's code is not easily reusable by other GStreamer-based players 4 https://bugs.webkit.org/show_bug.cgi?id=100261 5 6 Refactor the media player implementation so that more of the 7 internal functionality can be shared between the current media 8 backend and the mediastream player backend. Common code is 9 broken out into a MediaPlayerPrivateGStreamerBase class, and 10 both MediaPlayerPrivateGStreamer and 11 StreamMediaPlayerPrivateGStreamer inherit from this base class. 12 13 Reviewed by Philippe Normand 14 15 No new tests since functionality is covered by existing media tests 16 17 * GNUmakefile.list.am: 18 * PlatformEfl.cmake: 19 * Target.pri: 20 * platform/graphics/gstreamer/FullscreenVideoControllerGStreamer.cpp: 21 (WebCore::FullscreenVideoControllerGStreamer::create): 22 (WebCore::FullscreenVideoControllerGStreamer::FullscreenVideoControllerGStreamer): 23 * platform/graphics/gstreamer/FullscreenVideoControllerGStreamer.h: 24 (WebCore): 25 (FullscreenVideoControllerGStreamer): 26 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 27 (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): 28 (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): 29 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 30 (MediaPlayerPrivateGStreamer): 31 (WebCore::MediaPlayerPrivateGStreamer::isLiveStream): 32 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp: Added. 33 (WebCore): 34 (WebCore::greatestCommonDivisor): 35 (WebCore::mediaPlayerPrivateVolumeChangedCallback): 36 (WebCore::mediaPlayerPrivateVolumeChangeTimeoutCallback): 37 (WebCore::mediaPlayerPrivateMuteChangedCallback): 38 (WebCore::mediaPlayerPrivateMuteChangeTimeoutCallback): 39 (WebCore::mediaPlayerPrivateRepaintCallback): 40 (WebCore::MediaPlayerPrivateGStreamerBase::MediaPlayerPrivateGStreamerBase): 41 (WebCore::MediaPlayerPrivateGStreamerBase::~MediaPlayerPrivateGStreamerBase): 42 (WebCore::MediaPlayerPrivateGStreamerBase::naturalSize): 43 (WebCore::MediaPlayerPrivateGStreamerBase::setVolume): 44 (WebCore::MediaPlayerPrivateGStreamerBase::volume): 45 (WebCore::MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange): 46 (WebCore::MediaPlayerPrivateGStreamerBase::volumeChanged): 47 (WebCore::MediaPlayerPrivateGStreamerBase::networkState): 48 (WebCore::MediaPlayerPrivateGStreamerBase::readyState): 49 (WebCore::MediaPlayerPrivateGStreamerBase::sizeChanged): 50 (WebCore::MediaPlayerPrivateGStreamerBase::setMuted): 51 (WebCore::MediaPlayerPrivateGStreamerBase::muted): 52 (WebCore::MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute): 53 (WebCore::MediaPlayerPrivateGStreamerBase::muteChanged): 54 (WebCore::MediaPlayerPrivateGStreamerBase::triggerRepaint): 55 (WebCore::MediaPlayerPrivateGStreamerBase::setSize): 56 (WebCore::MediaPlayerPrivateGStreamerBase::paint): 57 (WebCore::MediaPlayerPrivateGStreamerBase::enterFullscreen): 58 (WebCore::MediaPlayerPrivateGStreamerBase::exitFullscreen): 59 (WebCore::MediaPlayerPrivateGStreamerBase::supportsFullscreen): 60 (WebCore::MediaPlayerPrivateGStreamerBase::platformMedia): 61 (WebCore::MediaPlayerPrivateGStreamerBase::movieLoadType): 62 (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink): 63 (WebCore::MediaPlayerPrivateGStreamerBase::setStreamVolumeElement): 64 (WebCore::MediaPlayerPrivateGStreamerBase::decodedFrameCount): 65 (WebCore::MediaPlayerPrivateGStreamerBase::droppedFrameCount): 66 (WebCore::MediaPlayerPrivateGStreamerBase::audioDecodedByteCount): 67 (WebCore::MediaPlayerPrivateGStreamerBase::videoDecodedByteCount): 68 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h: Added. 69 (WebCore): 70 (MediaPlayerPrivateGStreamerBase): 71 (WebCore::MediaPlayerPrivateGStreamerBase::supportsMuting): 72 (WebCore::MediaPlayerPrivateGStreamerBase::setVisible): 73 (WebCore::MediaPlayerPrivateGStreamerBase::hasSingleSecurityOrigin): 74 (WebCore::MediaPlayerPrivateGStreamerBase::maxTimeLoaded): 75 (WebCore::MediaPlayerPrivateGStreamerBase::canEnterFullscreen): 76 (WebCore::MediaPlayerPrivateGStreamerBase::mediaPlayer): 77 (WebCore::MediaPlayerPrivateGStreamerBase::audioSink): 78 * platform/graphics/gtk/FullscreenVideoControllerGtk.cpp: 79 (WebCore::FullscreenVideoControllerGtk::FullscreenVideoControllerGtk): 80 * platform/graphics/gtk/FullscreenVideoControllerGtk.h: 81 (FullscreenVideoControllerGtk): 82 1 83 2013-02-06 Tony Gentilcore <tonyg@chromium.org> 2 84 -
trunk/Source/WebCore/GNUmakefile.list.am
r141984 r142005 6093 6093 Source/WebCore/platform/graphics/gstreamer/ImageGStreamerCairo.cpp \ 6094 6094 Source/WebCore/platform/graphics/gstreamer/ImageGStreamer.h \ 6095 Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp \ 6096 Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h \ 6095 6097 Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp \ 6096 6098 Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h \ -
trunk/Source/WebCore/PlatformEfl.cmake
r141749 r142005 122 122 platform/graphics/gstreamer/GStreamerVersioning.cpp 123 123 platform/graphics/gstreamer/ImageGStreamerCairo.cpp 124 platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp 124 125 platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 125 126 platform/graphics/gstreamer/PlatformVideoWindowEfl.cpp -
trunk/Source/WebCore/Target.pri
r141973 r142005 3352 3352 HEADERS += \ 3353 3353 platform/graphics/gstreamer/GStreamerGWorld.h \ 3354 platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h \ 3354 3355 platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h \ 3355 3356 platform/graphics/gstreamer/VideoSinkGStreamer.h \ … … 3360 3361 SOURCES += \ 3361 3362 platform/graphics/gstreamer/GStreamerGWorld.cpp \ 3363 platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp \ 3362 3364 platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp \ 3363 3365 platform/graphics/gstreamer/VideoSinkGStreamer.cpp \ -
trunk/Source/WebCore/platform/graphics/gstreamer/FullscreenVideoControllerGStreamer.cpp
r141566 r142005 30 30 #include "GStreamerGWorld.h" 31 31 #include "MediaPlayer.h" 32 #include "MediaPlayerPrivateGStreamer .h"32 #include "MediaPlayerPrivateGStreamerBase.h" 33 33 #include <gst/gst.h> 34 34 #include <wtf/text/CString.h> … … 49 49 } 50 50 51 PassOwnPtr<FullscreenVideoControllerGStreamer> FullscreenVideoControllerGStreamer::create(MediaPlayerPrivateGStreamer * player)51 PassOwnPtr<FullscreenVideoControllerGStreamer> FullscreenVideoControllerGStreamer::create(MediaPlayerPrivateGStreamerBase* player) 52 52 { 53 53 #if PLATFORM(GTK) … … 58 58 } 59 59 60 FullscreenVideoControllerGStreamer::FullscreenVideoControllerGStreamer(MediaPlayerPrivateGStreamer * player)60 FullscreenVideoControllerGStreamer::FullscreenVideoControllerGStreamer(MediaPlayerPrivateGStreamerBase* player) 61 61 : m_player(player) 62 62 , m_client(player->mediaPlayer()->mediaPlayerClient()) -
trunk/Source/WebCore/platform/graphics/gstreamer/FullscreenVideoControllerGStreamer.h
r141566 r142005 30 30 31 31 class GStreamerGWorld; 32 class MediaPlayerPrivateGStreamer ;32 class MediaPlayerPrivateGStreamerBase; 33 33 class MediaPlayerClient; 34 34 … … 36 36 WTF_MAKE_NONCOPYABLE(FullscreenVideoControllerGStreamer); 37 37 public: 38 static PassOwnPtr<FullscreenVideoControllerGStreamer> create(MediaPlayerPrivateGStreamer * player);39 FullscreenVideoControllerGStreamer(MediaPlayerPrivateGStreamer *);38 static PassOwnPtr<FullscreenVideoControllerGStreamer> create(MediaPlayerPrivateGStreamerBase*); 39 FullscreenVideoControllerGStreamer(MediaPlayerPrivateGStreamerBase*); 40 40 virtual ~FullscreenVideoControllerGStreamer(); 41 41 … … 57 57 String timeToString(float time); 58 58 59 MediaPlayerPrivateGStreamer * m_player;59 MediaPlayerPrivateGStreamerBase* m_player; 60 60 MediaPlayerClient* m_client; 61 61 GStreamerGWorld* m_gstreamerGWorld; -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r141697 r142005 27 27 #if ENABLE(VIDEO) && USE(GSTREAMER) 28 28 29 #include "ColorSpace.h"30 #include "Document.h"31 #include "Frame.h"32 #include "FrameView.h"33 #include "FullscreenVideoControllerGStreamer.h"34 #include "GStreamerGWorld.h"35 29 #include "GStreamerUtilities.h" 36 30 #include "GStreamerVersioning.h" 37 #include "GraphicsContext.h"38 #include "GraphicsTypes.h"39 #include "ImageGStreamer.h"40 #include "ImageOrientation.h"41 #include "IntRect.h"42 31 #include "KURL.h" 43 32 #include "Logging.h" 44 33 #include "MIMETypeRegistry.h" 45 34 #include "MediaPlayer.h" 46 #include "NotImplemented.h"47 35 #include "SecurityOrigin.h" 48 36 #include "TimeRanges.h" 49 #include "VideoSinkGStreamer.h"50 37 #include "WebKitWebSourceGStreamer.h" 51 38 #include <gst/gst.h> 52 #include <gst/video/video.h>53 39 #include <limits> 54 #include <math.h>55 40 #include <wtf/gobject/GOwnPtr.h> 56 41 #include <wtf/text/CString.h> 57 58 #ifdef GST_API_VERSION_159 #include <gst/audio/streamvolume.h>60 #else61 #include <gst/interfaces/streamvolume.h>62 #endif63 42 64 43 // GstPlayFlags flags from playbin2. It is the policy of GStreamer to … … 97 76 namespace WebCore { 98 77 99 static int greatestCommonDivisor(int a, int b)100 {101 while (b) {102 int temp = a;103 a = b;104 b = temp % b;105 }106 107 return ABS(a);108 }109 110 78 static gboolean mediaPlayerPrivateMessageCallback(GstBus*, GstMessage* message, MediaPlayerPrivateGStreamer* player) 111 79 { … … 116 84 { 117 85 player->sourceChanged(); 118 }119 120 static void mediaPlayerPrivateVolumeChangedCallback(GObject*, GParamSpec*, MediaPlayerPrivateGStreamer* player)121 {122 // This is called when playbin receives the notify::volume signal.123 player->volumeChanged();124 }125 126 static gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)127 {128 // This is the callback of the timeout source created in ::volumeChanged.129 player->notifyPlayerOfVolumeChange();130 return FALSE;131 }132 133 static void mediaPlayerPrivateMuteChangedCallback(GObject*, GParamSpec*, MediaPlayerPrivateGStreamer* player)134 {135 // This is called when playbin receives the notify::mute signal.136 player->muteChanged();137 }138 139 static gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)140 {141 // This is the callback of the timeout source created in ::muteChanged.142 player->notifyPlayerOfMute();143 return FALSE;144 86 } 145 87 … … 171 113 player->notifyPlayerOfVideo(); 172 114 return FALSE; 173 }174 175 static void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivateGStreamer* playerPrivate)176 {177 playerPrivate->triggerRepaint(buffer);178 115 } 179 116 … … 213 150 214 151 MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player) 215 : m_player(player) 216 , m_webkitVideoSink(0) 217 , m_fpsSink(0) 152 : MediaPlayerPrivateGStreamerBase(player) 218 153 , m_source(0) 219 154 , m_seekTime(0) … … 221 156 , m_endTime(numeric_limits<float>::infinity()) 222 157 , m_isEndReached(false) 223 , m_networkState(MediaPlayer::Empty)224 , m_readyState(MediaPlayer::HaveNothing)225 158 , m_isStreaming(false) 226 , m_size(IntSize())227 , m_buffer(0)228 159 , m_mediaLocations(0) 229 160 , m_mediaLocationCurrentIndex(0) … … 243 174 , m_mediaDurationKnown(true) 244 175 , m_maxTimeLoadedAtLastDidLoadingProgress(0) 245 , m_volumeTimerHandler(0)246 , m_muteTimerHandler(0)247 176 , m_hasVideo(false) 248 177 , m_hasAudio(false) … … 261 190 m_fillTimer.stop(); 262 191 263 if (m_buffer)264 gst_buffer_unref(m_buffer);265 m_buffer = 0;266 267 192 if (m_mediaLocations) { 268 193 gst_structure_free(m_mediaLocations); 269 194 m_mediaLocations = 0; 270 195 } 271 272 #if USE(NATIVE_FULLSCREEN_VIDEO)273 if (m_fullscreenVideoController)274 exitFullscreen();275 276 if (m_videoSinkBin) {277 gst_object_unref(m_videoSinkBin);278 m_videoSinkBin = 0;279 }280 #endif281 196 282 197 if (m_playBin) { … … 286 201 gst_bus_remove_signal_watch(bus.get()); 287 202 203 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateSourceChangedCallback), this); 204 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateVideoChangedCallback), this); 205 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateAudioChangedCallback), this); 206 288 207 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); 289 m_playBin = 0; 290 } 291 292 m_player = 0; 293 294 if (m_muteTimerHandler) 295 g_source_remove(m_muteTimerHandler); 296 297 if (m_volumeTimerHandler) 298 g_source_remove(m_volumeTimerHandler); 208 m_playBin.clear(); 209 } 210 211 GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink.get(), "sink")); 212 g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateVideoSinkCapsChangedCallback), this); 299 213 300 214 if (m_videoTimerHandler) … … 573 487 } 574 488 575 // Returns the size of the video576 IntSize MediaPlayerPrivateGStreamer::naturalSize() const577 {578 if (!hasVideo())579 return IntSize();580 581 if (!m_videoSize.isEmpty())582 return m_videoSize;583 584 GRefPtr<GstCaps> caps = webkitGstGetPadCaps(m_videoSinkPad.get());585 if (!caps)586 return IntSize();587 588 589 // TODO: handle possible clean aperture data. See590 // https://bugzilla.gnome.org/show_bug.cgi?id=596571591 // TODO: handle possible transformation matrix. See592 // https://bugzilla.gnome.org/show_bug.cgi?id=596326593 594 // Get the video PAR and original size, if this fails the595 // video-sink has likely not yet negotiated its caps.596 int pixelAspectRatioNumerator, pixelAspectRatioDenominator, stride;597 IntSize originalSize;598 GstVideoFormat format;599 if (!getVideoSizeAndFormatFromCaps(caps.get(), originalSize, format, pixelAspectRatioNumerator, pixelAspectRatioDenominator, stride))600 return IntSize();601 602 LOG_MEDIA_MESSAGE("Original video size: %dx%d", originalSize.width(), originalSize.height());603 LOG_MEDIA_MESSAGE("Pixel aspect ratio: %d/%d", pixelAspectRatioNumerator, pixelAspectRatioDenominator);604 605 // Calculate DAR based on PAR and video size.606 int displayWidth = originalSize.width() * pixelAspectRatioNumerator;607 int displayHeight = originalSize.height() * pixelAspectRatioDenominator;608 609 // Divide display width and height by their GCD to avoid possible overflows.610 int displayAspectRatioGCD = greatestCommonDivisor(displayWidth, displayHeight);611 displayWidth /= displayAspectRatioGCD;612 displayHeight /= displayAspectRatioGCD;613 614 // Apply DAR to original video size. This is the same behavior as in xvimagesink's setcaps function.615 guint64 width = 0, height = 0;616 if (!(originalSize.height() % displayHeight)) {617 LOG_MEDIA_MESSAGE("Keeping video original height");618 width = gst_util_uint64_scale_int(originalSize.height(), displayWidth, displayHeight);619 height = static_cast<guint64>(originalSize.height());620 } else if (!(originalSize.width() % displayWidth)) {621 LOG_MEDIA_MESSAGE("Keeping video original width");622 height = gst_util_uint64_scale_int(originalSize.width(), displayHeight, displayWidth);623 width = static_cast<guint64>(originalSize.width());624 } else {625 LOG_MEDIA_MESSAGE("Approximating while keeping original video height");626 width = gst_util_uint64_scale_int(originalSize.height(), displayWidth, displayHeight);627 height = static_cast<guint64>(originalSize.height());628 }629 630 LOG_MEDIA_MESSAGE("Natural size: %" G_GUINT64_FORMAT "x%" G_GUINT64_FORMAT, width, height);631 m_videoSize = IntSize(static_cast<int>(width), static_cast<int>(height));632 return m_videoSize;633 }634 635 489 void MediaPlayerPrivateGStreamer::videoChanged() 636 490 { … … 671 525 m_hasAudio = audioTracks > 0; 672 526 m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player); 673 }674 675 void MediaPlayerPrivateGStreamer::setVolume(float volume)676 {677 if (!m_playBin)678 return;679 680 gst_stream_volume_set_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC,681 static_cast<double>(volume));682 }683 684 float MediaPlayerPrivateGStreamer::volume() const685 {686 if (!m_playBin)687 return 0;688 689 return gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC);690 }691 692 void MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange()693 {694 m_volumeTimerHandler = 0;695 696 if (!m_player || !m_playBin)697 return;698 double volume;699 volume = gst_stream_volume_get_volume(GST_STREAM_VOLUME(m_playBin.get()), GST_STREAM_VOLUME_FORMAT_CUBIC);700 // get_volume() can return values superior to 1.0 if the user701 // applies software user gain via third party application (GNOME702 // volume control for instance).703 volume = CLAMP(volume, 0.0, 1.0);704 m_player->volumeChanged(static_cast<float>(volume));705 }706 707 void MediaPlayerPrivateGStreamer::volumeChanged()708 {709 if (m_volumeTimerHandler)710 g_source_remove(m_volumeTimerHandler);711 m_volumeTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVolumeChangeTimeoutCallback), this);712 527 } 713 528 … … 774 589 { 775 590 m_preservesPitch = preservesPitch; 776 }777 778 MediaPlayer::NetworkState MediaPlayerPrivateGStreamer::networkState() const779 {780 return m_networkState;781 }782 783 MediaPlayer::ReadyState MediaPlayerPrivateGStreamer::readyState() const784 {785 return m_readyState;786 591 } 787 592 … … 1115 920 } 1116 921 1117 unsigned MediaPlayerPrivateGStreamer::decodedFrameCount() const1118 {1119 guint64 decodedFrames = 0;1120 if (m_fpsSink)1121 g_object_get(m_fpsSink, "frames-rendered", &decodedFrames, NULL);1122 return static_cast<unsigned>(decodedFrames);1123 }1124 1125 unsigned MediaPlayerPrivateGStreamer::droppedFrameCount() const1126 {1127 guint64 framesDropped = 0;1128 if (m_fpsSink)1129 g_object_get(m_fpsSink, "frames-dropped", &framesDropped, NULL);1130 return static_cast<unsigned>(framesDropped);1131 }1132 1133 unsigned MediaPlayerPrivateGStreamer::audioDecodedByteCount() const1134 {1135 GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES);1136 gint64 position = 0;1137 1138 if (m_webkitAudioSink && gst_element_query(m_webkitAudioSink.get(), query))1139 gst_query_parse_position(query, 0, &position);1140 1141 gst_query_unref(query);1142 return static_cast<unsigned>(position);1143 }1144 1145 unsigned MediaPlayerPrivateGStreamer::videoDecodedByteCount() const1146 {1147 GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES);1148 gint64 position = 0;1149 1150 if (gst_element_query(m_webkitVideoSink, query))1151 gst_query_parse_position(query, 0, &position);1152 1153 gst_query_unref(query);1154 return static_cast<unsigned>(position);1155 }1156 1157 922 void MediaPlayerPrivateGStreamer::updateAudioSink() 1158 923 { … … 1167 932 } 1168 933 934 GstElement* MediaPlayerPrivateGStreamer::audioSink() const 935 { 936 return m_webkitAudioSink.get(); 937 } 1169 938 1170 939 void MediaPlayerPrivateGStreamer::sourceChanged() … … 1473 1242 } 1474 1243 1475 void MediaPlayerPrivateGStreamer::sizeChanged()1476 {1477 notImplemented();1478 }1479 1480 1244 void MediaPlayerPrivateGStreamer::timeChanged() 1481 1245 { … … 1552 1316 } 1553 1317 1554 bool MediaPlayerPrivateGStreamer::supportsMuting() const1555 {1556 return true;1557 }1558 1559 void MediaPlayerPrivateGStreamer::setMuted(bool muted)1560 {1561 if (!m_playBin)1562 return;1563 1564 g_object_set(m_playBin.get(), "mute", muted, NULL);1565 }1566 1567 bool MediaPlayerPrivateGStreamer::muted() const1568 {1569 if (!m_playBin)1570 return false;1571 1572 bool muted;1573 g_object_get(m_playBin.get(), "mute", &muted, NULL);1574 return muted;1575 }1576 1577 void MediaPlayerPrivateGStreamer::notifyPlayerOfMute()1578 {1579 m_muteTimerHandler = 0;1580 1581 if (!m_player || !m_playBin)1582 return;1583 1584 gboolean muted;1585 g_object_get(m_playBin.get(), "mute", &muted, NULL);1586 m_player->muteChanged(static_cast<bool>(muted));1587 }1588 1589 void MediaPlayerPrivateGStreamer::muteChanged()1590 {1591 if (m_muteTimerHandler)1592 g_source_remove(m_muteTimerHandler);1593 m_muteTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateMuteChangeTimeoutCallback), this);1594 }1595 1596 1318 void MediaPlayerPrivateGStreamer::loadingFailed(MediaPlayer::NetworkState error) 1597 1319 { … … 1605 1327 m_player->readyStateChanged(); 1606 1328 } 1607 }1608 1609 void MediaPlayerPrivateGStreamer::setSize(const IntSize& size)1610 {1611 m_size = size;1612 }1613 1614 void MediaPlayerPrivateGStreamer::setVisible(bool)1615 {1616 }1617 1618 1619 void MediaPlayerPrivateGStreamer::triggerRepaint(GstBuffer* buffer)1620 {1621 g_return_if_fail(GST_IS_BUFFER(buffer));1622 gst_buffer_replace(&m_buffer, buffer);1623 m_player->repaint();1624 }1625 1626 void MediaPlayerPrivateGStreamer::paint(GraphicsContext* context, const IntRect& rect)1627 {1628 if (context->paintingDisabled())1629 return;1630 1631 if (!m_player->visible())1632 return;1633 1634 if (!m_buffer)1635 return;1636 1637 GRefPtr<GstCaps> caps = webkitGstGetPadCaps(m_videoSinkPad.get());1638 if (!caps)1639 return;1640 1641 RefPtr<ImageGStreamer> gstImage = ImageGStreamer::createImage(m_buffer, caps.get());1642 if (!gstImage)1643 return;1644 1645 context->drawImage(reinterpret_cast<Image*>(gstImage->image().get()), ColorSpaceSRGB,1646 rect, gstImage->rect(), CompositeCopy, DoNotRespectImageOrientation, false);1647 1329 } 1648 1330 … … 1768 1450 } 1769 1451 1770 bool MediaPlayerPrivateGStreamer::hasSingleSecurityOrigin() const1771 {1772 return true;1773 }1774 1775 #if USE(NATIVE_FULLSCREEN_VIDEO)1776 void MediaPlayerPrivateGStreamer::enterFullscreen()1777 {1778 ASSERT(!m_fullscreenVideoController);1779 m_fullscreenVideoController = FullscreenVideoControllerGStreamer::create(this);1780 if (m_fullscreenVideoController)1781 m_fullscreenVideoController->enterFullscreen();1782 }1783 1784 void MediaPlayerPrivateGStreamer::exitFullscreen()1785 {1786 if (!m_fullscreenVideoController)1787 return;1788 m_fullscreenVideoController->exitFullscreen();1789 m_fullscreenVideoController.release();1790 }1791 #endif1792 1793 bool MediaPlayerPrivateGStreamer::supportsFullscreen() const1794 {1795 #if PLATFORM(MAC) && !PLATFORM(IOS) && __MAC_OS_X_VERSION_MIN_REQUIRED == 10501796 // See <rdar://problem/7389945>1797 return false;1798 #else1799 return true;1800 #endif1801 }1802 1803 PlatformMedia MediaPlayerPrivateGStreamer::platformMedia() const1804 {1805 #if USE(NATIVE_FULLSCREEN_VIDEO)1806 PlatformMedia p;1807 p.type = PlatformMedia::GStreamerGWorldType;1808 p.media.gstreamerGWorld = m_gstGWorld.get();1809 return p;1810 #else1811 return NoPlatformMedia;1812 #endif1813 }1814 1815 MediaPlayer::MovieLoadType MediaPlayerPrivateGStreamer::movieLoadType() const1816 {1817 if (m_readyState == MediaPlayer::HaveNothing)1818 return MediaPlayer::Unknown;1819 1820 if (isLiveStream())1821 return MediaPlayer::LiveStream;1822 1823 return MediaPlayer::Download;1824 }1825 1826 1452 void MediaPlayerPrivateGStreamer::setDownloadBuffering() 1827 1453 { … … 1895 1521 // we should not adopt. 1896 1522 m_playBin = gst_element_factory_make(gPlaybinName, "play"); 1523 setStreamVolumeElement(GST_STREAM_VOLUME(m_playBin.get())); 1897 1524 1898 1525 GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_playBin.get())); … … 1902 1529 g_object_set(m_playBin.get(), "mute", m_player->muted(), NULL); 1903 1530 1904 g_signal_connect(m_playBin.get(), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);1905 1531 g_signal_connect(m_playBin.get(), "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this); 1906 g_signal_connect(m_playBin.get(), "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);1907 1532 g_signal_connect(m_playBin.get(), "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this); 1908 1533 g_signal_connect(m_playBin.get(), "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this); 1909 1534 1910 #if USE(NATIVE_FULLSCREEN_VIDEO) 1911 m_gstGWorld = GStreamerGWorld::createGWorld(m_playBin.get()); 1912 m_webkitVideoSink = webkitVideoSinkNew(m_gstGWorld.get()); 1913 #else 1914 m_webkitVideoSink = webkitVideoSinkNew(); 1915 #endif 1916 m_videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink, "sink")); 1917 1918 g_signal_connect(m_webkitVideoSink, "repaint-requested", G_CALLBACK(mediaPlayerPrivateRepaintCallback), this); 1919 1920 1921 #if USE(NATIVE_FULLSCREEN_VIDEO) 1922 // Build a new video sink consisting of a bin containing a tee 1923 // (meant to distribute data to multiple video sinks) and our 1924 // internal video sink. For fullscreen we create an autovideosink 1925 // and initially block the data flow towards it and configure it 1926 1927 m_videoSinkBin = gst_bin_new("video-sink"); 1928 1929 // Take ownership. 1930 gst_object_ref_sink(m_videoSinkBin); 1931 1932 GstElement* videoTee = gst_element_factory_make("tee", "videoTee"); 1933 GstElement* queue = gst_element_factory_make("queue", 0); 1934 1935 #ifdef GST_API_VERSION_1 1936 GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(videoTee, "sink")); 1937 GST_OBJECT_FLAG_SET(GST_OBJECT(sinkPad.get()), GST_PAD_FLAG_PROXY_ALLOCATION); 1938 #endif 1939 1940 gst_bin_add_many(GST_BIN(m_videoSinkBin), videoTee, queue, NULL); 1941 1942 // Link a new src pad from tee to queue1. 1943 gst_element_link_pads_full(videoTee, 0, queue, "sink", GST_PAD_LINK_CHECK_NOTHING); 1944 #endif 1945 1946 GstElement* actualVideoSink = 0; 1947 m_fpsSink = gst_element_factory_make("fpsdisplaysink", "sink"); 1948 if (m_fpsSink) { 1949 // The verbose property has been added in -bad 0.10.22. Making 1950 // this whole code depend on it because we don't want 1951 // fpsdiplaysink to spit data on stdout. 1952 GstElementFactory* factory = GST_ELEMENT_FACTORY(GST_ELEMENT_GET_CLASS(m_fpsSink)->elementfactory); 1953 if (gst_plugin_feature_check_version(GST_PLUGIN_FEATURE(factory), 0, 10, 22)) { 1954 g_object_set(m_fpsSink, "silent", TRUE , NULL); 1955 1956 // Turn off text overlay unless logging is enabled. 1957 #if LOG_DISABLED 1958 g_object_set(m_fpsSink, "text-overlay", FALSE , NULL); 1959 #else 1960 WTFLogChannel* channel = getChannelFromName("Media"); 1961 if (channel->state != WTFLogChannelOn) 1962 g_object_set(m_fpsSink, "text-overlay", FALSE , NULL); 1963 #endif // LOG_DISABLED 1964 1965 if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_fpsSink), "video-sink")) { 1966 g_object_set(m_fpsSink, "video-sink", m_webkitVideoSink, NULL); 1967 #if USE(NATIVE_FULLSCREEN_VIDEO) 1968 gst_bin_add(GST_BIN(m_videoSinkBin), m_fpsSink); 1969 #endif 1970 actualVideoSink = m_fpsSink; 1971 } else 1972 m_fpsSink = 0; 1973 } else 1974 m_fpsSink = 0; 1975 } 1976 1977 if (!m_fpsSink) { 1978 #if USE(NATIVE_FULLSCREEN_VIDEO) 1979 gst_bin_add(GST_BIN(m_videoSinkBin), m_webkitVideoSink); 1980 #endif 1981 actualVideoSink = m_webkitVideoSink; 1982 } 1983 1984 ASSERT(actualVideoSink); 1985 1986 #if USE(NATIVE_FULLSCREEN_VIDEO) 1987 // Faster elements linking. 1988 gst_element_link_pads_full(queue, "src", actualVideoSink, "sink", GST_PAD_LINK_CHECK_NOTHING); 1989 1990 // Add a ghostpad to the bin so it can proxy to tee. 1991 GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(videoTee, "sink")); 1992 gst_element_add_pad(m_videoSinkBin, gst_ghost_pad_new("sink", pad.get())); 1993 1994 // Set the bin as video sink of playbin. 1995 g_object_set(m_playBin.get(), "video-sink", m_videoSinkBin, NULL); 1996 #else 1997 g_object_set(m_playBin.get(), "video-sink", actualVideoSink, NULL); 1998 #endif 1999 2000 GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink, "sink")); 1535 GstElement* videoElement = createVideoSink(m_playBin.get()); 1536 1537 g_object_set(m_playBin.get(), "video-sink", videoElement, NULL); 1538 1539 GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink.get(), "sink")); 2001 1540 if (videoSinkPad) 2002 1541 g_signal_connect(videoSinkPad.get(), "notify::caps", G_CALLBACK(mediaPlayerPrivateVideoSinkCapsChangedCallback), this); -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r141695 r142005 26 26 27 27 #include "GRefPtrGStreamer.h" 28 #include "MediaPlayerPrivate .h"28 #include "MediaPlayerPrivateGStreamerBase.h" 29 29 #include "Timer.h" 30 30 … … 33 33 #include <wtf/Forward.h> 34 34 35 typedef struct _WebKitVideoSink WebKitVideoSink;36 35 typedef struct _GstBuffer GstBuffer; 37 36 typedef struct _GstMessage GstMessage; … … 40 39 namespace WebCore { 41 40 42 class FullscreenVideoControllerGStreamer; 43 class GraphicsContext; 44 class IntSize; 45 class IntRect; 46 class GStreamerGWorld; 47 class MediaPlayerPrivateGStreamer; 48 49 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface { 41 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase { 50 42 51 43 public: … … 54 46 gboolean handleMessage(GstMessage*); 55 47 56 IntSize naturalSize() const;57 48 bool hasVideo() const { return m_hasVideo; } 58 49 bool hasAudio() const { return m_hasAudio; } … … 76 67 void setPreservesPitch(bool); 77 68 78 void setVolume(float);79 float volume() const;80 void volumeChanged();81 void notifyPlayerOfVolumeChange();82 83 bool supportsMuting() const;84 void setMuted(bool);85 bool muted() const;86 void muteChanged();87 void notifyPlayerOfMute();88 89 69 void setPreload(MediaPlayer::Preload); 90 70 void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*); 91 92 MediaPlayer::NetworkState networkState() const;93 MediaPlayer::ReadyState readyState() const;94 71 95 72 PassRefPtr<TimeRanges> buffered() const; … … 99 76 float maxTimeLoaded() const; 100 77 101 void setVisible(bool);102 void setSize(const IntSize&);103 104 78 void loadStateChanged(); 105 void sizeChanged();106 79 void timeChanged(); 107 80 void didEnd(); 108 81 void durationChanged(); 109 82 void loadingFailed(MediaPlayer::NetworkState); 110 111 void triggerRepaint(GstBuffer*);112 void repaint();113 void paint(GraphicsContext*, const IntRect&);114 115 bool hasSingleSecurityOrigin() const;116 117 #if USE(NATIVE_FULLSCREEN_VIDEO)118 void enterFullscreen();119 void exitFullscreen();120 bool canEnterFullscreen() const { return true; }121 #endif122 123 bool supportsFullscreen() const;124 PlatformMedia platformMedia() const;125 83 126 84 void videoChanged(); … … 130 88 131 89 void sourceChanged(); 132 133 unsigned decodedFrameCount() const; 134 unsigned droppedFrameCount() const; 135 unsigned audioDecodedByteCount() const; 136 unsigned videoDecodedByteCount() const; 137 138 MediaPlayer::MovieLoadType movieLoadType() const; 139 140 MediaPlayer* mediaPlayer() const { return m_player; } 90 GstElement* audioSink() const; 141 91 142 92 static KURL convertPlaybinURL(const gchar* uri); … … 172 122 173 123 virtual String engineDescription() const { return "GStreamer"; } 174 bool isLiveStream() const { return m_isStreaming; }124 virtual bool isLiveStream() const { return m_isStreaming; } 175 125 176 126 private: 177 MediaPlayer* m_player;178 127 GRefPtr<GstElement> m_playBin; 179 GstElement* m_webkitVideoSink;180 GstElement* m_videoSinkBin;181 GstElement* m_fpsSink;182 128 GRefPtr<GstElement> m_source; 183 129 float m_seekTime; … … 185 131 float m_endTime; 186 132 bool m_isEndReached; 187 MediaPlayer::NetworkState m_networkState;188 MediaPlayer::ReadyState m_readyState;189 133 mutable bool m_isStreaming; 190 IntSize m_size;191 GstBuffer* m_buffer;192 134 GstStructure* m_mediaLocations; 193 135 int m_mediaLocationCurrentIndex; … … 207 149 bool m_mediaDurationKnown; 208 150 mutable float m_maxTimeLoadedAtLastDidLoadingProgress; 209 #if USE(NATIVE_FULLSCREEN_VIDEO)210 RefPtr<GStreamerGWorld> m_gstGWorld;211 OwnPtr<FullscreenVideoControllerGStreamer> m_fullscreenVideoController;212 #endif213 guint m_volumeTimerHandler;214 guint m_muteTimerHandler;215 151 bool m_volumeAndMuteInitialized; 216 152 bool m_hasVideo; … … 220 156 GRefPtr<GstElement> m_webkitAudioSink; 221 157 mutable long m_totalBytes; 222 GRefPtr<GstPad> m_videoSinkPad;223 mutable IntSize m_videoSize;224 158 KURL m_url; 225 159 bool m_originalPreloadWasAutoAndWasOverridden; -
trunk/Source/WebCore/platform/graphics/gtk/FullscreenVideoControllerGtk.cpp
r141566 r142005 29 29 #include "GtkVersioning.h" 30 30 #include "MediaPlayer.h" 31 #include "MediaPlayerPrivateGStreamer .h"31 #include "MediaPlayerPrivateGStreamerBase.h" 32 32 33 33 #include <gdk/gdk.h> … … 125 125 126 126 127 FullscreenVideoControllerGtk::FullscreenVideoControllerGtk(MediaPlayerPrivateGStreamer * player)127 FullscreenVideoControllerGtk::FullscreenVideoControllerGtk(MediaPlayerPrivateGStreamerBase* player) 128 128 : FullscreenVideoControllerGStreamer(player) 129 129 , m_hudTimeoutId(0) -
trunk/Source/WebCore/platform/graphics/gtk/FullscreenVideoControllerGtk.h
r141566 r142005 29 29 class FullscreenVideoControllerGtk : public FullscreenVideoControllerGStreamer { 30 30 public: 31 FullscreenVideoControllerGtk(MediaPlayerPrivateGStreamer *);31 FullscreenVideoControllerGtk(MediaPlayerPrivateGStreamerBase*); 32 32 33 33 void gtkConfigure(GdkEventConfigure*); -
trunk/configure.ac
r141868 r142005 993 993 fi 994 994 995 # farstream-0.1 depends on gstreamer 0.10 currently. Disable996 # media_stream if gstreamer 1.0 build support is enabled.997 if test "$have_gstreamer" != "yes" || test "$GST_API_VERSION" = "1.0"; then998 if test "$enable_media_stream" = "yes"; then999 AC_MSG_WARN([Disabling Media Stream because no GStreamer 0.10 support is enabled])1000 fi1001 enable_media_stream=false1002 fi1003 if test "$enable_media_stream" = "yes"; then1004 PKG_CHECK_MODULES([FARSTREAM], [farstream-0.1],1005 [have_farstream=yes], [enable_media_stream=false])1006 AC_SUBST([FARSTREAM_CFLAGS])1007 AC_SUBST([FARSTREAM_LIBS])1008 fi1009 1010 995 acceleration_backend_description=$with_acceleration_backend 1011 996 if test "$with_acceleration_backend" = "clutter"; then
Note: See TracChangeset
for help on using the changeset viewer.