blob: 9a7bda06c3890620dff3e164e3734f13cc054b66 [file] [log] [blame]
/* 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__ */