summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h')
-rw-r--r--Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h218
1 files changed, 168 insertions, 50 deletions
diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
index dfcab5994..3092c1eff 100644
--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
@@ -2,7 +2,8 @@
* Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
* Copyright (C) 2007 Collabora Ltd. All rights reserved.
* Copyright (C) 2007 Alp Toker <alp@atoker.com>
- * Copyright (C) 2009, 2010 Igalia S.L
+ * Copyright (C) 2009, 2010, 2015, 2016 Igalia S.L
+ * Copyright (C) 2015, 2016 Metrological Group B.V.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -25,110 +26,227 @@
#if ENABLE(VIDEO) && USE(GSTREAMER)
#include "GRefPtrGStreamer.h"
+#include "MainThreadNotifier.h"
#include "MediaPlayerPrivate.h"
-
+#include "PlatformLayer.h"
#include <glib.h>
-
+#include <gst/gst.h>
+#include <wtf/Condition.h>
#include <wtf/Forward.h>
+#include <wtf/RunLoop.h>
-#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
+#if USE(TEXTURE_MAPPER)
#include "TextureMapperPlatformLayer.h"
+#include "TextureMapperPlatformLayerProxy.h"
#endif
-typedef struct _GstBuffer GstBuffer;
-typedef struct _GstElement GstElement;
-typedef struct _GstMessage GstMessage;
typedef struct _GstStreamVolume GstStreamVolume;
-typedef struct _WebKitVideoSink WebKitVideoSink;
+typedef struct _GstVideoInfo GstVideoInfo;
+typedef struct _GstGLContext GstGLContext;
+typedef struct _GstGLDisplay GstGLDisplay;
namespace WebCore {
+class BitmapTextureGL;
+class GLContext;
class GraphicsContext;
+class GraphicsContext3D;
class IntSize;
class IntRect;
+class VideoTextureCopierGStreamer;
+
+void registerWebKitGStreamerElements();
class MediaPlayerPrivateGStreamerBase : public MediaPlayerPrivateInterface
-#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
- , public TextureMapperPlatformLayer
+#if USE(COORDINATED_GRAPHICS_THREADED) || (USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS))
+ , public PlatformLayer
#endif
{
public:
virtual ~MediaPlayerPrivateGStreamerBase();
- IntSize naturalSize() const;
+ FloatSize naturalSize() const override;
- void setVolume(float);
- float volume() const;
- void volumeChanged();
- void notifyPlayerOfVolumeChange();
+ void setVolume(float) override;
+ virtual float volume() const;
+
+#if USE(GSTREAMER_GL)
+ bool ensureGstGLContext();
+ static GstContext* requestGLContext(const gchar* contextType, MediaPlayerPrivateGStreamerBase*);
+#endif
- bool supportsMuting() const { return true; }
- void setMuted(bool);
+ bool supportsMuting() const override { return true; }
+ void setMuted(bool) override;
bool muted() const;
- void muteChanged();
- void notifyPlayerOfMute();
- MediaPlayer::NetworkState networkState() const;
- MediaPlayer::ReadyState readyState() const;
+ MediaPlayer::NetworkState networkState() const override;
+ MediaPlayer::ReadyState readyState() const override;
- void setVisible(bool) { }
- void setSize(const IntSize&);
+ void setVisible(bool) override { }
+ void setSize(const IntSize&) override;
void sizeChanged();
- void triggerRepaint(GstBuffer*);
- void paint(GraphicsContext*, const IntRect&);
+ void paint(GraphicsContext&, const FloatRect&) override;
- virtual bool hasSingleSecurityOrigin() const { return true; }
+ bool hasSingleSecurityOrigin() const override { return true; }
virtual float maxTimeLoaded() const { return 0.0; }
- bool supportsFullscreen() const;
- PlatformMedia platformMedia() const;
+ bool supportsFullscreen() const override;
+ PlatformMedia platformMedia() const override;
- MediaPlayer::MovieLoadType movieLoadType() const;
+ MediaPlayer::MovieLoadType movieLoadType() const override;
virtual bool isLiveStream() const = 0;
MediaPlayer* mediaPlayer() const { return m_player; }
- unsigned decodedFrameCount() const;
- unsigned droppedFrameCount() const;
- unsigned audioDecodedByteCount() const;
- unsigned videoDecodedByteCount() const;
+ unsigned decodedFrameCount() const override;
+ unsigned droppedFrameCount() const override;
+ unsigned audioDecodedByteCount() const override;
+ unsigned videoDecodedByteCount() const override;
+
+ void acceleratedRenderingStateChanged() override;
+
+#if USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
+ PlatformLayer* platformLayer() const override { return const_cast<MediaPlayerPrivateGStreamerBase*>(this); }
+#if PLATFORM(WIN_CAIRO)
+ // FIXME: Accelerated rendering has not been implemented for WinCairo yet.
+ bool supportsAcceleratedRendering() const override { return false; }
+#else
+ bool supportsAcceleratedRendering() const override { return true; }
+#endif
+ void paintToTextureMapper(TextureMapper&, const FloatRect&, const TransformationMatrix&, float) override;
+#endif
+
+#if USE(COORDINATED_GRAPHICS_THREADED)
+ PlatformLayer* platformLayer() const override { return const_cast<MediaPlayerPrivateGStreamerBase*>(this); }
+ bool supportsAcceleratedRendering() const override { return true; }
+#endif
+
+#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
+ void needKey(RefPtr<Uint8Array>);
+ void setCDMSession(CDMSession*) override;
+ void keyAdded() override;
+ virtual void dispatchDecryptionKey(GstBuffer*);
+ void handleProtectionEvent(GstEvent*);
+ void receivedGenerateKeyRequest(const String&);
+#endif
+
+ static bool supportsKeySystem(const String& keySystem, const String& mimeType);
+ static MediaPlayer::SupportsType extendedSupportsType(const MediaEngineSupportParameters&, MediaPlayer::SupportsType);
-#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
- virtual PlatformLayer* platformLayer() const { return const_cast<MediaPlayerPrivateGStreamerBase*>(this); }
- virtual bool supportsAcceleratedRendering() const { return true; }
- virtual void paintToTextureMapper(TextureMapper*, const FloatRect&, const TransformationMatrix&, float);
+#if USE(GSTREAMER_GL)
+ bool copyVideoTextureToPlatformTexture(GraphicsContext3D*, Platform3DObject, GC3Denum, GC3Dint, GC3Denum, GC3Denum, GC3Denum, bool, bool) override;
+ NativeImagePtr nativeImageForCurrentTime() override;
#endif
+ void setVideoSourceOrientation(const ImageOrientation&);
+ GstElement* pipeline() const { return m_pipeline.get(); }
+
+ virtual bool handleSyncMessage(GstMessage*);
+
protected:
MediaPlayerPrivateGStreamerBase(MediaPlayer*);
virtual GstElement* createVideoSink();
- GRefPtr<GstCaps> currentVideoSinkCaps() const;
+
+#if USE(GSTREAMER_GL)
+ static GstFlowReturn newSampleCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
+ static GstFlowReturn newPrerollCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
+ GstElement* createGLAppSink();
+ GstElement* createVideoSinkGL();
+ GstGLContext* gstGLContext() const { return m_glContext.get(); }
+ GstGLDisplay* gstGLDisplay() const { return m_glDisplay.get(); }
+#if USE(CAIRO) && ENABLE(ACCELERATED_2D_CANVAS)
+ GLContext* prepareContextForCairoPaint(GstVideoInfo&, IntSize&, IntSize&);
+ bool paintToCairoSurface(cairo_surface_t*, cairo_device_t*, GstVideoInfo&, const IntSize&, const IntSize&, bool);
+#endif
+#endif
+
+ GstElement* videoSink() const { return m_videoSink.get(); }
void setStreamVolumeElement(GstStreamVolume*);
virtual GstElement* createAudioSink() { return 0; }
virtual GstElement* audioSink() const { return 0; }
+ void setPipeline(GstElement*);
+
+ void triggerRepaint(GstSample*);
+ void repaint();
+ void cancelRepaint();
+
+ static void repaintCallback(MediaPlayerPrivateGStreamerBase*, GstSample*);
+ static void repaintCancelledCallback(MediaPlayerPrivateGStreamerBase*);
+
+ void notifyPlayerOfVolumeChange();
+ void notifyPlayerOfMute();
+
+ static void volumeChangedCallback(MediaPlayerPrivateGStreamerBase*);
+ static void muteChangedCallback(MediaPlayerPrivateGStreamerBase*);
+
+ enum MainThreadNotification {
+ VideoChanged = 1 << 0,
+ VideoCapsChanged = 1 << 1,
+ AudioChanged = 1 << 2,
+ VolumeChanged = 1 << 3,
+ MuteChanged = 1 << 4,
+#if ENABLE(VIDEO_TRACK)
+ TextChanged = 1 << 5,
+#endif
+ SizeChanged = 1 << 6
+ };
+
+ Ref<MainThreadNotifier<MainThreadNotification>> m_notifier;
MediaPlayer* m_player;
+ GRefPtr<GstElement> m_pipeline;
GRefPtr<GstStreamVolume> m_volumeElement;
- GRefPtr<GstElement> m_webkitVideoSink;
+ GRefPtr<GstElement> m_videoSink;
GRefPtr<GstElement> m_fpsSink;
MediaPlayer::ReadyState m_readyState;
- MediaPlayer::NetworkState m_networkState;
+ mutable MediaPlayer::NetworkState m_networkState;
IntSize m_size;
- GMutex* m_bufferMutex;
- GstBuffer* m_buffer;
- unsigned long m_volumeTimerHandler;
- unsigned long m_muteTimerHandler;
- unsigned long m_repaintHandler;
- unsigned long m_volumeSignalHandler;
- unsigned long m_muteSignalHandler;
- mutable IntSize m_videoSize;
-#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
- PassRefPtr<BitmapTexture> updateTexture(TextureMapper*);
+ mutable GMutex m_sampleMutex;
+ GRefPtr<GstSample> m_sample;
+#if USE(GSTREAMER_GL) || USE(COORDINATED_GRAPHICS_THREADED)
+ RunLoop::Timer<MediaPlayerPrivateGStreamerBase> m_drawTimer;
+#endif
+ mutable FloatSize m_videoSize;
+ bool m_usingFallbackVideoSink;
+ bool m_renderingCanBeAccelerated { false };
+#if USE(TEXTURE_MAPPER_GL)
+ void updateTexture(BitmapTextureGL&, GstVideoInfo&);
+#endif
+#if USE(GSTREAMER_GL)
+ GRefPtr<GstGLContext> m_glContext;
+ GRefPtr<GstGLDisplay> m_glDisplay;
+#endif
+
+#if USE(COORDINATED_GRAPHICS_THREADED)
+ RefPtr<TextureMapperPlatformLayerProxy> proxy() const override { return m_platformLayerProxy.copyRef(); }
+ void swapBuffersIfNeeded() override { };
+ void pushTextureToCompositor();
+ RefPtr<TextureMapperPlatformLayerProxy> m_platformLayerProxy;
+#endif
+
+#if USE(GSTREAMER_GL) || USE(COORDINATED_GRAPHICS_THREADED)
+ RefPtr<GraphicsContext3D> m_context3D;
+ Condition m_drawCondition;
+ Lock m_drawMutex;
+#endif
+
+ ImageOrientation m_videoSourceOrientation;
+#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
+ std::unique_ptr<CDMSession> createSession(const String&, CDMSessionClient*) override;
+ CDMSession* m_cdmSession;
+ Lock m_protectionMutex;
+ Condition m_protectionCondition;
+ String m_lastGenerateKeyRequestKeySystemUuid;
+ HashSet<uint32_t> m_handledProtectionEvents;
+#endif
+#if USE(GSTREAMER_GL)
+ std::unique_ptr<VideoTextureCopierGStreamer> m_videoTextureCopier;
#endif
};
+
}
#endif // USE(GSTREAMER)