/*
 * # Copyright 2020 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _GST_GLBOX_H
#define _GST_GLBOX_H

#include <gst/gst.h>

#include <gst/gl/gstglfilter.h>

G_BEGIN_DECLS

#define GST_TYPE_GL_BOX            (gst_gl_box_get_type())
#define GST_GL_BOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_BOX,GstGLBox))
#define GST_IS_GL_BOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_BOX))
#define GST_GL_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_GL_BOX,GstGLBoxClass))
#define GST_IS_GL_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_BOX))
#define GST_GL_BOX_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_BOX,GstGLBoxClass))

typedef struct _GstGLBox GstGLBox;
typedef struct _GstGLBoxClass GstGLBoxClass;


struct _GstGLBox
{
  GstGLFilter filter;
  GstGLShader *shader;
  GstVideoRectangle viewport;
};

struct _GstGLBoxClass
{
    GstGLFilterClass filter_class;
};

GType gst_gl_box_get_type (void);

G_END_DECLS

#endif /* _GST_GLBOX_H */
