gstreamer/sys/dshowvideosink/dshowvideosink.h
Chun-wei Fan 788297fec3 dshowvideosink: Port to 1.0 and new GLib threading API
This updates the dshowvideosink to work with the GStreamer 1.0.x APIs, and
avoids the use of deprecated GLib threading API that are now used since
GLib 2.32+

https://bugzilla.gnome.org/show_bug.cgi?id=699364
2014-12-05 08:02:02 +00:00

129 lines
3.8 KiB
C++

/* 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__ */