170 lines
5.6 KiB
C
170 lines
5.6 KiB
C
/*******************************************************************************
|
|
# Linuc-UVC streaming input-plugin for MJPG-streamer #
|
|
# #
|
|
# This package work with the Logitech UVC based webcams with the mjpeg feature #
|
|
# #
|
|
# Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard #
|
|
# 2007 Lucas van Staden #
|
|
# 2007 Tom Stöveken #
|
|
# #
|
|
# This program is free software; you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation; either version 2 of the License, or #
|
|
# (at your option) any later version. #
|
|
# #
|
|
# This program 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 General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with this program; if not, write to the Free Software #
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
|
# #
|
|
*******************************************************************************/
|
|
|
|
#ifndef V4L2_UVC_H
|
|
#define V4L2_UVC_H
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/select.h>
|
|
|
|
#include <linux/types.h> /* for videodev2.h */
|
|
#include <linux/videodev2.h>
|
|
|
|
#include "../../mjpg_streamer.h"
|
|
#define NB_BUFFER 4
|
|
|
|
|
|
#define IOCTL_RETRY 4
|
|
|
|
/* ioctl with a number of retries in the case of I/O failure
|
|
* args:
|
|
* fd - device descriptor
|
|
* IOCTL_X - ioctl reference
|
|
* arg - pointer to ioctl data
|
|
* returns - ioctl result
|
|
*/
|
|
int xioctl(int fd, int IOCTL_X, void *arg);
|
|
|
|
#ifdef USE_LIBV4L2
|
|
#include <libv4l2.h>
|
|
#define IOCTL_VIDEO(fd, req, value) v4l2_ioctl(fd, req, value)
|
|
#define OPEN_VIDEO(fd, flags) v4l2_open(fd, flags)
|
|
#define CLOSE_VIDEO(fd) v4l2_close(fd)
|
|
#else
|
|
#define IOCTL_VIDEO(fd, req, value) ioctl(fd, req, value)
|
|
#define OPEN_VIDEO(fd, flags) open(fd, flags)
|
|
#define CLOSE_VIDEO(fd) close(fd)
|
|
#endif
|
|
|
|
typedef enum _streaming_state streaming_state;
|
|
enum _streaming_state {
|
|
STREAMING_OFF = 0,
|
|
STREAMING_ON = 1,
|
|
STREAMING_PAUSED = 2,
|
|
};
|
|
|
|
struct vdIn {
|
|
int fd;
|
|
char *videodevice;
|
|
char *status;
|
|
char *pictName;
|
|
struct v4l2_capability cap;
|
|
struct v4l2_format fmt;
|
|
struct v4l2_buffer buf;
|
|
struct v4l2_requestbuffers rb;
|
|
void *mem[NB_BUFFER];
|
|
unsigned char *tmpbuffer;
|
|
unsigned char *framebuffer;
|
|
streaming_state streamingState;
|
|
int grabmethod;
|
|
int width;
|
|
int height;
|
|
int fps;
|
|
int formatIn;
|
|
int formatOut;
|
|
int framesizeIn;
|
|
int signalquit;
|
|
int toggleAvi;
|
|
int getPict;
|
|
int rawFrameCapture;
|
|
/* raw frame capture */
|
|
unsigned int fileCounter;
|
|
/* raw frame stream capture */
|
|
unsigned int rfsFramesWritten;
|
|
unsigned int rfsBytesWritten;
|
|
/* raw stream capture */
|
|
FILE *captureFile;
|
|
unsigned int framesWritten;
|
|
unsigned int bytesWritten;
|
|
int framecount;
|
|
int recordstart;
|
|
int recordtime;
|
|
uint32_t tmpbytesused;
|
|
struct timeval tmptimestamp;
|
|
v4l2_std_id vstd;
|
|
unsigned long frame_period_time; // in ms
|
|
unsigned char soft_framedrop;
|
|
unsigned int dv_timings;
|
|
};
|
|
|
|
/* optional initial settings */
|
|
typedef struct {
|
|
int quality_set, quality,
|
|
sh_set, sh,
|
|
co_set, co,
|
|
br_set, br_auto, br,
|
|
sa_set, sa,
|
|
wb_set, wb_auto, wb,
|
|
ex_set, ex_auto, ex,
|
|
bk_set, bk,
|
|
rot_set, rot,
|
|
hf_set, hf,
|
|
vf_set, vf,
|
|
pl_set, pl,
|
|
gain_set, gain_auto, gain,
|
|
cagc_set, cagc_auto, cagc,
|
|
cb_set, cb_auto, cb;
|
|
} context_settings;
|
|
|
|
/* context of each camera thread */
|
|
typedef struct {
|
|
int id;
|
|
globals *pglobal;
|
|
pthread_t threadID;
|
|
pthread_mutex_t controls_mutex;
|
|
struct vdIn *videoIn;
|
|
context_settings *init_settings;
|
|
} context;
|
|
|
|
int init_videoIn(struct vdIn *vd, char *device, int width, int height, int fps, int format, int grabmethod, globals *pglobal, int id, v4l2_std_id vstd);
|
|
void enumerateControls(struct vdIn *vd, globals *pglobal, int id);
|
|
void control_readed(struct vdIn *vd, struct v4l2_queryctrl *ctrl, globals *pglobal, int id);
|
|
int setResolution(struct vdIn *vd, int width, int height);
|
|
|
|
int memcpy_picture(unsigned char *out, unsigned char *buf, int size);
|
|
int uvcGrab(struct vdIn *vd);
|
|
int close_v4l2(struct vdIn *vd);
|
|
|
|
int video_enable(struct vdIn *vd);
|
|
int video_set_dv_timings(struct vdIn *vd);
|
|
int video_handle_event(struct vdIn *vd);
|
|
|
|
int v4l2GetControl(struct vdIn *vd, int control);
|
|
int v4l2SetControl(struct vdIn *vd, int control, int value, int plugin_number, globals *pglobal);
|
|
int v4l2UpControl(struct vdIn *vd, int control);
|
|
int v4l2DownControl(struct vdIn *vd, int control);
|
|
int v4l2ToggleControl(struct vdIn *vd, int control);
|
|
int v4l2ResetControl(struct vdIn *vd, int control);
|
|
|
|
#endif
|