Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
v4l2.c File Reference

Capture images from a V4L2 device (Video for Linux 2) More...

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <pthread.h>
#include "v4l2.h"
#include "virt2phys.h"
#include <sys/time.h>
#include "mcu_periph/sys_time.h"
+ Include dependency graph for v4l2.c:

Go to the source code of this file.

Macros

#define CLEAR(x)   memset(&(x), 0, sizeof (x))
 

Functions

static void * v4l2_capture_thread (void *data)
 The main capturing thread This thread handles the queue and dequeue of buffers, to make sure only the latest image buffer is preserved for image processing. More...
 
bool v4l2_init_subdev (char *subdev_name, uint8_t pad, uint16_t code, struct img_size_t size)
 Initialize a V4L2 subdevice. More...
 
struct v4l2_devicev4l2_init (char *device_name, struct img_size_t size, struct crop_t crop, uint8_t buffers_cnt, uint32_t _pixelformat)
 Initialize a V4L2(Video for Linux 2) device. More...
 
void v4l2_image_get (struct v4l2_device *dev, struct image_t *img)
 Get the latest image buffer and lock it (Thread safe, BLOCKING) This functions blocks until image access is granted. More...
 
bool v4l2_image_get_nonblock (struct v4l2_device *dev, struct image_t *img)
 Get the latest image and lock it (Thread safe, NON BLOCKING) This function returns NULL if it can't get access to the current image. More...
 
void v4l2_image_free (struct v4l2_device *dev, struct image_t *img)
 Free the image and enqueue the buffer (Thread safe) This must be done after processing the image, because else all buffers are locked. More...
 
bool v4l2_start_capture (struct v4l2_device *dev)
 Start capturing images in streaming mode (Thread safe) More...
 
bool v4l2_stop_capture (struct v4l2_device *dev)
 Stop capturing of the image stream (Thread safe) This function is blocking until capturing thread is closed. More...
 
void v4l2_close (struct v4l2_device *dev)
 Close the V4L2 device (Thread safe) This needs to be preformed to clean up all the buffers and close the device. More...
 

Detailed Description

Capture images from a V4L2 device (Video for Linux 2)

Definition in file v4l2.c.

Macro Definition Documentation

◆ CLEAR

#define CLEAR (   x)    memset(&(x), 0, sizeof (x))

Definition at line 46 of file v4l2.c.

Function Documentation

◆ v4l2_capture_thread()

static void * v4l2_capture_thread ( void *  data)
static

The main capturing thread This thread handles the queue and dequeue of buffers, to make sure only the latest image buffer is preserved for image processing.

Parameters
[in]*dataThe Video 4 Linux 2 device pointer
Returns
0 on success, -1 if it isn't able to fetch an image, -2 on timeout of taking an image, -3 on failing buffer dequeue

Definition at line 57 of file v4l2.c.

References CLEAR, dev, get_sys_time_usec(), TRUE, and V4L2_IMG_NONE.

Referenced by v4l2_start_capture().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ v4l2_close()

void v4l2_close ( struct v4l2_device dev)

Close the V4L2 device (Thread safe) This needs to be preformed to clean up all the buffers and close the device.

Note that this also stops the capturing if it is still capturing.

Parameters
[in]*devThe video for linux device to close(cleanup)

Definition at line 537 of file v4l2.c.

References dev, and v4l2_stop_capture().

+ Here is the call graph for this function:

◆ v4l2_image_free()

void v4l2_image_free ( struct v4l2_device dev,
struct image_t img 
)

Free the image and enqueue the buffer (Thread safe) This must be done after processing the image, because else all buffers are locked.

Parameters
[in]*devThe video for linux device which the image is from
[in]*imgThe image to free

Definition at line 418 of file v4l2.c.

References image_t::buf_idx, CLEAR, and dev.

Referenced by video_thread_function().

+ Here is the caller graph for this function:

◆ v4l2_image_get()

void v4l2_image_get ( struct v4l2_device dev,
struct image_t img 
)

Get the latest image buffer and lock it (Thread safe, BLOCKING) This functions blocks until image access is granted.

