/*
 * GStreamer DirectShow codecs wrapper
 * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com>
 * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com>
 * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Alternatively, the contents of this file may be used under the
 * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
 * which case the following provisions apply instead of the ones
 * mentioned above:
 *
 * 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 __GST_DSHOWVIDEODEC_H__
#define __GST_DSHOWVIDEODEC_H__

#include <gst/gst.h>
#include "gstdshowutil.h"
#include "gstdshowfakesrc.h"

G_BEGIN_DECLS

typedef struct {
  gchar *element_name;      /* The gst element factory name */
  gchar *element_longname;  /* Description string for element */
  gint32 format;            /* ??? */
  GUID input_majortype;
  GUID input_subtype;
  gchar *sinkcaps;          /* GStreamer caps of input format */
  GUID output_majortype;
  GUID output_subtype;
  gchar *srccaps;
  PreferredFilter *preferred_filters;
} VideoCodecEntry;

#define GST_TYPE_DSHOWVIDEODEC               (gst_dshowvideodec_get_type())
#define GST_DSHOWVIDEODEC(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDec))
#define GST_DSHOWVIDEODEC_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDecClass))
#define GST_IS_DSHOWVIDEODEC(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEODEC))
#define GST_IS_DSHOWVIDEODEC_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEODEC))

typedef struct _GstDshowVideoDec GstDshowVideoDec;
typedef struct _GstDshowVideoDecClass GstDshowVideoDecClass;

class VideoFakeSink;

struct _GstDshowVideoDec
{
  GstElement element;

  /* element pads */
  GstPad *sinkpad;
  GstPad *srcpad;

  /* caps of our src pad */
  GstCaps *srccaps;
  
  GstFlowReturn last_ret;

  /* list of dshow mediatypes coresponding to the caps list */
  GList *mediatypes;

  /* filters interfaces */
  FakeSrc *fakesrc;
  VideoFakeSink *fakesink;

  IBaseFilter *decfilter;

  /* graph manager interfaces */
  IMediaFilter *mediafilter;
  IFilterGraph *filtergraph;

  /* settings */
  gint width, height;
  gint fps_n, fps_d;
  gint par_n, par_d;

  /* current segment */
  GstSegment *segment;

  gboolean setup;

  gboolean comInitialized;
  GMutex   com_init_lock;
  GMutex   com_deinit_lock;
  GCond    com_initialized;
  GCond    com_uninitialize;
  GCond    com_uninitialized;

  GstBufferPool *buffer_pool;
};

struct _GstDshowVideoDecClass
{
  GstElementClass parent_class;
  const VideoCodecEntry *entry;
};

gboolean dshow_vdec_register (GstPlugin * plugin);

const GUID CLSID_VideoFakeSink = 
{ 0xff8f0c8e, 0x64f9, 0x4471,
  { 0x96, 0x0e, 0xd2, 0xd3, 0x18, 0x87, 0x78, 0x9a} };

class VideoFakeSink :  public CBaseRenderer
{
public:
  VideoFakeSink(GstDshowVideoDec *dec) : 
      m_hres(S_OK),
      CBaseRenderer(CLSID_VideoFakeSink, _T("VideoFakeSink"), NULL, &m_hres),
      mDec(dec) 
  {};
  virtual ~VideoFakeSink() {};

  HRESULT DoRenderSample(IMediaSample *pMediaSample);
  HRESULT CheckMediaType(const CMediaType *pmt);
  HRESULT SetMediaType (AM_MEDIA_TYPE *pmt) 
  {
    m_MediaType.Set (*pmt);
    return S_OK;
  }

protected:
  HRESULT m_hres;
  CMediaType m_MediaType;
  GstDshowVideoDec *mDec;
};

G_END_DECLS

#endif /* __GST_DSHOWVIDEODEC_H__ */
