/* GStreamer video parsers
 * Copyright (C) 2011 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
 * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
 *
 * 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.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "gsth263parse.h"
#include "gsth264parse.h"
#include "gstdiracparse.h"
#include "gstmpegvideoparse.h"
#include "gstmpeg4videoparse.h"
#include "gstpngparse.h"
#include "gstjpeg2000parse.h"
#include "gstvc1parse.h"
#include "gsth265parse.h"

static gboolean
plugin_init (GstPlugin * plugin)
{
  gboolean ret = FALSE;
#if 0
  ret |= gst_element_register (plugin, "h263parse",
      GST_RANK_PRIMARY + 1, GST_TYPE_H263_PARSE);
  ret |= gst_element_register (plugin, "h264parse",
      GST_RANK_PRIMARY + 1, GST_TYPE_H264_PARSE);
  ret |= gst_element_register (plugin, "diracparse",
      GST_RANK_NONE, GST_TYPE_DIRAC_PARSE);
  ret |= gst_element_register (plugin, "mpegvideoparse",
      GST_RANK_PRIMARY + 1, GST_TYPE_MPEGVIDEO_PARSE);
  ret |= gst_element_register (plugin, "mpeg4videoparse",
      GST_RANK_PRIMARY + 1, GST_TYPE_MPEG4VIDEO_PARSE);
  ret |= gst_element_register (plugin, "pngparse",
      GST_RANK_PRIMARY, GST_TYPE_PNG_PARSE);
  ret |= gst_element_register (plugin, "jpeg2000parse",
      GST_RANK_PRIMARY, GST_TYPE_JPEG2000_PARSE);
  ret |= gst_element_register (plugin, "h265parse",
      GST_RANK_SECONDARY, GST_TYPE_H265_PARSE);
  ret |= gst_element_register (plugin, "vc1parse",
      GST_RANK_NONE, GST_TYPE_VC1_PARSE);
#else
  ret |= gst_element_register (plugin, "h263parse",
      GST_RANK_MARGINAL - 1, GST_TYPE_H263_PARSE);
  ret |= gst_element_register (plugin, "h264parse",
      GST_RANK_PRIMARY + 1, GST_TYPE_H264_PARSE);
  ret |= gst_element_register (plugin, "diracparse",
      GST_RANK_NONE, GST_TYPE_DIRAC_PARSE);
  ret |= gst_element_register (plugin, "mpegvideoparse",
      GST_RANK_MARGINAL - 1, GST_TYPE_MPEGVIDEO_PARSE);
  ret |= gst_element_register (plugin, "mpeg4videoparse",
      GST_RANK_MARGINAL -1, GST_TYPE_MPEG4VIDEO_PARSE);
  ret |= gst_element_register (plugin, "pngparse",
      GST_RANK_MARGINAL-1, GST_TYPE_PNG_PARSE);
  ret |= gst_element_register (plugin, "h265parse",
      GST_RANK_PRIMARY + 1, GST_TYPE_H265_PARSE);
  ret |= gst_element_register (plugin, "vc1parse",
      GST_RANK_NONE, GST_TYPE_VC1_PARSE);
#endif
  return ret;
}


GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    videoparsersbad,
    "videoparsers",
    plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