This should not take that long, because it is only locked while enqueueing an image. Make sure you free the image after processing with v4l2_image_free()!

Parameters
[in]*devThe V4L2 video device we want to get an image from
[out]*imgThe image that we got from the video device

Definition at line 344 of file v4l2.c.

References image_t::buf, image_t::buf_idx, image_t::buf_size, dev, image_t::h, IMAGE_YUV422, image_t::pprz_ts, image_t::ts, image_t::type, V4L2_IMG_NONE, and image_t::w.

Referenced by video_thread_function().

+ Here is the caller graph for this function:

◆ v4l2_image_get_nonblock()

bool v4l2_image_get_nonblock ( struct v4l2_device dev,
struct image_t img 
)

Get the latest image and lock it (Thread safe, NON BLOCKING) This function returns NULL if it can't get access to the current image.

Make sure you free the image after processing with v4l2_image_free())!

Parameters
[in]*devThe V4L2 video device we want to get an image from
[out]*imgThe image that we got from the video device
Returns
Whether we got an image or not

Definition at line 383 of file v4l2.c.

References image_t::buf, image_t::buf_idx, image_t::buf_size, dev, image_t::h, IMAGE_YUV422, image_t::pprz_ts, image_t::ts, image_t::type, V4L2_IMG_NONE, and image_t::w.

◆ v4l2_init()

struct v4l2_device* v4l2_init ( char *  device_name,
struct img_size_t  size,
struct crop_t  crop,
uint8_t  buffers_cnt,
uint32_t  _pixelformat 
)

Initialize a V4L2(Video for Linux 2) device.

Note that the device must be closed with v4l2_close(dev) at the end.

Parameters
[in]device_nameThe video device name (like /dev/video1)
[in]width,heightThe width and height of the images
[in]buffers_cntThe amount of buffers used for mapping
Returns
The newly create V4L2 device

Definition at line 184 of file v4l2.c.

References v4l2_img_buf::buf, v4l2_device::buffers, check_contiguity(), CLEAR, dev, fd, img_size_t::h, crop_t::h, v4l2_img_buf::length, physmem::paddr, v4l2_img_buf::physp, physmem::size, img_size_t::w, crop_t::w, crop_t::x, and crop_t::y.

Referenced by initialize_camera().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ v4l2_init_subdev()

bool v4l2_init_subdev ( char *  subdev_name,
uint8_t  pad,
uint16_t  code,
struct img_size_t  size 
)

Initialize a V4L2 subdevice.

Parameters
[in]*subdev_nameThe subdevice name (like /dev/v4l-subdev0)
[in]pad,whichThe way the subdevice should comminicate and be connected to the real device.
[in]codeThe encoding the subdevice uses (like V4L2_MBUS_FMT_UYVY8_2X8, see the V4L2 manual for available encodings)
[in]width,heightThe width and height of the images
Returns
Whether the subdevice was successfully initialized

Definition at line 137 of file v4l2.c.

References CLEAR, fd, img_size_t::h, and img_size_t::w.

Referenced by initialize_camera().

+ Here is the caller graph for this function:

◆ v4l2_start_capture()

bool v4l2_start_capture ( struct v4l2_device dev)

Start capturing images in streaming mode (Thread safe)

Parameters
[in]*devThe video for linux device to start capturing from
Returns
It resturns TRUE if it successfully started capture, but keep in mind that if it is already started it will return FALSE.

Definition at line 439 of file v4l2.c.

References CLEAR, dev, v4l2_capture_thread(), and V4L2_IMG_NONE.

Referenced by video_thread_function().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ v4l2_stop_capture()

bool v4l2_stop_capture ( struct v4l2_device dev)

Stop capturing of the image stream (Thread safe) This function is blocking until capturing thread is closed.

Parameters
[in]*devThe video for linux device to stop capturing
Returns
TRUE if it successfully stopped capturing. Note that it also returns FALSE when the capturing is already stopped.

Definition at line 502 of file v4l2.c.

References dev.

Referenced by stop_video_thread(), and v4l2_close().

+ Here is the caller graph for this function: