/*
 * Copyright (c) 2016 MediaTek Inc
 *     Author: Rick Chang <rick.chang@mediatek.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_V4L2_MTK_JPEG_DEC_H__
#define __GST_V4L2_MTK_JPEG_DEC_H__

#include <gst/gst.h>
#include "gstv4l2videodec.h"

GST_DEBUG_CATEGORY_EXTERN (v4l2mtkjpegdec_debug);

G_BEGIN_DECLS
#define GST_TYPE_V4L2_MTK_JPEG_DEC \
  (gst_v4l2_mtk_jpeg_dec_get_type())
#define GST_V4L2_MTK_JPEG_DEC(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_MTK_JPEG_DEC,GstV4l2MtkJpegDec))
#define GST_V4L2_MTK_JPEG_DEC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_MTK_JPEG_DEC,GstV4l2MtkJpegDecClass))
#define GST_IS_V4L2_MTK_JPEG_DEC(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_MTK_JPEG_DEC))
#define GST_IS_V4L2_MTK_JPEG_DEC_CLASS(obj) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_MTK_JPEG_DEC))
typedef struct _GstV4l2MtkJpegDec GstV4l2MtkJpegDec;
typedef struct _GstV4l2MtkJpegDecClass GstV4l2MtkJpegDecClass;

struct _GstV4l2MtkJpegDec
{
  GstV4l2VideoDec parent;
};

struct _GstV4l2MtkJpegDecClass
{
  GstV4l2VideoDecClass parent_class;
};

GType gst_v4l2_mtk_jpeg_dec_get_type (void);

gboolean gst_v4l2_is_mtk_jpeg_dec (GstCaps * sink_caps, GstCaps * src_caps);

gboolean gst_v4l2_mtk_jpeg_dec_register (GstPlugin * plugin,
    const gchar * basename,
    const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps);

G_END_DECLS
#endif /* __GST_V4L2_MTK_JPEG_DEC_H__ */