1 /* GStreamer 2 * 3 * Copyright (C) 2001-2002 Ronald Bultje <rbultje@ronald.bitfreak.net> 4 * 2006 Edgard Lima <edgard.lima@gmail.com> 5 * 6 * gstv4l2object.h: base class for V4L2 elements 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public 19 * License along with this library; if not, write to the 20 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 */ 23 24 #ifndef __GST_V4L2_OBJECT_H__ 25 #define __GST_V4L2_OBJECT_H__ 26 27 #include "ext/videodev2.h" 28 #ifdef HAVE_LIBV4L2 29 # include <libv4l2.h> 30 #endif 31 32 #include "v4l2-utils.h" 33 34 #include <gst/gst.h> 35 #include <gst/base/gstpushsrc.h> 36 37 #include <gst/video/video.h> 38 #include <unistd.h> 39 40 typedef struct _GstV4l2Object GstV4l2Object; 41 typedef struct _GstV4l2ObjectClassHelper GstV4l2ObjectClassHelper; 42 43 #include <gstv4l2bufferpool.h> 44 45 /* size of v4l2 buffer pool in streaming case */ 46 #define GST_V4L2_MIN_BUFFERS 2 47 48 /* max frame width/height */ 49 #define GST_V4L2_MAX_SIZE (1<<15) /* 2^15 == 32768 */ 50 51 G_BEGIN_DECLS 52 53 #define GST_TYPE_V4L2_IO_MODE (gst_v4l2_io_mode_get_type ()) 54 GType gst_v4l2_io_mode_get_type (void); 55 56 #define GST_V4L2_OBJECT(obj) (GstV4l2Object *)(obj) 57 58 typedef enum { 59 GST_V4L2_IO_AUTO = 0, 60 GST_V4L2_IO_RW = 1, 61 GST_V4L2_IO_MMAP = 2, 62 GST_V4L2_IO_USERPTR = 3, 63 GST_V4L2_IO_DMABUF = 4, 64 GST_V4L2_IO_DMABUF_IMPORT = 5 65 } GstV4l2IOMode; 66 67 typedef gboolean (*GstV4l2GetInOutFunction) (GstV4l2Object * v4l2object, gint * input); 68 typedef gboolean (*GstV4l2SetInOutFunction) (GstV4l2Object * v4l2object, gint input); 69 typedef gboolean (*GstV4l2UpdateFpsFunction) (GstV4l2Object * v4l2object); 70 71 /* On Android NDK r18b the ioctl() signature uses 'unsigned' instead of 72 * 'unsigned long' for the 2nd parameter */ 73 #ifdef __ANDROID__ 74 typedef unsigned ioctl_req_t; 75 #else 76 typedef gulong ioctl_req_t; 77 #endif 78 79 #define GST_V4L2_WIDTH(o) (GST_VIDEO_INFO_WIDTH (&(o)->info)) 80 #define GST_V4L2_HEIGHT(o) (GST_VIDEO_INFO_HEIGHT (&(o)->info)) 81 #define GST_V4L2_PIXELFORMAT(o) ((o)->fmtdesc->pixelformat) 82 #define GST_V4L2_FPS_N(o) (GST_VIDEO_INFO_FPS_N (&(o)->info)) 83 #define GST_V4L2_FPS_D(o) (GST_VIDEO_INFO_FPS_D (&(o)->info)) 84 85 /* simple check whether the device is open */ 86 #define GST_V4L2_IS_OPEN(o) ((o)->video_fd > 0) 87 88 /* check whether the device is 'active' */ 89 #define GST_V4L2_IS_ACTIVE(o) ((o)->active) 90 #define GST_V4L2_SET_ACTIVE(o) ((o)->active = TRUE) 91 #define GST_V4L2_SET_INACTIVE(o) ((o)->active = FALSE) 92 93 /* checks whether the current v4lv4l2object has already been open()'ed or not */ 94 #define GST_V4L2_CHECK_OPEN(v4l2object) \ 95 if (!GST_V4L2_IS_OPEN(v4l2object)) \ 96 { \ 97 GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ 98 (_("Device is not open.")), (NULL)); \ 99 return FALSE; \ 100 } 101 102 /* checks whether the current v4lv4l2object is close()'ed or whether it is still open */ 103 #define GST_V4L2_CHECK_NOT_OPEN(v4l2object) \ 104 if (GST_V4L2_IS_OPEN(v4l2object)) \ 105 { \ 106 GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ 107 (_("Device is open.")), (NULL)); \ 108 return FALSE; \ 109 } 110 111 /* checks whether we're out of capture mode or not */ 112 #define GST_V4L2_CHECK_NOT_ACTIVE(v4l2object) \ 113 if (GST_V4L2_IS_ACTIVE(v4l2object)) \ 114 { \ 115 GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ 116 (NULL), ("Device is in streaming mode")); \ 117 return FALSE; \ 118 } 119 120 121 struct _GstV4l2Object { 122 GstElement * element; 123 GstObject * dbg_obj; 124 125 enum v4l2_buf_type type; /* V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT */ 126 127 /* the video device */ 128 char *videodev; 129 130 /* the video-device's file descriptor */ 131 gint video_fd; 132 GstV4l2IOMode mode; 133 134 gboolean active; 135 gboolean streaming; 136 137 /* the current format */ 138 struct v4l2_fmtdesc *fmtdesc; 139 struct v4l2_format format; 140 GstVideoInfo info; 141 GstVideoAlignment align; 142 143 /* Features */ 144 gboolean need_video_meta; 145 gboolean has_alpha_component; 146 147 /* only used if the device supports MPLANE 148 * nb planes is meaning of v4l2 planes 149 * the gstreamer equivalent is gst_buffer_n_memory 150 */ 151 gint n_v4l2_planes; 152 153 /* We cache the frame duration if known */ 154 GstClockTime duration; 155 156 /* if the MPLANE device support both contiguous and non contiguous 157 * it allows to select which one we want. But we prefered_non_contiguous 158 * non contiguous mode. 159 */ 160 gboolean prefered_non_contiguous; 161 162 /* This will be set if supported in decide_allocation. It can be used to 163 * calculate the minimum latency. */ 164 guint32 min_buffers; 165 166 /* wanted mode */ 167 GstV4l2IOMode req_mode; 168 169 /* optional pool */ 170 GstBufferPool *pool; 171 172 /* the video device's capabilities */ 173 struct v4l2_capability vcap; 174 /* opened device specific capabilities */ 175 guint32 device_caps; 176 177 /* lists... */ 178 GSList *formats; /* list of available capture formats */ 179 GstCaps *probed_caps; 180 181 GList *colors; 182 GList *norms; 183 GList *channels; 184 GData *controls; 185 186 /* properties */ 187 v4l2_std_id tv_norm; 188 gchar *channel; 189 gulong frequency; 190 GstStructure *extra_controls; 191 gboolean keep_aspect; 192 GValue *par; 193 194 /* funcs */ 195 GstV4l2GetInOutFunction get_in_out_func; 196 GstV4l2SetInOutFunction set_in_out_func; 197 GstV4l2UpdateFpsFunction update_fps_func; 198 199 /* syscalls */ 200 gint (*fd_open) (gint fd, gint v4l2_flags); 201 gint (*close) (gint fd); 202 gint (*dup) (gint fd); 203 gint (*ioctl) (gint fd, ioctl_req_t request, ...); 204 gssize (*read) (gint fd, gpointer buffer, gsize n); 205 gpointer (*mmap) (gpointer start, gsize length, gint prot, gint flags, 206 gint fd, off_t offset); 207 gint (*munmap) (gpointer _start, gsize length); 208 209 /* Quirks */ 210 /* Skips interlacing probes */ 211 gboolean never_interlaced; 212 /* Allow to skip reading initial format through G_FMT. Some devices 213 * just fails if you don't call S_FMT first. (ex: M2M decoders) */ 214 gboolean no_initial_format; 215 /* Avoid any try_fmt probe. This is used by v4l2src to speedup start up time 216 * on slow USB firmwares. When this is set, gst_v4l2_set_format() will modify 217 * the caps to reflect what was negotiated during fixation */ 218 gboolean skip_try_fmt_probes; 219 }; 220 221 struct _GstV4l2ObjectClassHelper { 222 /* probed devices */ 223 GList *devices; 224 }; 225 226 GType gst_v4l2_object_get_type (void); 227 228 #define V4L2_STD_OBJECT_PROPS \ 229 PROP_DEVICE, \ 230 PROP_DEVICE_NAME, \ 231 PROP_DEVICE_FD, \ 232 PROP_FLAGS, \ 233 PROP_BRIGHTNESS, \ 234 PROP_CONTRAST, \ 235 PROP_SATURATION, \ 236 PROP_HUE, \ 237 PROP_TV_NORM, \ 238 PROP_IO_MODE, \ 239 PROP_OUTPUT_IO_MODE, \ 240 PROP_CAPTURE_IO_MODE, \ 241 PROP_EXTRA_CONTROLS, \ 242 PROP_PIXEL_ASPECT_RATIO, \ 243 PROP_FORCE_ASPECT_RATIO 244 245 /* create/destroy */ 246 GstV4l2Object* gst_v4l2_object_new (GstElement * element, 247 GstObject * dbg_obj, 248 enum v4l2_buf_type type, 249 const char * default_device, 250 GstV4l2GetInOutFunction get_in_out_func, 251 GstV4l2SetInOutFunction set_in_out_func, 252 GstV4l2UpdateFpsFunction update_fps_func); 253 254 void gst_v4l2_object_destroy (GstV4l2Object * v4l2object); 255 256 /* properties */ 257 258 void gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, 259 const char * default_device); 260 261 void gst_v4l2_object_install_m2m_properties_helper (GObjectClass * gobject_class); 262 263 gboolean gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object, 264 guint prop_id, 265 const GValue * value, 266 GParamSpec * pspec); 267 gboolean gst_v4l2_object_get_property_helper (GstV4l2Object *v4l2object, 268 guint prop_id, GValue * value, 269 GParamSpec * pspec); 270 /* open/close */ 271 gboolean gst_v4l2_object_open (GstV4l2Object * v4l2object); 272 gboolean gst_v4l2_object_open_shared (GstV4l2Object * v4l2object, GstV4l2Object * other); 273 gboolean gst_v4l2_object_close (GstV4l2Object * v4l2object); 274 275 /* probing */ 276 277 GstCaps* gst_v4l2_object_get_all_caps (void); 278 279 GstCaps* gst_v4l2_object_get_raw_caps (void); 280 281 GstCaps* gst_v4l2_object_get_codec_caps (void); 282 283 gint gst_v4l2_object_extrapolate_stride (const GstVideoFormatInfo * finfo, 284 gint plane, gint stride); 285 286 gboolean gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps, GstV4l2Error * error); 287 gboolean gst_v4l2_object_try_format (GstV4l2Object * v4l2object, GstCaps * caps, GstV4l2Error * error); 288 gboolean gst_v4l2_object_try_import (GstV4l2Object * v4l2object, GstBuffer * buffer); 289 290 gboolean gst_v4l2_object_caps_equal (GstV4l2Object * v4l2object, GstCaps * caps); 291 gboolean gst_v4l2_object_caps_is_subset (GstV4l2Object * v4l2object, GstCaps * caps); 292 GstCaps * gst_v4l2_object_get_current_caps (GstV4l2Object * v4l2object); 293 294 gboolean gst_v4l2_object_unlock (GstV4l2Object * v4l2object); 295 gboolean gst_v4l2_object_unlock_stop (GstV4l2Object * v4l2object); 296 297 gboolean gst_v4l2_object_stop (GstV4l2Object * v4l2object); 298 299 GstCaps * gst_v4l2_object_probe_caps (GstV4l2Object * v4l2object, GstCaps * filter); 300 GstCaps * gst_v4l2_object_get_caps (GstV4l2Object * v4l2object, GstCaps * filter); 301 302 gboolean gst_v4l2_object_acquire_format (GstV4l2Object * v4l2object, GstVideoInfo * info); 303 304 gboolean gst_v4l2_object_set_crop (GstV4l2Object * obj); 305 306 gboolean gst_v4l2_object_decide_allocation (GstV4l2Object * v4l2object, GstQuery * query); 307 308 gboolean gst_v4l2_object_propose_allocation (GstV4l2Object * obj, GstQuery * query); 309 310 GstStructure * gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc); 311 312 /* TODO Move to proper namespace */ 313 /* open/close the device */ 314 gboolean gst_v4l2_open (GstV4l2Object * v4l2object); 315 gboolean gst_v4l2_dup (GstV4l2Object * v4l2object, GstV4l2Object * other); 316 gboolean gst_v4l2_close (GstV4l2Object * v4l2object); 317 318 /* norm/input/output */ 319 gboolean gst_v4l2_get_norm (GstV4l2Object * v4l2object, v4l2_std_id * norm); 320 gboolean gst_v4l2_set_norm (GstV4l2Object * v4l2object, v4l2_std_id norm); 321 gboolean gst_v4l2_get_input (GstV4l2Object * v4l2object, gint * input); 322 gboolean gst_v4l2_set_input (GstV4l2Object * v4l2object, gint input); 323 gboolean gst_v4l2_get_output (GstV4l2Object * v4l2object, gint * output); 324 gboolean gst_v4l2_set_output (GstV4l2Object * v4l2object, gint output); 325 326 /* frequency control */ 327 gboolean gst_v4l2_get_frequency (GstV4l2Object * v4l2object, gint tunernum, gulong * frequency); 328 gboolean gst_v4l2_set_frequency (GstV4l2Object * v4l2object, gint tunernum, gulong frequency); 329 gboolean gst_v4l2_signal_strength (GstV4l2Object * v4l2object, gint tunernum, gulong * signal); 330 331 /* attribute control */ 332 gboolean gst_v4l2_get_attribute (GstV4l2Object * v4l2object, int attribute, int * value); 333 gboolean gst_v4l2_set_attribute (GstV4l2Object * v4l2object, int attribute, const int value); 334 gboolean gst_v4l2_set_controls (GstV4l2Object * v4l2object, GstStructure * controls); 335 336 G_END_DECLS 337 338 #endif /* __GST_V4L2_OBJECT_H__ */ 339