/* GStreamer WebM muxer
 * Copyright (c) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *
 * 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_WEBM_MUX_H__
#define __GST_WEBM_MUX_H__

#include "matroska-mux.h"

#define GST_TYPE_WEBM_MUX \
  (gst_webm_mux_get_type ())
#define GST_WEBM_MUX(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WEBM_MUX, GstWebMMux))
#define GST_WEBM_MUX_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WEBM_MUX, GstWebMMuxClass))
#define GST_IS_WEBM_MUX(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WEBM_MUX))
#define GST_IS_WEBM_MUX_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WEBM_MUX))

typedef struct _GstWebMMux GstWebMMux;
typedef struct _GstWebMMuxClass GstWebMMuxClass;

struct _GstWebMMux {
  GstMatroskaMux matroskamux;
};

struct _GstWebMMuxClass {
  GstMatroskaMuxClass matroskamuxclass;
};

GType   gst_webm_mux_get_type (void);

#endif /* __GST_WEBM_MUX_H__ */
