diff options
author | Edgard Lima <edgard.lima@indt.org.br> | 2006-05-11 17:59:59 +0000 |
---|---|---|
committer | Edgard Lima <edgard.lima@indt.org.br> | 2006-05-11 17:59:59 +0000 |
commit | 4a246a0d9d3bba695bd84532ee4a6fca19415e1b (patch) | |
tree | 26c62ea208e3c4c2986006f9517857993a1ea5f0 /sys/v4l2/gstv4l2object.h | |
parent | c4feff34927f2ff4224494644fa8d63c41ee82ad (diff) | |
download | gst-plugins-bad-4a246a0d9d3bba695bd84532ee4a6fca19415e1b.tar.gz gst-plugins-bad-4a246a0d9d3bba695bd84532ee4a6fca19415e1b.tar.bz2 gst-plugins-bad-4a246a0d9d3bba695bd84532ee4a6fca19415e1b.zip |
Changes proposed by Wingo in bug #338818.
Original commit message from CVS:
Changes proposed by Wingo in bug #338818.
Diffstat (limited to 'sys/v4l2/gstv4l2object.h')
-rw-r--r-- | sys/v4l2/gstv4l2object.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h new file mode 100644 index 00000000..37552185 --- /dev/null +++ b/sys/v4l2/gstv4l2object.h @@ -0,0 +1,211 @@ +/* GStreamer + * + * gstv4l2object.h: base class for V4L2 elements + * + * Copyright (C) 2001-2002 Ronald Bultje <rbultje@ronald.bitfreak.net> + * Copyright (C) 2006 Edgard Lima <edgard.lima@indt.org.br> + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_V4L2OBJECT_H__ +#define __GST_V4L2OBJECT_H__ + +/* Because of some really cool feature in video4linux1, also known as + * 'not including sys/types.h and sys/time.h', we had to include it + * ourselves. In all their intelligence, these people decided to fix + * this in the next version (video4linux2) in such a cool way that it + * breaks all compilations of old stuff... + * The real problem is actually that linux/time.h doesn't use proper + * macro checks before defining types like struct timeval. The proper + * fix here is to either fuck the kernel header (which is what we do + * by defining _LINUX_TIME_H, an innocent little hack) or by fixing it + * upstream, which I'll consider doing later on. If you get compiler + * errors here, check your linux/time.h && sys/time.h header setup. + */ +#include <sys/types.h> +#include <linux/types.h> +#define _LINUX_TIME_H +#define __user +#include <linux/videodev2.h> + +#include <gst/gst.h> +#include <gst/base/gstpushsrc.h> + +#include <gst/interfaces/propertyprobe.h> + +G_BEGIN_DECLS + +typedef struct _GstV4l2Object GstV4l2Object; +typedef struct _GstV4l2ObjectClassHelper GstV4l2ObjectClassHelper; +typedef struct _GstV4l2Xv GstV4l2Xv; + +typedef gboolean (*GstV4l2GetInOutFunction) (GstV4l2Object * v4l2object, gint * input); +typedef gboolean (*GstV4l2SetInOutFunction) (GstV4l2Object * v4l2object, gint input); +typedef gboolean (*GstV4l2UpdateFpsFunction) (GstV4l2Object * v4l2object); + +struct _GstV4l2Object { + GstElement * element; + + /* the video device */ + char *videodev; + + /* the video-device's file descriptor */ + gint video_fd; + + /* the video buffer (mmap()'ed) */ + guint8 **buffer; + + /* the video device's capabilities */ + struct v4l2_capability vcap; + + /* the video device's window properties */ + struct v4l2_window vwin; + + /* some more info about the current input's capabilities */ + struct v4l2_input vinput; + + /* lists... */ + GList *colors; + GList *stds; + GList *inputs; + + /* properties */ + gchar *std; + gchar *input; + gulong frequency; + + + /* X-overlay */ + GstV4l2Xv *xv; + gulong xwindow_id; + + /* funcs */ + GstV4l2GetInOutFunction get_in_out_func; + GstV4l2SetInOutFunction set_in_out_func; + GstV4l2UpdateFpsFunction update_fps_func; + +}; + +struct _GstV4l2ObjectClassHelper { + /* probed devices */ + GList *devices; + +}; + + +GType gst_v4l2object_get_type(void); + + +#define OPEN_V4L2OBJECT_PROPS \ + enum { \ + PROP_0, \ + PROP_DEVICE, \ + PROP_DEVICE_NAME, \ + PROP_FLAGS, \ + PROP_STD, \ + PROP_INPUT, \ + PROP_FREQUENCY + +#define CLOSE_V4L2OBJECT_PROPS }; + +extern GstV4l2Object * +gst_v4l2object_new (GstElement * element, + GstV4l2GetInOutFunction get_in_out_func, + GstV4l2SetInOutFunction set_in_out_func, + GstV4l2UpdateFpsFunction update_fps_func); + +extern void +gst_v4l2object_destroy (GstV4l2Object ** v4l2object); + +extern void +gst_v4l2object_install_properties_helper (GObjectClass *gobject_class); + +extern gboolean +gst_v4l2object_set_property_helper (GstV4l2Object *v4l2object, + guint prop_id, const GValue * value, GParamSpec * pspec); +extern gboolean +gst_v4l2object_get_property_helper (GstV4l2Object *v4l2object, + guint prop_id, GValue * value, GParamSpec * pspec); + +extern gboolean gst_v4l2object_start (GstV4l2Object *v4l2object); +extern gboolean gst_v4l2object_stop (GstV4l2Object *v4l2object); + +extern const GList * +gst_v4l2_probe_get_properties (GstPropertyProbe * probe); + +extern void +gst_v4l2_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); + +extern gboolean +gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); + +extern GValueArray * +gst_v4l2_probe_get_values (GstPropertyProbe * probe, + guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); + +#define GST_IMPLEMENT_V4L2_PROBE_METHODS(Type_Class, interface_as_function) \ + \ +static void \ +interface_as_function ## _probe_probe_property (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) probe; \ + gst_v4l2_probe_probe_property (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static gboolean \ +interface_as_function ## _probe_needs_probe (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) probe; \ + return gst_v4l2_probe_needs_probe (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static GValueArray * \ +interface_as_function ## _probe_get_values (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) probe; \ + return gst_v4l2_probe_get_values (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static void \ +interface_as_function ## _property_probe_interface_init (GstPropertyProbeInterface * iface) \ +{ \ + iface->get_properties = gst_v4l2_probe_get_properties; \ + iface->probe_property = interface_as_function ## _probe_probe_property; \ + iface->needs_probe = interface_as_function ## _probe_needs_probe; \ + iface->get_values = interface_as_function ## _probe_get_values; \ +} + +G_END_DECLS + +#endif /* __GST_V4L2OBJECT_H__ */ |