/*
 * # 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_GLSVGOVERLAY_H
#define _GST_GLSVGOVERLAY_H

#include <gst/gst.h>

#include <gst/gl/gstglfilter.h>

G_BEGIN_DECLS

#define GST_TYPE_GL_SVG_OVERLAY            (gst_gl_svg_overlay_get_type())
#define GST_GL_SVG_OVERLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_SVG_OVERLAY,GstGLSvgOverlay))
#define GST_IS_GL_SVG_OVERLAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_SVG_OVERLAY))
#define GST_GL_SVG_OVERLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_GL_SVG_OVERLAY,GstGLSvgOverlayClass))
#define GST_IS_GL_SVG_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_SVG_OVERLAY))
#define GST_GL_SVG_OVERLAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_SVG_OVERLAY,GstGLSvgOverlayClass))

typedef struct _GstGLSvgOverlay GstGLSvgOverlay;
typedef struct _GstGLSvgOverlayClass GstGLSvgOverlayClass;
typedef struct _TaskData TaskData;

struct _GstGLSvgOverlay
{
  GstGLFilter filter;

  GstGLContext *context;
  GMutex mutex;
  GCond cond;
  GstGLShader *shader;
  GThreadPool *thread_pool;
  GQueue *svg_queue;
  GQueue *gl_queue;
  GstClockTime next_pts;
  guint num_tasks;
  TaskData *current;
  gboolean sync;
  gboolean started;
  guint width;
  guint height;
  guint stride;
};

struct _GstGLSvgOverlayClass
{
    GstGLFilterClass filter_class;
    gboolean (*set_svg) (GstGLSvgOverlay *overlay, const gchar *svg, GstClockTime pts);
};

enum TaskOp
{
  OP_ALLOC,
  OP_DRAW,
  OP_UPLOAD,
  OP_READY,
};

struct _TaskData {
  GstGLSvgOverlay *overlay;
  enum TaskOp op;
  gchar *svg;
  GstClockTime pts;
  GstBuffer *buf;
  GstMapInfo map;
  guint tex;
};

GType gst_gl_svg_overlay_get_type (void);

G_END_DECLS

#endif /* _GST_GLSVGOVERLAY_H */
