/*
 * GStreamer
 * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
 *
 * 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_DISPARITY_H__
#define __GST_DISPARITY_H__

#include <gst/gst.h>
#include <gst/video/video.h>

#include <opencv2/legacy/legacy.hpp>

G_BEGIN_DECLS
/* #defines don't like whitespacey bits */
#define GST_TYPE_DISPARITY \
  (gst_disparity_get_type())
#define GST_DISPARITY(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISPARITY,GstDisparity))
#define GST_DISPARITY_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISPARITY,GstDisparityClass))
#define GST_IS_DISPARITY(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISPARITY))
#define GST_IS_DISPARITY_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISPARITY))
typedef struct _GstDisparity GstDisparity;
typedef struct _GstDisparityClass GstDisparityClass;

struct _GstDisparity
{
  GstElement element;

  GstPad *sinkpad_left, *sinkpad_right, *srcpad;
  GstCaps *caps;

  gint method;
  gboolean display;

  int width;
  int height;
  int actualChannels;

  GstBuffer *buffer_left;
  GMutex lock;
  GCond cond;
  gboolean flushing;

  CvSize imgSize;
  IplImage *cvRGB_right;
  IplImage *cvRGB_left;
  IplImage *cvGray_right;
  IplImage *cvGray_left;
  IplImage *cvGray_depth_map1;  /*IPL_DEPTH_16S */
  IplImage *cvGray_depth_map2;  /*IPL_DEPTH_8U */
  IplImage *cvGray_depth_map1_2;        /*IPL_DEPTH_16S */

  void *sbm;                    /* cv::StereoBM */
  void *sgbm;                   /* cv::StereoSGBM */
  void *svar;                   /* cv::StereoVar */
  CvStereoGCState *sgc;         /* This is a C implementation */
  void *img_right_as_cvMat_rgb; /* cv::Mat */
  void *img_left_as_cvMat_rgb;  /* cv::Mat */
  void *depth_map_as_cvMat;     /* cv::Mat */
  void *depth_map_as_cvMat2;    /* cv::Mat */
  void *img_right_as_cvMat_gray;        /* cv::Mat */
  void *img_left_as_cvMat_gray; /* cv::Mat */
};

struct _GstDisparityClass
{
  GstElementClass parent_class;
};

GType gst_disparity_get_type (void);

gboolean gst_disparity_plugin_init (GstPlugin * disparity);

G_END_DECLS
#endif /* __GST_DISPARITY_H__ */
