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