mirror of
https://github.com/Motion-Project/motion.git
synced 2026-04-18 21:17:04 -04:00
Merge pull request #4 from tosiara/mr-dave-pull-request
Merge with latest "unstable" tree of Mr-Dave
This commit is contained in:
@@ -77,6 +77,11 @@ Features
|
||||
* Clean up the messaging for RTSP.
|
||||
* Additional validations for RTSP connection and corrected free sequences
|
||||
* Removed seg fault on failure to open first image, comments, isolation of RTSP
|
||||
* Add AC_GNU_SOURCE macro to check for GNU C Library, fix compile when no FFMpeg.
|
||||
* Implement inits of AV functions from bcl fork
|
||||
* Add gray image upon disconnection
|
||||
* Added tcp/udp transport config option from hyperbolic(commit 423ef7bb3)
|
||||
* Revised comments to be in line with application standard.
|
||||
|
||||
|
||||
Bugfixes
|
||||
|
||||
25
INSTALL
25
INSTALL
@@ -1,3 +1,9 @@
|
||||
NOTE: Versions come, versions go, packages change, etc. These instructions are intended as a starting point
|
||||
and may need modification by the time you read this.
|
||||
|
||||
**********************************
|
||||
*** DEBIAN BASED SYSTEMS ***
|
||||
|
||||
Required Packages:
|
||||
sudo apt-get install autoconf automake build-essential libtool libjpeg8-dev libzip-dev
|
||||
|
||||
@@ -34,3 +40,22 @@ Sample PI configuration with LIBAV
|
||||
Once configured type:
|
||||
make
|
||||
make install
|
||||
|
||||
*****************************
|
||||
*** OpenSUSE SYSTEM ***
|
||||
|
||||
sudo zypper install autoconf automake libtool git
|
||||
sudo zypper install --type pattern devel_basis
|
||||
sudo zypper install libjpeg8-devel
|
||||
sudo zypper install -t pattern devel_C_C++
|
||||
|
||||
Optional: FFmpeg files
|
||||
sudo zypper ar -f -n packman-essentials http://packman.inode.at/suse/openSUSE_13.1/Essentials/ packman-essentials
|
||||
sudo zypper ar -f -n packman-multimedia http://packman.inode.at/suse/openSUSE_13.1/Multimedia/ packman-multimedia
|
||||
sudo zypper install libffmpeg-devel
|
||||
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
*************************
|
||||
|
||||
10
conf.c
10
conf.c
@@ -146,6 +146,7 @@ struct config conf_template = {
|
||||
netcam_keepalive: "off",
|
||||
netcam_proxy: NULL,
|
||||
netcam_tolerant_check: 0,
|
||||
rtsp_uses_tcp: 1,
|
||||
text_changes: 0,
|
||||
text_left: NULL,
|
||||
text_right: DEF_TIMESTAMP,
|
||||
@@ -411,6 +412,15 @@ config_param config_params[] = {
|
||||
print_bool
|
||||
},
|
||||
{
|
||||
"rtsp_uses_tcp",
|
||||
"# RTSP connection uses TCP to communicate to the camera. Can prevent image corruption.\n"
|
||||
"# Default: on",
|
||||
1,
|
||||
CONF_OFFSET(rtsp_uses_tcp),
|
||||
copy_bool,
|
||||
print_bool
|
||||
},
|
||||
{
|
||||
"auto_brightness",
|
||||
"# Let motion regulate the brightness of a video device (default: off).\n"
|
||||
"# The auto_brightness feature uses the brightness option as its target value.\n"
|
||||
|
||||
1
conf.h
1
conf.h
@@ -123,6 +123,7 @@ struct config {
|
||||
const char *netcam_keepalive;
|
||||
const char *netcam_proxy;
|
||||
unsigned int netcam_tolerant_check;
|
||||
unsigned int rtsp_uses_tcp;
|
||||
int text_changes;
|
||||
const char *text_left;
|
||||
const char *text_right;
|
||||
|
||||
49
config.h.in
49
config.h.in
@@ -1,4 +1,4 @@
|
||||
/* config.h.in. Generated from configure.in by autoheader. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
@@ -108,20 +108,37 @@
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
/* Define to 1 if you have av_avformat_alloc_context support */
|
||||
#undef have_av_avformat_alloc_context
|
||||
|
||||
/* Define to 1 if you have av_get_media_type_string support */
|
||||
#undef have_av_get_media_type_string
|
||||
|
||||
/* Define to 1 if you have av_register_protocol support */
|
||||
#undef have_av_register_protocol
|
||||
|
||||
/* Define to 1 if you have av_register_protocol2 support */
|
||||
#undef have_av_register_protocol2
|
||||
|
||||
/* Define to 1 if you have avformat_alloc_context support */
|
||||
#undef have_avformat_alloc_context
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Process this file with autoconf to produce a configure script
|
||||
|
||||
AC_INIT(motion, esyscmd(['./version.sh']))
|
||||
AC_GNU_SOURCE
|
||||
AC_CONFIG_SRCDIR([motion.c])
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
AC_PROG_CC
|
||||
|
||||
2
ffmpeg.h
2
ffmpeg.h
@@ -95,7 +95,9 @@ void ffmpeg_deinterlace(unsigned char *, int, int);
|
||||
/* Setup an avcodec log handler. */
|
||||
void ffmpeg_avcodec_log(void *, int, const char *, va_list);
|
||||
|
||||
#ifdef HAVE_FFMPEG
|
||||
AVFrame *my_frame_alloc(void);
|
||||
void my_frame_free(AVFrame *frame);
|
||||
#endif
|
||||
|
||||
#endif /* _INCLUDE_FFMPEG_H_ */
|
||||
|
||||
736
motion-dist.conf
Normal file
736
motion-dist.conf
Normal file
@@ -0,0 +1,736 @@
|
||||
# Rename this distribution example file to motion.conf
|
||||
#
|
||||
# This config file was generated by motion trunkREVUNKNOWN
|
||||
|
||||
|
||||
############################################################
|
||||
# Daemon
|
||||
############################################################
|
||||
|
||||
# Start in daemon (background) mode and release terminal (default: off)
|
||||
daemon on
|
||||
|
||||
# File to store the process ID, also called pid file. (default: not defined)
|
||||
process_id_file /var/run/motion/motion.pid
|
||||
|
||||
############################################################
|
||||
# Basic Setup Mode
|
||||
############################################################
|
||||
|
||||
# Start in Setup-Mode, daemon disabled. (default: off)
|
||||
setup_mode off
|
||||
|
||||
|
||||
# Use a file to save logs messages, if not defined stderr and syslog is used. (default: not defined)
|
||||
;logfile /tmp/motion.log
|
||||
|
||||
# Level of log messages [1..9] (EMR, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL). (default: 6 / NTC)
|
||||
log_level 6
|
||||
|
||||
# Filter to log messages by type (COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL). (default: ALL)
|
||||
log_type all
|
||||
|
||||
###########################################################
|
||||
# Capture device options
|
||||
############################################################
|
||||
|
||||
# Videodevice to be used for capturing (default /dev/video0)
|
||||
# for FreeBSD default is /dev/bktr0
|
||||
videodevice /dev/video0
|
||||
|
||||
# v4l2_palette allows to choose preferable palette to be use by motion
|
||||
# to capture from those supported by your videodevice. (default: 17)
|
||||
# E.g. if your videodevice supports both V4L2_PIX_FMT_SBGGR8 and
|
||||
# V4L2_PIX_FMT_MJPEG then motion will by default use V4L2_PIX_FMT_MJPEG.
|
||||
# Setting v4l2_palette to 2 forces motion to use V4L2_PIX_FMT_SBGGR8
|
||||
# instead.
|
||||
#
|
||||
# Values :
|
||||
# V4L2_PIX_FMT_SN9C10X : 0 'S910'
|
||||
# V4L2_PIX_FMT_SBGGR16 : 1 'BYR2'
|
||||
# V4L2_PIX_FMT_SBGGR8 : 2 'BA81'
|
||||
# V4L2_PIX_FMT_SPCA561 : 3 'S561'
|
||||
# V4L2_PIX_FMT_SGBRG8 : 4 'GBRG'
|
||||
# V4L2_PIX_FMT_SGRBG8 : 5 'GRBG'
|
||||
# V4L2_PIX_FMT_PAC207 : 6 'P207'
|
||||
# V4L2_PIX_FMT_PJPG : 7 'PJPG'
|
||||
# V4L2_PIX_FMT_MJPEG : 8 'MJPEG'
|
||||
# V4L2_PIX_FMT_JPEG : 9 'JPEG'
|
||||
# V4L2_PIX_FMT_RGB24 : 10 'RGB3'
|
||||
# V4L2_PIX_FMT_SPCA501 : 11 'S501'
|
||||
# V4L2_PIX_FMT_SPCA505 : 12 'S505'
|
||||
# V4L2_PIX_FMT_SPCA508 : 13 'S508'
|
||||
# V4L2_PIX_FMT_UYVY : 14 'UYVY'
|
||||
# V4L2_PIX_FMT_YUYV : 15 'YUYV'
|
||||
# V4L2_PIX_FMT_YUV422P : 16 '422P'
|
||||
# V4L2_PIX_FMT_YUV420 : 17 'YU12'
|
||||
#
|
||||
v4l2_palette 17
|
||||
|
||||
# Tuner device to be used for capturing using tuner as source (default /dev/tuner0)
|
||||
# This is ONLY used for FreeBSD. Leave it commented out for Linux
|
||||
; tunerdevice /dev/tuner0
|
||||
|
||||
# The video input to be used (default: -1)
|
||||
# Should normally be set to 0 or 1 for video/TV cards, and -1 for USB cameras
|
||||
input -1
|
||||
|
||||
# The video norm to use (only for video capture and TV tuner cards)
|
||||
# Values: 0 (PAL), 1 (NTSC), 2 (SECAM), 3 (PAL NC no colour). Default: 0 (PAL)
|
||||
norm 0
|
||||
|
||||
# The frequency to set the tuner to (kHz) (only for TV tuner cards) (default: 0)
|
||||
frequency 0
|
||||
|
||||
# Rotate image this number of degrees. The rotation affects all saved images as
|
||||
# well as movies. Valid values: 0 (default = no rotation), 90, 180 and 270.
|
||||
rotate 0
|
||||
|
||||
# Image width (pixels). Valid range: Camera dependent, default: 352
|
||||
width 320
|
||||
|
||||
# Image height (pixels). Valid range: Camera dependent, default: 288
|
||||
height 240
|
||||
|
||||
# Maximum number of frames to be captured per second.
|
||||
# Valid range: 2-100. Default: 100 (almost no limit).
|
||||
framerate 2
|
||||
|
||||
# Minimum time in seconds between capturing picture frames from the camera.
|
||||
# Default: 0 = disabled - the capture rate is given by the camera framerate.
|
||||
# This option is used when you want to capture images at a rate lower than 2 per second.
|
||||
minimum_frame_time 0
|
||||
|
||||
# URL to use if you are using a network camera, size will be autodetected (incl http:// ftp:// mjpg:// rtsp:// or file:///)
|
||||
# Must be a URL that returns single jpeg pictures or a raw mjpeg stream. Default: Not defined
|
||||
; netcam_url value
|
||||
|
||||
# Username and password for network camera (only if required). Default: not defined
|
||||
# Syntax is user:password
|
||||
; netcam_userpass value
|
||||
|
||||
# The setting for keep-alive of network socket, should improve performance on compatible net cameras.
|
||||
# off: The historical implementation using HTTP/1.0, closing the socket after each http request.
|
||||
# force: Use HTTP/1.0 requests with keep alive header to reuse the same connection.
|
||||
# on: Use HTTP/1.1 requests that support keep alive as default.
|
||||
# Default: off
|
||||
netcam_keepalive off
|
||||
|
||||
# URL to use for a netcam proxy server, if required, e.g. "http://myproxy".
|
||||
# If a port number other than 80 is needed, use "http://myproxy:1234".
|
||||
# Default: not defined
|
||||
; netcam_proxy value
|
||||
|
||||
# Set less strict jpeg checks for network cameras with a poor/buggy firmware.
|
||||
# Default: off
|
||||
netcam_tolerant_check off
|
||||
|
||||
# RTSP connection uses TCP to communicate to the camera. Can prevent image corruption.
|
||||
# Default: on
|
||||
rtsp_uses_tcp on
|
||||
|
||||
# Let motion regulate the brightness of a video device (default: off).
|
||||
# The auto_brightness feature uses the brightness option as its target value.
|
||||
# If brightness is zero auto_brightness will adjust to average brightness value 128.
|
||||
# Only recommended for cameras without auto brightness
|
||||
auto_brightness off
|
||||
|
||||
# Set the initial brightness of a video device.
|
||||
# If auto_brightness is enabled, this value defines the average brightness level
|
||||
# which Motion will try and adjust to.
|
||||
# Valid range 0-255, default 0 = disabled
|
||||
brightness 0
|
||||
|
||||
# Set the contrast of a video device.
|
||||
# Valid range 0-255, default 0 = disabled
|
||||
contrast 0
|
||||
|
||||
# Set the saturation of a video device.
|
||||
# Valid range 0-255, default 0 = disabled
|
||||
saturation 0
|
||||
|
||||
# Set the hue of a video device (NTSC feature).
|
||||
# Valid range 0-255, default 0 = disabled
|
||||
hue 0
|
||||
|
||||
|
||||
############################################################
|
||||
# Round Robin (multiple inputs on same video device name)
|
||||
############################################################
|
||||
|
||||
# Number of frames to capture in each roundrobin step (default: 1)
|
||||
roundrobin_frames 1
|
||||
|
||||
# Number of frames to skip before each roundrobin step (default: 1)
|
||||
roundrobin_skip 1
|
||||
|
||||
# Try to filter out noise generated by roundrobin (default: off)
|
||||
switchfilter off
|
||||
|
||||
|
||||
############################################################
|
||||
# Motion Detection Settings:
|
||||
############################################################
|
||||
|
||||
# Threshold for number of changed pixels in an image that
|
||||
# triggers motion detection (default: 1500)
|
||||
threshold 1500
|
||||
|
||||
# Automatically tune the threshold down if possible (default: off)
|
||||
threshold_tune off
|
||||
|
||||
# Noise threshold for the motion detection (default: 32)
|
||||
noise_level 32
|
||||
|
||||
# Automatically tune the noise threshold (default: on)
|
||||
noise_tune on
|
||||
|
||||
# Despeckle motion image using (e)rode or (d)ilate or (l)abel (Default: not defined)
|
||||
# Recommended value is EedDl. Any combination (and number of) of E, e, d, and D is valid.
|
||||
# (l)abeling must only be used once and the 'l' must be the last letter.
|
||||
# Comment out to disable
|
||||
despeckle_filter EedDl
|
||||
|
||||
# Detect motion in predefined areas (1 - 9). Areas are numbered like that: 1 2 3
|
||||
# A script (on_area_detected) is started immediately when motion is 4 5 6
|
||||
# detected in one of the given areas, but only once during an event. 7 8 9
|
||||
# One or more areas can be specified with this option. Take care: This option
|
||||
# does NOT restrict detection to these areas! (Default: not defined)
|
||||
; area_detect value
|
||||
|
||||
# PGM file to use as a sensitivity mask.
|
||||
# Full path name to. (Default: not defined)
|
||||
; mask_file value
|
||||
|
||||
# Dynamically create a mask file during operation (default: 0)
|
||||
# Adjust speed of mask changes from 0 (off) to 10 (fast)
|
||||
smart_mask_speed 0
|
||||
|
||||
# Ignore sudden massive light intensity changes given as a percentage of the picture
|
||||
# area that changed intensity. Valid range: 0 - 100 , default: 0 = disabled
|
||||
lightswitch 0
|
||||
|
||||
# Picture frames must contain motion at least the specified number of frames
|
||||
# in a row before they are detected as true motion. At the default of 1, all
|
||||
# motion is detected. Valid range: 1 to thousands, recommended 1-5
|
||||
minimum_motion_frames 1
|
||||
|
||||
# Specifies the number of pre-captured (buffered) pictures from before motion
|
||||
# was detected that will be output at motion detection.
|
||||
# Recommended range: 0 to 5 (default: 0)
|
||||
# Do not use large values! Large values will cause Motion to skip video frames and
|
||||
# cause unsmooth movies. To smooth movies use larger values of post_capture instead.
|
||||
pre_capture 0
|
||||
|
||||
# Number of frames to capture after motion is no longer detected (default: 0)
|
||||
post_capture 0
|
||||
|
||||
# Event Gap is the seconds of no motion detection that triggers the end of an event.
|
||||
# An event is defined as a series of motion images taken within a short timeframe.
|
||||
# Recommended value is 60 seconds (Default). The value -1 is allowed and disables
|
||||
# events causing all Motion to be written to one single movie file and no pre_capture.
|
||||
# If set to 0, motion is running in gapless mode. Movies don't have gaps anymore. An
|
||||
# event ends right after no more motion is detected and post_capture is over.
|
||||
event_gap 60
|
||||
|
||||
# Maximum length in seconds of a movie
|
||||
# When value is exceeded a new movie file is created. (Default: 0 = infinite)
|
||||
max_movie_time 0
|
||||
|
||||
# Always save images even if there was no motion (default: off)
|
||||
emulate_motion off
|
||||
|
||||
|
||||
############################################################
|
||||
# Image File Output
|
||||
############################################################
|
||||
|
||||
# Output 'normal' pictures when motion is detected (default: on)
|
||||
# Valid values: on, off, first, best, center
|
||||
# When set to 'first', only the first picture of an event is saved.
|
||||
# Picture with most motion of an event is saved when set to 'best'.
|
||||
# Picture with motion nearest center of picture is saved when set to 'center'.
|
||||
# Can be used as preview shot for the corresponding movie.
|
||||
output_pictures on
|
||||
|
||||
# Output pictures with only the pixels moving object (ghost images) (default: off)
|
||||
output_debug_pictures off
|
||||
|
||||
# The quality (in percent) to be used by the jpeg compression (default: 75)
|
||||
quality 75
|
||||
|
||||
# Type of output images
|
||||
# Valid values: jpeg, ppm (default: jpeg)
|
||||
picture_type jpeg
|
||||
|
||||
############################################################
|
||||
# FFMPEG related options
|
||||
# Film (movies) file output, and deinterlacing of the video input
|
||||
# The options movie_filename and timelapse_filename are also used
|
||||
# by the ffmpeg feature
|
||||
############################################################
|
||||
|
||||
# Use ffmpeg to encode movies in realtime (default: off)
|
||||
ffmpeg_output_movies on
|
||||
|
||||
# Use ffmpeg to make movies with only the pixels moving
|
||||
# object (ghost images) (default: off)
|
||||
ffmpeg_output_debug_movies off
|
||||
|
||||
# Use ffmpeg to encode a timelapse movie
|
||||
# Default value 0 = off - else save frame every Nth second
|
||||
ffmpeg_timelapse 0
|
||||
|
||||
# The file rollover mode of the timelapse video
|
||||
# Valid values: hourly, daily (default), weekly-sunday, weekly-monday, monthly, manual
|
||||
ffmpeg_timelapse_mode daily
|
||||
|
||||
# Bitrate to be used by the ffmpeg encoder (default: 400000)
|
||||
# This option is ignored if ffmpeg_variable_bitrate is not 0 (disabled)
|
||||
ffmpeg_bps 500000
|
||||
|
||||
# Enables and defines variable bitrate for the ffmpeg encoder.
|
||||
# ffmpeg_bps is ignored if variable bitrate is enabled.
|
||||
# Valid values: 0 (default) = fixed bitrate defined by ffmpeg_bps,
|
||||
# or the range 2 - 31 where 2 means best quality and 31 is worst.
|
||||
ffmpeg_variable_bitrate 0
|
||||
|
||||
# Codec to used by ffmpeg for the video compression.
|
||||
# Timelapse mpegs are always made in mpeg1 format independent from this option.
|
||||
# Supported formats are: mpeg1 (ffmpeg-0.4.8 only), mpeg4 (default), and msmpeg4.
|
||||
# mpeg1 - gives you files with extension .mpg
|
||||
# mpeg4 or msmpeg4 - gives you files with extension .avi
|
||||
# msmpeg4 is recommended for use with Windows Media Player because
|
||||
# it requires no installation of codec on the Windows client.
|
||||
# swf - gives you a flash film with extension .swf
|
||||
# flv - gives you a flash video with extension .flv
|
||||
# ffv1 - FF video codec 1 for Lossless Encoding ( experimental )
|
||||
# mov - QuickTime ( testing )
|
||||
# ogg - Ogg/Theora ( testing )
|
||||
ffmpeg_video_codec mpeg4
|
||||
|
||||
# Use ffmpeg to deinterlace video. Necessary if you use an analog camera
|
||||
# and see horizontal combing on moving objects in video or pictures.
|
||||
# (default: off)
|
||||
ffmpeg_deinterlace off
|
||||
|
||||
############################################################
|
||||
# SDL Window
|
||||
############################################################
|
||||
|
||||
# Number of motion thread to show in SDL Window (default: 0 = disabled)
|
||||
sdl_threadnr 0
|
||||
|
||||
############################################################
|
||||
# External pipe to video encoder
|
||||
# Replacement for FFMPEG builtin encoder for ffmpeg_output_movies only.
|
||||
# The options movie_filename and timelapse_filename are also used
|
||||
# by the ffmpeg feature
|
||||
#############################################################
|
||||
|
||||
# Bool to enable or disable extpipe (default: off)
|
||||
use_extpipe off
|
||||
|
||||
# External program (full path and opts) to pipe raw video to
|
||||
# Generally, use '-' for STDIN...
|
||||
;extpipe mencoder -demuxer rawvideo -rawvideo w=320:h=240:i420 -ovc x264 -x264encopts bframes=4:frameref=1:subq=1:scenecut=-1:nob_adapt:threads=1:keyint=1000:8x8dct:vbv_bufsize=4000:crf=24:partitions=i8x8,i4x4:vbv_maxrate=800:no-chroma-me -vf denoise3d=16:12:48:4,pp=lb -of avi -o %f.avi - -fps %fps
|
||||
|
||||
|
||||
|
||||
############################################################
|
||||
# Snapshots (Traditional Periodic Webcam File Output)
|
||||
############################################################
|
||||
|
||||
# Make automated snapshot every N seconds (default: 0 = disabled)
|
||||
snapshot_interval 0
|
||||
|
||||
|
||||
############################################################
|
||||
# Text Display
|
||||
# %Y = year, %m = month, %d = date,
|
||||
# %H = hour, %M = minute, %S = second, %T = HH:MM:SS,
|
||||
# %v = event, %q = frame number, %t = thread (camera) number,
|
||||
# %D = changed pixels, %N = noise level, \n = new line,
|
||||
# %i and %J = width and height of motion area,
|
||||
# %K and %L = X and Y coordinates of motion center
|
||||
# %C = value defined by text_event - do not use with text_event!
|
||||
# You can put quotation marks around the text to allow
|
||||
# leading spaces
|
||||
############################################################
|
||||
|
||||
# Locate and draw a box around the moving object.
|
||||
# Valid values: on, off, preview (default: off)
|
||||
# Set to 'preview' will only draw a box in preview_shot pictures.
|
||||
locate_motion_mode off
|
||||
|
||||
# Set the look and style of the locate box if enabled.
|
||||
# Valid values: box, redbox, cross, redcross (default: box)
|
||||
# Set to 'box' will draw the traditional box.
|
||||
# Set to 'redbox' will draw a red box.
|
||||
# Set to 'cross' will draw a little cross to mark center.
|
||||
# Set to 'redcross' will draw a little red cross to mark center.
|
||||
locate_motion_style box
|
||||
|
||||
# Draws the timestamp using same options as C function strftime(3)
|
||||
# Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock
|
||||
# Text is placed in lower right corner
|
||||
text_right %Y-%m-%d\n%T-%q
|
||||
|
||||
# Draw a user defined text on the images using same options as C function strftime(3)
|
||||
# Default: Not defined = no text
|
||||
# Text is placed in lower left corner
|
||||
; text_left CAMERA %t
|
||||
|
||||
# Draw the number of changed pixed on the images (default: off)
|
||||
# Will normally be set to off except when you setup and adjust the motion settings
|
||||
# Text is placed in upper right corner
|
||||
text_changes off
|
||||
|
||||
# This option defines the value of the special event conversion specifier %C
|
||||
# You can use any conversion specifier in this option except %C. Date and time
|
||||
# values are from the timestamp of the first image in the current event.
|
||||
# Default: %Y%m%d%H%M%S
|
||||
# The idea is that %C can be used filenames and text_left/right for creating
|
||||
# a unique identifier for each event.
|
||||
text_event %Y%m%d%H%M%S
|
||||
|
||||
# Draw characters at twice normal size on images. (default: off)
|
||||
text_double off
|
||||
|
||||
|
||||
# Text to include in a JPEG EXIF comment
|
||||
# May be any text, including conversion specifiers.
|
||||
# The EXIF timestamp is included independent of this text.
|
||||
;exif_text %i%J/%K%L
|
||||
|
||||
############################################################
|
||||
# Target Directories and filenames For Images And Films
|
||||
# For the options snapshot_, picture_, movie_ and timelapse_filename
|
||||
# you can use conversion specifiers
|
||||
# %Y = year, %m = month, %d = date,
|
||||
# %H = hour, %M = minute, %S = second,
|
||||
# %v = event, %q = frame number, %t = thread (camera) number,
|
||||
# %D = changed pixels, %N = noise level,
|
||||
# %i and %J = width and height of motion area,
|
||||
# %K and %L = X and Y coordinates of motion center
|
||||
# %C = value defined by text_event
|
||||
# Quotation marks round string are allowed.
|
||||
############################################################
|
||||
|
||||
# Target base directory for pictures and films
|
||||
# Recommended to use absolute path. (Default: current working directory)
|
||||
target_dir /usr/local/apache2/htdocs/cam1
|
||||
|
||||
# File path for snapshots (jpeg or ppm) relative to target_dir
|
||||
# Default: %v-%Y%m%d%H%M%S-snapshot
|
||||
# Default value is equivalent to legacy oldlayout option
|
||||
# For Motion 3.0 compatible mode choose: %Y/%m/%d/%H/%M/%S-snapshot
|
||||
# File extension .jpg or .ppm is automatically added so do not include this.
|
||||
# Note: A symbolic link called lastsnap.jpg created in the target_dir will always
|
||||
# point to the latest snapshot, unless snapshot_filename is exactly 'lastsnap'
|
||||
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
|
||||
|
||||
# File path for motion triggered images (jpeg or ppm) relative to target_dir
|
||||
# Default: %v-%Y%m%d%H%M%S-%q
|
||||
# Default value is equivalent to legacy oldlayout option
|
||||
# For Motion 3.0 compatible mode choose: %Y/%m/%d/%H/%M/%S-%q
|
||||
# File extension .jpg or .ppm is automatically added so do not include this
|
||||
# Set to 'preview' together with best-preview feature enables special naming
|
||||
# convention for preview shots. See motion guide for details
|
||||
picture_filename %v-%Y%m%d%H%M%S-%q
|
||||
|
||||
# File path for motion triggered ffmpeg films (movies) relative to target_dir
|
||||
# Default: %v-%Y%m%d%H%M%S
|
||||
# Default value is equivalent to legacy oldlayout option
|
||||
# For Motion 3.0 compatible mode choose: %Y/%m/%d/%H%M%S
|
||||
# File extension .mpg or .avi is automatically added so do not include this
|
||||
# This option was previously called ffmpeg_filename
|
||||
movie_filename %v-%Y%m%d%H%M%S
|
||||
|
||||
# File path for timelapse movies relative to target_dir
|
||||
# Default: %Y%m%d-timelapse
|
||||
# Default value is near equivalent to legacy oldlayout option
|
||||
# For Motion 3.0 compatible mode choose: %Y/%m/%d-timelapse
|
||||
# File extension .mpg is automatically added so do not include this
|
||||
timelapse_filename %Y%m%d-timelapse
|
||||
|
||||
############################################################
|
||||
# Global Network Options
|
||||
############################################################
|
||||
# Enable or disable IPV6 for http control and stream (default: off )
|
||||
ipv6_enabled off
|
||||
|
||||
############################################################
|
||||
# Live Stream Server
|
||||
############################################################
|
||||
|
||||
# The mini-http server listens to this port for requests (default: 0 = disabled)
|
||||
stream_port 8081
|
||||
|
||||
# Quality of the jpeg (in percent) images produced (default: 50)
|
||||
stream_quality 50
|
||||
|
||||
# Output frames at 1 fps when no motion is detected and increase to the
|
||||
# rate given by stream_maxrate when motion is detected (default: off)
|
||||
stream_motion off
|
||||
|
||||
# Maximum framerate for stream streams (default: 1)
|
||||
stream_maxrate 1
|
||||
|
||||
# Restrict stream connections to localhost only (default: on)
|
||||
stream_localhost on
|
||||
|
||||
# Limits the number of images per connection (default: 0 = unlimited)
|
||||
# Number can be defined by multiplying actual stream rate by desired number of seconds
|
||||
# Actual stream rate is the smallest of the numbers framerate and stream_maxrate
|
||||
stream_limit 0
|
||||
|
||||
# Set the authentication method (default: 0)
|
||||
# 0 = disabled
|
||||
# 1 = Basic authentication
|
||||
# 2 = MD5 digest (the safer authentication)
|
||||
stream_auth_method 0
|
||||
|
||||
# Authentication for the stream. Syntax username:password
|
||||
# Default: not defined (Disabled)
|
||||
; stream_authentication username:password
|
||||
|
||||
|
||||
############################################################
|
||||
# HTTP Based Control
|
||||
############################################################
|
||||
|
||||
# TCP/IP port for the http server to listen on (default: 0 = disabled)
|
||||
webcontrol_port 8080
|
||||
|
||||
# Restrict control connections to localhost only (default: on)
|
||||
webcontrol_localhost on
|
||||
|
||||
# Output for http server, select off to choose raw text plain (default: on)
|
||||
webcontrol_html_output on
|
||||
|
||||
# Authentication for the http based control. Syntax username:password
|
||||
# Default: not defined (Disabled)
|
||||
; webcontrol_authentication username:password
|
||||
|
||||
|
||||
############################################################
|
||||
# Tracking (Pan/Tilt)
|
||||
#############################################################
|
||||
|
||||
# Type of tracker (0=none (default), 1=stepper, 2=iomojo, 3=pwc, 4=generic, 5=uvcvideo, 6=servo)
|
||||
# The generic type enables the definition of motion center and motion size to
|
||||
# be used with the conversion specifiers for options like on_motion_detected
|
||||
track_type 0
|
||||
|
||||
# Enable auto tracking (default: off)
|
||||
track_auto off
|
||||
|
||||
# Serial port of motor (default: none)
|
||||
;track_port /dev/ttyS0
|
||||
|
||||
# Motor number for x-axis (default: 0)
|
||||
;track_motorx 0
|
||||
|
||||
# Set motorx reverse (default: 0)
|
||||
;track_motorx_reverse 0
|
||||
|
||||
# Motor number for y-axis (default: 0)
|
||||
;track_motory 1
|
||||
|
||||
# Set motory reverse (default: 0)
|
||||
;track_motory_reverse 0
|
||||
|
||||
# Maximum value on x-axis (default: 0)
|
||||
;track_maxx 200
|
||||
|
||||
# Minimum value on x-axis (default: 0)
|
||||
;track_minx 50
|
||||
|
||||
# Maximum value on y-axis (default: 0)
|
||||
;track_maxy 200
|
||||
|
||||
# Minimum value on y-axis (default: 0)
|
||||
;track_miny 50
|
||||
|
||||
# Center value on x-axis (default: 0)
|
||||
;track_homex 128
|
||||
|
||||
# Center value on y-axis (default: 0)
|
||||
;track_homey 128
|
||||
|
||||
# ID of an iomojo camera if used (default: 0)
|
||||
track_iomojo_id 0
|
||||
|
||||
# Angle in degrees the camera moves per step on the X-axis
|
||||
# with auto-track (default: 10)
|
||||
# Currently only used with pwc type cameras
|
||||
track_step_angle_x 10
|
||||
|
||||
# Angle in degrees the camera moves per step on the Y-axis
|
||||
# with auto-track (default: 10)
|
||||
# Currently only used with pwc type cameras
|
||||
track_step_angle_y 10
|
||||
|
||||
# Delay to wait for after tracking movement as number
|
||||
# of picture frames (default: 10)
|
||||
track_move_wait 10
|
||||
|
||||
# Speed to set the motor to (stepper motor option) (default: 255)
|
||||
track_speed 255
|
||||
|
||||
# Number of steps to make (stepper motor option) (default: 40)
|
||||
track_stepsize 40
|
||||
|
||||
|
||||
############################################################
|
||||
# External Commands, Warnings and Logging:
|
||||
# You can use conversion specifiers for the on_xxxx commands
|
||||
# %Y = year, %m = month, %d = date,
|
||||
# %H = hour, %M = minute, %S = second,
|
||||
# %v = event, %q = frame number, %t = thread (camera) number,
|
||||
# %D = changed pixels, %N = noise level,
|
||||
# %i and %J = width and height of motion area,
|
||||
# %K and %L = X and Y coordinates of motion center
|
||||
# %C = value defined by text_event
|
||||
# %f = filename with full path
|
||||
# %n = number indicating filetype
|
||||
# Both %f and %n are only defined for on_picture_save,
|
||||
# on_movie_start and on_movie_end
|
||||
# Quotation marks round string are allowed.
|
||||
############################################################
|
||||
|
||||
# Do not sound beeps when detecting motion (default: on)
|
||||
# Note: Motion never beeps when running in daemon mode.
|
||||
quiet on
|
||||
|
||||
# Command to be executed when an event starts. (default: none)
|
||||
# An event starts at first motion detected after a period of no motion defined by event_gap
|
||||
; on_event_start value
|
||||
|
||||
# Command to be executed when an event ends after a period of no motion
|
||||
# (default: none). The period of no motion is defined by option event_gap.
|
||||
; on_event_end value
|
||||
|
||||
# Command to be executed when a picture (.ppm|.jpg) is saved (default: none)
|
||||
# To give the filename as an argument to a command append it with %f
|
||||
; on_picture_save value
|
||||
|
||||
# Command to be executed when a motion frame is detected (default: none)
|
||||
; on_motion_detected value
|
||||
|
||||
# Command to be executed when motion in a predefined area is detected
|
||||
# Check option 'area_detect'. (default: none)
|
||||
; on_area_detected value
|
||||
|
||||
# Command to be executed when a movie file (.mpg|.avi) is created. (default: none)
|
||||
# To give the filename as an argument to a command append it with %f
|
||||
; on_movie_start value
|
||||
|
||||
# Command to be executed when a movie file (.mpg|.avi) is closed. (default: none)
|
||||
# To give the filename as an argument to a command append it with %f
|
||||
; on_movie_end value
|
||||
|
||||
# Command to be executed when a camera can't be opened or if it is lost
|
||||
# NOTE: There is situations when motion don't detect a lost camera!
|
||||
# It depends on the driver, some drivers dosn't detect a lost camera at all
|
||||
# Some hangs the motion thread. Some even hangs the PC! (default: none)
|
||||
; on_camera_lost value
|
||||
|
||||
#####################################################################
|
||||
# Common Options for database features.
|
||||
# Options require database options to be active also.
|
||||
#####################################################################
|
||||
|
||||
# Log to the database when creating motion triggered picture file (default: on)
|
||||
; sql_log_picture on
|
||||
|
||||
# Log to the database when creating a snapshot image file (default: on)
|
||||
; sql_log_snapshot on
|
||||
|
||||
# Log to the database when creating motion triggered movie file (default: off)
|
||||
; sql_log_movie off
|
||||
|
||||
# Log to the database when creating timelapse movies file (default: off)
|
||||
; sql_log_timelapse off
|
||||
|
||||
# SQL query string that is sent to the database
|
||||
# Use same conversion specifiers has for text features
|
||||
# Additional special conversion specifiers are
|
||||
# %n = the number representing the file_type
|
||||
# %f = filename with full path
|
||||
# Default value:
|
||||
# Create tables :
|
||||
##
|
||||
# Mysql
|
||||
# CREATE TABLE security (camera int, filename char(80) not null, frame int, file_type int, time_stamp timestamp(14), event_time_stamp timestamp(14));
|
||||
#
|
||||
# Postgresql
|
||||
# CREATE TABLE security (camera int, filename char(80) not null, frame int, file_type int, time_stamp timestamp without time zone, event_time_stamp timestamp without time zone);
|
||||
#
|
||||
# insert into security(camera, filename, frame, file_type, time_stamp, text_event) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
|
||||
; 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')
|
||||
|
||||
|
||||
############################################################
|
||||
# Database Options
|
||||
############################################################
|
||||
|
||||
# database type : mysql, postgresql, sqlite3 (default : not defined)
|
||||
; database_type value
|
||||
|
||||
# database to log to (default: not defined)
|
||||
; database_dbname value
|
||||
|
||||
# The host on which the database is located (default: localhost)
|
||||
; database_host value
|
||||
|
||||
# User account name for database (default: not defined)
|
||||
; database_user value
|
||||
|
||||
# User password for database (default: not defined)
|
||||
; database_password value
|
||||
|
||||
# Port on which the database is located
|
||||
# mysql 3306 , postgresql 5432 (default: not defined)
|
||||
; database_port value
|
||||
|
||||
############################################################
|
||||
# Database Options For SQLite3
|
||||
############################################################
|
||||
|
||||
# SQLite3 database (file path) (default: not defined)
|
||||
; sqlite3_db value
|
||||
|
||||
|
||||
|
||||
############################################################
|
||||
# Video Loopback Device (vloopback project)
|
||||
############################################################
|
||||
|
||||
# Output images to a video4linux loopback device
|
||||
# The value '-' means next available (default: not defined)
|
||||
; video_pipe value
|
||||
|
||||
# Output motion images to a video4linux loopback device
|
||||
# The value '-' means next available (default: not defined)
|
||||
; motion_video_pipe value
|
||||
|
||||
|
||||
##############################################################
|
||||
# Thread config files - One for each camera.
|
||||
# Except if only one camera - You only need this config file.
|
||||
# If you have more than one camera you MUST define one thread
|
||||
# config file for each camera in addition to this config file.
|
||||
##############################################################
|
||||
|
||||
# Remember: If you have more than one camera you must have one
|
||||
# thread file for each camera. E.g. 2 cameras requires 3 files:
|
||||
# This motion.conf file AND thread1.conf and thread2.conf.
|
||||
# Only put the options that are unique to each camera in the
|
||||
# thread config files.
|
||||
; thread /usr/local/etc/thread1.conf
|
||||
; thread /usr/local/etc/thread2.conf
|
||||
; thread /usr/local/etc/thread3.conf
|
||||
; thread /usr/local/etc/thread4.conf
|
||||
|
||||
@@ -101,7 +101,7 @@ framerate 2
|
||||
# This option is used when you want to capture images at a rate lower than 2 per second.
|
||||
minimum_frame_time 0
|
||||
|
||||
# URL to use if you are using a network camera, size will be autodetected (incl http:// ftp:// mjpg:// rstp:// or file:///)
|
||||
# URL to use if you are using a network camera, size will be autodetected (incl http:// ftp:// mjpg:// rtsp:// or file:///)
|
||||
# Must be a URL that returns single jpeg pictures or a raw mjpeg stream. Default: Not defined
|
||||
; netcam_url value
|
||||
|
||||
@@ -125,6 +125,10 @@ netcam_keepalive off
|
||||
# Default: off
|
||||
netcam_tolerant_check off
|
||||
|
||||
# RTSP connection uses TCP to communicate to the camera. Can prevent image corruption.
|
||||
# Default: on
|
||||
rtsp_uses_tcp on
|
||||
|
||||
# Let motion regulate the brightness of a video device (default: off).
|
||||
# The auto_brightness feature uses the brightness option as its target value.
|
||||
# If brightness is zero auto_brightness will adjust to average brightness value 128.
|
||||
|
||||
355
netcam_rtsp.c
355
netcam_rtsp.c
@@ -1,20 +1,30 @@
|
||||
/***********************************************************
|
||||
* In the top section are the functions that are used
|
||||
* when processing the RTSP camera feed. Since these functions
|
||||
* are internal to the RTSP module, and many require FFmpeg
|
||||
* structures in their declarations, they are within the
|
||||
* HAVE_FFMPEG block that eliminates them entirely when
|
||||
* FFmpeg is not present.
|
||||
*
|
||||
* The functions:
|
||||
* netcam_setup_rtsp
|
||||
* netcam_connect_rtsp
|
||||
* netcam_shutdown_rtsp
|
||||
* are called from netcam.c therefore must be defined even
|
||||
* if FFmpeg is not present. They must also not have FFmpeg
|
||||
* structures are in the declarations. Simple error
|
||||
* messages are raised if called when no FFmpeg is found.
|
||||
*
|
||||
***********************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "netcam_rtsp.h"
|
||||
#include "motion.h"
|
||||
|
||||
#ifdef HAVE_FFMPEG
|
||||
/***********************************************************
|
||||
* This top section is the real code that opens and processes
|
||||
* the rtsp camera. In the #else section below there are
|
||||
* basic functions that indicate that if FFmpeg/Libav is
|
||||
* not installed, rtsp is not available. By blocking the
|
||||
* #IFs this way, we are able to isolate all the rtsp code
|
||||
* and avoid numerous #IF blocks in the other components.
|
||||
***********************************************************/
|
||||
|
||||
#include "ffmpeg.h"
|
||||
|
||||
static void netcam_buffsize_rtsp(netcam_buff_ptr buff, size_t numbytes){
|
||||
/**
|
||||
* netcam_buffsize_rtsp
|
||||
*
|
||||
@@ -28,6 +38,7 @@ static void netcam_buffsize_rtsp(netcam_buff_ptr buff, size_t numbytes){
|
||||
*
|
||||
* Returns: Nothing
|
||||
*/
|
||||
static void netcam_buffsize_rtsp(netcam_buff_ptr buff, size_t numbytes){
|
||||
|
||||
int min_size_to_alloc;
|
||||
int real_alloc;
|
||||
@@ -53,7 +64,6 @@ static void netcam_buffsize_rtsp(netcam_buff_ptr buff, size_t numbytes){
|
||||
buff->size = new_size;
|
||||
}
|
||||
|
||||
static int decode_packet(AVPacket *packet, netcam_buff_ptr buffer, AVFrame *frame, AVCodecContext *cc){
|
||||
/**
|
||||
* decode_packet
|
||||
*
|
||||
@@ -71,11 +81,12 @@ static int decode_packet(AVPacket *packet, netcam_buff_ptr buffer, AVFrame *fram
|
||||
* Failure 0(zero)
|
||||
* Success The size of the frame decoded
|
||||
*/
|
||||
|
||||
static int decode_packet(AVPacket *packet, netcam_buff_ptr buffer, AVFrame *frame, AVCodecContext *cc){
|
||||
int check = 0;
|
||||
int frame_size = 0;
|
||||
int ret = 0;
|
||||
|
||||
cc->err_recognition = 3;
|
||||
ret = avcodec_decode_video2(cc, frame, &check, packet);
|
||||
if (ret < 0) {
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Error decoding video packet");
|
||||
@@ -83,7 +94,6 @@ static int decode_packet(AVPacket *packet, netcam_buff_ptr buffer, AVFrame *fram
|
||||
}
|
||||
|
||||
if (check == 0) {
|
||||
// no frame could be decoded...keep trying
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -99,7 +109,6 @@ static int decode_packet(AVPacket *packet, netcam_buff_ptr buffer, AVFrame *fram
|
||||
return frame_size;
|
||||
}
|
||||
|
||||
static int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AVMediaType type){
|
||||
/**
|
||||
* open_codec_context
|
||||
*
|
||||
@@ -115,7 +124,7 @@ static int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AV
|
||||
* Failure Error code from FFmpeg (Negative number)
|
||||
* Success 0(Zero)
|
||||
*/
|
||||
|
||||
static int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AVMediaType type){
|
||||
int ret;
|
||||
char errstr[128];
|
||||
AVStream *st;
|
||||
@@ -139,7 +148,7 @@ static int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AV
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Failed to find codec!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Open the codec */
|
||||
ret = avcodec_open2(dec_ctx, dec, NULL);
|
||||
if (ret < 0) {
|
||||
@@ -147,11 +156,10 @@ static int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AV
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Failed to open codec!: %s", errstr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct rtsp_context *rtsp_new_context(void){
|
||||
/**
|
||||
* rtsp_new_context
|
||||
*
|
||||
@@ -164,7 +172,7 @@ struct rtsp_context *rtsp_new_context(void){
|
||||
* Returns: Pointer to the newly-created structure, NULL if error.
|
||||
*
|
||||
*/
|
||||
|
||||
struct rtsp_context *rtsp_new_context(void){
|
||||
struct rtsp_context *ret;
|
||||
|
||||
/* Note that mymalloc will exit on any problem. */
|
||||
@@ -175,7 +183,6 @@ struct rtsp_context *rtsp_new_context(void){
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int netcam_interrupt_rtsp(void *ctx){
|
||||
/**
|
||||
* netcam_interrupt_rtsp
|
||||
*
|
||||
@@ -196,7 +203,7 @@ static int netcam_interrupt_rtsp(void *ctx){
|
||||
* Success 0(zero which indicates to let process continue)
|
||||
*
|
||||
*/
|
||||
|
||||
static int netcam_interrupt_rtsp(void *ctx){
|
||||
struct rtsp_context *rtsp = (struct rtsp_context *)ctx;
|
||||
|
||||
if (rtsp->readingframe != 1) {
|
||||
@@ -218,125 +225,6 @@ static int netcam_interrupt_rtsp(void *ctx){
|
||||
return 0;
|
||||
}
|
||||
|
||||
int netcam_connect_rtsp(netcam_context_ptr netcam){
|
||||
/**
|
||||
* netcam_connect_rtsp
|
||||
*
|
||||
* This function initiates the connection to the rtsp camera.
|
||||
*
|
||||
* Parameters
|
||||
*
|
||||
* netcam The netcam context to open.
|
||||
*
|
||||
* Returns:
|
||||
* Failure -1
|
||||
* Success 0(zero)
|
||||
*
|
||||
*/
|
||||
|
||||
int ret;
|
||||
char errstr[128];
|
||||
|
||||
if (netcam->rtsp->path == NULL) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Null path passed to connect (%s)", netcam->rtsp->path);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// open the network connection
|
||||
AVDictionary *opts = 0;
|
||||
//av_dict_set(&opts, "rtsp_transport", "tcp", 0);
|
||||
|
||||
netcam->rtsp->format_context = avformat_alloc_context();
|
||||
netcam->rtsp->format_context->interrupt_callback.callback = netcam_interrupt_rtsp;
|
||||
netcam->rtsp->format_context->interrupt_callback.opaque = netcam->rtsp;
|
||||
|
||||
ret = avformat_open_input(&netcam->rtsp->format_context, netcam->rtsp->path, NULL, &opts);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, "%s: unable to open input(%s): %s", netcam->rtsp->path,errstr);
|
||||
}
|
||||
av_dict_free(&opts);
|
||||
//The format context gets freed upon any error from open_input.
|
||||
return ret;
|
||||
}
|
||||
av_dict_free(&opts);
|
||||
|
||||
// fill out stream information
|
||||
ret = avformat_find_stream_info(netcam->rtsp->format_context, NULL);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to find stream info: %s", errstr);
|
||||
}
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = open_codec_context(&netcam->rtsp->video_stream_index, netcam->rtsp->format_context, AVMEDIA_TYPE_VIDEO);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to open codec context: %s", errstr);
|
||||
}
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
netcam->rtsp->codec_context = netcam->rtsp->format_context->streams[netcam->rtsp->video_stream_index]->codec;
|
||||
|
||||
netcam->rtsp->frame = my_frame_alloc();
|
||||
if (netcam->rtsp->frame == NULL) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to allocate frame. Fatal error. Check FFmpeg/Libav configuration");
|
||||
}
|
||||
avcodec_close(netcam->rtsp->codec_context);
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// start up the feed
|
||||
ret = av_read_play(netcam->rtsp->format_context);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to open the camera: %s", errstr);
|
||||
}
|
||||
my_frame_free(netcam->rtsp->frame);
|
||||
avcodec_close(netcam->rtsp->codec_context);
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get an image from the feed, this serves
|
||||
* two purposes. One get the dimensions of the pic
|
||||
* validate that the previous steps really did open
|
||||
* something we can use. Some cameras get this far
|
||||
* without throwing an error
|
||||
*/
|
||||
|
||||
ret = netcam_read_rtsp_image(netcam);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Failed to read first image");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
netcam->width = netcam->rtsp->codec_context->width;
|
||||
netcam->height = netcam->rtsp->codec_context->height;
|
||||
|
||||
netcam->rtsp->status = RTSP_CONNECTED;
|
||||
|
||||
MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "%s: Camera connected");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int netcam_read_rtsp_image(netcam_context_ptr netcam){
|
||||
/**
|
||||
* netcam_read_rtsp_image
|
||||
*
|
||||
@@ -353,7 +241,7 @@ int netcam_read_rtsp_image(netcam_context_ptr netcam){
|
||||
* Success 0(zero)
|
||||
*
|
||||
*/
|
||||
|
||||
int netcam_read_rtsp_image(netcam_context_ptr netcam){
|
||||
struct timeval curtime;
|
||||
netcam_buff_ptr buffer;
|
||||
AVPacket packet;
|
||||
@@ -434,7 +322,145 @@ int netcam_read_rtsp_image(netcam_context_ptr netcam){
|
||||
return 0;
|
||||
}
|
||||
|
||||
void netcam_shutdown_rtsp(netcam_context_ptr netcam){
|
||||
/***********************************************************
|
||||
* This ends the section of functions that rely upon FFmpeg
|
||||
***********************************************************/
|
||||
#endif /* End HAVE_FFMPEG */
|
||||
|
||||
/**
|
||||
* netcam_connect_rtsp
|
||||
*
|
||||
* This function initiates the connection to the rtsp camera.
|
||||
*
|
||||
* Parameters
|
||||
*
|
||||
* netcam The netcam context to open.
|
||||
*
|
||||
* Returns:
|
||||
* Failure -1
|
||||
* Success 0(zero)
|
||||
*
|
||||
*/
|
||||
int netcam_connect_rtsp(netcam_context_ptr netcam){
|
||||
#ifdef HAVE_FFMPEG
|
||||
|
||||
int ret;
|
||||
char errstr[128];
|
||||
|
||||
if (netcam->rtsp->path == NULL) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Null path passed to connect (%s)", netcam->rtsp->path);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// open the network connection
|
||||
AVDictionary *opts = 0;
|
||||
if (netcam->cnt->conf.rtsp_uses_tcp) {
|
||||
av_dict_set(&opts, "rtsp_transport", "tcp", 0);
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED)
|
||||
MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "%s: Using tcp transport");
|
||||
} else {
|
||||
av_dict_set(&opts, "rtsp_transport", "udp", 0);
|
||||
av_dict_set(&opts, "max_delay", "500000", 0); //100000 is the default
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED)
|
||||
MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "%s: Using udp transport");
|
||||
}
|
||||
|
||||
netcam->rtsp->format_context = avformat_alloc_context();
|
||||
netcam->rtsp->format_context->interrupt_callback.callback = netcam_interrupt_rtsp;
|
||||
netcam->rtsp->format_context->interrupt_callback.opaque = netcam->rtsp;
|
||||
|
||||
ret = avformat_open_input(&netcam->rtsp->format_context, netcam->rtsp->path, NULL, &opts);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to open input(%s): %s", netcam->rtsp->path,errstr);
|
||||
}
|
||||
av_dict_free(&opts);
|
||||
//The format context gets freed upon any error from open_input.
|
||||
return ret;
|
||||
}
|
||||
av_dict_free(&opts);
|
||||
|
||||
// fill out stream information
|
||||
ret = avformat_find_stream_info(netcam->rtsp->format_context, NULL);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to find stream info: %s", errstr);
|
||||
}
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = open_codec_context(&netcam->rtsp->video_stream_index, netcam->rtsp->format_context, AVMEDIA_TYPE_VIDEO);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to open codec context: %s", errstr);
|
||||
}
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
netcam->rtsp->codec_context = netcam->rtsp->format_context->streams[netcam->rtsp->video_stream_index]->codec;
|
||||
|
||||
netcam->rtsp->frame = my_frame_alloc();
|
||||
if (netcam->rtsp->frame == NULL) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to allocate frame. Fatal error. Check FFmpeg/Libav configuration");
|
||||
}
|
||||
avcodec_close(netcam->rtsp->codec_context);
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// start up the feed
|
||||
ret = av_read_play(netcam->rtsp->format_context);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
av_strerror(ret, errstr, sizeof(errstr));
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: unable to open the camera: %s", errstr);
|
||||
}
|
||||
my_frame_free(netcam->rtsp->frame);
|
||||
avcodec_close(netcam->rtsp->codec_context);
|
||||
avformat_close_input(&netcam->rtsp->format_context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get an image from the feed, this serves
|
||||
* two purposes.
|
||||
* 1. Get the dimensions of the pic
|
||||
* 2. Validate that the previous steps opened the camera
|
||||
*/
|
||||
|
||||
ret = netcam_read_rtsp_image(netcam);
|
||||
if (ret < 0) {
|
||||
if (netcam->rtsp->status == RTSP_NOTCONNECTED){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: Failed to read first image");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
netcam->width = netcam->rtsp->codec_context->width;
|
||||
netcam->height = netcam->rtsp->codec_context->height;
|
||||
|
||||
netcam->rtsp->status = RTSP_CONNECTED;
|
||||
|
||||
MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "%s: Camera connected");
|
||||
|
||||
return 0;
|
||||
|
||||
#else /* No FFmpeg/Libav */
|
||||
netcam->rtsp->status = RTSP_NOTCONNECTED;
|
||||
netcam->rtsp->format_context = NULL;
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: FFmpeg/Libav not found on computer. No RTSP support");
|
||||
return -1;
|
||||
#endif /* End #ifdef HAVE_FFMPEG */
|
||||
}
|
||||
|
||||
/**
|
||||
* netcam_shutdown_rtsp
|
||||
*
|
||||
@@ -449,6 +475,9 @@ void netcam_shutdown_rtsp(netcam_context_ptr netcam){
|
||||
* Success nothing
|
||||
*
|
||||
*/
|
||||
void netcam_shutdown_rtsp(netcam_context_ptr netcam){
|
||||
#ifdef HAVE_FFMPEG
|
||||
|
||||
if (netcam->rtsp->status == RTSP_CONNECTED) {
|
||||
my_frame_free(netcam->rtsp->frame);
|
||||
avcodec_close(netcam->rtsp->codec_context);
|
||||
@@ -464,9 +493,11 @@ void netcam_shutdown_rtsp(netcam_context_ptr netcam){
|
||||
free(netcam->rtsp);
|
||||
netcam->rtsp = NULL;
|
||||
|
||||
#else /* No FFmpeg/Libav */
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: FFmpeg/Libav not found on computer. No RTSP support");
|
||||
#endif /* End #ifdef HAVE_FFMPEG */
|
||||
}
|
||||
|
||||
int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
/**
|
||||
* netcam_setup_rtsp
|
||||
*
|
||||
@@ -483,6 +514,9 @@ int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
* Success 0(zero)
|
||||
*
|
||||
*/
|
||||
int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
#ifdef HAVE_FFMPEG
|
||||
|
||||
struct context *cnt = netcam->cnt;
|
||||
const char *ptr;
|
||||
int ret = -1;
|
||||
@@ -527,15 +561,9 @@ int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
}
|
||||
|
||||
/*
|
||||
Need a method to query the path and
|
||||
determine the authentication type if needed.
|
||||
avformat_open_input returns file not found when
|
||||
it wants authentication and it is not provided.
|
||||
right now, if user specified a password, we will
|
||||
prepend it onto the path to make it happier so we
|
||||
can at least try basic authentication.
|
||||
*/
|
||||
|
||||
* Need a method to query the path and
|
||||
* determine the authentication type
|
||||
*/
|
||||
if ((netcam->rtsp->user != NULL) && (netcam->rtsp->pass != NULL)) {
|
||||
ptr = mymalloc(strlen(url->service) + strlen(netcam->connect_host)
|
||||
+ 5 + strlen(url->path) + 5
|
||||
@@ -560,6 +588,9 @@ int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
netcam->rtsp->readingframe = 0;
|
||||
netcam->rtsp->status = RTSP_NOTCONNECTED;
|
||||
|
||||
av_register_all();
|
||||
avformat_network_init();
|
||||
|
||||
/*
|
||||
* The RTSP context should be all ready to attempt a connection with
|
||||
* the server, so we try ....
|
||||
@@ -572,25 +603,9 @@ int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
netcam->get_image = netcam_read_rtsp_image;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
/***********************************************************
|
||||
* This section is when there is no FFmpeg/Libav. It only
|
||||
* contains the functions called from netcam and they all
|
||||
* return fail error codes and user messages.
|
||||
***********************************************************/
|
||||
int netcam_setup_rtsp(netcam_context_ptr netcam, struct url_t *url){
|
||||
|
||||
#else /* No FFmpeg/Libav */
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: FFmpeg/Libav not found on computer. No RTSP support");
|
||||
return -1;
|
||||
#endif /* End #ifdef HAVE_FFMPEG */
|
||||
}
|
||||
void netcam_shutdown_rtsp(netcam_context_ptr netcam){
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: FFmpeg/Libav not found on computer. No RTSP support");
|
||||
};
|
||||
int netcam_connect_rtsp(netcam_context_ptr netcam){
|
||||
netcam->rtsp->status = RTSP_NOTCONNECTED;
|
||||
netcam->rtsp->format_context = NULL;
|
||||
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: FFmpeg/Libav not found on computer. No RTSP support");
|
||||
return -1;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,10 @@
|
||||
#include <libavutil/avutil.h>
|
||||
#include <libavutil/imgutils.h>
|
||||
|
||||
#endif /* end HAVE_FFMPEG */
|
||||
|
||||
struct rtsp_context {
|
||||
#ifdef HAVE_FFMPEG
|
||||
AVFormatContext* format_context;
|
||||
AVCodecContext* codec_context;
|
||||
AVFrame* frame;
|
||||
@@ -19,19 +22,13 @@ struct rtsp_context {
|
||||
int readingframe;
|
||||
int status;
|
||||
struct timeval startreadtime;
|
||||
};
|
||||
#else
|
||||
/****************************************
|
||||
* Dummy context for when no FFMPEG/Libav
|
||||
* is on machine. These need to be primitive
|
||||
* data types
|
||||
*****************************************/
|
||||
struct rtsp_context {
|
||||
|
||||
#else /* Do not have FFmpeg */
|
||||
int* format_context;
|
||||
int readingframe;
|
||||
int status;
|
||||
#endif /* end HAVE_FFMPEG */
|
||||
};
|
||||
#endif
|
||||
|
||||
struct rtsp_context *rtsp_new_context(void);
|
||||
void netcam_shutdown_rtsp(netcam_context_ptr netcam);
|
||||
|
||||
Reference in New Issue
Block a user