/* GStreamer
 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
 *                    2000 Wim Taymans <wtay@chello.be>
 *                    2002 Kristian Rietveld <kris@gtk.org>
 *                    2002,2003 Colin Walters <walters@gnu.org>
 *                    2001,2010 Bastien Nocera <hadess@hadess.net>
 *                    2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *                    2010 Jan Schmidt <thaytan@noraisin.net>
 *
 * rtmpsrc.c:
 *
 * 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 <gst/gst.h>

#include "gstrtmpsrc.h"
#include "gstrtmpsink.h"

#ifndef GST_DISABLE_GST_DEBUG
GST_DEBUG_CATEGORY_STATIC (rtmp_debug);

static void
gst_rtmp_log_callback (int level, const gchar * fmt, va_list vl)
{
  GstDebugLevel gst_level;

  switch (level) {
    case RTMP_LOGCRIT:
    case RTMP_LOGERROR:
      gst_level = GST_LEVEL_ERROR;
      break;
    case RTMP_LOGWARNING:
      gst_level = GST_LEVEL_WARNING;
      break;
    case RTMP_LOGINFO:
      gst_level = GST_LEVEL_INFO;
      break;
    case RTMP_LOGDEBUG:
      gst_level = GST_LEVEL_DEBUG;
      break;
    case RTMP_LOGDEBUG2:
      gst_level = GST_LEVEL_LOG;
      break;
    default:
      gst_level = GST_LEVEL_TRACE;
      break;
  }

  gst_debug_log_valist (rtmp_debug, gst_level, "", "", 0, NULL, fmt, vl);
}

static void
_set_debug_level (void)
{
  GstDebugLevel gst_level;

  RTMP_LogSetCallback (gst_rtmp_log_callback);
  gst_level = gst_debug_category_get_threshold (rtmp_debug);

  switch (gst_level) {
    case GST_LEVEL_ERROR:
      RTMP_LogSetLevel (RTMP_LOGERROR);
      break;
    case GST_LEVEL_WARNING:
    case GST_LEVEL_FIXME:
      RTMP_LogSetLevel (RTMP_LOGWARNING);
      break;
    case GST_LEVEL_INFO:
      RTMP_LogSetLevel (RTMP_LOGINFO);
      break;
    case GST_LEVEL_DEBUG:
      RTMP_LogSetLevel (RTMP_LOGDEBUG);
      break;
    case GST_LEVEL_LOG:
      RTMP_LogSetLevel (RTMP_LOGDEBUG2);
      break;
    default:                   /* _TRACE and beyond */
      RTMP_LogSetLevel (RTMP_LOGALL);
  }
}
#endif

static gboolean
plugin_init (GstPlugin * plugin)
{
  gboolean ret;

#ifndef GST_DISABLE_GST_DEBUG
  GST_DEBUG_CATEGORY_INIT (rtmp_debug, "rtmp", 0, "libRTMP logging");
  _set_debug_level ();
#endif

  ret = gst_element_register (plugin, "rtmpsrc", GST_RANK_PRIMARY,
      GST_TYPE_RTMP_SRC);
  ret &= gst_element_register (plugin, "rtmpsink", GST_RANK_PRIMARY,
      GST_TYPE_RTMP_SINK);

  return ret;
}

GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    rtmp,
    "RTMP source and sink",
    plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
