| /* GStreamer |
| * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> |
| * |
| * 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 <gst/gst.h> |
| #include <gst/video/video.h> |
| #include <gst/video/gstvideosink.h> |
| |
| #include "dshowvideofakesrc.h" |
| |
| #include <dshow.h> |
| |
| #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__ */ |