⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motion.h

📁 motion motion
💻 H
字号:
/*	motion.h * *	Include file for motion.c *      Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) *      This software is distributed under the GNU public license version 2 *      See also the file 'COPYING'. * */#ifndef _INCLUDE_MOTION_H#define _INCLUDE_MOTION_H#include "config.h"/* Includes */#ifdef HAVE_MYSQL#include <mysql.h>#endif#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#define __USE_GNU#include <string.h>#include <unistd.h>#include <fcntl.h>#include <time.h>#include <signal.h>#include <syslog.h>#include <limits.h>#include <errno.h>#include <sys/time.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/ioctl.h>#include <sys/param.h>#define _LINUX_TIME_H 1#if (!defined(WITHOUT_V4L)) && (!defined(BSD))#include <linux/videodev.h>#endif#include <pthread.h>#ifdef HAVE_PGSQL#include <libpq-fe.h>#endif#include "conf.h"#include "webcam.h"#include "webhttpd.h"/** * ATTRIBUTE_UNUSED: * * Macro used to signal to GCC unused function parameters */#ifdef __GNUC__#ifdef HAVE_ANSIDECL_H#include <ansidecl.h>#endif#ifndef ATTRIBUTE_UNUSED#define ATTRIBUTE_UNUSED __attribute__((unused))#endif#else#define ATTRIBUTE_UNUSED#endif/* The macro below defines a version of sleep using nanosleep * If a signal such as SIG_CHLD interrupts the sleep we just continue sleeping */#define SLEEP(seconds, nanoseconds) {              \                struct timespec tv;                \                tv.tv_sec = (seconds);             \                tv.tv_nsec = (nanoseconds);        \                while (nanosleep(&tv, &tv) == -1); \        } #if defined(WITHOUT_V4L) || defined(BSD) #define VIDEO_PALETTE_GREY      1       /* Linear greyscale */#define VIDEO_PALETTE_HI240     2       /* High 240 cube (BT848) */#define VIDEO_PALETTE_RGB565    3       /* 565 16 bit RGB */#define VIDEO_PALETTE_RGB24     4       /* 24bit RGB */#define VIDEO_PALETTE_RGB32     5       /* 32bit RGB */#define VIDEO_PALETTE_RGB555    6       /* 555 15bit RGB */#define VIDEO_PALETTE_YUV422    7       /* YUV422 capture */#define VIDEO_PALETTE_YUYV      8#define VIDEO_PALETTE_UYVY      9       /* The great thing about standards is ... */#define VIDEO_PALETTE_YUV420    10#define VIDEO_PALETTE_YUV411    11      /* YUV411 capture */#define VIDEO_PALETTE_RAW       12      /* RAW capture (BT848) */#define VIDEO_PALETTE_YUV422P   13      /* YUV 4:2:2 Planar */#define VIDEO_PALETTE_YUV411P   14      /* YUV 4:1:1 Planar */#define VIDEO_PALETTE_YUV420P   15      /* YUV 4:2:0 Planar */#define VIDEO_PALETTE_YUV410P   16      /* YUV 4:1:0 Planar */#define VIDEO_PALETTE_PLANAR    13      /* start of planar entries */#define VIDEO_PALETTE_COMPONENT 7       /* start of component entries */#endif/* Debug levels FIXME */#define CAMERA_WARNINGS         3   /* warnings only */#define CAMERA_INFO             5   /* info debug */#define CAMERA_DEBUG            7   /* debug but not verbose */#define CAMERA_VERBOSE          8   /* verbose level */#define CAMERA_ALL              9   /* everything *//* Default picture settings */#define DEF_WIDTH              352#define DEF_HEIGHT             288#define DEF_QUALITY             75#define DEF_CHANGES           1500#define DEF_MAXFRAMERATE       100#define DEF_NOISELEVEL          32/* Minimum time between two 'actions' (email, sms, external) */#define DEF_GAP                 60  /* 1 minutes */#define DEF_MAXMPEGTIME       3600  /* 60 minutes */#define DEF_FFMPEG_BPS      400000#define DEF_FFMPEG_VBR           0#define DEF_FFMPEG_CODEC   "mpeg4"#define THRESHOLD_TUNE_LENGTH  256#define MISSING_FRAMES_TIMEOUT  30  /* When failing to get picture frame from camera                                     * we reuse the previous frame until                                     * MISSING_FRAMES_TIMEOUT seconds has passed                                     * and then we show a grey image instead                                     */#define WATCHDOG_TMO 30  /* 10 sec max motion_loop interval */#define WATCHDOG_OFF -127 /* Turn off watchdog, used when we wants to quit a thread */#define CONNECTION_KO "Lost connection"#define CONNECTION_OK "Connection OK"#define DEF_MAXSTREAMS          10  /* Maximum number of webcam clients per camera */#define DEF_MAXWEBQUEUE         10  /* Maximum number of webcam client in queue */#define DEF_TIMESTAMP      "%Y-%m-%d\\n%T"#define DEF_EVENTSTAMP     "%Y%m%d%H%M%S"#define DEF_SNAPPATH       "%v-%Y%m%d%H%M%S-snapshot"#define DEF_JPEGPATH       "%v-%Y%m%d%H%M%S-%q"#define DEF_MPEGPATH       "%v-%Y%m%d%H%M%S"#define DEF_TIMEPATH       "%Y%m%d-timelapse"#define DEF_TIMELAPSE_MODE "daily"/* Do not break this line into two or more. Must be ONE line */#define DEF_SQL_QUERY "sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')"/* Filetype defines */#define FTYPE_IMAGE            1#define FTYPE_IMAGE_SNAPSHOT   2#define FTYPE_IMAGE_MOTION     4#define FTYPE_MPEG             8#define FTYPE_MPEG_MOTION     16#define FTYPE_MPEG_TIMELAPSE  32#define FTYPE_MPEG_ANY    (FTYPE_MPEG | FTYPE_MPEG_MOTION | FTYPE_MPEG_TIMELAPSE)#define FTYPE_IMAGE_ANY   (FTYPE_IMAGE | FTYPE_IMAGE_SNAPSHOT | FTYPE_IMAGE_MOTION)/* What types of jpeg files do we want to have */#define NEWIMG_OFF       0#define NEWIMG_ON        1#define NEWIMG_FIRST     2#define NEWIMG_BEST      4#define NEWIMG_CENTER    8#define LOCATE_OFF       0#define LOCATE_ON        1#define LOCATE_PREVIEW   2#define LOCATE_NORMAL    0#define LOCATE_BOTH      1#define UPDATE_REF_FRAME 1#define RESET_REF_FRAME  2/* Forward declaration, used in track.h */struct images;#include "track.h"#include "netcam.h"/* Structure to hold images information * The idea is that this should have all information about a picture e.g. diffs, timestamp etc. * The exception is the label information, it uses a lot of memory * When the image is stored all texts motion marks etc. is written to the image * so we only have to send it out when/if we want. *//* A image can have detected motion in it, but dosn't trigger an event, if we use minimum_motion_frames */#define IMAGE_MOTION     1#define IMAGE_TRIGGER    2#define IMAGE_SAVE       4#define IMAGE_SAVED      8#define IMAGE_PRECAP    16#define IMAGE_POSTCAP   32struct image_data {	unsigned char *image;	int diffs;	time_t timestamp;         /* Timestamp when image was captured */	struct tm timestamp_tm;	int shot;                 /* Sub second timestamp count */	/* movement center to img center distance 	 * Note Dist is calculated distX*distX + distY*distY */	unsigned long cent_dist;	unsigned int flags;       /* Se IMAGE_* defines */	struct coord location;      /* coordinates for center and size of last motion detection*/	int total_labels;};/* DIFFERENCES BETWEEN imgs.width, conf.width AND rotate_data.cap_width * (and the corresponding height values, of course) * =========================================================================== * Location      Purpose *  * conf          The values in conf reflect width and height set in the *               configuration file. These can be set via http remote control,  *               but they are not used internally by Motion, so it won't break *               anything. These values are transferred to imgs in vid_start. * * imgs          The values in imgs are the actual output dimensions. Normally *               the output dimensions are the same as the capture dimensions, *               but for 90 or 270 degrees rotation, they are not. E.g., if  *               you capture at 320x240, and rotate 90 degrees, the output *               dimensions are 240x320. *               These values are set from the conf values in vid_start, or  *               from the first JPEG image in netcam_start. For 90 or 270  *               degrees rotation, they are swapped in rotate_init. * * rotate_data   The values in rotate_data are named cap_width and cap_height, *               and contain the capture dimensions. The difference between *               capture and output dimensions is explained above. *               These values are set in rotate_init. *//* date/time drawing, draw.c */int draw_text (unsigned char *image, int startx, int starty, int width, const char *text, unsigned short int factor);int initialize_chars(void);struct images {	struct image_data *image_ring;    /* The base address of the image ring buffer */	int image_ring_size;	int image_ring_in;                /* Index in image ring buffer we last added a image into */	int image_ring_out;               /* Index in image ring buffer we want to process next time */	unsigned char *ref;               /* The reference frame */	unsigned char *out;               /* Picture buffer for motion images */	int *ref_dyn;                     /* Dynamic objects to be excluded from reference frame */	unsigned char *image_virgin;      /* Last picture frame with no text or locate overlay */	struct image_data preview_image;  /* Picture buffer for best image when enables */	unsigned char *mask;              /* Buffer for the mask file */	unsigned char *smartmask;	unsigned char *smartmask_final;	unsigned char *common_buffer;	int *smartmask_buffer;	int *labels;	int *labelsize;	int width;	int height;	int type;	int size;	int motionsize;	int labelgroup_max;	int labels_above;	int labelsize_max;	int largest_label;};/* Contains data for image rotation, see rotate.c. */struct rotdata {	/* Temporary buffer for 90 and 270 degrees rotation. */	unsigned char *temp_buf;	/* Degrees to rotate; copied from conf.rotate_deg. This is the value	 * that is actually used. The value of conf.rotate_deg cannot be used	 * because it can be changed by motion-control, and changing rotation	 * while Motion is running just causes problems.	 */	int degrees;	/* Capture width and height - different from output width and height if 	 * rotating 90 or 270 degrees. */	int cap_width;	int cap_height;};/*	these used to be global variables but now each thread will have its	own context */struct context {	char conf_filename[PATH_MAX];	int threadnr;	unsigned short int daemon;	char pid_file[PATH_MAX];	struct config conf;	struct images imgs;	struct trackoptions track;	struct netcam_context *netcam;	struct image_data *current_image;	/* Pointer to a structure where the image, diffs etc is stored */	unsigned short int new_img;	int locate;	struct rotdata rotate_data;		/* rotation data is thread-specific */	int noise;	int threshold;	int diffs_last[THRESHOLD_TUNE_LENGTH];	int smartmask_speed;	/* Commands to the motion thread */	volatile unsigned short int snapshot;    /* Make a snapshot */	volatile unsigned short int makemovie;   /* End a movie */	volatile unsigned short int finish;      /* End the thread */	volatile unsigned short int restart;     /* Restart the thread when it ends */	/* Is the motion thread running */	volatile unsigned short int running;	volatile int watchdog;	pthread_t thread_id;	int event_nr;	int prev_event;	int lightswitch_framecounter;	char text_event_string[PATH_MAX];	/* The text for conv. spec. %C -						we assume PATH_MAX normally 4096 characters is fine */	int postcap;				/* downcounter, frames left to to send post event */	short int shots;	unsigned short int detecting_motion;	struct tm *currenttime_tm;	struct tm *eventtime_tm;	time_t currenttime;	time_t lasttime;	time_t eventtime;	time_t connectionlosttime;		/* timestamp from connection lost */	int lastrate;	unsigned short int startup_frames;	unsigned short int moved;	unsigned short int pause;	int missing_frame_counter;		/* counts failed attempts to fetch picture frame from camera */	unsigned short int lost_connection;	#if (defined(BSD))	int tuner_dev;#endif	int video_dev;	int pipe;	int mpipe;	struct webcam webcam;	int stream_count;	#if defined(HAVE_MYSQL) || defined(HAVE_PGSQL)	int sql_mask;#endif#ifdef HAVE_MYSQL	MYSQL *database;#endif#ifdef HAVE_PGSQL	PGconn *database_pg;#endif#ifdef HAVE_FFMPEG	struct ffmpeg *ffmpeg_new;	struct ffmpeg *ffmpeg_motion;	struct ffmpeg *ffmpeg_timelapse;	struct ffmpeg *ffmpeg_smartmask;	char newfilename[PATH_MAX];	char motionfilename[PATH_MAX];	char timelapsefilename[PATH_MAX];#endif};extern pthread_mutex_t global_lock;extern volatile int threads_running;extern unsigned short int debug_level;/* TLS keys below */extern pthread_key_t tls_key_threadnr; /* key for thread number */int http_bindsock(int, int);void * mymalloc(size_t);void * myrealloc(void *, size_t, const char *);FILE * myfopen(const char *, const char *);size_t mystrftime(struct context *, char *, size_t, const char *, const struct tm *, const char *, int);int create_path(const char *);void motion_log(int, int, const char *, ...);#endif /* _INCLUDE_MOTION_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -