/* GStreamer * Copyright (C) 2008 Pioneers of the Inevitable * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __DSHOWVIDEOSINK_H__ #define __DSHOWVIDEOSINK_H__ #include #include #include #include "dshowvideofakesrc.h" #include #include "d3d9.h" #include "vmr9.h" #include "evr.h" #include "mfidl.h" #pragma warning( disable : 4090 4024) G_BEGIN_DECLS #define GST_TYPE_DSHOWVIDEOSINK (gst_dshowvideosink_get_type()) #define GST_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSink)) #define GST_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSinkClass)) #define GST_IS_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEOSINK)) #define GST_IS_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEOSINK)) typedef struct _GstDshowVideoSink GstDshowVideoSink; typedef struct _GstDshowVideoSinkClass GstDshowVideoSinkClass; #define GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink) g_mutex_lock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) #define GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(clock) g_mutex_unlock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) /* Renderer-specific support classes */ class RendererSupport { public: virtual ~RendererSupport() {}; virtual const char *GetName() = 0; virtual IBaseFilter *GetFilter() = 0; virtual gboolean Configure() = 0; virtual gboolean SetRendererWindow(HWND window) = 0; virtual void PaintWindow() = 0; virtual void MoveWindow() = 0; virtual void DestroyWindow() = 0; virtual void DisplayModeChanged() = 0; virtual void SetAspectRatioMode() = 0; }; struct _GstDshowVideoSink { GstVideoSink sink; /* Preferred renderer to use: VM9 or VMR */ char *preferredrenderer; /* The filter graph (DirectShow equivalent to pipeline */ IFilterGraph *filter_graph; IMediaEventEx *filter_media_event; /* Renderer wrapper (EVR, VMR9, or VMR) and support code */ RendererSupport *renderersupport; /* Our fakesrc filter */ VideoFakeSrc *fakesrc; /* DirectShow description of media type (equivalent of GstCaps) */ AM_MEDIA_TYPE mediatype; gboolean keep_aspect_ratio; gboolean full_screen; /* If the window is closed, we set this and error out */ gboolean window_closed; /* The video window set through GstXOverlay */ HWND window_id; /* If we created the window, it needs to be closed in ::stop() */ gboolean is_new_window; gboolean connected; gboolean graph_running; /* If we create our own window, we run it from another thread */ GThread *window_thread; HANDLE window_created_signal; /* If we use an app-supplied window, we need to hook its WNDPROC */ WNDPROC prevWndProc; /* Lock for transitions */ GMutex graph_lock; gboolean comInitialized; GMutex com_init_lock; GMutex com_deinit_lock; GCond com_initialized; GCond com_uninitialize; GCond com_uninitialized; }; struct _GstDshowVideoSinkClass { GstVideoSinkClass parent_class; }; GType gst_dshowvideosink_get_type (void); G_END_DECLS #endif /* __DSHOWVIDEOSINK_H__ */