/*
 * GStreamer
 * Copyright (C) 2014 Jan Schmidt <jan@centricular.com>
 * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
 *
 * 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_GL_VIEW_CONVERT_H_
#define _GST_GL_VIEW_CONVERT_H_

#include <gst/gl/gl.h>

G_BEGIN_DECLS
#define GST_TYPE_GL_VIEW_CONVERT            (gst_gl_view_convert_get_type())
#define GST_GL_VIEW_CONVERT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_VIEW_CONVERT,GstGLViewConvert))
#define GST_IS_GL_VIEW_CONVERT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_VIEW_CONVERT))
#define GST_GL_VIEW_CONVERT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_GL_VIEW_CONVERT,GstGLViewConvertClass))
#define GST_IS_GL_VIEW_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_VIEW_CONVERT))
#define GST_GL_VIEW_CONVERT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_VIEW_CONVERT,GstGLViewConvertClass))

#define GST_TYPE_GL_STEREO_DOWNMIX_MODE_TYPE gst_gl_stereo_downmix_mode_get_type()
GST_EXPORT
GType gst_gl_stereo_downmix_mode_get_type (void);

/**
 * GstGLStereoDownmix:
 * @GST_GL_STEREO_DOWNMIX_ANAGLYPH_GREEN_MAGENTA_DUBOIS: Dubois optimised Green-Magenta anaglyph
 * @GST_GL_STEREO_DOWNMIX_ANAGLYPH_RED_CYAN_DUBOIS: Dubois optimised Red-Cyan anaglyph
 * @GST_GL_STEREO_DOWNMIX_ANAGLYPH_AMBER_BLUE_DUBOIS: Dubois optimised Amber-Blue anaglyph
 *
 * Output anaglyph type to generate when downmixing to mono
 */
enum _GstGLStereoDownmix {
  GST_GL_STEREO_DOWNMIX_ANAGLYPH_GREEN_MAGENTA_DUBOIS,
  GST_GL_STEREO_DOWNMIX_ANAGLYPH_RED_CYAN_DUBOIS,
  GST_GL_STEREO_DOWNMIX_ANAGLYPH_AMBER_BLUE_DUBOIS,
};
typedef enum _GstGLStereoDownmix GstGLStereoDownmix;

/**
 * GstGLViewConvert:
 *
 * #GstGLViewConvert is an opaque struct and should only be accessed through the
 * provided api.
 */
struct _GstGLViewConvert
{
  GstObject object;

  GstGLContext *context;

  GstGLShader *shader;

  GstVideoMultiviewMode input_mode_override;
  GstVideoMultiviewFlags input_flags_override;
  GstVideoMultiviewMode output_mode_override;
  GstVideoMultiviewFlags output_flags_override;

  GstGLStereoDownmix downmix_mode;

  GstVideoInfo in_info;
  GstVideoInfo out_info;

  GstGLTextureTarget from_texture_target;
  GstGLTextureTarget to_texture_target;
  gboolean caps_passthrough;

  gboolean initted;
  gboolean reconfigure;

  GstGLFramebuffer *fbo;

  /* <private> */
  GstGLViewConvertPrivate *priv;

  gpointer _padding[GST_PADDING];
};

/**
 * GstGLViewConvertClass:
 *
 * Opaque #GstGLViewConvertClass struct
 */
struct _GstGLViewConvertClass
{
  /* <private> */
  GstObjectClass object_class;

  gpointer                  _padding[GST_PADDING];
};

GST_EXPORT
GType gst_gl_view_convert_get_type (void);
GST_EXPORT
GstGLViewConvert * gst_gl_view_convert_new (void);

GST_EXPORT
gboolean  gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert, GstCaps * in_caps, GstCaps * out_caps);
GST_EXPORT
GstCaps * gst_gl_view_convert_transform_caps (GstGLViewConvert * viewconvert,
    GstPadDirection direction, GstCaps * caps, GstCaps * filter);
GST_EXPORT
GstCaps * gst_gl_view_convert_fixate_caps (GstGLViewConvert *viewconvert,
    GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
GST_EXPORT
GstFlowReturn gst_gl_view_convert_submit_input_buffer (GstGLViewConvert *viewconvert,
    gboolean is_discont, GstBuffer * input);
GST_EXPORT
GstFlowReturn gst_gl_view_convert_get_output (GstGLViewConvert *viewconvert,
    GstBuffer ** outbuf_ptr);

GST_EXPORT
GstBuffer * gst_gl_view_convert_perform (GstGLViewConvert * viewconvert, GstBuffer *inbuf);
GST_EXPORT
void gst_gl_view_convert_reset (GstGLViewConvert * viewconvert);
GST_EXPORT
void gst_gl_view_convert_set_context (GstGLViewConvert *viewconvert, GstGLContext * context);

G_END_DECLS
#endif /* _GST_GL_VIEW_CONVERT_H_ */
