From 5150829a9fb325aa00de4a790b1b06a7198c8abe Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Sat, 13 Feb 2016 16:22:44 +1100 Subject: [PATCH 01/26] Convert to Travis Trusty --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d44973e2e..59018e553 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: cpp +sudo: required +dist: trusty notifications: irc: "chat.freenode.net#zoneminder-dev" branches: @@ -24,7 +26,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev libvlccore5 libvlc5 2>&1 > /dev/null install: - - git clone -b n2.8.1 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From 4303aa4fe28c3db2b8392e0de7de4db887223eaa Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Sat, 13 Feb 2016 16:34:49 +1100 Subject: [PATCH 02/26] Remove libvlc5 and libvlccore5, also attempt clang builds --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 59018e553..eeb99bd96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,9 +22,10 @@ env: - ZM_BUILDMETHOD=autotools compiler: - gcc + - clang before_install: - sudo apt-get update -qq - - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev libvlccore5 libvlc5 2>&1 > /dev/null + - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg From 4fd984f30b23fc86e6ddf28d16fe5cea16259266 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Thu, 25 Feb 2016 22:32:18 +1100 Subject: [PATCH 03/26] ffmpeg 3.0.0 build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index eeb99bd96..c4bd95bc9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n3.0.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From b53e9e7dadfbd09d754408046aebce3a49133fc5 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Thu, 25 Feb 2016 22:38:19 +1100 Subject: [PATCH 04/26] ffmpeg 3.0 too many 0000s --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c4bd95bc9..03fcb2c2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - - git clone -b n3.0.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n3.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From 5ff427d9e9d90417852908c574415f9873af7265 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:05:40 +1100 Subject: [PATCH 05/26] Removed Autotools Makefile.am Conflicts: Makefile.am misc/Makefile.am src/Makefile.am web/includes/Makefile.am web/js/Makefile.am web/skins/classic/css/classic/views/Makefile.am web/skins/classic/css/flat/views/Makefile.am web/skins/classic/views/Makefile.am web/skins/classic/views/js/Makefile.am --- Makefile.am | 40 ------ db/Makefile.am | 14 -- misc/Makefile.am | 17 --- onvif/Makefile.am | 26 ---- onvif/scripts/Makefile.am | 5 - scripts/Makefile.am | 75 ---------- src/Makefile.am | 135 ------------------ web/Makefile.am | 35 ----- web/ajax/Makefile.am | 12 -- web/css/Makefile.am | 8 -- web/graphics/Makefile.am | 8 -- web/includes/Makefile.am | 19 --- web/js/Makefile.am | 8 -- web/lang/Makefile.am | 25 ---- web/skins/Makefile.am | 6 - web/skins/classic/Makefile.am | 15 -- web/skins/classic/ajax/Makefile.am | 5 - web/skins/classic/css/Makefile.am | 7 - web/skins/classic/css/classic/Makefile.am | 10 -- .../classic/css/classic/views/Makefile.am | 31 ---- web/skins/classic/css/dark/Makefile.am | 10 -- web/skins/classic/css/dark/views/Makefile.am | 31 ---- web/skins/classic/css/flat/Makefile.am | 10 -- web/skins/classic/css/flat/views/Makefile.am | 31 ---- web/skins/classic/graphics/Makefile.am | 23 --- web/skins/classic/includes/Makefile.am | 11 -- web/skins/classic/js/Makefile.am | 10 -- web/skins/classic/lang/Makefile.am | 5 - web/skins/classic/views/Makefile.am | 57 -------- web/skins/classic/views/js/Makefile.am | 50 ------- web/skins/mobile/Makefile.am | 14 -- web/skins/mobile/ajax/Makefile.am | 5 - web/skins/mobile/css/Makefile.am | 6 - web/skins/mobile/graphics/Makefile.am | 5 - web/skins/mobile/includes/Makefile.am | 9 -- web/skins/mobile/lang/Makefile.am | 5 - web/skins/mobile/views/Makefile.am | 22 --- web/skins/mobile/views/css/Makefile.am | 6 - web/skins/xml/Makefile.am | 10 -- web/skins/xml/includes/Makefile.am | 8 -- web/skins/xml/views/Makefile.am | 11 -- web/tools/Makefile.am | 4 - web/tools/mootools/Makefile.am | 16 --- web/views/Makefile.am | 6 - 44 files changed, 866 deletions(-) delete mode 100644 Makefile.am delete mode 100644 db/Makefile.am delete mode 100644 misc/Makefile.am delete mode 100644 onvif/Makefile.am delete mode 100644 onvif/scripts/Makefile.am delete mode 100644 scripts/Makefile.am delete mode 100644 src/Makefile.am delete mode 100644 web/Makefile.am delete mode 100644 web/ajax/Makefile.am delete mode 100644 web/css/Makefile.am delete mode 100644 web/graphics/Makefile.am delete mode 100644 web/includes/Makefile.am delete mode 100644 web/js/Makefile.am delete mode 100644 web/lang/Makefile.am delete mode 100644 web/skins/Makefile.am delete mode 100644 web/skins/classic/Makefile.am delete mode 100644 web/skins/classic/ajax/Makefile.am delete mode 100644 web/skins/classic/css/Makefile.am delete mode 100644 web/skins/classic/css/classic/Makefile.am delete mode 100644 web/skins/classic/css/classic/views/Makefile.am delete mode 100644 web/skins/classic/css/dark/Makefile.am delete mode 100644 web/skins/classic/css/dark/views/Makefile.am delete mode 100644 web/skins/classic/css/flat/Makefile.am delete mode 100644 web/skins/classic/css/flat/views/Makefile.am delete mode 100644 web/skins/classic/graphics/Makefile.am delete mode 100644 web/skins/classic/includes/Makefile.am delete mode 100644 web/skins/classic/js/Makefile.am delete mode 100644 web/skins/classic/lang/Makefile.am delete mode 100644 web/skins/classic/views/Makefile.am delete mode 100644 web/skins/classic/views/js/Makefile.am delete mode 100644 web/skins/mobile/Makefile.am delete mode 100644 web/skins/mobile/ajax/Makefile.am delete mode 100644 web/skins/mobile/css/Makefile.am delete mode 100644 web/skins/mobile/graphics/Makefile.am delete mode 100644 web/skins/mobile/includes/Makefile.am delete mode 100644 web/skins/mobile/lang/Makefile.am delete mode 100644 web/skins/mobile/views/Makefile.am delete mode 100644 web/skins/mobile/views/css/Makefile.am delete mode 100644 web/skins/xml/Makefile.am delete mode 100644 web/skins/xml/includes/Makefile.am delete mode 100644 web/skins/xml/views/Makefile.am delete mode 100644 web/tools/Makefile.am delete mode 100644 web/tools/mootools/Makefile.am delete mode 100644 web/views/Makefile.am diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 62f767e75..000000000 --- a/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -AUTOMAKE_OPTIONS = foreign -ACLOCAL_AMFLAGS = -I m4 - -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ -zmconfigdir = @ZM_CONFIG_DIR@ - -zmconfig_DATA = \ - zm.conf - -if COND_ONVIF - MAYBE_ONVIF = onvif -endif - -SUBDIRS = \ - src \ - web \ - scripts \ - db \ - misc \ - $(MAYBE_ONVIF) - -EXTRA_DIST = \ - zm.conf.in \ - zmconfgen.pl.in - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(zmconfigdir); chown $(webuser):$(webgroup) $(zmconfig_DATA); chmod 600 $(zmconfig_DATA) ) - ( if ! test -e $(DESTDIR)$(ZM_RUNDIR); then mkdir -p $(DESTDIR)$(ZM_RUNDIR); fi; if test "$(DESTDIR)$(ZM_RUNDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_RUNDIR); chmod u+w $(DESTDIR)$(ZM_RUNDIR); fi ) - ( if ! test -e $(DESTDIR)$(ZM_SOCKDIR); then mkdir -p $(DESTDIR)$(ZM_SOCKDIR); fi; if test "$(DESTDIR)$(ZM_SOCKDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_SOCKDIR); chmod u+w $(DESTDIR)$(ZM_SOCKDIR); fi ) - ( if ! test -e $(DESTDIR)$(ZM_TMPDIR); then mkdir -m 700 -p $(DESTDIR)$(ZM_TMPDIR); fi; if test "$(DESTDIR)$(ZM_TMPDIR)" != "/tmp" && test "$(DESTDIR)$(ZM_TMPDIR)" != "/var/tmp"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_TMPDIR); chmod u+w $(DESTDIR)$(ZM_TMPDIR); fi ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -rf events graphics images sounds temp ) - @-( if test "$(DESTDIR)$(ZM_RUNDIR)" != "/var/run"; then rm -rf $(DESTDIR)$(ZM_RUNDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_SOCKDIR)" != "/var/run"; then rm -rf $(DESTDIR)$(ZM_SOCKDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_TMPDIR)" != "/tmp" && test "$(DESTDIR)$(ZM_TMPDIR)" != "/var/tmp"; then rm -rf $(DESTDIR)$(ZM_TMPDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_LOGDIR)" != "/var/log"; then rm -rf $(DESTDIR)$(ZM_LOGDIR); fi ) diff --git a/db/Makefile.am b/db/Makefile.am deleted file mode 100644 index 9cb4e197c..000000000 --- a/db/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -AUTOMAKE_OPTIONS = foreign - -zmdbdatadir = $(pkgdatadir)/db - -EXTRA_DIST = \ - zm_create.sql.in \ - $(dbupgrade_scripts) - -dist_zmdbdata_DATA = \ - zm_create.sql \ - $(dbupgrade_scripts) - -dbupgrade_scripts = $(wildcard zm_update-*.sql) - diff --git a/misc/Makefile.am b/misc/Makefile.am deleted file mode 100644 index 5578e4373..000000000 --- a/misc/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -EXTRA_DIST = \ - apache.conf.in \ - logrotate.conf.in \ - syslog.conf.in \ - zoneminder-tmpfiles.conf.in \ - zoneminder.service.in \ - com.zoneminder.systemctl.policy.in \ - com.zoneminder.systemctl.rules.in - -polkit_actiondir = @POLKIT_PREFIX@/share/polkit-1/actions -dist_polkit_action_DATA = com.zoneminder.systemctl.policy - -polkit_rulesdir = @POLKIT_PREFIX@/share/polkit-1/rules.d -dist_polkit_rules_DATA = com.zoneminder.systemctl.rules - diff --git a/onvif/Makefile.am b/onvif/Makefile.am deleted file mode 100644 index 8cc9d700a..000000000 --- a/onvif/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# Ack! Nasty hack to get modules Makefile regenerated if wiped with make clean -all-local: proxy/Makefile modules/Makefile - -proxy/Makefile: proxy/Makefile.PL - ( cd proxy; perl Makefile.PL ) - -modules/Makefile: modules/Makefile.PL - ( cd modules; perl Makefile.PL ) - -SUBDIRS = \ - . \ - proxy \ - modules \ - scripts - - -EXTRA_DIST = \ - proxy/Makefile.PL \ - proxy/lib \ - modules/Makefile.PL \ - modules/lib \ - wsdl \ - doc \ - patches diff --git a/onvif/scripts/Makefile.am b/onvif/scripts/Makefile.am deleted file mode 100644 index 80db9755c..000000000 --- a/onvif/scripts/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -bin_SCRIPTS = \ - zmonvif-probe.pl - diff --git a/scripts/Makefile.am b/scripts/Makefile.am deleted file mode 100644 index 5eacd8203..000000000 --- a/scripts/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# Ack! Nasty hack to get modules Makefile regenerated if wiped with make clean -all-local: ZoneMinder/Makefile - -ZoneMinder/Makefile: ZoneMinder/Makefile.PL - ( cd ZoneMinder; perl Makefile.PL ) - -bin_SCRIPTS = \ - zmdc.pl \ - zmaudit.pl \ - zmfilter.pl \ - zmtrigger.pl \ - zmx10.pl \ - zmwatch.pl \ - zmpkg.pl \ - zmupdate.pl \ - zmvideo.pl \ - zmcontrol.pl \ - zmtrack.pl \ - zmcamtool.pl \ - zmsystemctl.pl - -SUBDIRS = \ - . \ - ZoneMinder - -EXTRA_DIST = \ - zmdc.pl.in \ - zmaudit.pl.in \ - zmfilter.pl.in \ - zmtrigger.pl.in \ - zmx10.pl.in \ - zmwatch.pl.in \ - zmpkg.pl.in \ - zmupdate.pl.in \ - zmvideo.pl.in \ - zmcontrol.pl.in \ - zmtrack.pl.in \ - zmcamtool.pl.in \ - zmsystemctl.pl.in \ - ZoneMinder/Makefile.PL \ - ZoneMinder/README \ - ZoneMinder/Changes \ - ZoneMinder/META.yml \ - ZoneMinder/MANIFEST \ - ZoneMinder/t/ZoneMinder.t \ - ZoneMinder/lib/ZoneMinder.pm \ - ZoneMinder/lib/ZoneMinder/Base.pm.in \ - ZoneMinder/lib/ZoneMinder/Config.pm.in \ - ZoneMinder/lib/ZoneMinder/Logger.pm \ - ZoneMinder/lib/ZoneMinder/General.pm \ - ZoneMinder/lib/ZoneMinder/Database.pm \ - ZoneMinder/lib/ZoneMinder/Memory.pm.in \ - ZoneMinder/lib/ZoneMinder/Memory/Shared.pm \ - ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm \ - ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm \ - ZoneMinder/lib/ZoneMinder/ConfigData.pm.in \ - ZoneMinder/lib/ZoneMinder/Control.pm \ - ZoneMinder/lib/ZoneMinder/Control \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm \ - zm.in \ - zmdbbackup.in \ - zmdbrestore.in \ - zmeventdump.in \ - zmlogrotate.conf.in - diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 9314daac0..000000000 --- a/src/Makefile.am +++ /dev/null @@ -1,135 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -AM_CPPFLAGS = @MYSQL_CFLAGS@ @MARIADB_CFLAGS@ @FFMPEG_CFLAGS@ -Wall -finline-functions -fomit-frame-pointer -#AM_CXXFLAGS = -frepo - -CLEANFILES = *.rpo - -# This should be set to your CGI directory -cgidir = @CGI_PREFIX@ -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ - -bin_PROGRAMS = \ - zmc \ - zma \ - zmu \ - zms \ - zmf \ - zmstreamer - -zm_SOURCES = \ - zm_box.cpp \ - zm_buffer.cpp \ - zm_camera.cpp \ - zm_comms.cpp \ - zm_config.cpp \ - zm_coord.cpp \ - zm_curl_camera.cpp \ - zm.cpp \ - zm_db.cpp \ - zm_logger.cpp \ - zm_event.cpp \ - zm_exception.cpp \ - zm_file_camera.cpp \ - zm_ffmpeg_camera.cpp \ - zm_image.cpp \ - zm_jpeg.cpp \ - zm_libvlc_camera.cpp \ - zm_local_camera.cpp \ - zm_monitor.cpp \ - zm_ffmpeg.cpp \ - zm_mpeg.cpp \ - zm_poly.cpp \ - zm_regexp.cpp \ - zm_remote_camera.cpp \ - zm_remote_camera_http.cpp \ - zm_remote_camera_rtsp.cpp \ - zm_rtp.cpp \ - zm_rtp_ctrl.cpp \ - zm_rtp_data.cpp \ - zm_rtp_source.cpp \ - zm_rtsp.cpp \ - zm_rtsp_auth.cpp \ - zm_sdp.cpp \ - zm_signal.cpp \ - zm_stream.cpp \ - zm_thread.cpp \ - zm_time.cpp \ - zm_timer.cpp \ - zm_user.cpp \ - zm_utils.cpp \ - zm_zone.cpp - -zmc_SOURCES = zmc.cpp $(zm_SOURCES) -zma_SOURCES = zma.cpp $(zm_SOURCES) -zms_SOURCES = zms.cpp $(zm_SOURCES) -zmu_SOURCES = zmu.cpp $(zm_SOURCES) -zmf_SOURCES = zmf.cpp $(zm_SOURCES) -zmstreamer_SOURCES = zmstreamer.cpp $(zm_SOURCES) - -noinst_HEADERS = \ - jinclude.h \ - zm_box.h \ - zm_buffer.h \ - zm_camera.h \ - zm_comms.h \ - zm_config_defines.h \ - zm_config.h \ - zm_coord.h \ - zm_curl_camera.h \ - zm_db.h \ - zm_logger.h \ - zm_event.h \ - zm_exception.h \ - zmf.h \ - zm_file_camera.h \ - zm_ffmpeg_camera.h \ - zm_font.h \ - zm_font.h \ - zm.h \ - zm_image.h \ - zm_jpeg.h \ - zm_libvlc_camera.h \ - zm_local_camera.h \ - zm_mem_utils.h \ - zm_monitor.h \ - zm_ffmpeg.h \ - zm_mpeg.h \ - zm_poly.h \ - zm_regexp.h \ - zm_remote_camera.h \ - zm_remote_camera_http.h \ - zm_remote_camera_rtsp.h \ - zm_rgb.h \ - zm_rtp_ctrl.h \ - zm_rtp_data.h \ - zm_rtp.h \ - zm_rtp_source.h \ - zm_rtsp.h \ - zm_sdp.h \ - zm_signal.h \ - zm_stream.h \ - zm_thread.h \ - zm_time.h \ - zm_timer.h \ - zm_user.h \ - zm_utils.h \ - zm_zone.h - -EXTRA_DIST = \ - zm_config.h.in \ - zm_threaddata.cpp - -dist-hook: - @( rm $(distdir)/zm_config.h ) - -# Yes, you are correct. This is a HACK! -install-exec-hook: - ( cd $(DESTDIR)@bindir@; mkdir -p $(DESTDIR)$(cgidir); mv zms $(DESTDIR)$(cgidir) ) - ( cd $(DESTDIR)$(cgidir); chown $(webuser):$(webgroup) zms; ln -f zms nph-zms ) - -uninstall-hook: - ( cd $(DESTDIR)$(cgidir); rm -f zms nph-zms ) - diff --git a/web/Makefile.am b/web/Makefile.am deleted file mode 100644 index 077a4ff91..000000000 --- a/web/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# This should be set to your web directory -webdir = @WEB_PREFIX@ -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - js \ - lang \ - skins \ - tools \ - views - -dist_web_DATA = \ - index.php - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(webdir); chown $(webuser):$(webgroup) $(dist_web_DATA) ) - ( cd $(DESTDIR)$(webdir); chown -R $(webuser):$(webgroup) $(SUBDIRS) ) - @-( cd $(DESTDIR)$(webdir); if ! test -e events; then mkdir events; fi; chown $(webuser):$(webgroup) events; chmod u+w events ) - @-( cd $(DESTDIR)$(webdir); if ! test -e images; then mkdir images; fi; chown $(webuser):$(webgroup) images; chmod u+w images ) - @-( cd $(DESTDIR)$(webdir); if ! test -e sounds; then mkdir sounds; fi; chown $(webuser):$(webgroup) sounds; chmod u+w sounds ) - @-( cd $(DESTDIR)$(webdir); if ! test -e tools; then mkdir tools; fi; chown $(webuser):$(webgroup) tools; chmod u+w tools ) - @-( cd $(DESTDIR)$(webdir); if ! test -e temp; then mkdir temp; fi; chown $(webuser):$(webgroup) temp; chmod u+w temp ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -rf $(SUBDIRS) ) - @-( cd $(DESTDIR)$(webdir); rm -rf events images sounds tools temp ) diff --git a/web/ajax/Makefile.am b/web/ajax/Makefile.am deleted file mode 100644 index ef79e6cae..000000000 --- a/web/ajax/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/ajax - -dist_web_DATA = \ - alarm.php \ - control.php \ - event.php \ - log.php \ - status.php \ - stream.php \ - zone.php diff --git a/web/css/Makefile.am b/web/css/Makefile.am deleted file mode 100644 index 917b8f389..000000000 --- a/web/css/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/css - -dist_web_DATA = \ - reset.css \ - spinner.css \ - overlay.css diff --git a/web/graphics/Makefile.am b/web/graphics/Makefile.am deleted file mode 100644 index ec252c82e..000000000 --- a/web/graphics/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/graphics - -dist_web_DATA = \ - favicon.ico \ - spinner.gif \ - transparent.gif diff --git a/web/includes/Makefile.am b/web/includes/Makefile.am deleted file mode 100644 index d4a1ece9b..000000000 --- a/web/includes/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/includes - -web_DATA = \ - config.php - -dist_web_DATA = \ - Monitor.php \ - Server.php \ - actions.php \ - database.php \ - functions.php \ - control_functions.php \ - lang.php \ - logger.php - -EXTRA_DIST = \ - config.php.in diff --git a/web/js/Makefile.am b/web/js/Makefile.am deleted file mode 100644 index 21c10613e..000000000 --- a/web/js/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/js - -dist_web_DATA = \ - logger.js \ - overlay.js \ - mootools.ext.js diff --git a/web/lang/Makefile.am b/web/lang/Makefile.am deleted file mode 100644 index 22d256a2e..000000000 --- a/web/lang/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/lang - -dist_web_DATA = \ - big5_big5.php \ - cn_zh.php \ - cs_cz.php \ - de_de.php \ - dk_dk.php \ - et_ee.php \ - en_gb.php \ - en_us.php \ - es_ar.php \ - fr_fr.php \ - he_il.php \ - hu_hu.php \ - it_it.php \ - ja_jp.php \ - nl_nl.php \ - pl_pl.php \ - pt_br.php \ - ro_ro.php \ - ru_ru.php \ - se_se.php diff --git a/web/skins/Makefile.am b/web/skins/Makefile.am deleted file mode 100644 index ae0abd8e8..000000000 --- a/web/skins/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - classic \ - mobile \ - xml diff --git a/web/skins/classic/Makefile.am b/web/skins/classic/Makefile.am deleted file mode 100644 index 986beae0d..000000000 --- a/web/skins/classic/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - js \ - lang \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/classic/ajax/Makefile.am b/web/skins/classic/ajax/Makefile.am deleted file mode 100644 index f910cbc5c..000000000 --- a/web/skins/classic/ajax/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/ajax - -dist_web_DATA = # No files here diff --git a/web/skins/classic/css/Makefile.am b/web/skins/classic/css/Makefile.am deleted file mode 100644 index 2c43d2e47..000000000 --- a/web/skins/classic/css/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css - -SUBDIRS = dark \ - flat \ - classic diff --git a/web/skins/classic/css/classic/Makefile.am b/web/skins/classic/css/classic/Makefile.am deleted file mode 100644 index 48dc58ab7..000000000 --- a/web/skins/classic/css/classic/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/classic - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/classic/views/Makefile.am b/web/skins/classic/css/classic/views/Makefile.am deleted file mode 100644 index d07eaac4f..000000000 --- a/web/skins/classic/css/classic/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/classic/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/css/dark/Makefile.am b/web/skins/classic/css/dark/Makefile.am deleted file mode 100644 index 6961860eb..000000000 --- a/web/skins/classic/css/dark/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/dark - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/dark/views/Makefile.am b/web/skins/classic/css/dark/views/Makefile.am deleted file mode 100644 index 2180d6432..000000000 --- a/web/skins/classic/css/dark/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/dark/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/css/flat/Makefile.am b/web/skins/classic/css/flat/Makefile.am deleted file mode 100644 index 297982929..000000000 --- a/web/skins/classic/css/flat/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/flat - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/flat/views/Makefile.am b/web/skins/classic/css/flat/views/Makefile.am deleted file mode 100644 index dff0aa29b..000000000 --- a/web/skins/classic/css/flat/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/flat/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/graphics/Makefile.am b/web/skins/classic/graphics/Makefile.am deleted file mode 100644 index c5c7b6bba..000000000 --- a/web/skins/classic/graphics/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/graphics - -dist_web_DATA = \ - arrow-d.gif \ - arrow-dl.gif \ - arrow-dr.gif \ - arrow-l-d.gif \ - arrow-l.gif \ - arrow-l-u.gif \ - arrow-r.gif \ - arrow-s-d.gif \ - arrow-s-u.gif \ - arrow-u.gif \ - arrow-ul.gif \ - arrow-ur.gif \ - center.gif \ - point-g.gif \ - point-o.gif \ - point-r.gif \ - seq-d.gif \ - seq-u.gif diff --git a/web/skins/classic/includes/Makefile.am b/web/skins/classic/includes/Makefile.am deleted file mode 100644 index 690df231a..000000000 --- a/web/skins/classic/includes/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php \ - control_functions.php \ - export_functions.php \ - timeline_functions.php diff --git a/web/skins/classic/js/Makefile.am b/web/skins/classic/js/Makefile.am deleted file mode 100644 index 3f5ffdda2..000000000 --- a/web/skins/classic/js/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/js - -dist_web_DATA = \ - skin.js \ - classic.js \ - dark.js \ - flat.js \ - skin.js.php diff --git a/web/skins/classic/lang/Makefile.am b/web/skins/classic/lang/Makefile.am deleted file mode 100644 index 6a089b4fa..000000000 --- a/web/skins/classic/lang/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/lang - -dist_web_DATA = # No files here diff --git a/web/skins/classic/views/Makefile.am b/web/skins/classic/views/Makefile.am deleted file mode 100644 index 4167a886b..000000000 --- a/web/skins/classic/views/Makefile.am +++ /dev/null @@ -1,57 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - js - -webdir = @WEB_PREFIX@/skins/classic/views - -dist_web_DATA = \ - bandwidth.php \ - blank.php \ - console.php \ - controlcap.php \ - controlcaps.php \ - control.php \ - controlpreset.php \ - cycle.php \ - device.php \ - devices.php \ - donate.php \ - error.php \ - eventdetail.php \ - event.php \ - events.php \ - export.php \ - filter.php \ - filtersave.php \ - frame.php \ - frames.php \ - function.php \ - group.php \ - groups.php \ - log.php \ - login.php \ - logout.php \ - Makefile.am \ - monitor.php \ - monitorpreset.php \ - monitorprobe.php \ - montage.php \ - montagereview.php \ - none.php \ - onvifprobe.php \ - optionhelp.php \ - options.php \ - postlogin.php \ - server.php \ - settings.php \ - state.php \ - stats.php \ - status.php \ - timeline.php \ - user.php \ - version.php \ - video.php \ - watch.php \ - zone.php \ - zones.php diff --git a/web/skins/classic/views/js/Makefile.am b/web/skins/classic/views/js/Makefile.am deleted file mode 100644 index 73c74fafe..000000000 --- a/web/skins/classic/views/js/Makefile.am +++ /dev/null @@ -1,50 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/views/js - -dist_web_DATA = \ - console.js \ - console.js.php \ - control.js \ - controlpreset.js \ - controlpreset.js.php \ - cycle.js \ - cycle.js.php \ - devices.js \ - donate.js \ - donate.js.php \ - event.js \ - event.js.php \ - events.js \ - events.js.php \ - export.js \ - export.js.php \ - filter.js \ - filter.js.php \ - group.js \ - groups.js \ - log.js \ - login.js \ - Makefile.am \ - monitor.js \ - monitor.js.php \ - monitorpreset.js \ - monitorprobe.js \ - montage.js \ - montage.js.php \ - onvifprobe.js \ - options.js.php \ - postlogin.js.php \ - state.js \ - state.js.php \ - timeline.js \ - timeline.js.php \ - user.js \ - version.js \ - version.js.php \ - video.js \ - video.js.php \ - watch.js \ - watch.js.php \ - zone.js \ - zone.js.php diff --git a/web/skins/mobile/Makefile.am b/web/skins/mobile/Makefile.am deleted file mode 100644 index 35051fade..000000000 --- a/web/skins/mobile/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - lang \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/mobile/ajax/Makefile.am b/web/skins/mobile/ajax/Makefile.am deleted file mode 100644 index 0558929c0..000000000 --- a/web/skins/mobile/ajax/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/ajax - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/css/Makefile.am b/web/skins/mobile/css/Makefile.am deleted file mode 100644 index 6353e163e..000000000 --- a/web/skins/mobile/css/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/css - -dist_web_DATA = \ - skin.css diff --git a/web/skins/mobile/graphics/Makefile.am b/web/skins/mobile/graphics/Makefile.am deleted file mode 100644 index dfd43bef7..000000000 --- a/web/skins/mobile/graphics/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/graphics - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/includes/Makefile.am b/web/skins/mobile/includes/Makefile.am deleted file mode 100644 index c88ad435a..000000000 --- a/web/skins/mobile/includes/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php \ - control_functions.php diff --git a/web/skins/mobile/lang/Makefile.am b/web/skins/mobile/lang/Makefile.am deleted file mode 100644 index 5084203fb..000000000 --- a/web/skins/mobile/lang/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/lang - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/views/Makefile.am b/web/skins/mobile/views/Makefile.am deleted file mode 100644 index c7d175ca3..000000000 --- a/web/skins/mobile/views/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - css - -webdir = @WEB_PREFIX@/skins/mobile/views - -dist_web_DATA = \ - console.php \ - devices.php \ - error.php \ - eventdetails.php \ - event.php \ - events.php \ - filter.php \ - frame.php \ - function.php \ - login.php \ - montage.php \ - state.php \ - video.php \ - watch.php diff --git a/web/skins/mobile/views/css/Makefile.am b/web/skins/mobile/views/css/Makefile.am deleted file mode 100644 index 86e0ff0a3..000000000 --- a/web/skins/mobile/views/css/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/views/css - -dist_web_DATA = \ - console.css diff --git a/web/skins/xml/Makefile.am b/web/skins/xml/Makefile.am deleted file mode 100644 index 2c30d19a3..000000000 --- a/web/skins/xml/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/xml - -SUBDIRS = \ - includes \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/xml/includes/Makefile.am b/web/skins/xml/includes/Makefile.am deleted file mode 100644 index c6128f8a2..000000000 --- a/web/skins/xml/includes/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/xml/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php diff --git a/web/skins/xml/views/Makefile.am b/web/skins/xml/views/Makefile.am deleted file mode 100644 index ab9147ae4..000000000 --- a/web/skins/xml/views/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = - -webdir = @WEB_PREFIX@/skins/xml/views - -dist_web_DATA = \ - console.php \ - actions.php \ - none.php \ - notfound.png diff --git a/web/tools/Makefile.am b/web/tools/Makefile.am deleted file mode 100644 index 29c91bc02..000000000 --- a/web/tools/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - mootools diff --git a/web/tools/mootools/Makefile.am b/web/tools/mootools/Makefile.am deleted file mode 100644 index 89b17ab8d..000000000 --- a/web/tools/mootools/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/tools/mootools - -dist_web_DATA = \ - mootools-core-1.4.5-compat.js \ - mootools-more-1.5.1.js - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(webdir); rm -f mootools-core.js mootools-more.js ) - ( cd $(DESTDIR)$(webdir); ln -sf mootools-core-1.4.5-compat.js mootools-core.js ) - ( cd $(DESTDIR)$(webdir); ln -sf mootools-more-1.5.1.js mootools-more.js ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -f mootools-* ) diff --git a/web/views/Makefile.am b/web/views/Makefile.am deleted file mode 100644 index 6ecec9d8b..000000000 --- a/web/views/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/views - -dist_web_DATA = file.php \ - image.php From e4a72f7653925ac2ffaf9969fb53d00990732238 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:25:37 +1100 Subject: [PATCH 06/26] Remove more Autotools files and edit travis to no longer build Autotools Conflicts: .travis.yml bootstrap.sh configure.ac --- .travis.yml | 7 - acinclude.m4 | 74 ------ bootstrap.sh | 5 - configure.ac | 509 ---------------------------------------- m4/ac_check_sendfile.m4 | 63 ----- 5 files changed, 658 deletions(-) delete mode 100644 acinclude.m4 delete mode 100755 bootstrap.sh delete mode 100644 configure.ac delete mode 100644 m4/ac_check_sendfile.m4 diff --git a/.travis.yml b/.travis.yml index d44973e2e..835f267f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,6 @@ env: - CXXFLAGS="$CFLAGS" matrix: - ZM_BUILDMETHOD=cmake - - ZM_BUILDMETHOD=autotools compiler: - gcc before_install: @@ -32,16 +31,10 @@ install: - sudo make install-libs before_script: - cd $TRAVIS_BUILD_DIR - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then libtoolize -v --force; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then aclocal -I m4; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then autoheader; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then automake --force-missing --add-missing; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then autoconf; fi - mysql -uroot -e "CREATE DATABASE IF NOT EXISTS zm" - mysql -uroot -e "GRANT ALL ON zm.* TO 'zmuser'@'localhost' IDENTIFIED BY 'zmpass'"; - mysql -uroot -e "FLUSH PRIVILEGES" script: - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then ./configure --prefix=/usr --with-libarch=lib/$DEB_HOST_GNU_TYPE --host=$DEB_HOST_GNU_TYPE --build=$DEB_BUILD_GNU_TYPE --with-mysql=/usr --with-ffmpeg=/usr --with-webdir=/usr/share/zoneminder/www --with-cgidir=/usr/libexec/zoneminder/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-crashtrace=yes --disable-debug --enable-mmap=yes ZM_SSL_LIB=openssl; fi - if [ "$ZM_BUILDMETHOD" = "cmake" ]; then cmake -DCMAKE_INSTALL_PREFIX="/usr"; fi - make - sudo make install diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index 605842149..000000000 --- a/acinclude.m4 +++ /dev/null @@ -1,74 +0,0 @@ -AC_DEFUN([AC_DEFINE_DIR], [ - prefix_NONE= - exec_prefix_NONE= - test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix - test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix -dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn -dnl refers to ${prefix}. Thus we have to use `eval' twice. - eval ac_define_dir="\"[$]$2\"" - eval ac_define_dir="\"$ac_define_dir\"" - AC_SUBST($1, "$ac_define_dir") - AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3]) - test "$prefix_NONE" && prefix=NONE - test "$exec_prefix_NONE" && exec_prefix=NONE -]) - -AC_DEFUN([AC_PROG_PERL_VERSION],[dnl -# Make sure we have perl -if test -z "$PERL"; then -AC_CHECK_PROG(PERL,perl,perl) -fi - -# Check if version of Perl is sufficient -ac_perl_version="$1" - -if test "x$PERL" != "x"; then - AC_MSG_CHECKING(for perl version greater than or equal to $ac_perl_version) - # NB: It would be nice to log the error if there is one, but we cannot rely - # on autoconf internals - $PERL -e "use $ac_perl_version;" > /dev/null 2>&1 - if test $? -ne 0; then - AC_MSG_RESULT(no); - $3 - else - AC_MSG_RESULT(ok); - $2 - fi -else - AC_MSG_WARN(could not find perl) -fi -])dnl - -AC_DEFUN([AC_PROG_PERL_MODULES],[dnl -ac_perl_modules="$1" -# Make sure we have perl -if test -z "$PERL"; then -AC_CHECK_PROG(PERL,perl,perl) -fi - -if test "x$PERL" != x; then - ac_perl_modules_failed=0 - for ac_perl_module in $ac_perl_modules; do - AC_MSG_CHECKING(for perl module $ac_perl_module) - - # Would be nice to log result here, but can't rely on autoconf internals - $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 - if test $? -ne 0; then - AC_MSG_RESULT(no); - ac_perl_modules_failed=1 - else - AC_MSG_RESULT(ok); - fi - done - - # Run optional shell commands - if test "$ac_perl_modules_failed" = 0; then - : - $2 - else - : - $3 - fi -else - AC_MSG_WARN(could not find perl) -fi])dnl diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 0bc041f18..000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -aclocal -I m4 -autoheader -automake --add-missing -autoconf diff --git a/configure.ac b/configure.ac deleted file mode 100644 index b10dd44d5..000000000 --- a/configure.ac +++ /dev/null @@ -1,509 +0,0 @@ -# -# Building ZoneMinder via Autotools will be depreciated soon -# For instructions on building with cmake, please see INSTALL -# -AC_PREREQ(2.59) -AC_INIT(zm,1.29.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) -AM_INIT_AUTOMAKE -AC_CONFIG_SRCDIR(src/zm.h) -AC_CONFIG_HEADERS(config.h) -AC_CONFIG_MACRO_DIR([m4]) - -AC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS]) - -AC_SUBST(VERSION) -# -# Platform specific setup -# -############################# -AC_CANONICAL_HOST -# Check for which host we are on and setup a few things -# specifically based on the host -case $host_os in - darwin* ) - # Do something specific for mac - HOST_OS='darwin' - ;; - linux*) - # Do something specific for linux - HOST_OS='linux' - ;; - *BSD*) - # Do something specific for BSD - HOST_OS='BSD' - AC_DEFINE(BSD,1,"This is a BSD system") - ;; - *bsd*) - # Do something specific for BSD - HOST_OS='BSD' - AC_DEFINE(BSD,1,"This is a BSD system") - ;; - *solaris*) - # Do something specific for Solaris - HOST_OS='solaris' - AC_DEFINE(SOLARIS,1,"We are running a Solaroid OS [tested on OmniOS]") - ;; - *) - #Default Case - AC_MSG_ERROR([Your platform is not currently supported]) - ;; -esac - -AC_SUBST(HOST_OS) - -AC_ARG_VAR(ZM_DB_TYPE,[Type of the ZoneMinder database, default mysql]) -AC_ARG_VAR(ZM_DB_HOST,[Hostname where ZoneMinder database located, default localhost]) -AC_ARG_VAR(ZM_DB_NAME,[Name of ZoneMinder database, default zm]) -AC_ARG_VAR(ZM_DB_USER,[Name of ZoneMinder database user, default zmuser]) -AC_ARG_VAR(ZM_DB_PASS,[Password of ZoneMinder database user, default zmpass]) -AC_ARG_VAR(ZM_SSL_LIB,[Library to use for ssl functions, default gnutls]) -AC_ARG_VAR(ZM_MYSQL_ENGINE,[MySQL engine to use with database, default InnoDB]) -AC_ARG_VAR(ZM_RUNDIR,[Location of transient process files, default /var/run/zm]) -AC_ARG_VAR(ZM_SOCKDIR,[Location of Unix domain socket files, default /var/run/zm]) -AC_ARG_VAR(ZM_TMPDIR,[Location of temporary files, default /var/tmp/zm]) -AC_ARG_VAR(ZM_LOGDIR,[Location of generated log files, default /var/log/zm]) -AC_ARG_VAR(ZM_CONFIG_DIR,[Location of ZoneMinder configuration, default system config directory]) - -if test "$ZM_DB_TYPE" == ""; then - AC_SUBST(ZM_DB_TYPE,[mysql]) -fi -if test "$ZM_DB_HOST" == ""; then - AC_SUBST(ZM_DB_HOST,[localhost]) -fi -if test "$ZM_DB_NAME" == ""; then - AC_SUBST(ZM_DB_NAME,[zm]) -fi -if test "$ZM_DB_USER" == ""; then - AC_SUBST(ZM_DB_USER,[zmuser]) -fi -if test "$ZM_DB_PASS" == ""; then - AC_SUBST(ZM_DB_PASS,[zmpass]) -fi -if test "$ZM_SSL_LIB" == ""; then - AC_SUBST(ZM_SSL_LIB,gnutls) -fi -if test "$ZM_MYSQL_ENGINE" == ""; then - AC_SUBST(ZM_MYSQL_ENGINE,InnoDB) -fi -if test "$ZM_RUNDIR" == ""; then - AC_SUBST(ZM_RUNDIR,[/var/run/zm]) -fi -if test "$ZM_SOCKDIR" == ""; then - AC_SUBST(ZM_SOCKDIR,[/var/run/zm]) -fi -if test "$ZM_TMPDIR" == ""; then - AC_SUBST(ZM_TMPDIR,[/tmp/zm]) -fi -if test "$ZM_LOGDIR" == ""; then - AC_SUBST(ZM_LOGDIR,[/var/log/zm]) -fi -AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) -if test "$ZM_CONFIG_DIR" == ""; then - AC_SUBST(ZM_CONFIG_DIR,[$SYSCONFDIR]) -fi - -LIB_ARCH=lib -AC_ARG_WITH(libarch, - [ --with-libarch= architecture library path to use, default lib], - [LIB_ARCH=$with_libarch], - AC_MSG_WARN([You can call configure with the --with-libarch option. - This tells configure where to find architecture specific libraries. - The default of 'lib' is usually ok but 64 bit machines may require lib64. - e.g. --with-libarch=lib or --with-libarch=lib64]) -) -AC_SUBST(LIB_ARCH) - -LDFLAGS="-L/usr/lib/${build_alias} ${LDFLAGS}" - -MYSQL_PREFIX=/usr -AC_ARG_WITH(mysql, - [ --with-mysql= prefix of MySQL installation, default /usr], - [MYSQL_PREFIX=$with_mysql], - AC_MSG_WARN([You can call configure with the --with-mysql option. - This tells configure where to find the MySql C library and headers if configure cannot - locate them automatically. - e.g. --with-mysql=/usr/local or --with-mysql=/usr]) -) -AC_SUBST(MYSQL_PREFIX) -MYSQL_LIBS="-L${MYSQL_PREFIX}/${LIB_ARCH}/mysql" -MYSQL_CFLAGS="-I${MYSQL_PREFIX}/include" -AC_SUBST(MYSQL_LIBS) -AC_SUBST(MYSQL_CFLAGS) -LDFLAGS="$LDFLAGS ${MYSQL_LIBS}" - - -MARIADB_PREFIX=/usr -AC_ARG_WITH(mariadb, - [ --with-mariadb= prefix of MariaDB installation, default /usr], - [MYSQL_PREFIX=$with_mariadb], - AC_MSG_WARN([You can call configure with the --with-mariadb option. - This tells configure where to find the mariaDB C library and headers if configure cannot - locate them automatically. - e.g. --with-mariadb=/usr/local or --with-mariadb=/usr]) -) -AC_SUBST(MARIADB_PREFIX) -MARIADB_LIBS="-L${MARIADB_PREFIX}/${LIB_ARCH}/mariadb" -MARIADB_CFLAGS="-I${MARIADB_PREFIX}/include" -AC_SUBST(MARIADB_LIBS) -AC_SUBST(MARIADB_CFLAGS) -LDFLAGS="$LDFLAGS ${MARIADB_LIBS}" - -POLKIT_PREFIX=/usr -AC_ARG_WITH(polkit, -[ --with-polkit= prefix of polkit root directory, default /usr], -[POLKIT_PREFIX=$with_polkit], -AC_MSG_WARN([You can call configure with the --with-polkit option. -This tells configure where to place the polkit policy files.]) -) -AC_SUBST(POLKIT_PREFIX) -PKG_CHECK_MODULES(POLKIT, polkit-gobject-1) - -FFMPEG_PREFIX=/usr -AC_ARG_WITH(ffmpeg, - [ --with-ffmpeg= prefix of ffmpeg root directory for libavcodec etc, default /usr], - [FFMPEG_PREFIX=$with_ffmpeg], - AC_MSG_WARN([You can call configure with the --with-ffmpeg option. - This tells configure where to find the ffmpeg root directory within which are the libavcodec - and libavformat files that can be used to build true MPEG streaming into ZoneMinder. Ensure that - your copy of ffmpeg has installed libraries as well as binaries (use 'make installlib'). If you - are using a local install of ffmpeg you may have to remove or rename a previous real installation - as the headers and libraries from that will probably be picked up before your local copy. - e.g. --with-ffmpeg=/usr/local]) -) -AC_SUBST(FFMPEG_PREFIX) -FFMPEG_LIBS="-L${FFMPEG_PREFIX}/${LIB_ARCH}" -FFMPEG_CFLAGS="-I${FFMPEG_PREFIX}/include -D__STDC_CONSTANT_MACROS" -AC_SUBST(FFMPEG_LIBS) -AC_SUBST(FFMPEG_CFLAGS) - -LDFLAGS="${FFMPEG_LIBS} $LDFLAGS" -CFLAGS="${FFMPEG_CFLAGS} $CFLAGS" -CPPFLAGS="${FFMPEG_CFLAGS} $CPPFLAGS" - -EXTRA_LIBS= -AC_ARG_WITH(extralibs, - [ --with-extralibs="" string containing extra libraries to pass to link, default empty], - [EXTRA_LIBS=$with_extralibs], - AC_MSG_WARN([You can call configure with the --with-extralibs option. - Ordinarily you will need to use this option only when your copy of ffmpeg has been built - with support for additional formats and you would use this option to detail which additional - libraries ffmpeg was built with so that it is able to link successfully with ZoneMinder. - You will need to wrap this option in quotes if it contains any spaces. - e.g. --with-extralibs="-lmp3lame"]) -) -AC_SUBST(EXTRA_LIBS) - -LDFLAGS="$LDFLAGS ${EXTRA_LIBS}" - -AC_ARG_WITH(webdir, - [ --with-webdir= prefix of web directory], - [WEB_PREFIX=$with_webdir], - AC_MSG_ERROR([You must call configure with the --with-webdir option. - This tells configure where to install PHP and web files and scripts. - e.g. --with-webdir=/var/www/html or --with-webdir=/www/vhtdocs/]) -) -AC_SUBST(WEB_PREFIX) - -AC_ARG_WITH(cgidir, - [ --with-cgidir= prefix of cgi directory], - [CGI_PREFIX=$with_cgidir], - AC_MSG_ERROR([You must call configure with the --with-cgidir option. - This tells configure where to install cgi files and scripts. - e.g. --with-cgidir=/var/www/cgi-bin or --with-webdir=/www/vhtdocs//cgi-bin]) -) -AC_SUBST(CGI_PREFIX) - -WEB_USER=apache -AC_ARG_WITH(webuser, - [ --with-webuser= name of web user, default apache], - [WEB_USER=$with_webuser], - AC_MSG_WARN([You can call configure with the --with-webuser option. - This tells configure what the user name of the web user is if it is not the default of 'apache'. - e.g. --with-webuser=apache or --with-webuser=web]) -) -AC_SUBST(WEB_USER) - -WEB_GROUP=apache -AC_ARG_WITH(webgroup, - [ --with-webgroup= name of web group, default apache], - [WEB_GROUP=$with_webgroup], - AC_MSG_WARN([You can call configure with the --with-webgroup option. - This tells configure what the group name of the web group is if it is not the default of 'apache'. - e.g. --with-webgroup=apache or --with-webgroup=web]) -) -AC_SUBST(WEB_GROUP) - -WEB_HOST=zm.local -AC_ARG_WITH(webhost, - [ --with-webhost= name of web hostname, default zm.local], - [WEB_HOST=$with_webhost], - AC_MSG_WARN([You can call configure with the --with-webhost option. - This tells configure what the host name is for name based virtual hosting. This is only used to populate the sample web/zmHttpd.conf file. - e.g. --with-webhost=zm.localdomain]) -) -AC_SUBST(WEB_HOST) - -ENABLE_DEBUG=yes -AC_ARG_ENABLE(debug, - [ --enable-debug= enable or disable debug, default enabled], - [ENABLE_DEBUG=$enable_debug], - AC_MSG_WARN([You can call configure with the --enable-debug= or --disable-debug option. - This tells configure whether to compile ZoneMinder with debug included. Although debug is included - by default it is not output unless explicitly switched on elsewhere. These checks may induce a - small penalty on performance and if you are after squeezing the maximum possible performance out - of ZoneMinder you may use this switch to prevent debug from being compiled in. - e.g. --enable-debug=yes or --disable-debug]) -) -if test "$ENABLE_DEBUG" != "yes"; then - AC_DEFINE(ZM_DBG_OFF,1,"Whether debug is switched off and compiled out") -fi - -ENABLE_MMAP=yes -AC_ARG_ENABLE(mmap, - [ --enable-mmap= enable or disabled mapped memory versus shared memory, default mapped], - [ENABLE_MMAP=$enable_mmap], - AC_MSG_WARN([You can call configure with the --enable-mmap= or --disable-mmap option. - This tells configure whether to compile ZoneMinder with mmap support rather than IPC shared - memory. This is a feature that uses memory mapped into files which all processes can share. - Memory mapping requires less configuration and is more flexible than shared memory but may - slow down your system unless the mapped files are configured to reside on a fast or RAM based - filesystem which will normally be the case by default. - e.g. --enable-mmap=yes or --disable-mmap]) -) -if test "$ENABLE_MMAP" == "yes"; then - AC_DEFINE(ZM_MEM_MAPPED,1,"Whether to use mapped rather than shared memory") -else - AC_DEFINE(ZM_MEM_MAPPED,0,"Whether to use mapped rather than shared memory") -fi -AC_SUBST(ENABLE_MMAP) - -ENABLE_ONVIF=no -AC_ARG_ENABLE(onvif, - [ --enable-onvif= enable or disable basic onvif support, default disabled], - [ENABLE_ONVIF=$enable_onvif], - AC_MSG_WARN([You can call configure with the --enable-onvif= or --enable-onvif option. - This tells configure whether to compile ZoneMinder with basic ONVIF support. This feature will - probe for ONVIF compliant cameras on your network and allow you the option to auto-configure them as - monitors in zoneminder. This option is EXPERIMENTAL and may not work with all cameras that claim to - be ONVIF compliant. - e.g. --enable-onvif=yes or --disable-onvif]) -) -AM_CONDITIONAL([COND_ONVIF], [test "$enable_onvif" = yes]) - -# Compiler -AC_LANG_CPLUSPLUS -if test "$ENABLE_ONVIF" == "yes"; then - AC_SUBST(ZM_HAS_ONVIF,1) -else - AC_SUBST(ZM_HAS_ONVIF,0) -fi - -# Checks for programs. -AC_PROG_CXX -AC_PROG_CC -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_RANLIB -AC_PROG_MAKE_SET - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_MODE_T -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_TYPE_SIGNAL - -AC_CHECK_TYPES(siginfo_t,,,[#include ]) -AC_CHECK_TYPES(ucontext_t,,,[#include ]) - -# Checks for library functions. -AC_PROG_GCC_TRADITIONAL -AC_FUNC_MALLOC -AC_FUNC_MMAP -AC_FUNC_SELECT_ARGTYPES -AC_FUNC_STAT -AC_FUNC_STRFTIME -AC_FUNC_STRTOD -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([gethostbyname gethostname gettimeofday memmove memset mkdir munmap posix_memalign putenv select sendfile socket sqrt strcasecmp strchr strcspn strerror strncasecmp strrchr strspn strstr strtol strtoull]) -AC_CHECK_FUNCS([syscall sleep usleep ioctl ioctlsocket sigaction]) -# this is required for freebsd to compile. Look for it in m4/ac_check_sendfile.m4 -AC_CHECK_SENDFILE -# Other programs -AC_CHECK_PROG(OPT_FFMPEG,ffmpeg,yes,no) -AC_PATH_PROG(PATH_FFMPEG,ffmpeg) - -# Checks for libraries. -AC_CHECK_LIB(rt,clock_gettime,,AC_MSG_ERROR(zm requires librt)) -AC_SEARCH_LIBS(mysql_init,[mysqlclient mariadbclient],,AC_MSG_ERROR(zm requires libmysqlclient.a or libmariadbclient.a)) -AC_CHECK_LIB(jpeg,jpeg_start_compress,,AC_MSG_ERROR(zm requires libjpeg.a)) -AC_CHECK_LIB(pthread,pthread_create,,AC_MSG_ERROR(zm requires libpthread.a)) -if test "$BSD" == "0"; then -AC_CHECK_LIB(dl,dlsym,,AC_MSG_ERROR(zm requires libdl.a)) -fi -if test "$ZM_SSL_LIB" == "openssl"; then -AC_CHECK_HEADERS(openssl/md5.h,,AC_MSG_WARN(zm requires openssl/md5.h header to be installed for openssl),) -AC_CHECK_LIB(crypto,MD5,,AC_MSG_WARN([libcrypto.a is required for authenticated streaming - use ZM_SSL_LIB option to select gnutls instead])) -else -AC_CHECK_HEADERS(gnutls/openssl.h,AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,1),AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,0),) -AC_CHECK_HEADERS(gnutls/gnutls.h,AC_SUBST(ZM_HAS_GNUTLS,1),AC_SUBST(ZM_HAS_GNUTLS,0),) -if test "$ZM_HAS_GNUTLS_OPENSSL" == "0" && test "$ZM_HAS_GNUTLS" == "0"; then -AC_MSG_WARN(gnutls is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead) -fi -AC_CHECK_HEADERS(gcrypt.h,,AC_MSG_WARN(zm requires libgcrypt headers to be installed for gnutls),) -AC_CHECK_LIB(gcrypt,gcry_check_version,,AC_MSG_WARN([libgcrypt.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -AC_CHECK_LIB(gnutls,gnutls_fingerprint,,AC_MSG_WARN([libgnutls.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -if test "$ZM_HAS_GNUTLS_OPENSSL" == "1"; then -AC_CHECK_LIB(gnutls-openssl,MD5,,AC_MSG_WARN([libgnutls.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -fi -fi -AC_CHECK_LIB(pcre,pcre_compile,,AC_MSG_WARN(libpcre.a may be required for remote/network camera support)) -AC_CHECK_LIB(z,zlibVersion) -AC_CHECK_LIB(x264,x264_predict_16x16_init) -AC_CHECK_LIB(avutil,av_malloc,,AC_MSG_WARN(libavutil.a may be required for MPEG streaming)) -# Don't bother to warn about this one -AC_CHECK_LIB(avcore,av_image_copy,,) -AC_CHECK_LIB(avcodec,avcodec_version,,AC_MSG_WARN(libavcodec.a is required for MPEG streaming)) -AC_CHECK_LIB(avformat,avformat_version,,AC_MSG_WARN(libavformat.a is required for MPEG streaming)) -#AC_CHECK_LIB(avcodec,avcodec_open,,AC_MSG_WARN(libavcodec.a is required for MPEG streaming)) -#AC_CHECK_LIB(avformat,av_new_stream,,AC_MSG_WARN(libavformat.a is required for MPEG streaming)) -AC_CHECK_LIB(avdevice,avdevice_register_all,,AC_MSG_WARN(libavdevice.a may be required for MPEG streaming)) -AC_CHECK_LIB(swscale,sws_scale,,,-lswscale) -AC_CHECK_LIB(vlc,libvlc_new,,AC_MSG_WARN(libvlc.a may be required for streaming)) -AC_CHECK_LIB(bz2,BZ2_bzCompress,,AC_MSG_WARN(zm requires libbz2.a for recent versions of ffmpeg)) -AC_CHECK_LIB(z,compress,,) -AC_CHECK_LIB(curl,curl_global_init,,) - -# Checks for header files. -AC_FUNC_ALLOCA -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h limits.h memory.h stddef.h stdlib.h string.h strings.h sys/param.h sys/time.h syslog.h unistd.h values.h]) -AC_CHECK_HEADERS([netdb.h netinet/in.h arpa/inet.h sys/ioctl.h sys/socket.h sys/un.h glob.h sys/sendfile.h]) -AC_CHECK_HEADERS(execinfo.h,,,) -AC_CHECK_HEADERS(ucontext.h,,,) -AC_CHECK_HEADERS(sys/syscall.h,,,) -AC_CHECK_HEADERS(pthread.h,,,) - -# Check for Video for Linux 1 Header Files -ZM_HAS_V4L1=0 -AC_CHECK_HEADERS([libv4l1-videodev.h linux/videodev.h],[ZM_HAS_V4L1=1; break;],,) -AC_SUBST(ZM_HAS_V4L1) - -# Check for Video for Linux 2 Header Files -ZM_HAS_V4L2=0 -AC_CHECK_HEADERS(linux/videodev2.h,ZM_HAS_V4L2=1,,) -AC_SUBST(ZM_HAS_V4L2) - -# Set global Video for Linux flag -ZM_HAS_V4L=0 -if test "$ZM_HAS_V4L1" == "1" || test "$ZM_HAS_V4L2" == "1"; then -ZM_HAS_V4L=1 -else -AC_MSG_WARN(zm requires Video4Linux or Video4Linux2 to be installed for analog or USB camera support) -fi -AC_SUBST(ZM_HAS_V4L) - -AC_CHECK_HEADERS(jpeglib.h,,AC_MSG_ERROR(zm requires libjpeg headers to be installed),) -AC_CHECK_HEADERS(mysql/mysql.h,,AC_MSG_ERROR(zm requires MySQL headers - check that MySQL development packages are installed),) -AC_LANG_PUSH([C]) -AC_CHECK_HEADERS(libavutil/avutil.h,,,) -AC_CHECK_HEADERS(libavcodec/avcodec.h,,,) -AC_CHECK_HEADERS(libavformat/avformat.h,,,) -AC_CHECK_HEADERS(libswscale/swscale.h,,,) -AC_LANG_POP([C]) -AC_CHECK_HEADERS(pcre/pcre.h,AC_SUBST(ZM_PCRE,"1"),,) -AC_CHECK_HEADERS(pcre.h,AC_SUBST(ZM_PCRE,"1"),,) -if test "$ENABLE_MMAP" == "yes"; then -AC_CHECK_HEADERS(sys/mman.h,,,) -AC_CHECK_HEADERS(fcntl.h,,,) -else -AC_CHECK_HEADERS(sys/ipc.h,,,) -AC_CHECK_HEADERS(sys/shm.h,,,) -fi -AC_CHECK_HEADERS(zlib.h,,,) -AC_CHECK_HEADERS(vlc/vlc.h,,,) -AC_CHECK_HEADERS(curl/curl.h,,,) - -if test "$ZM_SSL_LIB" == "openssl"; then -AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires openssl/md5.h - use ZM_SSL_LIB option to select gnutls instead]),[#include -#include ]) -else -if test "$ZM_HAS_GNUTLS_OPENSSL" == "1"; then -AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires gnutls/openssl.h - use ZM_SSL_LIB option to select openssl instead]),[#include -#include ]) -else -AC_CHECK_DECLS(gnutls_fingerprint,,AC_MSG_ERROR([zm requires gnutls/gnutls.h - use ZM_SSL_LIB option to select openssl instead]),[#include -#include ]) -fi -fi -AC_CHECK_DECLS(backtrace,,,[#include ]) -AC_CHECK_DECLS(backtrace_symbols,,,[#include ]) -AC_CHECK_LIB(execinfo,backtrace) - -AC_SUBST(LDFLAGS) - -AC_PROG_PERL_VERSION(5.6.0) - -# Compulsory perl modules -AC_PROG_PERL_MODULES(Sys::Syslog,,AC_MSG_ERROR(zm requires SYS:Syslog)) -AC_PROG_PERL_MODULES(DBI,,AC_MSG_ERROR(zm requires DBI)) -AC_PROG_PERL_MODULES(DBD::mysql,,AC_MSG_ERROR(zm requires DBD::mysql)) -AC_PROG_PERL_MODULES(Getopt::Long,,AC_MSG_ERROR(zm requires Getopt::Long)) -AC_PROG_PERL_MODULES(Time::HiRes,,AC_MSG_ERROR(zm requires Time::HiRes)) -AC_PROG_PERL_MODULES(Date::Manip,,AC_MSG_ERROR(zm requires Date::Manip)) -AC_PROG_PERL_MODULES(LWP::UserAgent,,AC_MSG_ERROR(zm requires LWP::UserAgent)) -AC_PROG_PERL_MODULES(ExtUtils::MakeMaker,,AC_MSG_ERROR(zm requires ExtUtils::MakeMaker)) -if test "$ENABLE_MMAP" == "yes"; then -AC_PROG_PERL_MODULES(Sys::Mmap,,AC_MSG_ERROR(zm requires Sys::Mmap for mapped memory - set --enable-mmap=no to use IPC shared memory instead)) -fi - -# Optional perl modules -AC_PROG_PERL_MODULES(Module::Load,,AC_MSG_WARN(Module::Load is required for PTZ camera control)) -AC_PROG_PERL_MODULES(Device::SerialPort,,AC_MSG_WARN(Device::SerialPort is required for RS232/RS485 PTZ camera control)) -AC_PROG_PERL_MODULES(Net::FTP,,AC_MSG_WARN(Net::FTP is required for automatic event uploading using ftp)) -AC_PROG_PERL_MODULES(Net::SFTP::Foreign,,AC_MSG_WARN(Net::SFTP::Foreign is required for automatic event uploading using sftp)) -AC_PROG_PERL_MODULES(Expect,,AC_MSG_WARN(Expect is required for automatic event uploading using sftp)) -AC_PROG_PERL_MODULES(Archive::Tar,,AC_MSG_WARN(Archive::Tar may be required for automatic event uploading)) -AC_PROG_PERL_MODULES(Archive::Zip,,AC_MSG_WARN(Archive::Zip may be required for automatic event uploading)) -AC_PROG_PERL_MODULES(Net::SMTP,,AC_MSG_WARN(Net::SMTP may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(MIME::Lite,,AC_MSG_WARN(MIME::Lite may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(MIME::Entity,,AC_MSG_WARN(MIME::Entity may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(X10::ActiveHome,,AC_MSG_WARN(X10::ActiveHome is required for X.10 support)) - -AC_DEFINE_DIR([BINDIR],[bindir],[Expanded binary directory]) -AC_DEFINE_DIR([LIBDIR],[libdir],[Expanded library directory]) -AC_DEFINE_DIR([DATADIR],[datadir],[Expanded data directory]) -AC_SUBST(PKGDATADIR,"$DATADIR/$PACKAGE") -AC_SUBST(ZM_PID,"$ZM_RUNDIR/zm.pid") -#AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) -#AC_SUBST(ZM_CONFIG,"$SYSCONFDIR/zm.conf") -AC_SUBST(ZM_CONFIG,"$ZM_CONFIG_DIR/zm.conf") - -# Slight hack for non-standard perl install paths -if test "$prefix" != "NONE"; then - PERL_SITE_PREFIX=`perl -V:siteprefix | sed -e "s/.*='\(.*\)';/\1/"` - PERL_SITE_LIB=`perl -V:installsitelib | sed -e "s/.*='\(.*\)';/\1/"` - PERL_LIB_PATH=`echo $PERL_SITE_LIB | sed -e "s|^$PERL_SITE_PREFIX||"` - EXTRA_PERL_LIB="use lib '$prefix$PERL_LIB_PATH'; # Include custom perl install path" - PERL_MM_PARMS="\"PREFIX=$prefix INSTALLDIRS=vendor\"" -else - EXTRA_PERL_LIB="# Include from system perl paths only" - PERL_MM_PARMS="\"INSTALLDIRS=vendor\"" -fi -AC_SUBST(PERL_MM_PARMS) -AC_SUBST(EXTRA_PERL_LIB) - -AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf misc/com.zoneminder.systemctl.policy misc/com.zoneminder.systemctl.rules onvif/Makefile onvif/scripts/Makefile scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmsystemctl.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/css/classic/Makefile web/skins/classic/css/classic/views/Makefile web/skins/classic/css/dark/Makefile web/skins/classic/css/dark/views/Makefile web/skins/classic/css/flat/Makefile web/skins/classic/css/flat/views/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile]) - -# Create the definitions for compilation and defaults for the database -AC_CONFIG_COMMANDS([src/zm_config_defines.h],[perl ./zmconfgen.pl]) -# Manually generate the perl Makefile maker -AC_CONFIG_COMMANDS([scripts/ZoneMinder/Makefile],[(cd scripts/ZoneMinder; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) -AC_CONFIG_COMMANDS([onvif/modules/Makefile],[(cd onvif/modules; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) -AC_CONFIG_COMMANDS([onvif/proxy/Makefile],[(cd onvif/proxy; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) - -AC_OUTPUT diff --git a/m4/ac_check_sendfile.m4 b/m4/ac_check_sendfile.m4 deleted file mode 100644 index 12605d588..000000000 --- a/m4/ac_check_sendfile.m4 +++ /dev/null @@ -1,63 +0,0 @@ -AC_DEFUN([AC_CHECK_SENDFILE],[ -AC_MSG_CHECKING([whether sendfile() is supported and what prototype it has]) - -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -Werror-implicit-function-declaration" -ac_sendfile_supported=no -AC_TRY_LINK([#include - #include ], - [sendfile(1, 1, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE4_SUPPORT, 1, - [Define this if Linux/Solaris sendfile() is supported]) - AC_MSG_RESULT([Linux sendfile()]) - ac_sendfile_supported=yes - ], []) - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we need libsendfile - dnl Presumably on Solaris - AC_CHECK_LIB(sendfile, sendfile, - [ - AC_DEFINE(HAVE_SENDFILE4_SUPPORT, 1, - [Define this if Linux/Solaris sendfile() is supported]) - SENDFILE_LIBS="-lsendfile" - AC_SUBST(SENDFILE_LIBS) - AC_MSG_RESULT([Solaris sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we have FreeBSD-like sendfile() support. - AC_TRY_LINK([#include - #include ], - [sendfile(1, 1, 0, 0, NULL, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE7_SUPPORT, 1, - [Define this if FreeBSD sendfile() is supported]) - AC_MSG_RESULT([FreeBSD sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we have MacOS-like sendfile() support. - AC_TRY_LINK([#include - #include - #include ], - [sendfile(1, 1, 0, NULL, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE6_SUPPORT, 1, - [Define this if MacOS sendfile() is supported]) - AC_MSG_RESULT([MacOS sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -CFLAGS="$saved_CFLAGS" - -if test x$ac_sendfile_supported = xno; then - AC_MSG_RESULT([no sendfile() support, using read/send]) -fi -]) From e6d57da0d4f6ddd1e369431ffbc505408b1b4188 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:37:16 +1100 Subject: [PATCH 07/26] Remove the mobile skin folder --- web/skins/mobile/css/skin.css | 311 ------------------ web/skins/mobile/includes/config.php | 63 ---- .../mobile/includes/control_functions.php | 184 ----------- web/skins/mobile/includes/functions.php | 66 ---- web/skins/mobile/includes/init.php | 29 -- web/skins/mobile/skin.php | 97 ------ web/skins/mobile/views/console.php | 178 ---------- web/skins/mobile/views/css/console.css | 16 - web/skins/mobile/views/devices.php | 73 ---- web/skins/mobile/views/error.php | 34 -- web/skins/mobile/views/event.php | 147 --------- web/skins/mobile/views/eventdetails.php | 86 ----- web/skins/mobile/views/events.php | 157 --------- web/skins/mobile/views/filter.php | 71 ---- web/skins/mobile/views/frame.php | 73 ---- web/skins/mobile/views/function.php | 66 ---- web/skins/mobile/views/login.php | 54 --- web/skins/mobile/views/montage.php | 75 ----- web/skins/mobile/views/state.php | 77 ----- web/skins/mobile/views/video.php | 226 ------------- web/skins/mobile/views/watch.php | 154 --------- 21 files changed, 2237 deletions(-) delete mode 100644 web/skins/mobile/css/skin.css delete mode 100644 web/skins/mobile/includes/config.php delete mode 100644 web/skins/mobile/includes/control_functions.php delete mode 100644 web/skins/mobile/includes/functions.php delete mode 100644 web/skins/mobile/includes/init.php delete mode 100644 web/skins/mobile/skin.php delete mode 100644 web/skins/mobile/views/console.php delete mode 100644 web/skins/mobile/views/css/console.css delete mode 100644 web/skins/mobile/views/devices.php delete mode 100644 web/skins/mobile/views/error.php delete mode 100644 web/skins/mobile/views/event.php delete mode 100644 web/skins/mobile/views/eventdetails.php delete mode 100644 web/skins/mobile/views/events.php delete mode 100644 web/skins/mobile/views/filter.php delete mode 100644 web/skins/mobile/views/frame.php delete mode 100644 web/skins/mobile/views/function.php delete mode 100644 web/skins/mobile/views/login.php delete mode 100644 web/skins/mobile/views/montage.php delete mode 100644 web/skins/mobile/views/state.php delete mode 100644 web/skins/mobile/views/video.php delete mode 100644 web/skins/mobile/views/watch.php diff --git a/web/skins/mobile/css/skin.css b/web/skins/mobile/css/skin.css deleted file mode 100644 index b996392a3..000000000 --- a/web/skins/mobile/css/skin.css +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Primary look and feel styles - */ - -body { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 100%; - color: #333333; - font-weight: normal; - text-align: center; -} - -h1 { - font-family: inherit; - font-size: 120%; - color: #000066; - font-weight: bold; -} - -h2 { - font-family: inherit; - font-size: 110%; - color: #000066; - font-weight: bold; -} - -h3 { - font-family: inherit; - font-size: 100%; - color: #016A9D; - font-weight: bold; -} - -p { - font-family: inherit; - font-size: 100%; - color: #333333; - font-weight: normal; -} - -th { - font-weight: bold; - color: #016A9D; -} - -a:link { - color: #7F7FB2; - text-decoration: none; -} - -a:visited { - color: #7F7FB2; - text-decoration: none; -} - -a:hover { - color: #666699; - text-decoration: underline; -} - -label { - margin-right: 4px; -} - -input,textarea,select { - border: 1px #7F7FB2 solid; - font-family: inherit; - font-size: 100%; - color: #333333; -} - -input[type=text], input[type=password], textarea { - padding: 1px; -} - -input.noborder { - border: 0; -} - -input[disabled] { - color: #888888; -} - -img.normal { - border: white solid 1px; -} - -img.alarm { - border: red solid 1px; -} - -hr { - height: 1px; - width: 100%; - border: 0; - color: #7f7fb2; - background-color: #7f7fb2; -} - -/* - * Major league table for multiple inputs or presentation - */ - -#content table.major { - margin: 4px auto; - width: 100%; - border-collapse: collapse; -} - -#content table.major tr.highlight { - background-color: #eeeeee; -} - -#content table.major thead tr th { - padding-top: 6px; - padding-bottom: 6px; - vertical-align: middle; -} - -#content table.major tfoot td { - padding-top: 6px; - padding-bottom: 6px; - vertical-align: middle; -} - -#content table.major th, #content table.major td { - border: 1px solid #7f7fb2; - padding: 3px; - text-align: left; -} - -#content table.major th { - vertical-align: bottom; -} - -#content table.major td { - vertical-align: middle; -} - -#content table.major th[scope=row] { - padding: 4px 3px 3px; - vertical-align: top; - text-align: right; -} - -#content table.major .colMark, #content table.major .colSelect { - text-align: center; -} -/* - * Lesser table for very simple forms - */ - -#content table.minor { - width: 200px; - margin: 0 auto; -} - -#content table.minor td { - padding: 4px; -} - -#content table.minor .colLeft { - width: 50%; - text-align: right; -} - -#content table.minor .colRight { - width: 50%; - text-align: left; -} - -#content table.minor input[type=submit] -{ - margin-top: 4px; - padding: 0 2px; - font-size: 120%; -} - -/* - * Behavior classes - */ -.error { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #DC143C; - font-weight: bold; -} - -.warn { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #FF8C00; - font-weight: bold; -} - -.info { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #688E23; - font-weight: bold; -} - -.errorText { - color: #DC143C; -} - -.warnText { - color: #FF8C00; -} - -.infoText { - color: #688E23; -} - -.disabledText { - font-style: italic; -} - -/* - * Generic useful classes, especially with mootools - */ - -.hidden { - display: none; -} - -.invisible { - visibility: hidden; -} - -.nowrap { - white-space: nowrap; -} - -div.clear { - clear: both; -} - -/* - * Primary layout styles - */ - -#page { - width: 100%; -} - -#header { - width: 98%; - line-height: 24px; - margin: 4px auto 0; - clear: both; -} - -#header h2 { - left: 0; -} - -#headerControl { -} - -#headerButtons { - float: right; -} - -#headerButtons a { - margin-left: 8px; -} - -#content { - width: 98%; - margin: 4px auto; - line-height: 130%; - text-align: center; - clear: both; -} - -#contentTable { - width: 100%; -} - -#content p { - margin-top: 4px; -} - -#content p.textblock { - text-align: justify; - padding: 4px; -} - -#content > input[type=submit], #content > input[type=button] { - margin-top: 4px; -} - -#content table input[type=submit], #content table input[type=button] { - margin-top: 0; -} - -#contentButtons { - margin: 4px auto 0; -} - -#contentButtons input, #contentButtons a { - margin: 0 4px; -} - -#footer { - width: 98%; - margin: 4px auto 0; - clear: both; -} - diff --git a/web/skins/mobile/includes/config.php b/web/skins/mobile/includes/config.php deleted file mode 100644 index fc1eba9bb..000000000 --- a/web/skins/mobile/includes/config.php +++ /dev/null @@ -1,63 +0,0 @@ - "50x", - "2000" => "20x", - "500" => "5x", - "200" => "2x", - "100" => translate('Real'), - "50" => "1/2x", -); - -$scales = array( - "400" => "4x", - "300" => "3x", - "200" => "2x", - "150" => "1.5x", - "100" => translate('Actual'), - "75" => "3/4x", - "50" => "1/2x", - "33" => "1/3x", - "25" => "1/4x", -); - -switch ( $_COOKIE['zmBandwidth'] ) -{ - case "phone" : // Very incomplete at present - { - define( "ZM_WEB_CAN_STREAM", ZM_WEB_P_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_P_STREAM_METHOD ); // Which method should be used to send video streams to your brow - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_P_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_P_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_P_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_P_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_P_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_P_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - - break; - } -} - -?> diff --git a/web/skins/mobile/includes/control_functions.php b/web/skins/mobile/includes/control_functions.php deleted file mode 100644 index 3a12cf467..000000000 --- a/web/skins/mobile/includes/control_functions.php +++ /dev/null @@ -1,184 +0,0 @@ - -
-
-
- -
- - " name="preset" value=""/> - -
-
-
-
- diff --git a/web/skins/mobile/includes/functions.php b/web/skins/mobile/includes/functions.php deleted file mode 100644 index aadbe435f..000000000 --- a/web/skins/mobile/includes/functions.php +++ /dev/null @@ -1,66 +0,0 @@ -'."\n" ); -?> - - - - <?php echo ZM_WEB_TITLE_PREFIX ?> - <?php echo $title ?> - - - - - - - - - - - diff --git a/web/skins/mobile/includes/init.php b/web/skins/mobile/includes/init.php deleted file mode 100644 index ae92bcdee..000000000 --- a/web/skins/mobile/includes/init.php +++ /dev/null @@ -1,29 +0,0 @@ - diff --git a/web/skins/mobile/skin.php b/web/skins/mobile/skin.php deleted file mode 100644 index 51ea63e01..000000000 --- a/web/skins/mobile/skin.php +++ /dev/null @@ -1,97 +0,0 @@ -GetDeviceCapabilitiesFromAgent($_SERVER['HTTP_USER_AGENT']); - - //print_r( $wurfl->wurfl_agent ); - if ( $wurfl->wurfl_agent ) - { - if ( $wurfl->getDeviceCapability( 'html_wi_oma_xhtmlmp_1_0' ) ) - { - $device['width'] = $wurfl->getDeviceCapability( 'resolution_width' ); - $device['height'] = $wurfl->getDeviceCapability( 'resolution_height' ); - } - } -} -else -{ - // This is an example of using fixed device strings to just match your phone etc - $devices = array( - array( 'name'=>"Motorola V600", 'ua_match'=>"MOT-V600", 'skin'=>"mobile", 'cookies'=>false, 'width'=>176, 'height'=>220 ), - ); - - foreach ( $devices as $tempDevice ) - { - if ( preg_match( '/'.$tempDevice['ua_match'].'/', $_SERVER['HTTP_USER_AGENT'] ) ) - { - $skin = $tempDevice['skin']; - $cookies = $tempDevice['cookies']; - break; - } - } -} - -foreach ( getSkinIncludes( 'includes/config.php' ) as $includeFile ) - require_once $includeFile; - -foreach ( getSkinIncludes( 'includes/functions.php' ) as $includeFile ) - require_once $includeFile; - -if ( empty($view) ) - $view = isset($user)?'console':'login'; - -if ( !isset($user) && ZM_OPT_USE_AUTH && ZM_AUTH_TYPE == "remote" && !empty( $_SERVER['REMOTE_USER']) ) -{ - $view = "postlogin"; - $action = "login"; - $_REQUEST['username'] = $_SERVER['REMOTE_USER']; -} - -// If there are additional actions -foreach ( getSkinIncludes( 'includes/actions.php' ) as $includeFile ) - require_once $includeFile; - -?> diff --git a/web/skins/mobile/views/console.php b/web/skins/mobile/views/console.php deleted file mode 100644 index 50b5f4775..000000000 --- a/web/skins/mobile/views/console.php +++ /dev/null @@ -1,178 +0,0 @@ - array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 hour" ), - ) - ), - ), - // Today - array( - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "today" ), - ) - ), - ), -); - -$running = daemonCheck(); -$status = $running?translate('Running'):translate('Stopped'); - -if ( $group = dbFetchOne( "select * from Groups where Name = 'Mobile'" ) ) - $groupIds = array_flip(explode( ',', $group['MonitorIds'] )); - -$maxWidth = 0; -$maxHeight = 0; -$cycleCount = 0; -$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" ); -for ( $i = 0; $i < count($monitors); $i++ ) -{ - if ( !visibleMonitor( $monitors[$i]['Id'] ) ) - { - continue; - } - if ( $group && !empty($groupIds) && !array_key_exists( $monitors[$i]['Id'], $groupIds ) ) - { - continue; - } - $monitors[$i]['Show'] = true; - $monitors[$i]['zmc'] = zmcStatus( $monitors[$i] ); - $monitors[$i]['zma'] = zmaStatus( $monitors[$i] ); - $counts = array(); - for ( $j = 0; $j < count($eventCounts); $j++ ) - { - $filter = addFilterTerm( $eventCounts[$j]['filter'], count($eventCounts[$j]['filter']['terms']), array( "cnj" => "and", "attr" => "MonitorId", "op" => "=", "val" => $monitors[$i]['Id'] ) ); - parseFilter( $filter, false, '&' ); - $counts[] = "count(if(1".$filter['sql'].",1,NULL)) as EventCount$j"; - $monitors[$i]['eventCounts'][$j]['filter'] = $filter; - } - $sql = "select ".join($counts,", ")." from Events as E where MonitorId = '".$monitors[$i]['Id']."'"; - $counts = dbFetchOne( $sql ); - if ( $monitors[$i]['Function'] != 'None' ) - { - $cycleCount++; - if ( $maxWidth < $monitors[$i]['Width'] ) $maxWidth = $monitors[$i]['Width']; - if ( $maxHeight < $monitors[$i]['Height'] ) $maxHeight = $monitors[$i]['Height']; - } - $monitors[$i] = array_merge( $monitors[$i], $counts ); -} - -xhtmlHeaders( __FILE__, translate('Console') ); -?> - -
- -
- - - - - - - - - - - - - - - - - 1 ) { -?> - - - - - - - -
".substr( $monitor['Function'], 0, 4 )."", canEdit( 'Monitors' ) ) ?>
  
-
-
- - diff --git a/web/skins/mobile/views/css/console.css b/web/skins/mobile/views/css/console.css deleted file mode 100644 index 49c711039..000000000 --- a/web/skins/mobile/views/css/console.css +++ /dev/null @@ -1,16 +0,0 @@ -#systemTime { - float: left; -} - -#systemState { - margin: 0 auto; - text-align: center; -} - -#systemStats { - float: right; -} - -td.colEvents { - text-align: right; -} diff --git a/web/skins/mobile/views/devices.php b/web/skins/mobile/views/devices.php deleted file mode 100644 index add0a6bc5..000000000 --- a/web/skins/mobile/views/devices.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
- -
- - - - - - - - -
-

-
-
- - diff --git a/web/skins/mobile/views/error.php b/web/skins/mobile/views/error.php deleted file mode 100644 index 33e99f09a..000000000 --- a/web/skins/mobile/views/error.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
- -
-

-

-
-
- - diff --git a/web/skins/mobile/views/event.php b/web/skins/mobile/views/event.php deleted file mode 100644 index ead6b6eae..000000000 --- a/web/skins/mobile/views/event.php +++ /dev/null @@ -1,147 +0,0 @@ -= ?".$_REQUEST['filter']['sql'].$midSql." order by $sortColumn asc"; -} -$result = dbQuery( $sql, array( $event[$_REQUEST['sort_field']] ) ); -while ( $row = dbFetchNext( $result ) ) -{ - if ( $row['Id'] == $_REQUEST['eid'] ) - { - $prevEvent = dbFetchNext( $result ); - break; - } -} - -$sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where $sortColumn ".($sortOrder=='asc'?'>=':'<=').' ?'.$_REQUEST['filter']['sql'].$midSql." order by $sortColumn $sortOrder"; -$result = dbQuery( $sql, array($event[$_REQUEST['sort_field']]) ); -while ( $row = dbFetchNext( $result ) ) -{ - if ( $row['Id'] == $_REQUEST['eid'] ) - { - $nextEvent = dbFetchNext( $result ); - break; - } -} - -$framesPerPage = 15; -$framesPerLine = 3; -$maxShortcuts = 3; - -$paged = $event['Frames'] > $framesPerPage; - -if ( $paged && !empty($_REQUEST['page']) ) -{ - $loFrameId = (($_REQUEST['page']-1)*$framesPerPage)+1; - $hiFrameId = min( $_REQUEST['page']*$framesPerPage, $event['Frames'] ); -} -else -{ - $loFrameId = 1; - $hiFrameId = $event['Frames']; -} - -$sql = 'SELECT * FROM Frames WHERE EventID = ?'; -if ( $paged && !empty($_REQUEST['page']) ) - $sql .= " and FrameId between $loFrameId and $hiFrameId"; -$sql .= " order by FrameId"; -$frames = dbFetchAll( $sql, NULL, array( $_REQUEST['eid'] ) ); - -$scale = getDeviceScale( $event['Width'], $event['Height'], $framesPerLine+0.3 ); - -$pages = (int)ceil($event['Frames']/$framesPerPage); -if ( !empty($_REQUEST['fid']) ) - $_REQUEST['page'] = ($_REQUEST['fid']/$framesPerPage)+1; - -$pagination = getPagination( $pages, $_REQUEST['page'], $maxShortcuts, '&eid='.$_REQUEST['eid'].$filterQuery.$sortQuery, '&' ); - -xhtmlHeaders( __FILE__, translate('Event').' - '.$event['Name'] ); -?> - -
- -
- -

- -
- - <?php echo $frame['Type'] ?>/<?php echo $frame['Type']=='Alarm'?$frame['Score']:0 ?> - -
-
-
- - diff --git a/web/skins/mobile/views/eventdetails.php b/web/skins/mobile/views/eventdetails.php deleted file mode 100644 index deee5eef2..000000000 --- a/web/skins/mobile/views/eventdetails.php +++ /dev/null @@ -1,86 +0,0 @@ - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s
()
//
-
- 1 - <?php echo $frame['FrameId'] ?> -
-
- - -
-
-
- - diff --git a/web/skins/mobile/views/events.php b/web/skins/mobile/views/events.php deleted file mode 100644 index 40dd6eff8..000000000 --- a/web/skins/mobile/views/events.php +++ /dev/null @@ -1,157 +0,0 @@ -$deviceLines)?$deviceLines:$limitLeft; - } - $eventsSql .= " limit $limitStart, $limitAmount"; -} -elseif ( !empty( $_REQUEST['limit'] ) ) -{ - $eventsSql .= " limit 0, ".$_REQUEST['limit']; -} - -$nEvents = dbFetchOne( $countSql, 'EventCount' ); -if ( !empty($limit) && $nEvents > $_REQUEST['limit'] ) -{ - $nEvents = $_REQUEST['limit']; -} -$pages = (int)ceil($nEvents/$deviceLines); - -$maxShortcuts = 3; -$pagination = getPagination( $pages, $_REQUEST['page'], $maxShortcuts, $filterQuery.$sortQuery.'&limit='.$_REQUEST['limit'], '&' ); - -xhtmlHeaders( __FILE__, translate('Events') ); -?> - -
- -
- -

- - - - - - - - - - - - - - - - - - - -
-

-
-
- - diff --git a/web/skins/mobile/views/filter.php b/web/skins/mobile/views/filter.php deleted file mode 100644 index 4613f3c3c..000000000 --- a/web/skins/mobile/views/filter.php +++ /dev/null @@ -1,71 +0,0 @@ - - -
- -
-
- - 0 ) -{ -?> -
- -
-
- -
- -

- -
-
-
- - diff --git a/web/skins/mobile/views/frame.php b/web/skins/mobile/views/frame.php deleted file mode 100644 index f9bb41633..000000000 --- a/web/skins/mobile/views/frame.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
- -
- "> -
- 1 ) { ?> - << - 1 ) { ?> - < - - > - - >> - -
-
-
- - diff --git a/web/skins/mobile/views/function.php b/web/skins/mobile/views/function.php deleted file mode 100644 index 421d91063..000000000 --- a/web/skins/mobile/views/function.php +++ /dev/null @@ -1,66 +0,0 @@ - - -
- -
-
- -
- -
-
- checked="checked"/> -
-
- -
-
-
-
- - diff --git a/web/skins/mobile/views/login.php b/web/skins/mobile/views/login.php deleted file mode 100644 index 6eb0b7db9..000000000 --- a/web/skins/mobile/views/login.php +++ /dev/null @@ -1,54 +0,0 @@ - - -
- -
-
- - - - - - - - - - -
" size="12"/>
-
- -
-
-
-
- - diff --git a/web/skins/mobile/views/montage.php b/web/skins/mobile/views/montage.php deleted file mode 100644 index 8311fe6f4..000000000 --- a/web/skins/mobile/views/montage.php +++ /dev/null @@ -1,75 +0,0 @@ - - -
- -
-
- - <?php echo $monitor['Name'] ?> - -
-
-
-
- - diff --git a/web/skins/mobile/views/state.php b/web/skins/mobile/views/state.php deleted file mode 100644 index 51cf71624..000000000 --- a/web/skins/mobile/views/state.php +++ /dev/null @@ -1,77 +0,0 @@ - - -
- -
-
- - -
- -
-
-
-
- - diff --git a/web/skins/mobile/views/video.php b/web/skins/mobile/views/video.php deleted file mode 100644 index 8f7ac8654..000000000 --- a/web/skins/mobile/views/video.php +++ /dev/null @@ -1,226 +0,0 @@ -= 352 && $deviceHeight >= 288 ) - $videoSize = "352x288"; -elseif ( $deviceWidth >= 176 && $deviceHeight >= 144 ) - $videoSize = "176x144"; -else - $videoSize = "128x96"; - -$eventWidth = $event['Width']; -$eventHeight = $event['Height']; - -if ( !isset( $rate ) ) - $_REQUEST['rate'] = reScale( RATE_BASE, $event['DefaultRate'], ZM_WEB_DEFAULT_RATE ); - -$eventPath = ZM_DIR_EVENTS.'/'.getEventPath( $event ); - -$videoFormats = array(); -$ffmpegFormats = preg_split( '/\s+/', ZM_FFMPEG_FORMATS ); -foreach ( $ffmpegFormats as $ffmpegFormat ) -{ - preg_match( '/^([^*]+)(\**)$/', $ffmpegFormat, $matches ); - $videoFormats[$matches[1]] = $matches[1]; - if ( $matches[2] == '*' ) - $defaultVideoFormat = $matches[1]; - elseif ( $matches[2] == '**' ) - $defaultPhoneFormat = $matches[1]; -} -if ( !isset($_REQUEST['videoFormat']) ) -{ - if ( isset($defaultPhoneFormat) ) - $_REQUEST['videoFormat'] = $defaultPhoneFormat; - elseif ( isset($defaultVideoFormat) ) - $_REQUEST['videoFormat'] = $defaultVideoFormat; - else - $videoFormat = $ffmpegFormats[0]; -} - -if ( !empty($_REQUEST['generate']) ) -{ - $videoFile = createVideo( $event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $videoSize, !empty($_REQUEST['overwrite']) ); -} - -$videoFiles = array(); -if ( $dir = opendir( $eventPath ) ) -{ - while ( ($file = readdir( $dir )) !== false ) - { - $file = $eventPath.'/'.$file; - if ( is_file( $file ) ) - { - if ( preg_match( '/-S([\da-z]+)\.(?:'.join( '|', $videoFormats ).')$/', $file, $matches ) ) - { - if ( $matches[1] == $videoSize ) - { - $videoFiles[] = $file; - } - } - } - } - closedir( $dir ); -} - -if ( isset($_REQUEST['download']) ) -{ - header( "Content-type: ".getMimeType($videoFiles[$_REQUEST['download']])); - header( "Content-length: ".filesize($videoFiles[$_REQUEST['download']])); - header( "Content-disposition: attachment; filename=".preg_replace( "/^.*\//", "", $videoFiles[$_REQUEST['download']] )."; size=".filesize($videoFiles[$_REQUEST['download']]) ); - readfile( $videoFiles[$_REQUEST['download']] ); - exit; -} - -xhtmlHeaders( __FILE__, translate('Video').' - '.$event['Name'] ); -?> - -
-
-
- - - - - - - - - - - - - - -
checked="checked"/>
-
-
- -

- -

- - -

- - - - - - - - - 0 ) - { - $index = 0; - foreach ( $videoFiles as $file ) - { - preg_match( '/^(.+)-((?:r[_\d]+)|(?:F[_\d]+))-((?:s[_\d]+)|(?:S[0-9a-z]+))\.([^.]+)$/', $file, $matches ); - if ( preg_match( '/^r(.+)$/', $matches[2], $temp_matches ) ) - { - $rate = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); - $rateText = isset($rates[$rate])?$rates[$rate]:($rate."x"); - } - elseif ( preg_match( '/^F(.+)$/', $matches[2], $temp_matches ) ) - { - $rateText = $temp_matches[1]."fps"; - } - if ( preg_match( '/^s(.+)$/', $matches[3], $temp_matches ) ) - { - $scale = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); - $scaleText = isset($scales[$scale])?$scales[$scale]:($scale."x"); - } - elseif ( preg_match( '/^S(.+)$/', $matches[3], $temp_matches ) ) - { - $scaleText = $temp_matches[1]; - } -?> - - - - - - - - -
 / 
- -

- -
-
- - diff --git a/web/skins/mobile/views/watch.php b/web/skins/mobile/views/watch.php deleted file mode 100644 index b61001db9..000000000 --- a/web/skins/mobile/views/watch.php +++ /dev/null @@ -1,154 +0,0 @@ - - -
-
-

 -  fps

-

- - - -

- -
- -
- -
- - - -
- -
-
- - From 7c7d7b245c09e31c5bd362b10422d672259ddd93 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:38:16 +1100 Subject: [PATCH 08/26] Remove the XML skin folder --- web/skins/xml/includes/config.php | 155 ---------- web/skins/xml/includes/functions.php | 447 --------------------------- web/skins/xml/includes/init.php | 2 - web/skins/xml/skin.php | 47 --- web/skins/xml/views/actions.php | 392 ----------------------- web/skins/xml/views/console.php | 259 ---------------- web/skins/xml/views/none.php | 0 web/skins/xml/views/notfound.png | Bin 7332 -> 0 bytes 8 files changed, 1302 deletions(-) delete mode 100644 web/skins/xml/includes/config.php delete mode 100644 web/skins/xml/includes/functions.php delete mode 100644 web/skins/xml/includes/init.php delete mode 100644 web/skins/xml/skin.php delete mode 100644 web/skins/xml/views/actions.php delete mode 100644 web/skins/xml/views/console.php delete mode 100644 web/skins/xml/views/none.php delete mode 100644 web/skins/xml/views/notfound.png diff --git a/web/skins/xml/includes/config.php b/web/skins/xml/includes/config.php deleted file mode 100644 index 66d3af5ee..000000000 --- a/web/skins/xml/includes/config.php +++ /dev/null @@ -1,155 +0,0 @@ - "100x", - "5000" => "50x", - "2500" => "25x", - "1000" => "10x", - "400" => "4x", - "200" => "2x", - "100" => translate('Real'), - "50" => "1/2x", - "25" => "1/4x", -); - -$scales = array( - "400" => "4x", - "300" => "3x", - "200" => "2x", - "150" => "1.5x", - "100" => translate('Actual'), - "75" => "3/4x", - "50" => "1/2x", - "33" => "1/3x", - "25" => "1/4x", -); - -$bwArray = array( - "high" => translate('High'), - "medium" => translate('Medium'), - "low" => translate('Low') -); - -/* Check if ZM_WEB_L_CAN_STREAM and ZM_WEB_L_STREAM_METHOD are defined */ -if (!defined("ZM_WEB_L_CAN_STREAM")) { - define ("ZM_WEB_L_CAN_STREAM", 1); - define ("ZM_WEB_M_CAN_STREAM", 1); - define ("ZM_WEB_H_CAN_STREAM", 1); -} -if (!defined("ZM_WEB_L_STREAM_METHOD")) { - define ("ZM_WEB_L_STREAM_METHOD", "jpeg"); - define ("ZM_WEB_M_STREAM_METHOD", "jpeg"); - define ("ZM_WEB_H_STREAM_METHOD", "jpeg"); -} - -switch ( $_COOKIE['zmBandwidth'] ) -{ - case "high" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_H_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_H_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_H_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_H_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_H_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_H_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_H_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_H_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_H_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_H_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_H_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_H_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_H_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_H_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_H_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } - case "medium" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_M_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_M_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_M_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_M_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_M_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_M_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_M_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_M_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_M_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_M_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_M_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_M_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_M_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_M_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_M_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } - case "low" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_L_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_L_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_L_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_L_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_L_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_L_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_L_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_L_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_L_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_L_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_L_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_L_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_L_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_L_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_L_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } -} - -?> diff --git a/web/skins/xml/includes/functions.php b/web/skins/xml/includes/functions.php deleted file mode 100644 index b84e65464..000000000 --- a/web/skins/xml/includes/functions.php +++ /dev/null @@ -1,447 +0,0 @@ - $maj) return 1; - if ((getClientVerMaj() == $maj) && (getClientVerMin() >= $min)) return 1; - return 0; -} -function logXmlErr($str) -{ - logXml($str, 1); -} -function logXml($str, $err = 0) -{ - if (!defined("ZM_EYEZM_DEBUG")) { - /* Check session variable */ - if (isset($_SESSION['xml_debug'])) define("ZM_EYEZM_DEBUG", $_SESSION['xml_debug']); - else define ("ZM_EYEZM_DEBUG", "0"); - } - if (!defined("ZM_EYEZM_LOG_TO_FILE")) { - /* Check session variable */ - if (isset($_SESSION['xml_log_to_file'])) define("ZM_EYEZM_LOG_TO_FILE", $_SESSION['xml_log_to_file']); - else define ("ZM_EYEZM_LOG_TO_FILE", "1"); - } - if (!defined("ZM_EYEZM_LOG_FILE")) { - /* Check session variable */ - if (isset($_SESSION['xml_log_file'])) define("ZM_EYEZM_LOG_FILE", $_SESSION['xml_log_file']); - else define ("ZM_EYEZM_LOG_FILE", "/tmp/zm_xml.log"); - } - /* Only log if debug is enabled */ - if (ZM_EYEZM_DEBUG == 0) return; - /* Logging is enabled, set log string */ - $logstr = "XML_LOG (".($err?"ERROR":"NOTICE")."): ".$str.(ZM_EYEZM_LOG_TO_FILE?"\n":""); - if (ZM_EYEZM_LOG_TO_FILE) { - error_log("[".date("r")."] ".$logstr, 3, ZM_EYEZM_LOG_FILE); - } else { - error_log($logstr); - } -} -/* Returns defval if varname is not set, otherwise return varname */ -function getset($varname, $defval) -{ - if (isset($_GET[$varname])) return $_GET[$varname]; - return $defval; -} -function xml_header() -{ - header ("content-type: text/xml"); - echo ""; -} -function xml_tag_val($tag, $val) -{ - echo "<".$tag.">".$val.""; -} -function xml_tag_sec($tag, $open) -{ - if ($open) $tok = "<"; - else $tok = ""; -} -function xhtmlHeaders( $file, $title ) -{ -?> - - - - - - - /dev/null")) > 0) { - /* More than one match */ - return TRUE; - } else { - /* Check -formats tag also if we fail -codecs */ - if (preg_match("/\b".$codec."\b/", shell_exec(getFfmpegPath()." -formats 2> /dev/null")) > 0) return TRUE; - return FALSE; - } -} -function exeExists($exepath) -{ - $path = trim($exepath); - return (file_exists($path) && is_readable($path) && ($path != "")); -} -/* Returns whether ffmpeg exists or not */ -function ffmpegExists() -{ - return exeExists(getFfmpegPath()); -} -/* Returns with PHP-GD exists */ -function gdExists() -{ - if (extension_loaded('gd') && function_exists('gd_info')) { - return TRUE; - } - return FALSE; -} - -function getFfmpeg264FoutParms($br, $fout) -{ - $ffparms = "-analyzeduration 0 -acodec copy"; - $ffparms .= " -vcodec libx264 -b ".$br; - $ffparms .= " -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8"; - $ffparms .= " -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25"; - $ffparms .= " -sc_threshold 40 -i_qfactor 0.71 -bt 16k"; - $ffparms .= " -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6"; - $ffparms .= " -qmin 10 -qmax 51 -qdiff 4 -level 30"; - $ffparms .= " -g 30 -analyzeduration 0 -async 2 ".$fout." 2> /dev/null"; - return $ffparms; -} -/** Return FFMPEG parameters for H264 streaming */ -function getFfmpeg264Str($width, $height, $br, $fin, $fout) -{ - $ffparms = getFfmpeg264FoutParms($br, $fout); - $ffstr = getFfmpegPath()." -t ".ZM_EYEZM_H264_MAX_DURATION." -analyzeduration 0 -i "; - $ffstr .= $fin." -f mpegts ".$ffparms; - return $ffstr; -} -/** Returns true when monitor exists */ -function isMonitor($monitor) -{ - $query = "select Id from Monitors where Id = ?"; - $res = dbFetchOne($query, NULL, array($monitor)); - if ($res) return TRUE; - logXml("Monitor ID ".$monitor." does not exist"); - return FALSE; -} -/** Returns the width and height of a monitor */ -function getMonitorDims($monitor) -{ - $query = "select Width,Height from Monitors where Id = ?"; - $res = dbFetchOne($query, NULL, array( $monitor ) ); - return $res; -} -/** Returns the temp directory for H264 encoding */ -function getTempDir() -{ - /* Assume that the directory structure is /skins/xml/views */ - return dirname(__FILE__)."/../../../temp"; -} -/** Returns the name of the m3u8 playlist based on monitor */ -function m3u8fname($monitor) { - return "stream_".$monitor.".m3u8"; -} - -/** Erases the M3u8 and TS file names for a given monitor */ -function eraseH264Files($monitor) { - /** NOTE: This command executes an 'rm' command, so $monitor parameter - * should be properly validated before executing */ - /* Remove wdir/.m3u8 and wdir/sample_*.ts */ - shell_exec("rm -f ".getTempDir()."/".m3u8fname($monitor)." ".getTempDir()."/sample_".$monitor."*.ts"); -} -function kill264proc($monitor) { - /** NOTE: This command executes an 'kill' command, so $monitor parameter - * should be properly validated before executing */ - $pid = trim(shell_exec("pgrep -f -x \"zmstreamer -m ".$monitor."\"")); - if ($pid == "") { - logXml("No PID found for ZMStreamer to kill"); - } else { - shell_exec("kill -9 ".$pid); - logXml("Killed process ".$pid." for Monitor ".$monitor); - } -} -/** Return the command-line shell function to setup H264 stream */ -function stream264fn ($mid, $width, $height, $br) { - $cdir = "./temp"; - $zmstrm = "zmstreamer -m ".$mid." 2> /dev/null"; - $ffstr = getFfmpeg264Str($width, $height, $br, "-", "-"); - $seg = "segmenter - ".ZM_EYEZM_SEG_DURATION." ".$cdir."/sample_".$mid." ".$cdir."/".m3u8fname($mid)." ../ 2> /dev/null"; - $url = $zmstrm . " | ".$ffstr." | " . $seg; - return "nohup ".$url." & echo $!"; -} - -/** Generate the web-page presented to the viewer when using H264 */ -function h264vidHtml($width, $height, $monitor, $br, $thumbsrc) { - function printTermLink() { - $str = "H264 Streaming Launching...
Tap to re-load if stream fails"; - $str2 = "document.getElementById(\"loaddiv\").innerHTML = \"".$str."\";"; - echo $str2; - - } - $ajaxUrl = "?view=actions&action=spawn264&&monitor=".$monitor."&br=".$br; - /* Call these two directly to bypass server blocking issues */ - $ajax2Url = "./skins/xml/views/actions.php?action=chk264&monitor=".$monitor; - $ajax2Url .= "&timeout=".ZM_EYEZM_H264_TIMEOUT; - $ajax3Url = "./skins/xml/views/actions.php?action=kill264&monitor=".$monitor; -?> - - - - - - - -
-
-Initializing H264 Stream ()...
-This may take a few seconds -
-
- -
- -
- - - diff --git a/web/skins/xml/includes/init.php b/web/skins/xml/includes/init.php deleted file mode 100644 index acb6c3546..000000000 --- a/web/skins/xml/includes/init.php +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/web/skins/xml/skin.php b/web/skins/xml/skin.php deleted file mode 100644 index c88718c4e..000000000 --- a/web/skins/xml/skin.php +++ /dev/null @@ -1,47 +0,0 @@ - diff --git a/web/skins/xml/views/actions.php b/web/skins/xml/views/actions.php deleted file mode 100644 index 73e206af6..000000000 --- a/web/skins/xml/views/actions.php +++ /dev/null @@ -1,392 +0,0 @@ - */ - if (!canEdit('Events')) { - logXmlErr("User ".$user['Username']. " doesn't have edit Events perms"); - exit; - } - if (!isset($_REQUEST['eid'])) { - logXmlErr("EID not set for action delete-event"); - exit; - } - $eid = validInteger($_REQUEST['eid']); - $url = "./index.php?view=request&request=event&id=".$eid."&action=delete"; - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "spawn264")) { - /* ACTION: Spawn 264 streaming process. - * Parms: [br|width|height] */ - if (!canView('Stream')) { - logXmlErr("User ".$user['Username']. " doesn't have view Stream perms"); - exit; - } - if (!isset($_GET['monitor'])) { - logXmlErr("Not all parameters specified for spawn264"); - exit; - } - $monitor = validInteger($_REQUEST['monitor']); - if (!isMonitor($monitor)) exit; - $dims = getMonitorDims($monitor); - $width = validInteger(getset('width', $dims['Width'])); - $height = validInteger(getset('height', $dims['Height'])); - $br = validString(getset('br', ZM_EYEZM_H264_DEFAULT_BR)); - /* Check that we can stream first */ - if (!canStream264()) { - /* canStream264 will print out error */ - exit; - } - $streamUrl = stream264fn($monitor, $width, $height, $br); - logXml("Using H264 Pipe Function: ".$streamUrl); - $pid = shell_exec($streamUrl); - logXml("Streaming Process for monitor ".$monitor." ended, cleaning up files"); - eraseH264Files($monitor); - exit; - - } else if (!strcmp($action, "kill264")) { - /* ACTION: Kill existing H264 stream process and cleanup files. - * Parms: . - * NOTE: This will be called directly by path, so include files - * may not be available */ - session_start(); - require_once(dirname(__FILE__)."/../includes/functions.php"); - if (!isset($_GET['monitor'])) { - logXmlErr("Not all parameters specified for kill264"); - exit; - } - $monitor = validInteger($_GET['monitor']); - kill264proc($monitor); - logXml("Killed Segmenter process for monitor ".$monitor); - exit; - - } else if (!strcmp($action, "chk264")) { - /* ACTION: Simply stalls while checking for 264 file. - * Parms: - * NOTE: This will be called directly by path, so include files - * may not be available */ - session_start(); - require_once(dirname(__FILE__)."/../includes/functions.php"); - if (!isset($_GET['monitor']) || !isset($_GET['timeout'])) { - logXmlErr("Monitor not specified for chk264"); - exit; - } - $monitor = validInteger($_GET['monitor']); - $path = getTempDir()."/".m3u8fname($monitor); - /* Wait for the second sample to become available */ - $tsfile = getTempDir()."/sample_".$monitor."-2.ts"; - /* Setup timeout */ - $startTime = time(); - $timeout = validInteger($_GET['timeout']); - while (!file_exists($path) || !file_exists($tsfile)) { - if (time() > $startTime + $timeout) { - logXmlErr("Timed out waiting for stream to start, exiting..."); - kill264proc($monitor); - exit; - } - usleep(10000); - } - logXml("File exists, stream created after ".(time()-$startTime)." sec"); - exit; - - } else if (!strcmp($action, "feed")) { - /* ACTION: View a feed. Parms: [height|width|fps|scale|vcodec|br] */ - if (!canView('Stream')) { - logXmlErr("User ".$user['Username']. " doesn't have view Stream perms"); - exit; - } - /* Check that required variables are set */ - if (!isset($_REQUEST['monitor'])) { - logXmlErr("Not all parameters set for action view-feed"); - exit; - } - $monitor = validInteger($_REQUEST['monitor']); - if (!isMonitor($monitor)) exit; - $dims = getMonitorDims($monitor); - $width = validInteger(getset('width', $dims['Width'])); - $height = validInteger(getset('height', $dims['Height'])); - $fps = validInteger(getset('fps', ZM_WEB_VIDEO_MAXFPS)); - $scale = validInteger(getset('scale', 100)); - $vcodec = validString(getset('vcodec', ZM_EYEZM_FEED_VCODEC)); - /* Select which codec we want */ - if (!strcmp($vcodec, "h264")) { - /* Validate that we can in fact stream H264 */ - if (!canStream264()) { - /* canStream264 will print out error if - * there is one */ - echo "Server cannot stream H264. Check eyeZm log for details"; - exit; - } - if (!requireVer("1", "2")) { - echo "H264 Streaming requires eyeZm v1.2 or above"; - logXmlErr("H264 Streaming requires eyeZm v1.2 or above"); - exit; - } - $br = validString(getset('br', ZM_EYEZM_H264_DEFAULT_BR)); - /* H264 processing */ - noCacheHeaders(); - /* Kill any existing processes and files */ - kill264proc($monitor); - eraseH264Files($monitor); - logXml("Streaming H264 on Monitor ".$monitor.", ".$width."x".$height." @".$br); - /* Get thumbnail source */ - $thumbsrc = - getStreamSrc( array( - "mode=single", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=".$fps, - "buffer=1000" - ) ); - logXml("Using thumbnail image from ".$thumbsrc); - /* Generate H264 Web-page */ - echo "\n"; - h264vidHtml($width, $height, $monitor, $br, $thumbsrc); - } else if (!strcmp($vcodec, "mjpeg")) { - /* MJPEG streaming */ - /* If $fps=0, get a single-shot */ - if (!$fps) { - /* single-shot */ - $streamSrc = - getStreamSrc( array( - "mode=single", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=0", - "buffer=1000" - ) ); - } else { - $streamSrc = - getStreamSrc( array( - "mode=jpeg", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=".$fps, - "buffer=1000" - ) ); - } - noCacheHeaders(); - xhtmlHeaders( __FILE__, "Stream" ); - logXml("Streaming MJPEG on Monitor ".$monitor.", ".$width."x".$height." @".$fps."fps"); - echo "\n"; - echo "\n"; - echo "
\n"; - logXml("Using stream source: ".$streamSrc); - outputImageStream("liveStream", $streamSrc, $width, $height, "stream"); - echo "
"; - } else { - logXmlErr("Unsupported codec ".$vcodec." selected for streaming"); - echo("Unsupported codec ".$vcodec." selected for streaming"); - } - exit; - - } else if (!strcmp($action, "vevent")) { - /* ACTION: View an event. Parms: [fps|vcodec|br] */ - if (!canView('Events')) { - logXmlErr("User ".$user['Username']. " doesn't have view Events perms"); - exit; - } - if (!isset($_GET['eid'])) { - logXmlErr("Not all parameters set for Action View-event"); - exit; - } - /* Grab event from the database */ - $eid = validInteger($_GET['eid']); - $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where E.Id = ?"; - $event = dbFetchOne($eventsSql, NULL, array( $eid ) ); - /* Check if exists */ - if (!$event) { - logxmlErr("Requested event ID ".$eid." does not exist"); - exit; - } - /* Calculate FPS */ - $fps = validInteger(getset('fps',ceil($event['Frames'] / $event['Length']))); - $vcodec = validString(getset('vcodec', ZM_EYEZM_EVENT_VCODEC)); - $baseURL = ZM_PATH_WEB."/".getEventPathSafe($event); - /* Here we validate the codec. - * Check that FFMPEG exists and supports codecs */ - if (!strcmp($vcodec, "mpeg4")) { - if (!ffmpegSupportsCodec("mpeg4")) { - logXmlErr("FFMPEG not installed, accessible in path/ZM_PATH_FFMPEG, or doesn't support mpeg4"); - exit; - } - /* Can generate, we are good to go */ - $fname = "capture.mov"; - $ffparms = "-vcodec mpeg4 -r ".ZM_EYEZM_EVENT_FPS." ".$baseURL."/".$fname." 2> /dev/null"; - - } else if (!strcmp($vcodec, "h264")) { - if (!ffmpegSupportsCodec("libx264")) { - logXmlErr("FFMPEG not installed, accessible in path/ZM_PATH_FFMPEG, or doesn't support H264"); - exit; - } - if (!requireVer("1","2")) { - logXmlErr("H264 Event viewing requires eyeZm v1.2 or greater"); - exit; - } - /* Good to go */ - $fname = "capture.mp4"; - $ffparms = getFfmpeg264FoutParms( - validString(getset('br',ZM_EYEZM_H264_DEFAULT_EVBR)), - $baseURL."/".$fname); - - } else { - logXmlErr("Unknown codec ".$vcodec." selected for event viewing"); - exit; - } - logXml("Selected ".$vcodec." for viewing event ".$event['Id']); - $fnameOut = $baseURL."/".$fname; - $shellCmd = getFfmpegPath()." -y -r ".$fps." -i ".$baseURL."/%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg"; - $shellCmd .= " ".$ffparms; - logXml("Encoding event with command: ".$shellCmd); - $shellOutput = shell_exec($shellCmd); - /* Check that file exists */ - if (!file_exists(trim($fnameOut))) { - logXmlErr("Generate Event ".$event['Id']." file ".$fnameOut." does not exist"); - exit; - } - $url = "./".getEventPathSafe($event)."/".$fname; - logXml("Loading Event URL ".$url); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "vframe")) { - /* ACTION: View a frame given by an event and frame-id. Parms: [alarm | analyze | qty | scale] - * If 'alarm' is set, the returned frame will be the -th alarm frame. If 'analyze' is set, - * the returned frame will be the %03d-analyse frame instead of %03d-capture, if ZM_CREATE_ANALYSIS_IMAGES - * is set. Otherwise it just returns the captured frame. - * If qty is set, it will apply a quality factor from 0-100, and if width is set, it will scale the jpeg accordingly - */ - if (!isset($_GET['eid']) || !isset($_GET['frame'])) { - logXmlErr("Not all parameters set for action view-frame"); - exit; - } - $eid = validInteger($_GET['eid']); - $frame = validInteger($_GET['frame']); - $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where E.Id = ?"; - $event = dbFetchOne($eventsSql, NULL, array( $eid ) ); - $qty = validInteger(getset('qty', 100)); - if ($qty > 100) $qty = 100; - $scale = validInteger(getset('scale', 100)); - if (!$event) { - logxmlErr("Requested event ID ".$eid." does not exist"); - exit; - } - /* Figure out the frame number. If 'alarm' is not set, this is just equal to the parameter. - * If 'alarm' is set, need to query DB and grab the -th item */ - if (isset($_GET['alarm'])) { - $frameSql = "select * from Frames as F where F.EventId=? and (F.Type = 'Alarm') order by F.FrameId"; - $i=0; - foreach (dbFetchAll($frameSql, NULL, array($eid) ) as $dbframe) { - if ($i == $frame) { - $frame = $dbframe['FrameId']; - break; - } - $i++; - } - } - if (isset($_GET['analyze']) && ZM_CREATE_ANALYSIS_IMAGES) { - $suffix = "analyse"; - } else { - $suffix = "capture"; - } - /* A frame index of 0 is invalid, so if we see this, just use frame 1 */ - if (!$frame) $frame = 1; - /* Suffix based on 'analyze' */ - $fname = sprintf("%0".ZM_EVENT_IMAGE_DIGITS."d-%s.jpg", $frame, $suffix); - $url = "./".getEventPathSafe($event)."/".$fname; - if (!file_exists($url)) { - logXmlErr("Invalid frame image requested: ".$url); - $url = "./skins/xml/views/notfound.png"; - } - /* Check if the image needs any processing - check for GD if requested */ - if (($scale != 100) || ($qty < 100)) { - if (!gdExists()) { - logXmlErr("Lib GD is not loaded, but required for image scaling functions"); - $url = "./skins/xml/views/notfound.png"; - } else if (!$img = imagecreatefromjpeg($url)) { - logXmlErr("Could not load JPEG from ".$url); - $url = "./skins/xml/views/notfound.png"; - } else { - /* GD exists and we read the file ok */ - header('Content-type: image/jpeg'); - /* Check if resizing is needed */ - if ($scale != 100) { - list($width_orig, $height_orig) = getimagesize($url); - $width_new = $width_orig * ($scale/100); - $height_new = $height_orig * ($scale/100); - $img_new = imagecreatetruecolor($width_new, $height_new); - imagecopyresampled($img_new, $img, 0, 0, 0, 0, $width_new, $height_new, $width_orig, $height_orig); - imagejpeg($img_new, NULL, $qty); - } else { - imagejpeg($img, NULL, $qty); - } - exit; - } - } - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "state")) { - /* ACTION: Change the state of the system. Parms: */ - if (!canEdit('System')) { - logXmlErr("User ".$user['Username']. " doesn't have edit System perms"); - exit; - } - if (!isset($_GET['state'])) { - logXmlErr("Server state not specified for action"); - exit; - } - $url = "./index.php?view=none&action=state&runState=".validString($_GET['state']); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "func")) { - /* ACTION: Change state of the monitor. Parms: */ - if (!canEdit('Monitors')) { - logXmlErr("User ".$user['Username']. " doesn't have monitors Edit perms"); - exit; - } - if (!isset($_GET['mid']) || !isset($_GET['func']) || !isset($_GET['en'])) { - logXmlErr("Not all parameters specified for action Monitor state"); - exit; - } - $mid = validInteger($_GET['mid']); - if (!isMonitor($mid)) exit; - $url = "./index.php?view=none&action=function&mid=".$mid."&newFunction=".validString($_GET['func'])."&newEnabled=".validString($_GET['en']); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "vlog")) { - /* ACTION: View log file. Must have debug and log to file enabled, and sufficient perms - * Parms: [lines] */ - if (!canEdit('System')) { - logXmlErr("Insufficient permissions to view log file"); - echo "Insufficient permissions to view log file"; - exit; - } - if (!ZM_EYEZM_DEBUG || !ZM_EYEZM_LOG_TO_FILE) { - echo "eyeZm Debug (EYEZM_DEBUG) or log-to-file (EYEZM_LOG_TO_FILE) not enabled. Please enable first"; - exit; - } - if (!file_exists(ZM_EYEZM_LOG_FILE)) { - echo "Log file ".ZM_EYEZM_LOG_FILE." doesn't exist"; - exit; - } - $lines = validInteger(getset('lines',ZM_EYEZM_LOG_LINES)); - logXml("Returning last ".$lines." lines of eyeZm Log from ".ZM_EYEZM_LOG_FILE); - echo shell_exec("tail -n ".$lines." ".ZM_EYEZM_LOG_FILE); - echo "\n\n--- Showing last ".$lines." lines ---\n"; - echo "--- End of Log ---\n\n"; - } -} -?> diff --git a/web/skins/xml/views/console.php b/web/skins/xml/views/console.php deleted file mode 100644 index b512bc13a..000000000 --- a/web/skins/xml/views/console.php +++ /dev/null @@ -1,259 +0,0 @@ - translate('Events'), - "filter" => array( - "terms" => array( - ) - ), - ), - array( - "title" => translate('Hour'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 hour" ), - ) - ), - ), - array( - "title" => translate('Day'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 day" ), - ) - ), - ), - array( - "title" => translate('Week'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-7 day" ), - ) - ), - ), - array( - "title" => translate('Month'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 month" ), - ) - ), - ), - array( - "title" => translate('Archived'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "1" ), - ) - ), - ), -); - -$running = daemonCheck(); -$status = $running?translate('Running'):translate('Stopped'); - -if ( $group = dbFetchOne( 'SELECT * FROM Groups WHERE Id = ?', NULL, array(empty($_COOKIE['zmGroup'])?0:$_COOKIE['zmGroup']) ) ) - $groupIds = array_flip(split( ',', $group['MonitorIds'] )); - -$maxWidth = 0; -$maxHeight = 0; -$cycleCount = 0; -$minSequence = 0; -$maxSequence = 1; -$seqIdList = array(); -$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" ); -$displayMonitors = array(); -for ( $i = 0; $i < count($monitors); $i++ ) -{ - if ( !visibleMonitor( $monitors[$i]['Id'] ) ) - { - continue; - } - if ( $group && !empty($groupIds) && !array_key_exists( $monitors[$i]['Id'], $groupIds ) ) - { - continue; - } - $monitors[$i]['Show'] = true; - if ( empty($minSequence) || ($monitors[$i]['Sequence'] < $minSequence) ) - { - $minSequence = $monitors[$i]['Sequence']; - } - if ( $monitors[$i]['Sequence'] > $maxSequence ) - { - $maxSequence = $monitors[$i]['Sequence']; - } - if (isset($_GET['nostatus'])) { - $monitors[$i]['zmc'] = 1; - $monitors[$i]['zma'] = 1; - } else { - $monitors[$i]['zmc'] = zmcStatus( $monitors[$i] ); - $monitors[$i]['zma'] = zmaStatus( $monitors[$i] ); - } - $monitors[$i]['ZoneCount'] = dbFetchOne( 'select count(Id) as ZoneCount from Zones where MonitorId = ?', 'ZoneCount', array($monitors[$i]['Id']) ); - $counts = array(); - for ( $j = 0; $j < count($eventCounts); $j++ ) - { - $filter = addFilterTerm( $eventCounts[$j]['filter'], count($eventCounts[$j]['filter']['terms']), array( "cnj" => "and", "attr" => "MonitorId", "op" => "=", "val" => $monitors[$i]['Id'] ) ); - parseFilter( $filter ); - $counts[] = "count(if(1".$filter['sql'].",1,NULL)) as EventCount$j"; - $monitors[$i]['eventCounts'][$j]['filter'] = $filter; - } - $sql = 'SELECT '.join($counts,", ").' from Events as E where MonitorId = ?'; - $counts = dbFetchOne( $sql, NULL, array( $monitors[$i]['Id'] ) ); - if ( $monitors[$i]['Function'] != 'None' ) - { - $cycleCount++; - $scaleWidth = reScale( $monitors[$i]['Width'], $monitors[$i]['DefaultScale'], ZM_WEB_DEFAULT_SCALE ); - $scaleHeight = reScale( $monitors[$i]['Height'], $monitors[$i]['DefaultScale'], ZM_WEB_DEFAULT_SCALE ); - if ( $maxWidth < $scaleWidth ) $maxWidth = $scaleWidth; - if ( $maxHeight < $scaleHeight ) $maxHeight = $scaleHeight; - } - $monitors[$i] = array_merge( $monitors[$i], $counts ); - $seqIdList[] = $monitors[$i]['Id']; - $displayMonitors[] = $monitors[$i]; -} -$states = dbFetchAll("select * from States"); -/* XML Dump Starts here */ -xml_header(); -/* Print out the general section */ -xml_tag_sec("ZM_XML", 1); -xml_tag_sec("GENERAL", 1); -xml_tag_val("RUNNING", $running); -xml_tag_val("PROTOVER", ZM_EYEZM_PROTOCOL_VERSION); -xml_tag_val("FEATURESET", ZM_EYEZM_FEATURE_SET); -xml_tag_val("VERSION", ZM_VERSION); -xml_tag_val("CANSTR264", canStream264(1)); -xml_tag_val("GD", gdExists()); -xml_tag_val("FVCODEC", ZM_EYEZM_FEED_VCODEC); -xml_tag_val("FVTMT", ZM_EYEZM_H264_TIMEOUT); -xml_tag_val("USER", $user['Username']); -xml_tag_val("UID", $user['Id']); -/* Permissions block */ -xml_tag_sec("PERMS", 1); -xml_tag_val("STREAM", $user['Stream']); -xml_tag_val("EVENTS", $user['Events']); -xml_tag_val("CONTROL", $user['Control']); -xml_tag_val("MONITORS", $user['Monitors']); -xml_tag_val("DEVICES", $user['Devices']); -xml_tag_val("SYSTEM", $user['System']); -xml_tag_sec("PERMS", 0); -/* End permissions block */ -if (canEdit('System')) { - if ($running) { - xml_tag_val("STATE", "stop"); - xml_tag_val("STATE", "restart"); - } else { - xml_tag_val("STATE", "start"); - } - foreach ($states as $state) { - xml_tag_val("STATE", $state['Name']); - } -} -/* End general section */ -xml_tag_sec("GENERAL", 0); -/* Print out the monitors section */ -xml_tag_sec("MONITOR_LIST", 1); -foreach( $displayMonitors as $monitor ) -{ - if (!canView('Monitors')) continue; - xml_tag_sec("MONITOR", 1); - xml_tag_val("ID", $monitor['Id']); - xml_tag_val("NAME", $monitor['Name']); - xml_tag_val("FUNCTION", $monitor['Function']); - xml_tag_val("NUMEVENTS", $monitor['EventCount0']); - xml_tag_val("ENABLED", $monitor['Enabled']); - xml_tag_val("ZMC", $monitor['zmc']); - xml_tag_val("ZMA", $monitor['zma']); - xml_tag_val("STATE", ($monitor['zmc']!=1)?"ERROR":( - ($monitor['zma']==1)?"OK":"WARN")); - xml_tag_val("WIDTH", $monitor['Width']); - xml_tag_val("HEIGHT", $monitor['Height']); - - /* Form the data-base query for this monitor */ - $pageOffset = 0; - $offset = 0; - if (isset($_GET['numEvents'])) { - $numEvents = validInteger($_GET['numEvents']); - $eventsSql = "select E.Id,E.MonitorId,M.Name As MonitorName,E.Cause,E.Name,E.StartTime,E.Length,E.Frames,E.AlarmFrames,E.TotScore,E.AvgScore,E.MaxScore,E.Archived from Monitors as M inner join Events as E on (M.Id = E.MonitorId) and ( E.MonitorId = ? ) order by E.StartTime desc"; - $eventsSql .= " limit ".$numEvents; - /* If there is an pageOff tag for this monitor, then retrieve the offset. Otherwise, don't specify offset */ - if (isset($_GET['pageOff'.$monitor['Id']])) { - /* If pageOffset is greater than we actually have, - * we need to adjust it */ - $pageOffset = validInteger($_GET['pageOff'.$monitor['Id']]); - if ($pageOffset >= ceil($monitor['EventCount0']/$numEvents)) { - $pageOffset = 0; - } - $offset = $pageOffset * $numEvents; - } - $eventsSql .= " offset ".$offset; - } else { - unset($eventsSql); - } - xml_tag_val("PAGEOFF", $pageOffset); - xml_tag_sec("EVENTS",1); - if (canView('Events') && isset($eventsSql)) { - foreach ( dbFetchAll( $eventsSql, NULL, array($monitor['Id']) ) as $event ) - { - xml_tag_sec("EVENT",1); - xml_tag_val("ID",$event['Id']); - xml_tag_val("NAME",$event['Name']); - xml_tag_val("TIME", strftime( STRF_FMT_DATETIME_SHORTER, strtotime($event['StartTime']))); - xml_tag_val("DURATION", $event['Length']); - xml_tag_val("FRAMES", $event['Frames']); - xml_tag_val("FPS", ($event['Length'] > 0)?ceil($event['Frames']/$event['Length']):0); - xml_tag_val("TOTSCORE", $event['TotScore']); - xml_tag_val("AVGSCORE", $event['AvgScore']); - xml_tag_val("MAXSCORE", $event['MaxScore']); - /* Grab the max frame-id from Frames table. If AlarmFrames = 0, don't try - * to grab any frames, and just signal the max frame index as index 0 */ - $fridx = 1; - $alarmFrames = 1; - if ($event['AlarmFrames']) { - $framesSql = "SELECT FrameId FROM Frames WHERE (Type = 'Alarm') and (EventId = ?) ORDER BY Score DESC LIMIT 1"; - $fr = dbFetchOne($framesSql, NULL, array( $event['Id'] ) ); - $fridx = $fr['FrameId']; - $alarmFrames = $event['AlarmFrames']; - } - xml_tag_val("ALARMFRAMES", $alarmFrames); - xml_tag_val("MAXFRAMEID", $fridx); - xml_tag_sec("EVENT",0); - } - } - xml_tag_sec("EVENTS",0); - xml_tag_sec("MONITOR", 0); -} -xml_tag_sec("MONITOR_LIST", 0); -xml_tag_sec("ZM_XML", 0); -?> diff --git a/web/skins/xml/views/none.php b/web/skins/xml/views/none.php deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/skins/xml/views/notfound.png b/web/skins/xml/views/notfound.png deleted file mode 100644 index 219706897647c72375b90298de2d8a6622b7093d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7332 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 R>Js3hJyX?HsZ+9j^?#`>R7U^+ From 6b169af655fcdd3a5f93f7723b440e76d2479e66 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 02:00:33 +1100 Subject: [PATCH 09/26] Remove eyezm configdata Conflicts: scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in --- .../lib/ZoneMinder/ConfigData.pm.in | 135 ------------------ 1 file changed, 135 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 703d47c30..c9d48f52f 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3942,141 +3942,6 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s readonly => 1, category => "dynamic", }, - { - name => "ZM_EYEZM_DEBUG", - default => "no", - description => "Switch additional debugging on for eyeZm Plugin", - help => qqq(" - Enable or Disable extra debugging from the eyeZm Plugin. Extra - debugging information will be displayed in it's own file - (EYEZM_LOG_TO_FILE is set), or your Apache error log - "), - type => $types{boolean}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_LOG_TO_FILE", - default => "yes", - description => "When eyeZm Debugging is enabled, enabling this logs output to it's own file", - help => qqq(" - When EYEZM_DEBUG is on and EYEZM_LOG_TO_FILE is on, output - generated from the eyeZm Plugin will go to it's own file. - Otherwise it will go to the apache error log. - "), - type => $types{boolean}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_LOG_FILE", - default => "@ZM_LOGDIR@/zm_xml.log", - description => "Default filename to use when logging eyeZm Output and EYEZM_LOG_TO_FILE is enabled", - help => qqq(" - This file will contain it's own output from the eyeZm Plugin - when EYEZM_LOG_TO_FILE and EYEZM_DEBUG are both enabled - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_EVENT_VCODEC", - default => "mpeg4", - description => "Default video-codec to use for encoding events", - help => qqq(" - The eyeZm Plugin calls FFMPEG externally to encode the captured - images. If your FFMPEG is not built with support for H264, - change this to MPEG-4. If using H264, please check - http://www.eyezm.com for H264 requirements and that your eyeZm - version supports H264 (v1.2+). - "), - type => { - db_type =>"string", - hint =>"mpeg4|h264", - pattern =>qr|^([mh])|i, - format =>q( $1 =~ /^m/ ? "mpeg4" : "h264" ) - }, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_FEED_VCODEC", - default => "mjpeg", - description => "Default video-codec to use for streaming the live feed", - help => qqq(" - Determines whether the live stream is generated using native - MJPEG streaming with ZoneMinder, or H264 using FFMPEG and - HTML-5 streaming. If using H264, please check - http://www.eyezm.com for H264 requirements and that your eyeZm - version supports H264 (v1.2+). This is just a default - parameter, and can be overridden with eyeZm. - "), - type => { - db_type =>"string", - hint =>"mjpeg|h264", - pattern =>qr|^([mh])|i, - format =>q( $1 =~ /^m/ ? "mjpeg" : "h264" ) - }, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_DEFAULT_BR", - default => "96k", - description => "Default bit-rate to use with FFMPEG for H264 streaming", - help => qqq(" - When using the eyeZm Plugin to stream H264 data, FFMPEG - requires a bitrate to control the quality and bandwidth of the - video. This should be specified in a format acceptable to - FFMPEG. The default value is sufficient for most installations. - This is just a default parameter, and can be overridden with - eyeZm. - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_DEFAULT_EVBR", - default => "128k", - description => "Default bit-rate to use with FFMPEG for H264 event viewing", - help => qqq(" - When using the eyeZm Plugin to view events in H264, FFMPEG - requires a bitrate to control the quality and bandwidth of the - video. This should be specified in a format acceptable to - FFMPEG. The default value is sufficient for most installations. - This is just a default parameter, and can be overridden with - eyeZm. - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_TIMEOUT", - default => "20", - description => "Timeout (sec) to wait for H264 stream to start before terminating", - help => qqq(" - The eyeZm Plugin will attempt to spawn an H264 stream when - requested, and require that it complete within the timeout - specified. If you have a slow system or find through the logs - that the H264 stream is not starting because the timeout is - expiring, even though FFMPEG is running, try increasing this - value. If you have a fast system, decreasing this value can - improve the responsiveness when there are issues starting H264 - streams - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_SEG_DURATION", - default => "3", - description => "Segment duration used for streaming using HTTP-5 Streaming protocol", - help => qqq(" - The HTTP-5 Live Streaming Protocol segments the input video - stream into small chunks of a duration specified by this - parameter. Increasing the segment duration will help with - choppy connections on the other end, but will increase the - latency in starting a stream. - "), - type => $types{string}, - category => "eyeZm", - }, ); our %options_hash = map { ( $_->{name}, $_ ) } @options; From 4837585601abd50da8fc89e6737aedf6836a5dc0 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 02:35:43 +1100 Subject: [PATCH 10/26] Deleted eyezm options documentation and references to it in other areas of documentation. Removed zmstreamer.cpp. Conflicts: src/zmstreamer.cpp --- docs/userguide/components.rst | 9 +- docs/userguide/options.rst | 1 - docs/userguide/options/options_eyezm.rst | 26 --- src/zmstreamer.cpp | 252 ----------------------- web/skins/classic/views/options.php | 1 - 5 files changed, 3 insertions(+), 286 deletions(-) delete mode 100644 docs/userguide/options/options_eyezm.rst delete mode 100644 src/zmstreamer.cpp diff --git a/docs/userguide/components.rst b/docs/userguide/components.rst index ebedc8c7e..48aff0be4 100644 --- a/docs/userguide/components.rst +++ b/docs/userguide/components.rst @@ -26,16 +26,13 @@ Binaries PHP --- -As well as this there are the web PHP files in the web directory. Currently these consist of 4 possible skins. +As well as this there are the web PHP files in the web directory. Currently these consist of a single skin with Classic and Flat styles. **Classic** Original ZoneMinder skin **Flat** - An updated version of classic skin, retaining the same layout with a more modern style -**XML** - Displays certain views as XML. Used by eyeZM as an interfacing skin (Note that eyeZM no longer seems to work with later versions of Zoneminder). New developers of 3rd party clients should use the API instead (:doc:`../api`) -**Mobile** - A skin that displays views in a more condensed and single page format, likely suitable for smaller mobile devices, should one choose to access the ZoneMinder console using such devices. Note that there are also third party mobile clients one could use (:doc:`mobile`) + An updated version of Classic skin, retaining the same layout with a more modern style. Originally a skin this is now just a CSS style. + Perl ---- diff --git a/docs/userguide/options.rst b/docs/userguide/options.rst index 4a0b357f6..8f7fbad30 100644 --- a/docs/userguide/options.rst +++ b/docs/userguide/options.rst @@ -20,5 +20,4 @@ If you have changed the value of an option you should then ‘save’ it. A numb options/options_x10 options/options_bw options/options_phonebw - options/options_eyezm options/options_users diff --git a/docs/userguide/options/options_eyezm.rst b/docs/userguide/options/options_eyezm.rst deleted file mode 100644 index 21c780bc0..000000000 --- a/docs/userguide/options/options_eyezm.rst +++ /dev/null @@ -1,26 +0,0 @@ -Options - eyeZM ---------------- - -.. NOTE:: - eyeZM does not seem to be actively maintained by the developers and does not work with later versions of ZoneMinder. - - -.. image:: images/Options_eyezm.png - -EYEZM_DEBUG - Enable or Disable extra debugging from the eyeZm Plugin. Extra debugging information will be displayed in it's own file (EYEZM_LOG_TO_FILE is set), or your Apache error log - -EYEZM_LOG_TO_FILE - When EYEZM_DEBUG is on and EYEZM_LOG_TO_FILE is on, output generated from the eyeZm Plugin will go to it's own file. Otherwise it will go to the apache error log. - -EYEZM_LOG_FILE - Default filename to use when logging eyeZm Output and EYEZM_LOG_TO_FILE is enabled. This file will contain it's own output from the eyeZm Plugin when EYEZM_LOG_TO_FILE and EYEZM_DEBUG are both enabled. - -EYEZM_EVENT_VCODEC - The eyeZm Plugin calls FFMPEG externally to encode the captured images. If your FFMPEG is not built with support for H264, change this to MPEG-4. If using H264, please check http://www.eyezm.com for H264 requirements and that your eyeZm version supports H264 (v1.2+). - -EYEZM_FEED_VCODEC - Determines whether the live stream is generated using native MJPEG streaming with ZoneMinder, or H264 using FFMPEG and HTML-5 streaming. If using H264, please check http://www.eyezm.com for H264 requirements and that your eyeZm version supports H264 (v1.2+). This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_DEFAULT_BR - Default bit-rate to use with FFMPEG for H264 streaming. When using the eyeZm Plugin to stream H264 data, FFMPEG requires a bitrate to control the quality and bandwidth of the video. This should be specified in a format acceptable to FFMPEG. The default value is sufficient for most installations. This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_DEFAULT_EVBR - Default bit-rate to use with FFMPEG for H264 event viewing. When using the eyeZm Plugin to view events in H264, FFMPEG requires a bitrate to control the quality and bandwidth of the video. This should be specified in a format acceptable to FFMPEG. The default value is sufficient for most installations. This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_TIMEOUT - Timeout (sec) to wait for H264 stream to start before terminating. The eyeZm Plugin will attempt to spawn an H264 stream when requested, and require that it complete within the timeout specified. If you have a slow system or find through the logs that the H264 stream is not starting because the timeout is expiring, even though FFMPEG is running, try increasing this value. If you have a fast system, decreasing this value can improve the responsiveness when there are issues starting H264 streams. - -EYEZM_SEG_DURATION - Segment duration used for streaming using HTTP-5 Streaming protocol. The HTTP-5 Live Streaming Protocol segments the input video stream into small chunks of a duration specified by this parameter. Increasing the segment duration will help with choppy connections on the other end, but will increase the latency in starting a stream. diff --git a/src/zmstreamer.cpp b/src/zmstreamer.cpp deleted file mode 100644 index a16e50704..000000000 --- a/src/zmstreamer.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// -// ZoneMinder Streamer, $Date: 2010-10-14 23:21:00 +0200 (Thu, 14 Oct 2010) $ -// Copyright (C) 2001-2010 Philip Coombes, Chris Kistner -// -// This program is based on revision 3143 of -// http://svn.zoneminder.com/svn/zm/trunk/src/zms.cpp -// -// 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. - -/* - -=head1 NAME - -zmstreamer - eyeZM video streamer - -=head1 SYNOPSIS - - zmstreamer -e - zmstreamer -o - zmstreamer -u - zmstreamer -f - zmstreamer -s - zmstreamer -b - zmstreamer -m - zmstreamer -d - zmstreamer -i - zmstreamer -? - zmstreamer -h - zmstreamer -v - -=head1 DESCRIPTION - -*DEPRECIATED* The xml skin and all files associated with the xml skin are now -depreciated. Please use the ZoneMinder API instead. - -This binary works in conjunction with the XML skin to stream video to iPhones -running the eyeZm app. - -=head1 OPTIONS - - -e - Specify output mode: mpeg/jpg/zip/single/raw. - -o - Specify output format. - -u - Specify buffer size in ms. - -f - Specify maximum framerate. - -s - Specify scale. - -b - Specify bitrate. - -m - Specify monitor id. - -d - 0 = off, 1 = no streaming, 2 = with streaming. - -i, -?, -h - Display usage information - -v - Print the installed version of ZoneMinder - -=cut - -*/ - -#include -#include - -#include -#include - -#include "zm.h" -#include "zm_db.h" -#include "zm_user.h" -#include "zm_signal.h" -#include "zm_monitor.h" -#include "zm_stream.h" - -// Possible command-line options -#define OPTIONS "e:o:u:f:s:b:m:d:i:?:h:v" - -// Default ZMS values -#define ZMS_DEFAULT_DEBUG 0 -#define ZMS_DEFAULT_ID 1 -#define ZMS_DEFAULT_BITRATE 100000 -#define ZMS_DEFAULT_SCALE 100 -#define ZMS_DEFAULT_MODE "mpeg" -#define ZMS_DEFAULT_FORMAT "asf" -#define ZMS_DEFAULT_FPS 25.0 -#define ZMS_DEFAULT_BUFFER 1000 - -int main(int argc, char** argv) { - self = argv[0]; - // Set initial values to the default values - int debug = ZMS_DEFAULT_DEBUG; - int id = ZMS_DEFAULT_ID; - int bitrate = ZMS_DEFAULT_BITRATE; - int scale = ZMS_DEFAULT_SCALE; - char mode[32]; - sprintf(mode, "%s", ZMS_DEFAULT_MODE); - char format[32]; - sprintf(format, "%s", ZMS_DEFAULT_FORMAT); - double maxfps = ZMS_DEFAULT_FPS; - int buffer = ZMS_DEFAULT_BUFFER; - - // Parse command-line options - int arg; - while ((arg = getopt(argc, argv, OPTIONS)) != -1) { - switch (arg) { - case 'e': - sprintf(mode, "%s", optarg); - break; - case 'o': - sprintf(format, "%s", optarg); - break; - case 'u': - buffer = atoi(optarg); - break; - case 'f': - maxfps = atof(optarg); - break; - case 's': - scale = atoi(optarg); - break; - case 'b': - bitrate = atoi(optarg); - break; - case 'm': - id = atoi(optarg); - break; - case 'd': - debug = atoi(optarg); - break; - case 'h': - case 'i': - case '?': - printf("-e : Specify output mode: mpeg/jpg/zip/single/raw. Default = %s\n", ZMS_DEFAULT_MODE); - printf("-o : Specify output format. Default = %s\n", ZMS_DEFAULT_FORMAT); - printf("-u : Specify buffer size in ms. Default = %d\n", ZMS_DEFAULT_BUFFER); - printf("-f : Specify maximum framerate. Default = %lf\n", ZMS_DEFAULT_FPS); - printf("-s : Specify scale. Default = %d\n", ZMS_DEFAULT_SCALE); - printf("-b : Specify bitrate. Default = %d\n", ZMS_DEFAULT_BITRATE); - printf("-m : Specify monitor id. Default = %d\n", ZMS_DEFAULT_ID); - printf("-d : 0 = off, 1 = no streaming, 2 = with streaming. Default = 0\n"); - printf("-i or -? or -h: This information\n"); - printf("-v : This installed version of ZoneMinder\n"); - return EXIT_SUCCESS; - case 'v': - std::cout << ZM_VERSION << "\n"; - exit(0); - } - } - - // Set stream type - StreamBase::StreamType streamtype; - if (!strcasecmp("raw", mode)) - streamtype = MonitorStream::STREAM_RAW; - else if (!strcasecmp("mpeg", mode)) - streamtype = MonitorStream::STREAM_MPEG; - else if (!strcasecmp("jpg", mode)) - streamtype = MonitorStream::STREAM_JPEG; - else if (!strcasecmp("single", mode)) - streamtype = MonitorStream::STREAM_SINGLE; - else if (!strcasecmp("zip", mode)) - streamtype = MonitorStream::STREAM_ZIP; - else - streamtype = MonitorStream::STREAM_MPEG; - - if (debug) { - // Show stream parameters - printf("Stream parameters:\n"); - switch (streamtype) { - case MonitorStream::STREAM_MPEG: - printf("Output mode (-e) = %s\n", "mpeg"); - printf("Output format (-o) = %s\n", format); - break; - default: - printf("Output mode (-e) = %s\n", mode); - } - printf("Buffer size (-u) = %d ms\n", buffer); - printf("Maximum FPS (-f) = %lf FPS\n", maxfps); - printf("Scale (-s) = %d%%\n", scale); - printf("Bitrate (-b) = %d bps\n", bitrate); - printf("Monitor Id (-m) = %d\n", id); - } - - if (debug) { - // Set ZM debugger to print to stdout - printf("Setting up ZoneMinder debugger to print to stdout..."); - setenv("ZM_DBG_PRINT", "1", 1); - printf("Done.\n"); - } - - // Loading ZM configurations - printf("Loading ZoneMinder configurations..."); - zmLoadConfig(); - printf("Done.\n"); - - logInit("zmstreamer"); - - ssedetect(); - - // Setting stream parameters - MonitorStream stream; - stream.setStreamScale(scale); // default = 100 (scale) - stream.setStreamReplayRate(100); // default = 100 (rate) - stream.setStreamMaxFPS(maxfps); // default = 10 (maxfps) - if (debug) stream.setStreamTTL(1); - else stream.setStreamTTL(0); // default = 0 (ttl) - stream.setStreamQueue(0); // default = 0 (connkey) - stream.setStreamBuffer(buffer); // default = 0 (buffer) - stream.setStreamStart(id); // default = 0 (monitor_id) - stream.setStreamType(streamtype); - if (streamtype == MonitorStream::STREAM_MPEG) { -#if HAVE_LIBAVCODEC - if (debug) printf("HAVE_LIBAVCODEC is set\n"); - stream.setStreamFormat(format); // default = "" (format) - stream.setStreamBitrate(bitrate); // default = 100000 (bitrate) -#else - fprintf(stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n"); - logTerm(); - zmDbClose(); - return EXIT_FAILURE; -#endif - } - - if (debug != 1) { - if (debug) printf("Running stream..."); - - // Output headers - fprintf(stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION); - time_t now = time(0); - char date_string[64]; - strftime(date_string, sizeof (date_string) - 1, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now)); - fprintf(stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"); - fprintf(stdout, "Last-Modified: %s\r\n", date_string); - fprintf(stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n"); - fprintf(stdout, "Cache-Control: post-check=0, pre-check=0\r\n"); - fprintf(stdout, "Pragma: no-cache\r\n"); - - // Run stream - stream.runStream(); - } - if (debug) printf("Done.\n"); - - logTerm(); - zmDbClose(); - - return (EXIT_SUCCESS); -} diff --git a/web/skins/classic/views/options.php b/web/skins/classic/views/options.php index 9c3b4a418..30ea85f43 100644 --- a/web/skins/classic/views/options.php +++ b/web/skins/classic/views/options.php @@ -43,7 +43,6 @@ $tabs['highband'] = translate('HighBW'); $tabs['medband'] = translate('MediumBW'); $tabs['lowband'] = translate('LowBW'); $tabs['phoneband'] = translate('PhoneBW'); -$tabs['eyeZm'] = "eyeZm"; $tabs['users'] = translate('Users'); if ( isset($_REQUEST['tab']) ) From 0277a66700fdaa047a709f26b64a4bf5d4af2213 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 03:03:04 +1100 Subject: [PATCH 11/26] Remove eyezm from distros and Cmake. Conflicts: distros/debian8/control --- .gitignore | 1 - distros/debian8/control | 23 +------------------ distros/debian8/zoneminder-ui-mobile.install | 1 - distros/debian8/zoneminder-ui-xml.install | 1 - .../fedora/archive/zoneminder.cmake.f19.spec | 1 - distros/fedora/archive/zoneminder.f19.spec | 1 - distros/fedora/archive/zoneminder.f20.spec | 1 - distros/fedora/archive/zoneminder.f21.spec | 1 - distros/fedora/zoneminder.f22.spec | 1 - distros/fedora/zoneminder.f23.spec | 1 - distros/redhat/archive/zoneminder.el6.spec | 1 - distros/redhat/zoneminder.el6.spec | 1 - distros/redhat/zoneminder.el7.spec | 1 - .../ubuntu1504_cmake_split_packages/control | 23 +------------------ .../zoneminder-ui-mobile.install | 1 - .../zoneminder-ui-xml.install | 1 - src/CMakeLists.txt | 8 +++---- 17 files changed, 5 insertions(+), 63 deletions(-) delete mode 100644 distros/debian8/zoneminder-ui-mobile.install delete mode 100644 distros/debian8/zoneminder-ui-xml.install delete mode 100644 distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install delete mode 100644 distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install diff --git a/.gitignore b/.gitignore index fa066279c..bd66e684a 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,6 @@ src/zma src/zmc src/zmf src/zms -src/zmstreamer src/zmu web/includes/config.php zm.conf diff --git a/distros/debian8/control b/distros/debian8/control index af5ba9ad0..4ab0c07e6 100644 --- a/distros/debian8/control +++ b/distros/debian8/control @@ -13,9 +13,7 @@ Depends: ${misc:Depends}, zoneminder-database (>= ${source:Version}), zoneminder-core (>= ${binary:Version}), zoneminder-ui-base (>= ${source:Version}), - zoneminder-ui-classic (>= ${source:Version}), - zoneminder-ui-mobile (>= ${source:Version}), - zoneminder-ui-xml (>= ${source:Version}) + zoneminder-ui-classic (>= ${source:Version}) Description: Video camera security and surveillance solution (metapackage) ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child @@ -101,22 +99,3 @@ Description: Classic web user interface for ZoneMinder ZoneMinder is a video camera security and surveillance solution. . This package provides the classic web user interface. - -Package: zoneminder-ui-mobile -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: Mobile web user interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the web user interface for mobile devices. - -Package: zoneminder-ui-xml -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: XML interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides a XML interface mainly intended for use with the eyeZm - iPhone Application, but can be used with any other custom programs as well. diff --git a/distros/debian8/zoneminder-ui-mobile.install b/distros/debian8/zoneminder-ui-mobile.install deleted file mode 100644 index 464bb74eb..000000000 --- a/distros/debian8/zoneminder-ui-mobile.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/mobile diff --git a/distros/debian8/zoneminder-ui-xml.install b/distros/debian8/zoneminder-ui-xml.install deleted file mode 100644 index 6617707f8..000000000 --- a/distros/debian8/zoneminder-ui-xml.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/xml diff --git a/distros/fedora/archive/zoneminder.cmake.f19.spec b/distros/fedora/archive/zoneminder.cmake.f19.spec index 771209247..0af88f41f 100644 --- a/distros/fedora/archive/zoneminder.cmake.f19.spec +++ b/distros/fedora/archive/zoneminder.cmake.f19.spec @@ -140,7 +140,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f19.spec b/distros/fedora/archive/zoneminder.f19.spec index 11a8ba249..d1be12aa2 100644 --- a/distros/fedora/archive/zoneminder.f19.spec +++ b/distros/fedora/archive/zoneminder.f19.spec @@ -232,7 +232,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f20.spec b/distros/fedora/archive/zoneminder.f20.spec index b06db673d..513a9cfee 100644 --- a/distros/fedora/archive/zoneminder.f20.spec +++ b/distros/fedora/archive/zoneminder.f20.spec @@ -142,7 +142,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f21.spec b/distros/fedora/archive/zoneminder.f21.spec index 6dfabceea..35662bf6c 100644 --- a/distros/fedora/archive/zoneminder.f21.spec +++ b/distros/fedora/archive/zoneminder.f21.spec @@ -142,7 +142,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/zoneminder.f22.spec b/distros/fedora/zoneminder.f22.spec index 9beef6319..40343090f 100644 --- a/distros/fedora/zoneminder.f22.spec +++ b/distros/fedora/zoneminder.f22.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/zoneminder.f23.spec b/distros/fedora/zoneminder.f23.spec index 14b653117..6fabd143d 100644 --- a/distros/fedora/zoneminder.f23.spec +++ b/distros/fedora/zoneminder.f23.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/archive/zoneminder.el6.spec b/distros/redhat/archive/zoneminder.el6.spec index d61a153e7..46bce099a 100644 --- a/distros/redhat/archive/zoneminder.el6.spec +++ b/distros/redhat/archive/zoneminder.el6.spec @@ -237,7 +237,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/zoneminder.el6.spec b/distros/redhat/zoneminder.el6.spec index 82406d431..1059d5930 100644 --- a/distros/redhat/zoneminder.el6.spec +++ b/distros/redhat/zoneminder.el6.spec @@ -145,7 +145,6 @@ rm -rf %{_docdir}/%{name}-%{version} %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/zoneminder.el7.spec b/distros/redhat/zoneminder.el7.spec index c350553b3..6dd0f5e1d 100644 --- a/distros/redhat/zoneminder.el7.spec +++ b/distros/redhat/zoneminder.el7.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/ubuntu1504_cmake_split_packages/control b/distros/ubuntu1504_cmake_split_packages/control index 4a152c46b..6b6692414 100644 --- a/distros/ubuntu1504_cmake_split_packages/control +++ b/distros/ubuntu1504_cmake_split_packages/control @@ -28,9 +28,7 @@ Depends: ${misc:Depends}, zoneminder-database (>= ${source:Version}), zoneminder-core (>= ${binary:Version}), zoneminder-ui-base (>= ${source:Version}), - zoneminder-ui-classic (>= ${source:Version}), - zoneminder-ui-mobile (>= ${source:Version}), - zoneminder-ui-xml (>= ${source:Version}) + zoneminder-ui-classic (>= ${source:Version}) Description: Video camera security and surveillance solution (metapackage) ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child @@ -117,25 +115,6 @@ Description: Classic web user interface for ZoneMinder . This package provides the classic web user interface. -Package: zoneminder-ui-mobile -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: Mobile web user interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the web user interface for mobile devices. - -Package: zoneminder-ui-xml -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: XML interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides a XML interface mainly intended for use with the eyeZm - iPhone Application, but can be used with any other custom programs as well. - Package: zoneminder-ui-api Section: web Architecture: all diff --git a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install b/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install deleted file mode 100644 index 464bb74eb..000000000 --- a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/mobile diff --git a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install b/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install deleted file mode 100644 index 6617707f8..000000000 --- a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ea254ac2f..9876e2a87 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,21 +14,19 @@ add_executable(zma zma.cpp) add_executable(zmu zmu.cpp) add_executable(zmf zmf.cpp) add_executable(zms zms.cpp) -add_executable(zmstreamer zmstreamer.cpp) target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zmf zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) -target_link_libraries(zmstreamer zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) # Generate man files for the binaries destined for the bin folder -FOREACH(CBINARY zma zmc zmf zmu zmstreamer) +FOREACH(CBINARY zma zmc zmf zmu) POD2MAN(${CMAKE_CURRENT_SOURCE_DIR}/${CBINARY}.cpp zoneminder-${CBINARY} 8) -ENDFOREACH(CBINARY zma zmc zmf zmu zmstreamer) +ENDFOREACH(CBINARY zma zmc zmf zmu) -install(TARGETS zmc zma zmu zmf zmstreamer RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(TARGETS zmc zma zmu zmf RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(TARGETS zms RUNTIME DESTINATION "${ZM_CGIDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(CODE "execute_process(COMMAND ln -sf zms nph-zms WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})" ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nph-zms DESTINATION "${ZM_CGIDIR}") From d40bf89b17995af756adb76326c4894e41318530 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 08:04:02 +1100 Subject: [PATCH 12/26] Remove Phone BW settings used with mobile skin --- docs/userguide/options.rst | 1 - docs/userguide/options/options_phonebw.rst | 20 --- .../lib/ZoneMinder/ConfigData.pm.in | 155 ------------------ web/includes/actions.php | 1 - web/skins/classic/views/options.php | 1 - 5 files changed, 178 deletions(-) delete mode 100644 docs/userguide/options/options_phonebw.rst diff --git a/docs/userguide/options.rst b/docs/userguide/options.rst index 8f7fbad30..8186d8b6a 100644 --- a/docs/userguide/options.rst +++ b/docs/userguide/options.rst @@ -19,5 +19,4 @@ If you have changed the value of an option you should then ‘save’ it. A numb options/options_upload options/options_x10 options/options_bw - options/options_phonebw options/options_users diff --git a/docs/userguide/options/options_phonebw.rst b/docs/userguide/options/options_phonebw.rst deleted file mode 100644 index e2389bccf..000000000 --- a/docs/userguide/options/options_phonebw.rst +++ /dev/null @@ -1,20 +0,0 @@ -Options - Phone Bandwidth -------------------------- - -.. image:: images/Options_BW_Phone.png - -WEB_P_CAN_STREAM - Override the automatic detection of browser streaming capability. If you know that your browser can handle image streams of the type 'multipart/x-mixed-replace' but ZoneMinder does not detect this correctly you can set this option to ensure that the stream is delivered with or without the use of the Cambozola plugin. Selecting 'yes' will tell ZoneMinder that your browser can handle the streams natively, 'no' means that it can't and so the plugin will be used while 'auto' lets ZoneMinder decide. - -WEB_P_STREAM_METHOD - ZoneMinder can be configured to use either mpeg encoded video or a series or still jpeg images when sending video streams. This option defines which is used. If you choose mpeg you should ensure that you have the appropriate plugins available on your browser whereas choosing jpeg will work natively on Mozilla and related browsers and with a Java applet on Internet Explorer" - -WEB_P_DEFAULT_SCALE - Normally ZoneMinder will display 'live' or 'event' streams in their native size. However if you have monitors with large dimensions or a slow link you may prefer to reduce this size, alternatively for small monitors you can enlarge it. This options lets you specify what the default scaling factor will be. It is expressed as a percentage so 100 is normal size, 200 is double size etc. - -WEB_P_DEFAULT_RATE - Normally ZoneMinder will display 'event' streams at their native rate, i.e. as close to real-time as possible. However if you have long events it is often convenient to replay them at a faster rate for review. This option lets you specify what the default replay rate will be. It is expressed as a percentage so 100 is normal rate, 200 is double speed etc. - -WEB_P_VIDEO_BITRATE - When encoding real video via the ffmpeg library a bit rate can be specified which roughly corresponds to the available bandwidth used for the stream. This setting effectively corresponds to a 'quality' setting for the video. A low value will result in a blocky image whereas a high value will produce a clearer view. Note that this setting does not control the frame rate of the video however the quality of the video produced is affected both by this setting and the frame rate that the video is produced at. A higher frame rate at a particular bit rate result in individual frames being at a lower quality. - -WEB_P_VIDEO_MAXFPS - When using streamed video the main control is the bitrate which determines how much data can be transmitted. However a lower bitrate at high frame rates results in a lower quality image. This option allows you to limit the maximum frame rate to ensure that video quality is maintained. An additional advantage is that encoding video at high frame rates is a processor intensive task when for the most part a very high frame rate offers little perceptible improvement over one that has a more manageable resource requirement. Note, this option is implemented as a cap beyond which binary reduction takes place. So if you have a device capturing at 15fps and set this option to 10fps then the video is not produced at 10fps, but rather at 7.5fps (15 divided by 2) as the final frame rate must be the original divided by a power of 2. - -WEB_P_SCALE_THUMBS - If unset, this option sends the whole image to the browser which resizes it in the window. If set the image is scaled down on the server before sending a reduced size image to the browser to conserve bandwidth at the cost of cpu on the server. Note that ZM can only perform the resizing if the appropriate PHP graphics functionality is installed. This is usually available in the php-gd package. - -WEB_P_AJAX_TIMEOUT - The newer versions of the live feed and event views use Ajax to request information from the server and populate the views dynamically. This option allows you to specify a timeout if required after which requests are abandoned. A timeout may be necessary if requests would overwise hang such as on a slow connection. This would tend to consume a lot of browser memory and make the interface unresponsive. Ordinarily no requests should timeout so this setting should be set to a value greater than the slowest expected response. This value is in milliseconds but if set to zero then no timeout will be used. \ No newline at end of file diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index c9d48f52f..0c421fec6 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3721,161 +3721,6 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s type => $types{integer}, category => "lowband", }, - { - name => "ZM_WEB_P_CAN_STREAM", - default => "auto", - description => "Override the automatic detection of browser streaming capability", - help => qqq(" - If you know that your browser can handle image streams of the - type 'multipart/x-mixed-replace' but ZoneMinder does not detect - this correctly you can set this option to ensure that the - stream is delivered with or without the use of the Cambozola - plugin. Selecting 'yes' will tell ZoneMinder that your browser - can handle the streams natively, 'no' means that it can't and - so the plugin will be used while 'auto' lets ZoneMinder decide. - "), - type => $types{tristate}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_STREAM_METHOD", - default => "jpeg", - description => "Which method should be used to send video streams to your browser.", - help => qqq(" - ZoneMinder can be configured to use either mpeg encoded video - or a series or still jpeg images when sending video streams. - This option defines which is used. If you choose mpeg you - should ensure that you have the appropriate plugins available - on your browser whereas choosing jpeg will work natively on - Mozilla and related browsers and with a Java applet on Internet - Explorer - "), - type => { - db_type =>"string", - hint =>"mpeg|jpeg", - pattern =>qr|^([mj])|i, - format =>q( $1 =~ /^m/ ? "mpeg" : "jpeg" ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_DEFAULT_SCALE", - default => "100", - description => "What the default scaling factor applied to 'live' or 'event' views is (%)", - help => qqq(" - Normally ZoneMinder will display 'live' or 'event' streams in - their native size. However if you have monitors with large - dimensions or a slow link you may prefer to reduce this size, - alternatively for small monitors you can enlarge it. This - options lets you specify what the default scaling factor will - be. It is expressed as a percentage so 100 is normal size, 200 - is double size etc. - "), - type => { - db_type =>"integer", - hint =>"25|33|50|75|100|150|200|300|400", - pattern =>qr|^(\d+)$|, format=>q( $1 ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_DEFAULT_RATE", - default => "100", - description => "What the default replay rate factor applied to 'event' views is (%)", - help => qqq(" - Normally ZoneMinder will display 'event' streams at their - native rate, i.e. as close to real-time as possible. However if - you have long events it is often convenient to replay them at a - faster rate for review. This option lets you specify what the - default replay rate will be. It is expressed as a percentage so - 100 is normal rate, 200 is double speed etc. - "), - type => { - db_type =>"integer", - hint =>"25|50|100|150|200|400|1000|2500|5000|10000", - pattern =>qr|^(\d+)$|, - format =>q( $1 ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_VIDEO_BITRATE", - default => "8000", - description => "What the bitrate of the video encoded stream should be set to", - help => qqq(" - When encoding real video via the ffmpeg library a bit rate can - be specified which roughly corresponds to the available - bandwidth used for the stream. This setting effectively - corresponds to a 'quality' setting for the video. A low value - will result in a blocky image whereas a high value will produce - a clearer view. Note that this setting does not control the - frame rate of the video however the quality of the video - produced is affected both by this setting and the frame rate - that the video is produced at. A higher frame rate at a - particular bit rate result in individual frames being at a - lower quality. - "), - type => $types{integer}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_VIDEO_MAXFPS", - default => "5", - description => "What the maximum frame rate for streamed video should be", - help => qqq(" - When using streamed video the main control is the bitrate which - determines how much data can be transmitted. However a lower - bitrate at high frame rates results in a lower quality image. - This option allows you to limit the maximum frame rate to - ensure that video quality is maintained. An additional - advantage is that encoding video at high frame rates is a - processor intensive task when for the most part a very high - frame rate offers little perceptible improvement over one that - has a more manageable resource requirement. Note, this option - is implemented as a cap beyond which binary reduction takes - place. So if you have a device capturing at 15fps and set this - option to 10fps then the video is not produced at 10fps, but - rather at 7.5fps (15 divided by 2) as the final frame rate must - be the original divided by a power of 2. - "), - type => $types{integer}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_SCALE_THUMBS", - default => "yes", - description => "Scale thumbnails in events, bandwidth versus cpu in rescaling", - help => qqq(" - If unset, this option sends the whole image to the browser - which resizes it in the window. If set the image is scaled down - on the server before sending a reduced size image to the - browser to conserve bandwidth at the cost of cpu on the server. - Note that ZM can only perform the resizing if the appropriate - PHP graphics functionality is installed. This is usually - available in the php-gd package. - "), - type => $types{boolean}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_AJAX_TIMEOUT", - default => "10000", - description => "How long to wait for Ajax request responses (ms)", - help => qqq(" - The newer versions of the live feed and event views use Ajax to - request information from the server and populate the views - dynamically. This option allows you to specify a timeout if - required after which requests are abandoned. A timeout may be - necessary if requests would overwise hang such as on a slow - connection. This would tend to consume a lot of browser memory - and make the interface unresponsive. Ordinarily no requests - should timeout so this setting should be set to a value greater - than the slowest expected response. This value is in - milliseconds but if set to zero then no timeout will be used. - "), - type => $types{integer}, - category => "phoneband", - }, { name => "ZM_DYN_LAST_VERSION", default => "", diff --git a/web/includes/actions.php b/web/includes/actions.php index 7de7a8238..4cd056116 100644 --- a/web/includes/actions.php +++ b/web/includes/actions.php @@ -921,7 +921,6 @@ if ( !empty($action) ) case "highband" : case "medband" : case "lowband" : - case "phoneband" : break; } } diff --git a/web/skins/classic/views/options.php b/web/skins/classic/views/options.php index 30ea85f43..1140b7bfd 100644 --- a/web/skins/classic/views/options.php +++ b/web/skins/classic/views/options.php @@ -42,7 +42,6 @@ $tabs['x10'] = translate('X10'); $tabs['highband'] = translate('HighBW'); $tabs['medband'] = translate('MediumBW'); $tabs['lowband'] = translate('LowBW'); -$tabs['phoneband'] = translate('PhoneBW'); $tabs['users'] = translate('Users'); if ( isset($_REQUEST['tab']) ) From a2e228a5ca71dc5cfdf50b3bbb256b185e5e45d1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 11:01:16 -0400 Subject: [PATCH 13/26] put quotes aroudn the string --- web/skins/classic/views/event.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 8b146cc7d..97fd71130 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -55,7 +55,7 @@ $replayModes = array( if ( isset( $_REQUEST['streamMode'] ) ) $streamMode = validHtmlStr($_REQUEST['streamMode']); else - $streamMode = video; + $streamMode = 'video'; if ( isset( $_REQUEST['replayMode'] ) ) $replayMode = validHtmlStr($_REQUEST['replayMode']); From 6ebd71f980907445c875559e471cb0910c56cad2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 12:51:09 -0400 Subject: [PATCH 14/26] instead of loading and looking at current recording settings, check to see if the images exist. If not, generate them from the video file --- web/includes/functions.php | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 89ca33e40..47f946fed 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -1149,30 +1149,38 @@ function zmaCheck( $monitor ) function getImageSrc( $event, $frame, $scale=SCALE_BASE, $captureOnly=false, $overwrite=false ) { - $eventPath = getEventPath( $event ); + $eventPath = ZM_DIR_EVENTS.'/'.getEventPath( $event ); if ( !is_array($frame) ) $frame = array( 'FrameId'=>$frame, 'Type'=>'' ); - //echo "S:$scale, CO:$captureOnly
"; - $currEvent = dbFetchOne( 'SELECT M.SaveJPEGs FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = '.$event['Id'] ); - if ( $currEvent['SaveJPEGs'] == "4" ) + if ( file_exists( $eventPath.'/snapshot.jpg' ) ) { $captImage = "snapshot.jpg"; - else + } else { $captImage = sprintf( "%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg", $frame['FrameId'] ); + if ( ! file_exists( $eventPath.'/'.$captImage ) ) { + # Generate the frame JPG + if ( $event['DefaultVideo'] ) { + $command ='ffmpeg -v 0 -i '.$eventPath.'/'.$Event->DefaultVideo().' -vf "select=gte(n\\,'.$frame['FrameId'].'),setpts=PTS-STARTPTS" '.$eventPath.'/'.$captImage; + system( $command, $output, $retval ); + } else { + Error("Can't create frame images from video becuase there is no video file for this event " ); + } + } + } + $captPath = $eventPath.'/'.$captImage; $thumbCaptPath = ZM_DIR_IMAGES.'/'.$event['Id'].'-'.$captImage; //echo "CI:$captImage, CP:$captPath, TCP:$thumbCaptPath
"; $analImage = sprintf( "%0".ZM_EVENT_IMAGE_DIGITS."d-analyse.jpg", $frame['FrameId'] ); $analPath = $eventPath.'/'.$analImage; - $analFile = ZM_DIR_EVENTS."/".$analPath; $thumbAnalPath = ZM_DIR_IMAGES.'/'.$event['Id'].'-'.$analImage; //echo "AI:$analImage, AP:$analPath, TAP:$thumbAnalPath
"; $alarmFrame = $frame['Type']=='Alarm'; - $hasAnalImage = $alarmFrame && file_exists( $analFile ) && filesize( $analFile ); + $hasAnalImage = $alarmFrame && file_exists( $analPath ) && filesize( $analPath ); $isAnalImage = $hasAnalImage && !$captureOnly; if ( !ZM_WEB_SCALE_THUMBS || $scale >= SCALE_BASE || !function_exists( 'imagecreatefromjpeg' ) ) @@ -1203,22 +1211,20 @@ function getImageSrc( $event, $frame, $scale=SCALE_BASE, $captureOnly=false, $ov $thumbPath = $thumbCaptPath; } - $imageFile = ZM_DIR_EVENTS."/".$imagePath; - //$thumbFile = ZM_DIR_EVENTS."/".$thumbPath; $thumbFile = $thumbPath; if ( $overwrite || !file_exists( $thumbFile ) || !filesize( $thumbFile ) ) { // Get new dimensions - list( $imageWidth, $imageHeight ) = getimagesize( $imageFile ); + list( $imageWidth, $imageHeight ) = getimagesize( $imagePath ); $thumbWidth = $imageWidth * $fraction; $thumbHeight = $imageHeight * $fraction; // Resample $thumbImage = imagecreatetruecolor( $thumbWidth, $thumbHeight ); - $image = imagecreatefromjpeg( $imageFile ); + $image = imagecreatefromjpeg( $imagePath ); imagecopyresampled( $thumbImage, $image, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imageWidth, $imageHeight ); - if ( !imagejpeg( $thumbImage, $thumbFile ) ) + if ( !imagejpeg( $thumbImage, $thumbPath ) ) Error( "Can't create thumbnail '$thumbPath'" ); } } @@ -1227,15 +1233,13 @@ function getImageSrc( $event, $frame, $scale=SCALE_BASE, $captureOnly=false, $ov 'eventPath' => $eventPath, 'imagePath' => $imagePath, 'thumbPath' => $thumbPath, - 'imageFile' => $imageFile, + 'imageFile' => $imagePath, 'thumbFile' => $thumbFile, 'imageClass' => $alarmFrame?"alarm":"normal", 'isAnalImage' => $isAnalImage, 'hasAnalImage' => $hasAnalImage, ); - //echo "IP:$imagePath
"; - //echo "TP:$thumbPath
"; return( $imageData ); } From fb3bd1182da7c04693920212e02b57adea4ad84a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 14:08:25 -0400 Subject: [PATCH 15/26] put this back, it got lost again --- docs/installationguide/debian.rst | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/installationguide/debian.rst diff --git a/docs/installationguide/debian.rst b/docs/installationguide/debian.rst new file mode 100644 index 000000000..9294ebeb6 --- /dev/null +++ b/docs/installationguide/debian.rst @@ -0,0 +1,37 @@ +Debian +====== + +A fresh build based on master branch running Debian 7 (wheezy)\: +:: + + root@host:~# aptitude install -y apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf libjpeg8-dev libjpeg8 apache2-mpm-prefork libapache2-mod-php5 php5-cli libphp-serialization-perl libgnutls-dev libjpeg8-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev libtool ffmpeg libnetpbm10-dev libavdevice-dev libmime-lite-perl dh-autoreconf dpatch; + + root@host:~# git clone https://github.com/ZoneMinder/ZoneMinder.git zoneminder; + root@host:~# cd zoneminder; + root@host:~# ln -s distros/debian; + root@host:~# dpkg-checkbuilddeps; + root@host:~# dpkg-buildpackage; + +One level above you'll now find a deb package matching the architecture of the build host: +:: + + root@host:~# ls -1 ~/zoneminder*; + /root/zoneminder_1.26.4-1_amd64.changes + /root/zoneminder_1.26.4-1_amd64.deb + /root/zoneminder_1.26.4-1.dsc + /root/zoneminder_1.26.4-1.tar.gz + +The dpkg command itself does not resolve dependencies. That's what high-level interfaces like aptitude and apt-get are normally for. Unfortunately, unlike RPM, there's no easy way to install a separate deb package not contained with any repository. + +To overcome this "limitation" we'll use dpkg only to install the zoneminder package and apt-get to fetch all needed dependencies afterwards. Running dpkg-reconfigure in the end will ensure that the setup scripts e.g. for database provisioning were executed. +:: + + root@host:~# dpkg -i /root/zoneminder_1.26.4-1_amd64.deb; apt-get install -f; + root@host:~# dpkg-reconfigure zoneminder; + +Alternatively you may also use gdebi to automatically resolve dependencies during installation: +:: + + root@host:~# aptitude install -y gdebi; + root@host:~# gdebi /root/zoneminder_1.26.4-1_amd64.deb; + From 210873e5aeb426f229d080102145efc8ce639e85 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 14:09:08 -0400 Subject: [PATCH 16/26] put test back, they got lost --- .../images/zm-multiserver.png | Bin 0 -> 38971 bytes .../images/zm-multiserver.xml | 1 + .../images/zm_first_screen_post_install.png | Bin 0 -> 68794 bytes docs/installationguide/index.rst | 12 ++++ docs/installationguide/multiserver.rst | 55 ++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 docs/installationguide/images/zm-multiserver.png create mode 100644 docs/installationguide/images/zm-multiserver.xml create mode 100644 docs/installationguide/images/zm_first_screen_post_install.png create mode 100644 docs/installationguide/index.rst create mode 100644 docs/installationguide/multiserver.rst diff --git a/docs/installationguide/images/zm-multiserver.png b/docs/installationguide/images/zm-multiserver.png new file mode 100644 index 0000000000000000000000000000000000000000..360b612a8cf96216773000742f00450f5d7f650a GIT binary patch literal 38971 zcmeEuWl)^k)+QkV0t5&a90I}JU4jJ&8r&feAZX(b9bAHj;Mxfqqyq$Z32wm&ZjHNZ z&&xUY-ov@~o2jXquWG8Mrhh@dd#}Crl4q^`yc@z)lw>f_h|v%b5HRFqrBo3R9wH$i zAa*}S2EJM4k48j5c#a?^C9dwCwms|NuD&`8KOn)wc5^7uEG(`Zv#MbAnaRv6uB^P# z(5pNDQBiE0InIH$O`zeH#8Ryg|-nI<8i~O-%S7V$@<=I|zGId-$ zs=_Cyq`|G)#)+J_p9Cxh+;(fkoOlC5?>X|(e6B;m9m^f*0 zu&lncqtx-10mI9@kBD%H1wE3OA|13IC0xJ+@Gd?Ci`4J$WWmL(cx>w73VjPrq)x3!5DN?Aq8 z%;rl`Xz~-P+)mi$mih5($=48d=t_ooFfO>k|J$5lz5Qcm_yon&)WM}o{;G?B&CUA< z_#)Nk2532J((Sy!4qJ;UO;4D@7hrK19mi|q8v@6(Yww4sr}TT)v!g7! zcl)~aZGS6#B8l@j`7NGyTCU7cX-dDodl~#~_EACX3dj7opd=wjueO zUdK5Wxcq3`Am>tSlhedlo=F4*UNKmH6f+wjKD1H=2XhD%m)=N5@#8t~U!DcMKtsaF z245p8BS(@+?$tasePS_7^b=QH47?lAFneD2Hdp1jqrw~dryD$Whp@S}jgBFB$g=FW zyx!O} zg=iF>f14D&w2I)E*+2E2nZ52EAHF0x5O*7(&f7tgenvBfilg`=34`sVIW*<=l{c*vqPT)EO z(}5M`k014vJ@L^HfRNnq0D`Rn;>(5$62>%DS}oBLux*@mQTy>0@od&rU=5S|SZp~} z|E!QMDN$4YNWCMj*K2|V`Pz{~V4&*a3hWd4pkrw7SiWXCOu5_UMuW4$^2mLuWa|R9 zfjqLO&RTl`t*@nGTc18?roQ+*e{k@F!XfQK6n8{#@KXbdg`*z0?F3hJkz(x;h3Mzj z-bADuuv&bvp8M$2Y z5oKtv=OEk7{Y%H2B9J82izc&maHk1l02s1y{UO)1Hh@kRV@jbR_oQ^*Vy-DRr4nk8 z*Q4XSc0hQ<@@ku3sxIVmlc7(R)(kAI!bY}e?fUa^$GitsE*#9o)O6xJ63-D<7_qnw zpYDQ?PqF%`u&J)QfSUhJlGrLr(^m3GC(p5(M^c6vM1_?+LH zp8uNjGF)u&nQ66)5?ZQJUG&y~0J*8s;+HLOKi9`H%XQfN7C&C#z8Au1+{u*v?K}?w zd;a|M#)CF5_sfq`n%6rDeP(QN!;>$EkLEj)dOc`zPOR0}ywgC0Z5nZ$5}rF!)ZBp6 zMf$Y@oQ~sfm;K;BKD27i=ht-KtemCUK7q|lpKmRHb-!$>tM>lTLh8mcxc5Zi@k3nD zQM!@C4UvV@7Ch2q$(rpDN}_y}`Q!R}w;822dee5$VaEa4>6GRA3n(Z!taPMg|_>wjPvA$-45uy<#SOMYHng{O_fvq#RD~0(1PDniI%sC{aQb@l);(4 z9mcGes9>KJRPyVciZrVydFk)`CB#Fwo+bs7fp>ha&kBP52#h+FLzt<9vWpPWsSEi1I{a&mpY76Dn_p~1?~(V*2g477F3ERn8klrL z5S4#9276B%D_tS&WjimAF0)FCzwe#ILqj%l;^<61s@@rt^q|^2yWW2iz>#z@rDEgR$DbWe@wK+wD>U-t6iTX<41TgB*?#wIaO#&v4juV zX$*b4$SwuDj-R~~oFVN*|Ja2LF^=8z(xD%Hx?uY-Dg3MU{0mg1^o;kUR`dw<@%(wW z@zzRMmmOEV@zaM%UbM4SQ1F-p`S&r!U03mY=A(lr>J-uAM5SAo{ZmYqOE&c;XC zHgQ1(fjgJuqUqA~a=z>HadUfvE&bz~&grJxifM9~uxa&1n{fRHp)HpZ-Wz`Sl3&sY zyzjTw2i;1+fuBhv$r)RyHzL2MJWPgYThNgFH!Gw|zZmM(bNMm1~mMBA^5BUBPbS65r(Wlw2){-zc9QjNddx z^1+EiMD?U`iBBBt0z8WuY+%gJr*IVQL50J6my%t2wP|pndE>q+4-6x~MFjB&mRG1sHitILySHcuhBnupk>l`MwkfuGDcnVTk%v#tUU>CqPw6ru5}8a6Q};EDraN`Ww1YMVt;Q- zv|Ve`NVS`#$JPYoE#FsGTT~=UsN@Ls_Ghv0^-cMXIH5!wvT=R`a;ebW3-Xq&&4 zoM+uTk+CX-8Iq#)blldk{G4* zg_3me7laprkpIyuYLB>0PAn5Y>3t<866DMs1qvRsx^+)^I|NNs@rxe5aC4MsB1t|z zO@G2YzcdwyY@fq<>KIVth`3Q=S1%)^x7U1_36FLobm@H=u`y`Nby(}OS_=3nzju-p z&CWA3jn|9$tjUF}BkiXc-$Y>JfUT$K=zO8JBVRz@bKi=r>@n?yLhTL;B@8sA(bBC0 zbPgEu97esCbrsg?RxU-Acg%E%76?~>7ii^<@svd~=e=k<2unOUqJCqNtCp@~UZ!%L z_g+fc-u~=woPgTZc$<&33$eek^oVL6d@*{&fKxhl2gyW{# zvKAgtX)?9PpR-XTiGgImswZ-w48}DrS!+nEq*xs*y55oNhdf_#d7lz!@N4Q|vn9&J z$BP|rv@?2PNps7U2A8YWFuCK4wy4L_GbLW+qn+6HiI8QUqc_)6fUWWlI^*L%q!vv; zTauXEdB)(8K7%%irw{}q8j>%KQ5*p^Y`Kp>sVYxBquur|uU?-o4dAk`iL_V#)~yt_ z$AnF@#l-B2g)CfJqS)hm_u1Y&nfIpkL#{oz1GR^}pa`Hclz^w8?y>E5hCW4wDo-~# zd4v4XDcpunH?~|wTPGqH69l9`ht%E~{KqQ4)MX%(kgyhl8!gmFj2{n(ZJG1hjm~0< z)kR2xEmmfFzIMd^R_C5we~t)|@2o z&RPnYU1`!u&7{zU6AZ8iTX(Wr^d_+ESQo|>S+UvDbyssH9s5Yar$v{t^1{c!f@DYi zd0|kxW0j%RGM5sSGxNS}iMyGx48Ho1k4mL^_RiCayp!~mU>UI?O9 z(-P$9N#~6_Ceqj~oZP-sA1xkLsuehGWTS9rHx3j(d}2PN>;X1fqquPq3U>6Z!`(nI z66oC(!7#NmbM@m}Q5i}SOz4eV6xu0i+sm~d>8!t6bj0MAsFUMlg`=D}h%GH2S6usi zUu^Aky-+@VB2T}sx_?l7%$0Z4xoV3=@w*Lu-crDue#M19MP(@c#1;*yip|PrZ8F^K z`gG;1uy;Og5EG1kw z)d#Z=`$OIz_qlHH<9$ed$hEs5WqLlhyj;UYj~6(%OlI_HG@dtuDPj?Z3U!!v=sa46 z<1H^g-MV!|hFOExb|?uOcoUOl=Xt|KAR6{xcR<+;7_XPH1{?Oy?I!ZI? z?mk2%p_Bpdxb7l=H}UC-{lY8>JIr}k&yD`rWp`m8(gx26`82q<;O>Ou#>QwX@=U#C zMLDku6>0SQs-F`F-E~CtGtuUWzL&lS9u8Flolj$j=kzQXfN{E^jCBgkuFk$k!XZ#Bc%n*c`tNBG_Q+6@Jfbt8adb`8hBd>wS zqQCe@UHHGsfy_PE$0)Vfhy;YBiNzUP4UhYEXMz83@mgq=C>!`YG651J3Nb}B20 z{ymFZbMh$QV&J_iU*Hzckt+WlCUTNf^%iKpjTA1{CrHTcv>m%MtV6%wq={Ry6~b}D zPP;C(9OG3VFhQZKWGHea9L1%@PC1KoPJcV7%s-IU%BRfnQ>Eimfo~2Y0Id2n45t*z<0qk~r@w@2=GH zkndpJ8Mc_<98hB8+hMpck}mfvUbxpc4f+p~B=GL34*OkcIuqpCpRKCWh_M-2D$jAu zlc7d?V!r1qsTZB5ZA7B=Up-Ugn9%K)Va?m~?309j6Ta;?Z88Ua0d5Xc2goCE;*9Ax zvzMQ;L(q}j84QS4n|}Y2({iXtZOq1V-#daM z4Sv*_%zolxczwq5MD&8wPPD2}Wr5146`#;aP|W9&1!mLLIU8AsRa3UM-?Vm_xHsBs zx2grcL}mchbvj@w_P-gDdZ+R!1Y?Ur%ae4r3@(ct{ z#z{27NByiy{x$_5(YUAlB@>E^zqKxwS>{*M9t8X58MN~>d8gGB?0^hi&s7i>ayWNI z$g6Lzylc%WNPUTGt+|^@&ZG8D&x1uV8+E2uhQ(`BDxk0 zX()y_(u-A;9O!4ehipe(*FI%`$eZbwQNGC_Y4WIrlc;lrmN$9ui1`?EGL>2VCY8Vr z2FgVjT@^(%2c5%N>o6wfug7Pu8-jQXg~mG%*D8S4ixq{e{?;#3i}?bBj;O8Ki1ka6 zCC!%W!DLVexXi7ND_hb%+LaCu0mI8^6{W*|MiKOhsI?mjGE={8f7he3lGTJMLg7KF zYy#=NFlyF%m{vqm6Lhw}7qf049T@e!31y-1?cO$I#^FNem@k;C5iUaun(3HidIC$y z>P5Pm$QT2QJ~UNYi)O;~l4HUakobd|!p;)Fd&J5$ZPEKCv2!=QPL|a&E_kz&YsI_m zgAucx&uvsy(jeG@3f9+DmWzhHLHXybW=2SJs#u)f716-OniXS;8^wA4+~p$zk~SWw zMaA#s!h-??N0f1uj9xuf8I4!T|v>U`Um6QQsU>nD@S*878FqxxV5RNumR<-Q~_`yHgb zp+Q2W+spXt!AwKrH=4ce^IDA&Vn#z)PMh&FXLdL|f-TzFGXGt?-5s?j^?yqK{a+W7 za`7Sim@2_W!L%i1g&aylGCUdgCJ+kM(*Fm^`FH{A(H?l0no%%!Vk>~n1pmn$w|N;O z;fHW5^61Skjwd8_pWVcC1|yXDPTd=>x;=v<4PL7|Kk?!Wzq+KkBR<2l(U1_Edy12# zq&xRdJGblw(;GBLU`2F{g26N-BbWC_g|iR=qu6Z+E)6k|D12-E^4AHUmB?*uCEn4l z)FupgkDuPEJS{(DnoBO<{eH4E8hYD$SrZsVO&220Z7uzn*yBrXd1{>OY9$ z*v2m^&p$}`;R7uMuookMxqJy}M*Ab;v!TE)vQ&(b{z$xGEj+YGD)iqG|I~~L(2O2W z+wU*2cxXj0|Dc*L0R|EQ4N3DK>PbUh0vsU|U?pJt_m@lmNkhQC*rup(HHhhm#(3rF zAeEi^*CM5bKW=h_1sssj6Kz+QFH#9beFZYxsa3W1Hn*g4W1j-v`G;~QG8#M>!Z*KP zH|m#Gcs!Y|wWR~~>kjUtGEEX^20)<%s#2H$mHtmH>JBcw6*4N~H;#B+&vm{#&hi?j z)uw3Wfrcrish$DM`akV4yF#GFWitHQ5dNM_ukrWP;#v!9UR=#bUM}xzM_4X4w_f?g(Mlk`O_4&w}dAJg|+IQv1 zRVR3XxKU^;lq~2aqO7Ff0@Ef_r5;WMeD)p{X^}O^f9MYI;>X78@{8RTcit@->T9-< zP=J;X9B%FRN3-L-OC8yu^;NMPAgKA+FJDaEx5vzc1zm}@T(`H59Z(sNgt+bKT5fIRUWD(q@Qan!(V%|u1s2mf0VbRucsZ$~~=i5tN81rPGDPZ2P zgI*#IOMw@(#qZ{ZsXOY+GZOQP-}VQOhv4n}uK4(qsd1?SYvLlHy_G+_*UHm@MVcxR zNU9x4aYskTqbe@ZOz3pWOGwt$A6AjTKyv6t5*D#UlGpV432dI8v5->KUiMdLSg(i4 zHD`y<_poRJI!^Cav|OLEj0zIB{T49qexEf{sILVXQ{}t;-8><=DXrmNYX+Q}J8x2; zIXXG%-FVsA0Tc+<7Cqj~`ACy##G48R?842hvscQR_Vn&6IYHN6EBd!5+i9*RLm$y~ z$~KuY((6B^%dwb(M>N98y=CmhXL)ScV=lJ5D|encva z^SJHTxYK;kr}kqoE2aic?EX+*AwtN!+IP1-!yte1ToEJ)fJ#h430GYFc+C2h@q?z7 z&f4e+c8fVx3G7$B=a_IM2OSL1z*GnBa^jKmLd+LS_*C~$Vj}x?d=8Lt&HD$vQ$Jkj z_WE=Nr=8rg$^lkju2jfVuFBa(N!;zBpF~US8~VrnrNSFHSHLpmJByNRN(R01Bjaw` z$_RTqaA7bLa0_?y_w*$|oYNEagJJ>ihc(&5Y#w@DxEUwql6v zJ0VvYwvA^7KKXkLc!4nO4Ck;Lvfi7ibl~u@>gc6i&l)ddsME8}w(J2fH>f{d)aA9E zY5~;j=2v+ZOhXW>LR$AV(fOl<_`KSE#poo&<31hg66=$X?@e~z?H2H%b}a{s4cJHu zb8nKY;jUS^%#aX&AGIo%I5}TBlc@+XKDo3NzTD&_#&mKYiWO9!?mFxzN}m(Zk@D>L z!wmFz$09)PlJ>^2mNuEzh<*KH8X6w82n6XAj$0O#Kt`%{`#)r7UaCoLzy6x|C(=J9 zR;+FB8O@|J(IRg6vrPC8y&tC0%)Q0Kt{Yyb`4dwEUja*Sp5%p2#=l~F@JGdX&Yj{M z7GEGH-Cn}&i8^!yc}_zUR9`QwK@gvikgM_(@xI{o3zaOvvI%8KmdM|}u2I>)PG$12 z7^pQYL>2dLr3Q=8DFgN=^1ai+Z@DxhQN=Bg@nl!v{U(95*B>mb$(m?S-K+gRs+ z?6VrVF^Saufa% zg!XiF#;z0R{a!;py@~C$@n5JmHoNK2piQpTZP3A_7kt|%xu@?Y$B3S2wBBfTM)TiV6fVAf9R z;0xv#xb0TYP;$Kr2p#O*Wto~`r@~wgUH&w26k4!fp?ka6&$e_hak@WmO=9nIP)~(J zycKOY%!CJYAlt2&ajaqbuIqy(5`KA&e(~sMCZtNNI@&UlLwlKMp;n@mG4*UXMs=Ug5y-SDmbmq>YUNbC^W`5VBWjC(#IZ3~^_~5+#x~e#V zsm1nsZP{9sZ(Nx6jcwf<(AE9JR_4Z|EZiei%7Wd5RlYY$O712;R%$-~ybFK@o*b8z zBN$|&f|TB_(=-5$7o?eWn|COxV1th@k1gLf_&lxXXO!x1I*rL2CTWI5=KQs2H!C9kKp z01M`_thrSI*8bsGnpDJ#ur;j9ltlPS!Rm?^7W{u^ssV;-_*a`?W=0da(yH0^CQId( z)!xm3Q@r#1E~xp>ImzsCNmENAtVWz@2Y#YsbsPfe3M`}vTbuTP#Pp+U+?#c8is~&7 z59jB2+|@}Ol>u2xq04i4%14JrHD!LeN2zt5hS;c)f5Z|~l{pSRS=%%PbZblnXrn!W z@~mCPQS6~(wPjHBJEhy7r+ct91wWGw+JYxdXrT;mZOwW!{P&sMudh@t_XCO@zwzh5^6#Y};0g)MCEkpL{z^6Wfb<^ z3RJiXLPatVgN6onTz*YFCZ@O*L1wBt9VYXtGB2b1N=UJAa*9OEWSV&zzxzrZ;T~gKk{!ZLoq7iq2JaS7o8jnFfFk1xsbb8R=yyfbVI2z6TqK9JADqN!}fS z2Y%Ta%~1taewdc#7-)RAtgS%nhO$&{45>w4f$pci{l zC-V;%PH-p|URbE1bzpaba75I1yN$Ejy3b&%`$rbb>tfD)Vz*yD2`f*FAc>aY9-dF- zyGJ>-bDsZXrZuZQKy)`~?^9mWi{|Hu(nfBI=??TEum5pDB1*tT*WoyGjuU0S78LrZ zbYq>y)j7X1_7|x51)wA)8_Pz85S?B{E|BptiPu`x#5d!Dm}9)BC$wcq(@M3}RFf5A zB!`%e1urthwrzcwmFiSJL~oyT1L!?nS+jpR!|eXz85eax5RVG}W2BDKR4>@t(d6ex z5pCUyTOgC_4$3PN6x zUIFYI6E`V;=POiFghbZQYSZHJ-;O*kO+VRRA7l$^}5ZmXez( zJhW#aIB5H^rB-YmvCU9X*;e7Co<1~q6L*k*3)i>&W523z5t*Xf^J+18Kk|$_CEywU zP1!%T8P5AhZE^`bCOMfNEXyuUDPUzZ*I)w7JD-gP{hvF&zl`^}%G4qj1)@FvGkfU; z&YYW$_!tuYUsbDV{_b|}VyW|uPd_@eAAapG9%RVxVOwAf!998>_$G6A`I7RkdXJBL zOtHTpUk+XUwo&sWvoY}jCYXM5Qk*`2aA1{0&|8+8d0W6UOt!u3AJ!~iTo7kT7x{L1X*O--cmobS&lls2bMPdkPJmwT2 zvnwe3sET@zkx^(H|5DBNj(+f~E2t}X$t1VOEqyglsP8?pJSmhXTSb50+>#I(=4%1+_0Pxb} zG1dGwnOV>|Da2F1XzFwCPP70A8$m2SH|1Wx$^t73tRrNpMvIRP7ZtrO%8&{NvMsdn zN!EDl)~0B+Al5;@Dc6rxdAb<7G!e}&u#wE2F}VLD<@(H!et+rOgfF1uSuA7(c!k*7 z@ij42ib_wpb|oqAAIAr($}jg&ICL_c*1*JUQyIIIDbmnHKu=VunIGp|#o<{r={+A3jGG}KKF%ir(Rdkea|V5A{&=%U3fU?)Y2ZuwJV(t~S; zser;C5!mHrMDgpbvoJS&v?!l@r6cTwn{)}DVQ=z^jJg}coy7f!h7R`2r|8?(0y2Lc zru|W<_9fPI+n(5TXOJSKdClxB!N!gdJH(;gp?k}tU7g#YdO+r_)q^IAxUQE#-Of~6 z+}pAqx&aj_-#Z$WK4&Abpfx7-@+h7RsVe&n_ZnI4qI^uYYX$>4iX#eSqTr(9bo91Esrh-P9_-%o$Wa&)fd=wu#JZ{ zC1;sx_ST(U5bBiA5!g_ z_dSlS_v_w)SjtBFUhw^WVzyVkU1iDCVDVR6!iCV)qBjiJc5elUSm9zQMnw5k=ZxYq zm)=&)HQ|ZllmE}WTndHW&YRKi$2Ks; zZ;y3wT1FWyoi!F9DG4* zul7OG@;3FekDH+=+?~d6nasi4+KRFcbBu#?eHtD&U;IVT-EYQ4SgfZznL<+y|9H7} zTc6dLU*KSe5kA-uSuZpW^n|Pb{T)#Q)c<2LuBm{XH>yna5!I6AJr;(t_pYPhzfe*j zixd|F6}iN!?S2^^xmc8>AwuDwUtBq!aCG;0`)u9=xH3=>qwXe8&mQGolAQ8$FykoX zLn`lBTwPO)HQ8;a9m9!oSt|Dm*@~)+FnDtMQajBRfBpySIWr!Cn# zo@U!*Bqjb_1vh>I>qI%13iEH zk|l8T;Z&3N`H%>OQJav;34@0wNYPl&l`$$_`Y4eT2&JWoL4#{qF)0p1KEKPYNY<~y zLRw&DSkeuN!=3+@Rn(YrMd9Yyy0waT1-wM@aKe1^@Z5^A+AAOT$b_mR`ne;!OX2$n9$ z-e<%pt$(Z8UzA;D0nx>HSg2Ea_O#$6J<9Gs%*+dp zA#u?D0!ZbE%7W>?y066YuPPs^{1{Brk~&XInMI;Ml9gV+3qfaNfh^QUM!F-+__Zbc zNAKlBZN<#8+@iGv_$nad_0pI80ZG5Q?9f6oCA;e${KiOJ@q1wLDTW8O=2QcK-X(&y z6{48)*g@-iizCAi1E+Z22jEQRcpJ`d)qqD~qcRW%!e!-*}=qscB{-oi)hyoF_+CjccVPEM^Hz!GWid8=CRcS^w!MUBHSZh zBoyYZae7}GBJ%@WqA3a_OH?Qkw7w5{k$bOsagLto560J-;pfZ%kcuu^7Usqg|Bh@| z6iF0odSZKdbFq|AhLk|D=dEEZSaS}5xms;*YpjQ4N~}q%Vz4H;ww3_>%~143sbvH= z5!1}G5Pu50$E1u>^7Pf7x8lAcj8VRlu19ef@uW6xCzNbDr8U>*I$#8T>ps!Bp3}_h zng3O@D09COl(M;zeHE&vwp^>X$xICe(D0R9Z(uzG-pr4F>1ZRG(KVA(YJ*S5@9)Po zFYJH2Q4}({-&r;Aj3176@s}8lyiCm78P_`4l1WQDRv;d<_|Z5oz88eZHo)fk$3a;z zeIfKdto^ULLn;%d`-_AY-`Dm3PyBz*I6Y-wwZ;Tsntot>!HNhY8pb?f{Dt{_AJjL4U~l6M_>BpP=^?`BMoeI~N@IM1QEyLYhCes@t| zU&Z-}b=A(+7K58m0vb|KPKdkrjN{!a%$u(j+m3<`-~Lz#n9W;QK~lxFjSqf){;u0@ zhMdjG1Sd5>{IKy;V}@syNwNyS!VzBG(gJgn_HT)i5dX1gJd1VWNO%5()*X#`JZO4= z1gjHWxEW0MYYR(QJn_78yqpa;lV}+~Cxw^9qxMc#`dDOw6#hATQ`TztOaI-KhQkvc zZthyWevd7ZSz#eF9^k4)-z6s`+I((DhYIi9Tl7^^#T^HD_vUkrMD?FG68!YL!kXX( z?FClIe8rk^h|@e--O(L^39xsiJ&lO+f&N7^hp>i6b*?8j9f0Zov{qDhLdoqn4>rGv ztu6cAt&>Z4^D;1~Me9JILHKAliAJJj>7?LJEtk_;(fJr)(pX}=?h^9M=iCk+I5TTa z%&TU#1SON#*sNKUV75|QUq07Cabg552Q-I8?Tq%DQH0Ue7`*9jQcGzA6D@z1*I=W?gHlJ0%4!x&#AZx0#IU z$_LoF{(AS-9fe+Fr-bGHVYmmatgg)>j#3c_IbxuJf8=hSN1wisyvlf zwIf?tREbBoS4(*|f4$cNL9ptQ3)i4mDNyh97UBB|9)qO$_W=5#95UT;&j7V4!r8RT z3i$F3sN{~x2i_kaUjzf*{MJ~^uPQ(LlB`CqlppuZ=`kE4c`z^zdG5O>zWG2HxZtm; zLc#AmrjaILV#UGQtY*;O;_pa|VC6K0yG6~rfe_;Tp(>&53l-xvIPkD9aJ<*CTIFe7 zNWEvXhJtPxSVuU=vVZXl18{jdUS$VKS(+9V4T&*+lMtFmdkJdQ)7BkXy{@V*3I-xG zxW1nII&SNQahM9wP~C-$>VaiWwO`8iEcH9hB@9x*6=&oSe>~NXx?rKqYA7+q0;3XL zc`N#;qp=&ak_9QlPu48I>xKirw%B_0M-nf$cOTw%gZq7P0uoo*A!Fja213|5iSwwQDKr+_mup z6RF^x=H&<7vWFo^z`d7qEDFZ%m6st#Djp2V@=wzG^p)o_nir+|Lzu~qDauBFkQxO0 zYoEgS5Ee>UzyA0U@$D4?mYHA7Fb>*qShPIkJ9a)a>vyDt-|HMfbNMwqQX~T(*}H|A zGJbGkEqrO2c3h7cnL5bu{{$03(&+a>D?{`HsLbFv`I z91RyLc?&8F&Yxm*qVhJx|1@*43RLts)6B0BtABVbBxMJECeQf%Jf~I}SXEUZy*)1; ziFSx31XCd0c7Q>abw877p#V~peIkHVH_~hWFcKeWg`7FJ1D*R>95IErk~l_AP|)Xz ztM$V)L=X$US?xy^7%xZE#W2|q60u!kXt=mme|%`e?& z)ygg9YMLR=nf|t@waVgLnS-6^YBz4&x6TJJ(fOo1hp*vhDkX<#-s!Ug75!lW4ufw> z&LMw$&2*E<#iB$xK&1RyiO9u{Vj-urHq=K>@l15z$S42Hz)sU;%oe*Ag;lSfw4vOK zg&e9EqU&x;h#|Bd^vcm73beFa$uwf%a#M~fS$T!^1ZzgdirAF9g{mQdcrYR2rZNRL zZaZshZzW?;3umS6{L~tW`d=8CQup2octA`{JX;K_KZ&%a8iHk^;Y2Clj(jmgb=oMm2l69H0uIkpF5m z%@v1I4+~N7b#-XXfTO5W!jajl7Zr`;SR*8Shz#tn2@8~|lP<+y`aJFav0B_S-9>OT zd~rZRG$Xgao;qW8b(2;cK8|w!cw4_$2raPZ@-Af8gHUJ zI1#5FNvL8}e#o`9ZE>9NdOTO7obqcFC+H735I~N?-{h>?EgbP6)&Jnn)Y8Obw^I~I z-W|vKMZzZmD3_G~H|5sMS1k&>L5|q+TJIe8dUUOvXR1FSehrMgl=3g2cr=Otq0SQ z2Sc%AtkDKlQ;%W*CUz_W(koPy`@x`5vl*I^)?+}iyS5nk%=n*o0pR9lM_{LqvZGZk z!&1Q7FYm9dfe}J@po1U(KeKXX>ct-I!Op=3@cMK7H9N2*?%$Ri)57KX`nm5Fg&njB zFct!!HSc|`3my6P=e8dzL=~F&xb5j~eY1F*f{rz$VkmtaB2Wa~JBOG^{`*b~1ykzA zJq^4$_~K9+CkLbHD2!i~pny7~@q|>3KePV|Y5FSxG{`m#tbGj8UXyh7K$kAM3xpH( zl{E`K{;o8l`RH@!;q^A7d%lZ0E~zN-oJ-AY`CAx!j|=3mjwvK_jotM_M^iZlie)7{11@gmz_Nvlz! zo00jsOW;LZjrlvowP?B31cwbNTkH3}vUwo=ze3pcPJSvNKj6On;vS7&^m6&`Q^br{ zq8VB*B?3MQa5<$=3~!L|*;8#+f7GqNibsq1@mT;}UPU$yn&& zYsI?t5sSms)9^@A(0kca;~J`LAreMzO``11ie2wm;i8b*{AaCtk=i_}oRL_}@&gVf0f>l$nm^;Q7cA$+^v2 z)B?y{);Ihhf77UccK~3Zwvj#3cN(6QSa$j5r$rBoFjsYtcV8vgu)=mu6g9eHP?Nn2 z!sbgQ?~?BRG6}0+ne)O~%p%*{Nf(lBT}aVZODZy6Y1*=xb&O~IHk2;Ob4$?m^!tw` z83R)lHX=z10ACAp2mgiIdK!=Ul865*Soz0{|3s!S7_HiiHT>^t^T_D*?5`*P21blF ziRqvJ-16Vhr`2^zP5=fB|2uYV%CZSDbc+6af|`*nn$fLJ=KVW-Qe{S$F%n$Fi)*ar ziUSvXfq4Y?6B~a_V?U0bZY{EZA(~=)xe@EsVZKOW$z`S*Sov>|&eAPo_7-2QX|i)~ ze$c${l=x78ha!j1?$KQ|sNP4!^y&U6#jA_kE}x=b4$EHvm9qba=$VOW5vs2S` z4&B*u{D{e@s9Nv{SLy#&LGmHNGM&`+zs_&!zZaw-9pE!76hTznit+ygfn)1p+4!Cv zbo|cxt=-~l@X_$!OAJtb|5MHX+tv5KEa?qd_1|vcwrOiM`?0xlDYSI6$|)mG z!y{?5mbGj7Q#(H_mv}c$Dk5>|1T5on<@8d@SUh6QrlL&If1eqYG53~f_LjZVc~<@L zBmM3Qf_`)Qqcfj*@t8-ud(ka1l8q1Tt3Naw@6Nl3Xqjx%JT}>-gtgQkVcJ=!FPmGf zej6tsKkxn~GQJaG_2fxi+l}fk#zhL3;Q#?j9+)2jthujxRkCaAgp#G{LG+%IRMFV8 zgOl@Jsq9t0=B<;Us~j#Q3IrK5luzYbS`DIJ^OA*^?ijWKi@r7VkIrGrR(%g2^!X(_ z^oGc)T|IYAui^7*Zn%mU;&)@=GO<2max>4|D&aaC8XX8|RsTgX8r7d%BUfw$Hh{dKCFo!O^@)dcV_lDbrbYtpa6y}`W9fwWiWmg zy3*BEre0QhWjI-N;J69wGh-@~-HUglEK)5zBI3T@XbOYwvG&ksB(6Oua?yL?ZL6tg zDtHf2K!tClKLz&k?JXV{9FE3f2;s&6qei&q?3<2*7fuzHgFU|uWw`6trQ@IO)DAP! zGq)!5ajL6@e{zUc3zrCIN{S^udKs?r?k$f~GczH2s=wJc%k8%DIHE(kTul^eUw5SX(-4!LEnExzEJx`YBv%Mz5#ZZKd2juuaz$U*YY0qP zHWqxehv&4}g-9myg5Q}^Fc)p3xN5n)G#QXY_Ln5IRK#>|gtG1a$scT}rJ5w5Nqy>LE}QDVqMl+MkUTCy0-m{BMWw6LO`NwrgauZaJ;!Ft#HO~Kt}Jt*?2ao7-JXuG=8RBG0=>r8 zVh3yvpvO^`@w22Lds8(84>QPlpDt;`=V-|_Ck!?C@yP63FsA3``cH4_nL?fwH0ihu z%ldRqHv?2_mtF<6@M`~Lef<`N4qQZFc$TURIvS zAX-6(1%1rZh6LMu&wa78kQ;&Z;x>ZA7|o%lyZvOUfDC3XsPVt#Py=$(DrNy(`0k)3 ztYp;v_)1aqODXU}bBDnpn)IrR$l}~eEs%z#XEvIXBn(_*kt^Z$pi_-b{Jv*wT*ZHh zk^)41a@xeUu2@{jIhKC7=~y!~H6;N3_U+pj*BPtv-o(|9xl5eZtqt8SrCQF<$F179 zu5kBZbvo5{z2-srtTWXiGF813L=h2+!CoU!;u7QBroQj~L`TiS^hrqOl&Z;%46;2X zl7Q0^*(@GmbLHTm+PtJe!Dz_B!h-wahKulR z<~HRuO%JlK^A4%?^>pB<&jkg+({|+THX3<@e>ls;S6h^vf)73GOpBC6_>+6Br)HF1q6EKhNc?S!AN?)(JEYZ2JkxU~mFFoW; zb@hE?J$w5CuKc<>eTppS+cMVFPoKUnSX^5AgkbT4!MJN@j$L2vAA8+lXCFSOu~6h5 z)Ma8~YJS2O*s&Pzn%Ufmy1Z`9y=H8)zn2&^-B>*}orQv$nz&xsT3)&|bVyexg)Jvr ztSr1eGd1&3t;PL;{p3KbA3CEjHq(>7xw%v>rSJ{`!_&1B1R#9B)q4JpYSPe-R(UC6XZEj|EQQak) zLSSlY+HA6xT%YcGH)@3W00RS~S+Gt$GDgQtNWGD?2jmZ`zt>Td#TW_ZxMdj!esWS0 zm=}dSaq>3wT{K5tL-j&3)@xvd+FkOJbP+OcJ<*S)b*$o-6VUUG+DUr=;{T9nV&lSj z)RK9lQ)zPOW}ouVeXTb!uB3fANG?`^cUA!fUTsn!7w*i2EHe`abK+@-z_ zQrduZ_TGgGDLHw1aj~O;r6QIiNEwxZSr4KIsj?0%J>1=^KnOwVb8{bqDCST5^ywi* zMU;A7ciuiC#-h;neMPhz z0#`u3mhH=yaV&?el^ltX9ImA1IIgK0jGDv+iL0uN1Ti1o4y=p6Csp@?k+zps3gq_g zW^gjYZve&rh!2QE8LrV$j<#Ft@<*qA3j4qo2Ey$_N3Irg}#P`r8j+>d3( zJ^3=>=};5m3HVtU2;IEgkGB8HK;OWFrJ#X>a0VDEYJ+ z!on7GOk1=kX}1*X+4P!hmPr*^+bkQ`^o-*iYnOTF-@hgRd2ytcc=Q2njPiv4W$Fh*RE9}@3%{gEF)%%mRu zV2rwD?53qhDQ&%ZWI_y;O^)Bhz`n5*vgJ2m02>aJG^F!|^ z`h#^c?^!nD6A=Sb$hN4(b1zJcWzS7x*g+r9%)D)^CnFOK;)o1^LY}O$+C+dyTResD zg;_P9Jh>W?Jn2YH=P;9b@YPpaC~Dub@g{#b`}=06j{Su9uMex zJ#VvRd^`_thX7!4r?mNNS}C}3g1-7S6&qpNV87r+U2XVR22c&I+xK=tJA1~*WBw(N1b+v`*>4ju|K!;4hzOjBY-gC$ z-=O6^4&>T3fXEVtCI>nrkL<83{k4B~%l;9_L5fX`V8Epj`T6;uX)E5}+lxofJBTmK z+?I{Ptk6B%f5tTATAEM#t!*Bc9msqXnmRgnlXegub*xqtOme3^?-TCB|2q2| zEJyp1HkkOU5BhA}jmXd=cy!4^{S_tNCXd)vw1C^BE;x8?QyQvkCB0|cNp6i@szEd; z?9DtNFNwo$3X=1(w9KPNAaFspr>!k0HGY3SXfxITb}asbkixvyC9(G za#^mHM!lU`6$S^dCf5(42o(T$l6Dko?*Y{Q@#IsW`2#P}lpl5Y0Dh|e4WeBw9X+F((a^v) z&;Dq8!0zb$>e1eK9&M-+u*tkUjCL=iHQJ3))lo?V zi1VcSdzTSly8xm4!on-jBW;cN!BP~X-@c`}i%*S=+zuU1s2@V%{m^{{6^=KF^k=s-JP_L=$U*0atV>sK|uAEDUsV$A~V zME**je)sdh&*2}GTRd{`A~s(Id#asM1;_$Cj+w=Mw3y}hoArRK2KL|0!x;07aizh1 z%Hm36V@1AFC3BbFw?tsW7{1w~wqDUTZ)a>$DR5fs04-T=*pUIm?e__c)gi}_0qx1K z${s49)Oa6z&-kj~lUvXE@SB2G(EB(ukt2*b>{epSJmftmpg4b3!On-?J9)R);9O`;CVni%C zYMY|oSb@?_aDkfX@P&nEX{GIJlvxLEIw|3IgmeTotOIZ6!E_?3-p`tr-DNJgo_Kg0 z%$Sr+gd6z}S)hz04Ikg1Q_hS(L7dE#68bl7Q?c+O4z^j z;>C-AGlH7PZ4|{D$q)UPSVED!pElT~_zRvM9x);yp*)+36W3fXIP4!5wqwcous1p| zaGliYVxJ!h*mQ#H&5`Q<#%5c52tc;I_V+O{*sg)7E8mi{u(TwkD?p|3tfRgzKcCoW z{?Kned-nj^2Udrc|BE-s{&h*aioAo@xgTJ|!^6$LF8QNhze}+0sj4c&gCF0&zn|B{ z8ki(0t*F46ot&Ix4b92PA#M+gh*h*bblmjPDR7qQiq7ZLS5y0V zd~&B>;@p$+mkRiw&N2+1V@rkVkmw^Q?()SsrK-Sy>Uq!li zO8yrJqm-piQNXt;wJn%O?QNltsG1Pd+^)=sX_+553!r?v5-I~KqbQ_OoL$`}CvXI? zxqoVA zlldJV5EZ{<%Y5qK;?Bc^H7VBkdVu{m&s14CILPql%JLQ8-a2Q!=Ir7EE(V~aI@}m6 zxTnQwOD6NYITpI!ul|QryIMG8rGGt_k6stt&B02UD7V38N{;J)l{VmB@}7go;mAZ?hclDQS-R(59~QnQG&a{SbNSXS@6jg^wcVaWv7df|`}s{$ z|1z#-3WLwvsm<=(oYrgIjBnqQQERzKh|fkDT6N>Gfvj=tmtkU5VtCL0glBO(+^%(x zw@K;|OE!z&&9^=8Z1hWLE`Lw2&F|pC^Lu8|8rEH|wjq=lsBgYS`KA68F<&T#Rp&f+ zK+|eEVq`T@gM9Q_9KgddY1kj|5Tu9((d>q}G$aJdly?N44-H!6g8wnz9%th%ed9VB z_I&HBB{;#{@VZM<6$j-PI^;zR>cj^Vllaet69RE|!u zJ?+1-I9ikUUuN1bP3Rgz1=@cY$hvO8Y9RH2}LC>R>vD6=@XJ3p_`{qWyYb3y_9y@I} zYEHyK^iMB9ZPS~PlO7#bUW?v38+&{5_5;*%Ut3!PgmtnQ2<*MSE*vqr;>peC>0q=? z>RC1occ^q_;!|H?SDd$z>Or2z(Xw54+QTYo^eRmIV;sxpR)Uu^8?{I4-uIFa0s%e| zO{l^3oB81ZV;#_Qee|+lkK!NQG@!$;xPHZGd3pI)VoUP_ia+kd2eNi6?~?*&bJN&v zCIC)k1f{~l!htXpPp%XfsE@qmuA`-LOiLQF;_(Er@1~+$b+AF#55OpQ*O-V9;IjhRD2$Wx%$fa(cwE5 zw;chmMcFyTMosR8Nf)x)9ULDD6;Brno1ZGDj7WPNdF>G zelWR!*lUp!+}F9=XV~AG*Ge<>wNuKVsf%Nb^A4NjBMmg0uT>@H4CQpnA4UUmD<&My z=L^I*M(1r2rVy*VhNW*^n#9wE-|-U^P?H2e&ZTI057oBDJ)!dF=LhIs84S zJ>_-0LoH5F0CGvGf4N?6v$RB-|8ov5)GMhc&k>%SQd4L%RR0_oH@JcurPNC{!;1e! zl>j>fkXl+^jy;?1EKbh8cuTJNYsjjE@Gd(RQDn5P#TpOv>C=U6ZXqESnmB94*_~sr z1fUT!8QGKSZ^})mN0#;>Eo}ELE_{sj6vHY*6DK!6oF4@USN(GG&1s^BoLVk!-;mqo z&0Hb)n$lSJj%?;J3<#Y?jgnB*K(4zbjqf(HVbYnGvr#}3{ci~8jl955=?^Y0F8)lz zEJsA7zK6;)-!}P^D&xYPM(>%ggU7eCA#p5jGaD}~`}K}*P6h$+kR*o%ju@HJApihm z<-1#Ua2(TN^BS*zATyqT+EVSzfPqG-)-Pu`xgz5zsP-bC zy;+cDdEu$1V=%UY-wsS8uN%NuUJ8#*xah}YRi{8mqjZi zI^g?|>wBHe=zv>t^~d9qI9ZG=icKLMQLqb-+aHAA-{Q4g2bJK7L|+hNusNH%O8Q-m zRo3y9UVC);lf^rBgH!rx?*?~`6h73X?}Sy_)b8|&)cS}JXB9l312!dUG3(;r>ZvKz z&SrM)SX|0@kyQQOE-v%Npe7A~qgcV6yLS^}pWft!M%FKY!ilcPZ@Gzb;d1c{lXEb7CaXf# zDkNV-T6*{;g`l!fohW`VhEkRj;4*6V6_bH5olytbs9T{<_mdM+@=^L^vGj-LFGwoY zh`-ChF#>7>d{7)v+qoJ)9{8%^U5Ir>3F1U|H|wIKFUurl%?EQ*>2`mPNI~bN%hCZa zcqZYa`O|IG+fywyaze7*Jp|RtR2eL<_DMS=%lzX%ya5XPw+;2DP!Dw8Kj3{n#rkUO zzO&HHPjJlY(+%U*TK?+2$Dz@)hslb|ut*TjrJ=fUb)c0xdd!H6V z+(nBCSMYfLF@RAlh8|*WD*#Gt4m@RpTnB+zKE-Ph?g&ZzMD*zLEyAg9@!x*jDDGl9@z+C~gRT<=^HR?0xFj1qEu!+LjuQ9JYbYIf>T+wscixR=zh@sdmL;~#bI#R=AmKXfs-1jna;nn% zxv`O?`Sj^iRX)3-Q<8`Bfz>RsU!$F1@*V3c1_t4onVIex&bmiYQAEZ`C(l?iHe70c z;o=@K5sFO==}3Ie%zOk0m8BA>)p2p$%z9BSk#PE66u+NVzEzlUTSjehreSw{Y?Bv1UV-tW!cY23i8^L z?mP$06@i<~>ShJpDx)_i7ZLmQm}h4WL>-03$Vj1)phQs;tIsIV|**1u*2sCx+j75^?h~&cty>as4Z@{rWOf ztF&w7Vn)K!Lq)-uAKR;|Xlt{06^!W9l#RgfOC?{9&?x5d5Y*Mx0h4)3yXuR)7dtaE zGvBuQTTPV!&{N}f?0Cf`x&CGEsnlNk5i;LR3-q9j9rNmW3*f|$LnW^?Pm@4^{rvr) z^H6X@Br!1au*t#RO8<8X08X^Ida84cZPpN_^WqpuC$LUXWwxX8(o!Jn?OH#Up+?aQ z)SR)NrRD0ES#5U*m9zAT@83VI|1gcZm6lp~bv6FDGWq>Wf!W^XK4kd4KY}=;ufG`vA z3bA|L*@%kBn`TXSgt&CbLVXqe!ZTCr4fL?Q9UQpsb`-I^UA4qcQp!Sj4-E~WNW_Tl zh_JWJdNoF#ZkP2m+av3$$_ypx!AX(;R*ZR+eGR5zociz;e9!!!)ea~!tzy&ISRBGz zhaB;!MUWqQ?=KJjFU#gVdtN5{0C3^6Weo~kX9Q73gWpbTYXBlnM?Lc7!gSE7t|mCu>m zpB1*{B~fmgV4kgkni}I{>0OVyJ)hWh*f@&q%~-Yk@Lo8-%D)-b5w6Z6=*~^MQeeKY zS!r`C^9RGC0h;6PJ|CX@aUe<|E$u&;lJ98(ZB!0`1s{H>dTCB@8(Se&w2B!mV)O0g zWqie_47-`9pcAJQxJln#*=;Q>xc2oG;{Q$QH=&P^eet_6d7^(K&`_wHcr69`+AL>=S3bK#C)*QJ#JM3MZ_}KVDGD9<)~UVqAkb)J*SP zC{ZqlrTm_Ikd@K(uRc*#^(!wgcL%*8%$Nc??d(%kJu@VqkWNJiXO#21p6z_}3}}&1 zYg=1V{2nGb(dBA~+>s}@P{{GCqvcmuNogkA>bX8yzUccHZQs37o}$xz+6VOtmw4{{ z8=)=j&@zOP*jT(jc?8pZ549^HFm9yPme}OFKs5nQm^Q*EV6}F8;*R~<@6`xMnu@{b zO=bHr(g;u$g{>7=S+Bo-&JTrrq4F>%cphOWi*xF7&3qGn&{vyjWNd0iKBw^vAJxsH z9?Mg>-9u|5@*xyt`e&eo{h<6N((m%-J0LC4E|M8*ubmVQWox2GqcBr%oXSHZcH*nS@CVD zzl}8v08|4AvX7tdAZbGm%x(<+D*D@$fsp>VGbH|J;UBWpo?4ra1&~~}k6+3Aus&Gh zoIAqsE6DW=R9&VnT{rhJ>>1b>z1H==%>i;V@GYr-QBn z@Muh*0!Y(S`MKkUThn~?H~$$Up`b`azaYH&oUdg5;KWFTsbL1SZa|B|t&HV7x08Oy zH9*AsK<5(>kIO41tZ4e)3wM=&k+<6K){!-O98v|+eSfTyD`amnZ}9a8f+~uPfwFE{ z@_iELeJ?6d>@h!#TUqrfkOD4C0HieyZO~L8iMet4y72En^)e#HdZUGr}9T8-v zysg}BZ7-~%I(u^p!LEm@(Ee)i*q^;qP^*-be_if3%%i4H(s}O4Mc#Bwv-+F5{cJYw z*KK+{$!NT?i?nMb(G`mtI;2Ya?5&_%bgYoa_-XlOI-oyikxyu<--cMfUhXUwNH22| zd`5-FhblBX9|qAz#`+%r*DJWsX^u`syq`i8d`y4JQgr|-Vg%#cba*2lS*|{RG4--M z-}pQ4VOr%EVxcy6a7ODNEb3O0F?Ez`(!yW#>MXV>n&)0o&s=?gBmljRft7!Ec?fu; zV*Ae`JuX`kmJi8z9NvFvgT@OL=72Wayrt{82KpH>xvPZHO!Jm{Aev z1l|~075K=mS+ocmOse)}I9(kp{JdeX<&^ilmDV+KMVXaWK}sXv!4NTPVCVIuULx;e?2tG9Ncwdf;%)g`H&@6`}5L zl0;B6Vw?Yh;!^GM=~>z|ddR+kS9T4)dWfhmcY^;;ks=b~D|*P{5VCsRaA$K(xwBVd z=g7f&LQmT$F+zC9W1}ausq~Tifb_)T{{Onc*sM8EH4P65~t!(%y}VUg!_P5`-6wp zWEvABaojlH!1hoR!}RFu^;e(cpEht^OA3Kr9ELMe#IJJA3;mRf%HJ63oyja zgpaK+5%!I`q`u_7=j4Fz8eq`*T(6wK?%9WQj9?rUV2pUgijE9!C2 zHY0p-u$H&sRdk3jjEY?FGtAr?0=Ip^0g<{n0_0=Fis9xpq@Zv6o_9K~+kQx6H5_`s zc6U#B??&O4&kghEmJ!Zne5I4Nc)k44rz->VmlK~(uaC%)X?1-Nk0kdkpe--ApCh1g zEI}kL&o`9Q3sYRZQ+ovVy&0j3ZAf3PZ_m|RkyyHu0KA(24R6F(2`g9rc?gJ%+ z?#T-;BC^$n`Ly{aCQ%LVpZxjw^{-VQ9Qb1@JZ8Bl@uD(74m_QHy=}+ZhV|^0mxThU zPZW0$8ai|W$@lqV1BP((C9U6j#y^Gi28lS zzy|eY`!lU)IWQQ7uO|h8?OVi!qD!wb#;N}~o7?W@H~R z64CiAb1vt6L=bE2sbkQ`NHNj_MfBy^W%%X1bgDOvMFX0b4=rMu9v$ltoxlfQ>u6NG zy>ZHKXXO$bc_Jn5#r(ET`$8v_bgY6BIdy-oiKmgo_t1J54qrC(%Tq=(+!dhb97SvM zT)MnONX#vjG#ch%Tr8uDp3{X~tPmJBb~KUjez3=STWerv5OsoPPmWl0ZuC~hXqf>s zGMZr9tTJSUJ!jp<8cnA4si76tPjV%={w09|*_lgkKjKNZ>yC^I4%@QE`_tP4+%75? z7hUI_hq&otb7NJRjf~zD@Z}Shiz@J)F4^s-6;HjNc)Q*&r3jiBwGoqL)QD%35k-B* zei<(?cI!k#Lq+`~t%ir53HvC3zaBcDX?AGW3hRWs zZ0p7Ni-bGgurF%B+U7jQrCYO>)V&c9nR>&a@>O#Rw+ZY-FA44E6lH#LFd zmgR6BdL}oQGE3JHM-aER+2mbB#1^5kaH((I^s?dYl0eRaCGP3$TQ=@CWH&L#1BBD@ zP%Y=oo>5^wC4ERF!Wv7raFLc=^tceS`;g;_a(~?p+@b&{#iJ4=v(2{Wy27G_>i!MF z8dUpXhU?~G6|Qp;CbzWsHRiEa)_3Byj%Pte#f_PrCPKL1vHu*Sb!{8|g@$0+{fGCO zpxV%@**B3!<7zK2->kRQI1^iF)~$qN9@Cc5)#Mdk*$ydMv<@6Xc!;=}#$t8{d9;Rc zo)-ZaHdfrbZmL~4b+qzRXTiFM?I9LF)M^HHV@D7%1WypYS-2%SSC!KkXWz7+#xhs7 z-Ff+8KIQ5lOzPq&Wx|*7(r<_O>ux*-*r{8%ags&cn#bYDd9Gj-&Cv5&oQlZEG=sa% z#Jh{kRFW|-`ogVX@eW*wK;b%?(R79J`J87A;!FlZ6n_oSm)(+na&bfdsn0fDSAqup zIP)<+^k90KD8O^?q>YmpU9GU5#R=KJR?Efh*R)fCkl*H8QXKhcVn{Fqn1c^y)|Wt zbXSV62lW2ZCkjc3#~2hcc6&0$kr&rFmDtWOO)>i}%y(1{m=TfV>&&77VlK3SygVfP zu=g0p1jBW&@!=)&$C1AN zi|BtL<=B5isB`=C!Pv~a&zWLw06{WUbK}^J`r}st1Rp3KHrTI5kb3mIL`KE&5qyh< zc6%GP3bVS0DJDV}P1LWya>c!)c!eLXAlfK0Tbjz^fH7H*pL@zN@KX%-g9EL;2;U7s zdSe!DW#Vs7=NAIn8aWX4*C&d&wq0rchiC7q2>af~9n(QTCf-&#;!POOY6Y@@X zM&OH8bjEb+QQ-J#R|f_BaXpCU|(eeDsnIoDe=3&j25!pF>4}*y@+3 z$!c4Tfoq2T8B6A}G$+@5)K4Jwd}BED{$k9V9Xg&Z`TS?9V2X#r+*}{7D%Ez@tDq}9 z7IJYpY4}0e2Dghca!FB_0~_v{l5}d=HYR+L+-GFjSWoPBiU)icF0U_i2l+EYLaUw@iAoRfs0UR@ z>+NKTbZf|@AqbyG%_+A+J5zqJFBf^MR~8!jFK6Grb)R}C5x`P6H(rW8_Dal&7DM|3 zw&sWKui639TwJ-uO0;Y-lz(GJf{r5Hmp8BIs{ zHp{0Lqs!Kz=~V?bc&D5^ZdzjO7h|1UOm#Ke62B<+xM(1+Jm)c*#%K&`z^F%FU1D;1 z6tkoCjbVTf3TM(bV(}!3a>X52Y`_cI4|cPA0pTgZ+I^N(mZ`239_uYgt>Hxm_2VxYb0Y9&WDB^JSRF>+?RG3b{#iJk%I} zLFdKr$luhJ-s%fR1Et|!1LbxeRq%J-pqfKE8u?B4eA_w*gnUr$p~MsEiMMM*jhex# zk=n119%#HS5W6`KujhNy>>7L0F6NJWndNsmf5}@|Qb@L~DN1=^X4kmFT|LLWvM1?L zgHAs_*V=#ghrv5otk>O3R}OsWIc*vJWbk2;v&Dp%8R_nt1mdGa z_eVaQnA7^&(9H}kbFz=nMD()V^b6(M2DAq!G>FHcmmlXEu&^Kb7O~CYtove>L!ct! zlc36UesoSD=y=_&6Rs$s)6nj>gNX${og z$C;DQ(zzoxGQ{jR>Vkd*XofN8mS=(KwSKtZ+@cYUAHh75Djm!9EawlOP*3JotCKA)rcY@ASgO&I%0 zpHN(wxIw%n=$Hrm&O%q%>X*cb5#4;6Hw-Noa88mK(^xtmXtKdi_Fv%nIM~@`M8e@E z<%@iWd9t4f-UOCeU4VZ;j;hiof?quK*vFRp6 zE(fiJ!7)X8^N^L7?+V~-iIU?{v&fEt*})*?R@uS_27&YjpF8LaGBid$E zI;eD)qvfB;Bgkd+kUOhXULG%hvF3EgE8Y@59pVupJOd$|B5Yy}hN5E;9G8UBm-pyc zp8&qVFi~PuwcY72b~cj0twIR$ z7z0{>HVYTOn5gh!%NPA5%4O$6j+{B)rS!|f#}L!P$~{FJ;DsV@`??xnUK~0#p3h>0 zYp-a~@8VJVM#Cp?-ZLuWjKYQW0OXKt8!dUB5#N5z9B0?(=O19cx*s+P`rC&L`Z|NmoJa?3^ zl_u7S0*2Xq`bE}^?U!vkurpg-^a<}Kcu>DCTK68A*Oc*&GUo~Q$kC{T0lz2Yc>0n6 zZm=r~RLsI6U&P|trxE{&cNTQT3u#@Ket_9(eKKs5VZ9*i$N!Fu{ep8Qh(@p!jT4$- z*sOVa|4D2j+hWm(3Zksj`)BT2>q}h)#0AB*hLh0R=FU`QFDbPK%7|05w}4rR%{~ui zYWItvw`dx+J0?|a*oklFi`#< z@Ob_+#Q#5>vj05A|I1HNdLxFOF1fX4b+|HK=PR}fSqRfczaMFQn@!<9iBq#0`Cemn zd>2i?mwfPgHcuJ0?exug(N_FBjEVl$KY;DV1qCf0tg?TWo zT6;#PRisf54=ARaO@0Ns~o{sipM=1xUeB2=(1Mt1LKK?7wcy;rl`yZH}C7>7d z2ZLr?2G9o#D%dtxQ3s)p4a#MdYesbjgBG&kbrT`R?h>*oq)NRGE3vWJ9|1X=zgom!2?@M-Zb=bZy4)e5$7tuec#` z7Jfr?MxoQ7CV6as_QDX4<_p~EiAxg(Wa#`e>kfQcHShxqWX2D1=>rB+=I^l_hU`TJS;V2X&}r+>kD2bps=d7euDGX0&S z6Bm!~2@%WP1oWB`QsOT9<5kh`Bso6t3>FC2xHgLbt_`*po5uU^`9r&u5Kn0ta0&2; zP_?NaM)Fs~^J6){C1|sFz$F-jL^%I?sFM19G1nlXxTEB!4L`)CC$HXSmieaoG_db$ zRYSy#pALzF%lna1W20x-K)3f(oFwF^u*o@m-#5A9TT=qnziAg*E@)g4`!U~%;++8m zVLT!7YUJ*+`M9daY@licdHpJEzudV6&!{*Z-Q}y_n@odHMRzneZlS5y)oL|JVYUg9 zv3Z+h2-nMR^DK~|pE)ca&Rw0=A)#q)mgee>&x$@~`uJ!WIDgJ?y7P0#-l^j{m?oR4 z=)#2H;chZQ#U`ANK@d3%>?Jq;xt}&Z@3G;c<iR0ND0#K%5kvMcNp24ugKD1+-b~n~8ussdu2+3IYw;xxyhF>Oh zxm2R{><{;RI8aGI-?rdw*j%MY?Rp^N+FGy% zJ8%S{-^c@HBkR_C8u}(k2{%-!3u_+&;he%?|I8Lc_L#mny>=R}F{J5)2)tnE8GqU6 zlS`-sSD&MGO#2S^HPBm?RDXx_REhb^+9Ve*hEX-aF#b-F{95oFlxtiytXhK87seYq z&LD^Xo}dp~ae$aJ6MmL?;U& zC2iw@vNl?S7>lv&HV6gVH%(w=K_JAo%Z2^c*fgKFlCR7?(yh9jn^Fy%v4p(a{QM<4 z(f_pu^TtI-X)Ir=xt^Ust@=9za?T$0+llcA@QwTE!_U3@qg|sCpA*sL zB<0Q zL%Y5xxj}mN`}L)62;F5kVm$xMPL_!Nb?f2Y=gWmFe+@i(u0a`eL~Q>A8-yBM+g9i5 zUfG+^Al{`7E12%XK5c(qq?J1mLu=~1NkNgaJNtDoB>OePi)zp;CbXIHdE2=K%jio5 z6+YNC^d<4o?wXYP!kW}xCV>$3x9vmpI6u!qoM~bR*L=#oC2?tW`t~gE#!zaEeifJ5xV~q6 zl(UOd30^oSk#4+V3XZa1HLd>EBP+aSy*9uP78bV1FqJtb3f0PT??&CKb$DnH__N3P zTGuT`dSA_%U+4(ljYoLgTz(*d$p?iD3=4o)^lvc&=!+a38lx!GVjKCQdF_jCG>hbJ z*nmgk-J5%TU%~lI=j6ND8rzdmnC>vH@n)5hlVh4g8YGD^Ti9p2pLlzbM_z=(BoJ{$ z6MFuws1;*d(1oEMJERQ`{sogQ!xx(BJDo07+-@H5dmv$gj{3JTqt~~j>?B&jP*gy9 z+8jT#GnwQcGC&F~1G`iefBNA-Z)N?aGZO*{l3|XFLcNXi_c_VBE1iYwsDe3`KIU29 znhG96leSSuef<03L+h7{XyAL|gpps1SWutYX1piF5B>Eow>vU@QQuPUTpA-meR7;I zo+c3;^&5=uO#V9fxuXp>>Nj3J4*$1{4SeL+28xzu) kL<0HGAOCp<|J!k(N8Wm@I_sIEf{G$JX{Cqxl1BdjALGIZ3jhEB literal 0 HcmV?d00001 diff --git a/docs/installationguide/images/zm-multiserver.xml b/docs/installationguide/images/zm-multiserver.xml new file mode 100644 index 000000000..c829e1a94 --- /dev/null +++ b/docs/installationguide/images/zm-multiserver.xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/installationguide/images/zm_first_screen_post_install.png b/docs/installationguide/images/zm_first_screen_post_install.png new file mode 100644 index 0000000000000000000000000000000000000000..568d7fcf5c92540065632d59509b0116b72f29d4 GIT binary patch literal 68794 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 Date: Fri, 1 Apr 2016 14:14:02 -0400 Subject: [PATCH 17/26] revert some structure changes --- src/zm_ffmpeg_camera.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp index d67661873..e4d818c95 100644 --- a/src/zm_ffmpeg_camera.cpp +++ b/src/zm_ffmpeg_camera.cpp @@ -123,7 +123,8 @@ int FfmpegCamera::PreCapture() return( 0 ); } -int FfmpegCamera::Capture( Image &image ) { +int FfmpegCamera::Capture( Image &image ) +{ if (!mCanCapture){ return -1; } @@ -153,7 +154,8 @@ int FfmpegCamera::Capture( Image &image ) { } int frameComplete = false; - while ( !frameComplete ) { + while ( !frameComplete ) + { int avResult = av_read_frame( mFormatContext, &packet ); if ( avResult < 0 ) { char errbuf[AV_ERROR_MAX_STRING_SIZE]; From f4fc129ecfb298116b85ffd23ce0f0c821e8cab8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 14:15:31 -0400 Subject: [PATCH 18/26] revert some structure changes --- src/zm_ffmpeg_camera.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp index e4d818c95..f4ce59d4b 100644 --- a/src/zm_ffmpeg_camera.cpp +++ b/src/zm_ffmpeg_camera.cpp @@ -157,7 +157,8 @@ int FfmpegCamera::Capture( Image &image ) while ( !frameComplete ) { int avResult = av_read_frame( mFormatContext, &packet ); - if ( avResult < 0 ) { + if ( avResult < 0 ) + { char errbuf[AV_ERROR_MAX_STRING_SIZE]; av_strerror(avResult, errbuf, AV_ERROR_MAX_STRING_SIZE); if ( @@ -165,7 +166,8 @@ int FfmpegCamera::Capture( Image &image ) (avResult == AVERROR_EOF || (mFormatContext->pb && mFormatContext->pb->eof_reached)) || // Check for Connection failure. (avResult == -110) - ) { + ) + { Info( "av_read_frame returned \"%s\". Reopening stream.", errbuf ); ReopenFfmpeg(); } @@ -188,7 +190,7 @@ int FfmpegCamera::Capture( Image &image ) if ( frameComplete ) { Debug( 3, "Got frame %d", frameCount ); - avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height); + avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height); #if HAVE_LIBSWSCALE if(mConvertContext == NULL) { From 58c39f930e09bea6794888ce3a0f319e690d661e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 14:57:48 -0400 Subject: [PATCH 19/26] revert some structure changes --- src/zm_monitor.h | 790 ++++++++++++++++++++++++----------------------- 1 file changed, 398 insertions(+), 392 deletions(-) diff --git a/src/zm_monitor.h b/src/zm_monitor.h index ad8ebc9da..076f074e7 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -45,441 +45,447 @@ // This is the main class for monitors. Each monitor is associated // with a camera and is effectively a collector for events. // -class Monitor { +class Monitor +{ friend class MonitorStream; public: - typedef enum { - QUERY=0, - CAPTURE, - ANALYSIS - } Purpose; + typedef enum + { + QUERY=0, + CAPTURE, + ANALYSIS + } Purpose; - typedef enum { - NONE=1, - MONITOR, - MODECT, - RECORD, - MOCORD, - NODECT - } Function; + typedef enum + { + NONE=1, + MONITOR, + MODECT, + RECORD, + MOCORD, + NODECT + } Function; - typedef enum { - ROTATE_0=1, - ROTATE_90, - ROTATE_180, - ROTATE_270, - FLIP_HORI, - FLIP_VERT - } Orientation; + typedef enum + { + ROTATE_0=1, + ROTATE_90, + ROTATE_180, + ROTATE_270, + FLIP_HORI, + FLIP_VERT + } Orientation; - typedef enum { - IDLE, - PREALARM, - ALARM, - ALERT, - TAPE - } State; + typedef enum + { + IDLE, + PREALARM, + ALARM, + ALERT, + TAPE + } State; protected: - typedef std::set ZoneSet; + typedef std::set ZoneSet; - typedef enum { GET_SETTINGS=0x1, SET_SETTINGS=0x2, RELOAD=0x4, SUSPEND=0x10, RESUME=0x20 } Action; + typedef enum { GET_SETTINGS=0x1, SET_SETTINGS=0x2, RELOAD=0x4, SUSPEND=0x10, RESUME=0x20 } Action; - typedef enum { CLOSE_TIME, CLOSE_IDLE, CLOSE_ALARM } EventCloseMode; + typedef enum { CLOSE_TIME, CLOSE_IDLE, CLOSE_ALARM } EventCloseMode; - /* sizeof(SharedData) expected to be 336 bytes on 32bit and 64bit */ - typedef struct { - uint32_t size; /* +0 */ - uint32_t last_write_index; /* +4 */ - uint32_t last_read_index; /* +8 */ - uint32_t state; /* +12 */ - uint32_t last_event; /* +16 */ - uint32_t action; /* +20 */ - int32_t brightness; /* +24 */ - int32_t hue; /* +28 */ - int32_t colour; /* +32 */ - int32_t contrast; /* +36 */ - int32_t alarm_x; /* +40 */ - int32_t alarm_y; /* +44 */ - uint8_t valid; /* +48 */ - uint8_t active; /* +49 */ - uint8_t signal; /* +50 */ - uint8_t format; /* +51 */ - uint32_t imagesize; /* +52 */ - uint32_t epadding1; /* +56 */ - uint32_t epadding2; /* +60 */ - /* - ** This keeps 32bit time_t and 64bit time_t identical and compatible as long as time is before 2038. - ** Shared memory layout should be identical for both 32bit and 64bit and is multiples of 16. - */ - union { /* +64 */ - time_t last_write_time; - uint64_t extrapad1; - }; - union { /* +72 */ - time_t last_read_time; - uint64_t extrapad2; - }; - uint8_t control_state[256]; /* +80 */ - - } SharedData; + /* sizeof(SharedData) expected to be 336 bytes on 32bit and 64bit */ + typedef struct + { + uint32_t size; /* +0 */ + uint32_t last_write_index; /* +4 */ + uint32_t last_read_index; /* +8 */ + uint32_t state; /* +12 */ + uint32_t last_event; /* +16 */ + uint32_t action; /* +20 */ + int32_t brightness; /* +24 */ + int32_t hue; /* +28 */ + int32_t colour; /* +32 */ + int32_t contrast; /* +36 */ + int32_t alarm_x; /* +40 */ + int32_t alarm_y; /* +44 */ + uint8_t valid; /* +48 */ + uint8_t active; /* +49 */ + uint8_t signal; /* +50 */ + uint8_t format; /* +51 */ + uint32_t imagesize; /* +52 */ + uint32_t epadding1; /* +56 */ + uint32_t epadding2; /* +60 */ + /* + ** This keeps 32bit time_t and 64bit time_t identical and compatible as long as time is before 2038. + ** Shared memory layout should be identical for both 32bit and 64bit and is multiples of 16. + */ + union { /* +64 */ + time_t last_write_time; + uint64_t extrapad1; + }; + union { /* +72 */ + time_t last_read_time; + uint64_t extrapad2; + }; + uint8_t control_state[256]; /* +80 */ + + } SharedData; - typedef enum { TRIGGER_CANCEL, TRIGGER_ON, TRIGGER_OFF } TriggerState; - - /* sizeof(TriggerData) expected to be 560 on 32bit & and 64bit */ - typedef struct { - uint32_t size; - uint32_t trigger_state; - uint32_t trigger_score; - uint32_t padding; - char trigger_cause[32]; - char trigger_text[256]; - char trigger_showtext[256]; - } TriggerData; + typedef enum { TRIGGER_CANCEL, TRIGGER_ON, TRIGGER_OFF } TriggerState; + + /* sizeof(TriggerData) expected to be 560 on 32bit & and 64bit */ + typedef struct { + uint32_t size; + uint32_t trigger_state; + uint32_t trigger_score; + uint32_t padding; + char trigger_cause[32]; + char trigger_text[256]; + char trigger_showtext[256]; + } TriggerData; - /* sizeof(Snapshot) expected to be 16 bytes on 32bit and 32 bytes on 64bit */ - struct Snapshot { - struct timeval *timestamp; - Image *image; - void* padding; - }; + /* sizeof(Snapshot) expected to be 16 bytes on 32bit and 32 bytes on 64bit */ + struct Snapshot { + struct timeval *timestamp; + Image *image; + void* padding; + }; - //TODO: Technically we can't exclude this struct when people don't have avformat as the Memory.pm module doesn't know about avformat + //TODO: Technically we can't exclude this struct when people don't have avformat as the Memory.pm module doesn't know about avformat #if 1 - //sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit - typedef struct { - uint32_t size; - char event_file[4096]; - uint32_t recording; //bool arch dependent so use uint32 instead - //uint32_t frameNumber; - - } VideoStoreData; - + //sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit + typedef struct { + uint32_t size; + char event_file[4096]; + uint32_t recording; //bool arch dependent so use uint32 instead + //uint32_t frameNumber; + + } VideoStoreData; + #endif // HAVE_LIBAVFORMAT - class MonitorLink { - protected: - unsigned int id; - char name[64]; + class MonitorLink { + protected: + unsigned int id; + char name[64]; - bool connected; - time_t last_connect_time; + bool connected; + time_t last_connect_time; #if ZM_MEM_MAPPED - int map_fd; - char mem_file[PATH_MAX]; + int map_fd; + char mem_file[PATH_MAX]; #else // ZM_MEM_MAPPED - int shm_id; + int shm_id; #endif // ZM_MEM_MAPPED - off_t mem_size; - unsigned char *mem_ptr; + off_t mem_size; + unsigned char *mem_ptr; - volatile SharedData *shared_data; - volatile TriggerData *trigger_data; - volatile VideoStoreData *video_store_data; + volatile SharedData *shared_data; + volatile TriggerData *trigger_data; + volatile VideoStoreData *video_store_data; - int last_state; - int last_event; + int last_state; + int last_event; - public: - MonitorLink( int p_id, const char *p_name ); - ~MonitorLink(); + public: + MonitorLink( int p_id, const char *p_name ); + ~MonitorLink(); - inline int Id() const { - return( id ); - } - inline const char *Name() const { - return( name ); - } + inline int Id() const { + return( id ); + } + inline const char *Name() const { + return( name ); + } - inline bool isConnected() const { - return( connected ); - } - inline time_t getLastConnectTime() const { - return( last_connect_time ); - } + inline bool isConnected() const { + return( connected ); + } + inline time_t getLastConnectTime() const { + return( last_connect_time ); + } - bool connect(); - bool disconnect(); + bool connect(); + bool disconnect(); - bool isAlarmed(); - bool inAlarm(); - bool hasAlarmed(); - }; + bool isAlarmed(); + bool inAlarm(); + bool hasAlarmed(); + }; protected: - // These are read from the DB and thereafter remain unchanged - unsigned int id; - char name[64]; - unsigned int server_id; - Function function; // What the monitor is doing - bool enabled; // Whether the monitor is enabled or asleep - unsigned int width; // Normally the same as the camera, but not if partly rotated - unsigned int height; // Normally the same as the camera, but not if partly rotated - bool v4l_multi_buffer; - unsigned int v4l_captures_per_frame; - Orientation orientation; // Whether the image has to be rotated at all - unsigned int deinterlacing; + // These are read from the DB and thereafter remain unchanged + unsigned int id; + char name[64]; + unsigned int server_id; + Function function; // What the monitor is doing + bool enabled; // Whether the monitor is enabled or asleep + unsigned int width; // Normally the same as the camera, but not if partly rotated + unsigned int height; // Normally the same as the camera, but not if partly rotated + bool v4l_multi_buffer; + unsigned int v4l_captures_per_frame; + Orientation orientation; // Whether the image has to be rotated at all + unsigned int deinterlacing; - int savejpegspref; - int videowriterpref; - std::string encoderparams; - std::vector encoderparamsvec; - bool record_audio; // Whether to store the audio that we receive + int savejpegspref; + int videowriterpref; + std::string encoderparams; + std::vector encoderparamsvec; + bool record_audio; // Whether to store the audio that we receive - int brightness; // The statically saved brightness of the camera - int contrast; // The statically saved contrast of the camera - int hue; // The statically saved hue of the camera - int colour; // The statically saved colour of the camera - char event_prefix[64]; // The prefix applied to event names as they are created - char label_format[64]; // The format of the timestamp on the images - Coord label_coord; // The coordinates of the timestamp on the images - int label_size; // Size of the timestamp on the images - int image_buffer_count; // Size of circular image buffer, at least twice the size of the pre_event_count - int pre_event_buffer_count; // Size of dedicated circular pre event buffer used when analysis is not performed at capturing framerate, - // value is pre_event_count + alarm_frame_count - 1 - int warmup_count; // How many images to process before looking for events - int pre_event_count; // How many images to hold and prepend to an alarm event - int post_event_count; // How many unalarmed images must occur before the alarm state is reset - int stream_replay_buffer; // How many frames to store to support DVR functions, IGNORED from this object, passed directly into zms now - int section_length; // How long events should last in continuous modes - bool adaptive_skip; // Whether to use the newer adaptive algorithm for this monitor - int frame_skip; // How many frames to skip in continuous modes - int motion_frame_skip; // How many frames to skip in motion detection - double analysis_fps; // Target framerate for video analysis - unsigned int analysis_update_delay; // How long we wait before updating analysis parameters - int capture_delay; // How long we wait between capture frames - int alarm_capture_delay; // How long we wait between capture frames when in alarm state - int alarm_frame_count; // How many alarm frames are required before an event is triggered - int fps_report_interval; // How many images should be captured/processed between reporting the current FPS - int ref_blend_perc; // Percentage of new image going into reference image. - int alarm_ref_blend_perc; // Percentage of new image going into reference image during alarm. - bool track_motion; // Whether this monitor tries to track detected motion - Rgb signal_check_colour; // The colour that the camera will emit when no video signal detected - bool embed_exif; // Whether to embed Exif data into each image frame or not + int brightness; // The statically saved brightness of the camera + int contrast; // The statically saved contrast of the camera + int hue; // The statically saved hue of the camera + int colour; // The statically saved colour of the camera + char event_prefix[64]; // The prefix applied to event names as they are created + char label_format[64]; // The format of the timestamp on the images + Coord label_coord; // The coordinates of the timestamp on the images + int label_size; // Size of the timestamp on the images + int image_buffer_count; // Size of circular image buffer, at least twice the size of the pre_event_count + int pre_event_buffer_count; // Size of dedicated circular pre event buffer used when analysis is not performed at capturing framerate, + // value is pre_event_count + alarm_frame_count - 1 + int warmup_count; // How many images to process before looking for events + int pre_event_count; // How many images to hold and prepend to an alarm event + int post_event_count; // How many unalarmed images must occur before the alarm state is reset + int stream_replay_buffer; // How many frames to store to support DVR functions, IGNORED from this object, passed directly into zms now + int section_length; // How long events should last in continuous modes + bool adaptive_skip; // Whether to use the newer adaptive algorithm for this monitor + int frame_skip; // How many frames to skip in continuous modes + int motion_frame_skip; // How many frames to skip in motion detection + double analysis_fps; // Target framerate for video analysis + unsigned int analysis_update_delay; // How long we wait before updating analysis parameters + int capture_delay; // How long we wait between capture frames + int alarm_capture_delay; // How long we wait between capture frames when in alarm state + int alarm_frame_count; // How many alarm frames are required before an event is triggered + int fps_report_interval; // How many images should be captured/processed between reporting the current FPS + int ref_blend_perc; // Percentage of new image going into reference image. + int alarm_ref_blend_perc; // Percentage of new image going into reference image during alarm. + bool track_motion; // Whether this monitor tries to track detected motion + Rgb signal_check_colour; // The colour that the camera will emit when no video signal detected + bool embed_exif; // Whether to embed Exif data into each image frame or not - double fps; - Image delta_image; - Image ref_image; - Image alarm_image; // Used in creating analysis images, will be initialized in Analysis - Image write_image; // Used when creating snapshot images + double fps; + Image delta_image; + Image ref_image; + Image alarm_image; // Used in creating analysis images, will be initialized in Analysis + Image write_image; // Used when creating snapshot images - Purpose purpose; // What this monitor has been created to do - int event_count; - int image_count; - int ready_count; - int first_alarm_count; - int last_alarm_count; - int buffer_count; - int prealarm_count; - State state; - time_t start_time; - time_t last_fps_time; - time_t auto_resume_time; - unsigned int last_motion_score; + Purpose purpose; // What this monitor has been created to do + int event_count; + int image_count; + int ready_count; + int first_alarm_count; + int last_alarm_count; + int buffer_count; + int prealarm_count; + State state; + time_t start_time; + time_t last_fps_time; + time_t auto_resume_time; + unsigned int last_motion_score; - EventCloseMode event_close_mode; + EventCloseMode event_close_mode; #if ZM_MEM_MAPPED - int map_fd; - char mem_file[PATH_MAX]; + int map_fd; + char mem_file[PATH_MAX]; #else // ZM_MEM_MAPPED - int shm_id; + int shm_id; #endif // ZM_MEM_MAPPED - off_t mem_size; - unsigned char *mem_ptr; + off_t mem_size; + unsigned char *mem_ptr; - SharedData *shared_data; - TriggerData *trigger_data; - VideoStoreData *video_store_data; + SharedData *shared_data; + TriggerData *trigger_data; + VideoStoreData *video_store_data; - Snapshot *image_buffer; - Snapshot next_buffer; /* Used by four field deinterlacing */ - Snapshot *pre_event_buffer; + Snapshot *image_buffer; + Snapshot next_buffer; /* Used by four field deinterlacing */ + Snapshot *pre_event_buffer; - Camera *camera; + Camera *camera; - Event *event; + Event *event; - int n_zones; - Zone **zones; + int n_zones; + Zone **zones; - struct timeval **timestamps; - Image **images; + struct timeval **timestamps; + Image **images; - const unsigned char *privacy_bitmask; + const unsigned char *privacy_bitmask; - int n_linked_monitors; - MonitorLink **linked_monitors; + int n_linked_monitors; + MonitorLink **linked_monitors; public: // OurCheckAlarms seems to be unused. Check it on zm_monitor.cpp for more info. //bool OurCheckAlarms( Zone *zone, const Image *pImage ); - Monitor( - int p_id, - const char *p_name, - unsigned int p_server_id, - int p_function, - bool p_enabled, - const char *p_linked_monitors, - Camera *p_camera, - int p_orientation, - unsigned int p_deinterlacing, - int p_savejpegs, - int p_videowriter, - std::string p_encoderparams, - bool p_record_audio, - const char *p_event_prefix, - const char *p_label_format, - const Coord &p_label_coord, - int label_size, - int p_image_buffer_count, - int p_warmup_count, - int p_pre_event_count, - int p_post_event_count, - int p_stream_replay_buffer, - int p_alarm_frame_count, - int p_section_length, - int p_frame_skip, - int p_motion_frame_skip, - double p_analysis_fps, - unsigned int p_analysis_update_delay, - int p_capture_delay, - int p_alarm_capture_delay, - int p_fps_report_interval, - int p_ref_blend_perc, - int p_alarm_ref_blend_perc, - bool p_track_motion, - Rgb p_signal_check_colour, - bool p_embed_exif, - Purpose p_purpose, - int p_n_zones=0, - Zone *p_zones[]=0 - ); - ~Monitor(); + Monitor( + int p_id, + const char *p_name, + unsigned int p_server_id, + int p_function, + bool p_enabled, + const char *p_linked_monitors, + Camera *p_camera, + int p_orientation, + unsigned int p_deinterlacing, + int p_savejpegs, + int p_videowriter, + std::string p_encoderparams, + bool p_record_audio, + const char *p_event_prefix, + const char *p_label_format, + const Coord &p_label_coord, + int label_size, + int p_image_buffer_count, + int p_warmup_count, + int p_pre_event_count, + int p_post_event_count, + int p_stream_replay_buffer, + int p_alarm_frame_count, + int p_section_length, + int p_frame_skip, + int p_motion_frame_skip, + double p_analysis_fps, + unsigned int p_analysis_update_delay, + int p_capture_delay, + int p_alarm_capture_delay, + int p_fps_report_interval, + int p_ref_blend_perc, + int p_alarm_ref_blend_perc, + bool p_track_motion, + Rgb p_signal_check_colour, + bool p_embed_exif, + Purpose p_purpose, + int p_n_zones=0, + Zone *p_zones[]=0 + ); + ~Monitor(); - void AddZones( int p_n_zones, Zone *p_zones[] ); - void AddPrivacyBitmask( Zone *p_zones[] ); + void AddZones( int p_n_zones, Zone *p_zones[] ); + void AddPrivacyBitmask( Zone *p_zones[] ); - bool connect(); - inline int ShmValid() const { - return( shared_data->valid ); - } + bool connect(); + inline int ShmValid() const { + return( shared_data->valid ); + } - inline int Id() const { - return( id ); - } - inline const char *Name() const { - return( name ); - } - inline Function GetFunction() const { - return( function ); - } - inline bool Enabled() { - if ( function <= MONITOR ) - return( false ); - return( enabled ); - } - inline const char *EventPrefix() const { - return( event_prefix ); - } - inline bool Ready() { - if ( function <= MONITOR ) - return( false ); - return( image_count > ready_count ); - } - inline bool Active() { - if ( function <= MONITOR ) - return( false ); - return( enabled && shared_data->active ); - } - inline bool Exif() { - return( embed_exif ); - } + inline int Id() const { + return( id ); + } + inline const char *Name() const { + return( name ); + } + inline Function GetFunction() const { + return( function ); + } + inline bool Enabled() { + if ( function <= MONITOR ) + return( false ); + return( enabled ); + } + inline const char *EventPrefix() const { + return( event_prefix ); + } + inline bool Ready() { + if ( function <= MONITOR ) + return( false ); + return( image_count > ready_count ); + } + inline bool Active() { + if ( function <= MONITOR ) + return( false ); + return( enabled && shared_data->active ); + } + inline bool Exif() { + return( embed_exif ); + } - unsigned int Width() const { return( width ); } - unsigned int Height() const { return( height ); } - unsigned int Colours() const { return( camera->Colours() ); } - unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } + unsigned int Width() const { return( width ); } + unsigned int Height() const { return( height ); } + unsigned int Colours() const { return( camera->Colours() ); } + unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } - int GetOptSaveJPEGs() const { return( savejpegspref ); } - int GetOptVideoWriter() const { return( videowriterpref ); } - const std::vector* GetOptEncoderParams() const { return( &encoderparamsvec ); } + int GetOptSaveJPEGs() const { return( savejpegspref ); } + int GetOptVideoWriter() const { return( videowriterpref ); } + const std::vector* GetOptEncoderParams() const { return( &encoderparamsvec ); } - State GetState() const; - int GetImage( int index=-1, int scale=100 ); - struct timeval GetTimestamp( int index=-1 ) const; - void UpdateAdaptiveSkip(); - useconds_t GetAnalysisRate(); - unsigned int GetAnalysisUpdateDelay() const { return( analysis_update_delay ); } - int GetCaptureDelay() const { return( capture_delay ); } - int GetAlarmCaptureDelay() const { return( alarm_capture_delay ); } - unsigned int GetLastReadIndex() const; - unsigned int GetLastWriteIndex() const; - unsigned int GetLastEvent() const; - double GetFPS() const; - void ForceAlarmOn( int force_score, const char *force_case, const char *force_text="" ); - void ForceAlarmOff(); - void CancelForced(); - TriggerState GetTriggerState() const { return( (TriggerState)(trigger_data?trigger_data->trigger_state:TRIGGER_CANCEL )); } + State GetState() const; + int GetImage( int index=-1, int scale=100 ); + struct timeval GetTimestamp( int index=-1 ) const; + void UpdateAdaptiveSkip(); + useconds_t GetAnalysisRate(); + unsigned int GetAnalysisUpdateDelay() const { return( analysis_update_delay ); } + int GetCaptureDelay() const { return( capture_delay ); } + int GetAlarmCaptureDelay() const { return( alarm_capture_delay ); } + unsigned int GetLastReadIndex() const; + unsigned int GetLastWriteIndex() const; + unsigned int GetLastEvent() const; + double GetFPS() const; + void ForceAlarmOn( int force_score, const char *force_case, const char *force_text="" ); + void ForceAlarmOff(); + void CancelForced(); + TriggerState GetTriggerState() const { return( (TriggerState)(trigger_data?trigger_data->trigger_state:TRIGGER_CANCEL )); } - void actionReload(); - void actionEnable(); - void actionDisable(); - void actionSuspend(); - void actionResume(); + void actionReload(); + void actionEnable(); + void actionDisable(); + void actionSuspend(); + void actionResume(); - int actionBrightness( int p_brightness=-1 ); - int actionHue( int p_hue=-1 ); - int actionColour( int p_colour=-1 ); - int actionContrast( int p_contrast=-1 ); + int actionBrightness( int p_brightness=-1 ); + int actionHue( int p_hue=-1 ); + int actionColour( int p_colour=-1 ); + int actionContrast( int p_contrast=-1 ); - inline int PrimeCapture() { - return( camera->PrimeCapture() ); - } - inline int PreCapture() { - return( camera->PreCapture() ); - } - int Capture(); - int PostCapture() { - return( camera->PostCapture() ); - } + inline int PrimeCapture() { + return( camera->PrimeCapture() ); + } + inline int PreCapture() { + return( camera->PreCapture() ); + } + int Capture(); + int PostCapture() { + return( camera->PostCapture() ); + } - unsigned int DetectMotion( const Image &comp_image, Event::StringSet &zoneSet ); + unsigned int DetectMotion( const Image &comp_image, Event::StringSet &zoneSet ); // DetectBlack seems to be unused. Check it on zm_monitor.cpp for more info. //unsigned int DetectBlack( const Image &comp_image, Event::StringSet &zoneSet ); - bool CheckSignal( const Image *image ); - bool Analyse(); - void DumpImage( Image *dump_image ) const; - void TimestampImage( Image *ts_image, const struct timeval *ts_time ) const; - bool closeEvent(); + bool CheckSignal( const Image *image ); + bool Analyse(); + void DumpImage( Image *dump_image ) const; + void TimestampImage( Image *ts_image, const struct timeval *ts_time ) const; + bool closeEvent(); - void Reload(); - void ReloadZones(); - void ReloadLinkedMonitors( const char * ); + void Reload(); + void ReloadZones(); + void ReloadLinkedMonitors( const char * ); - bool DumpSettings( char *output, bool verbose ); - void DumpZoneImage( const char *zone_string=0 ); + bool DumpSettings( char *output, bool verbose ); + void DumpZoneImage( const char *zone_string=0 ); #if ZM_HAS_V4L - static int LoadLocalMonitors( const char *device, Monitor **&monitors, Purpose purpose ); + static int LoadLocalMonitors( const char *device, Monitor **&monitors, Purpose purpose ); #endif // ZM_HAS_V4L - static int LoadRemoteMonitors( const char *protocol, const char *host, const char*port, const char*path, Monitor **&monitors, Purpose purpose ); - static int LoadFileMonitors( const char *file, Monitor **&monitors, Purpose purpose ); + static int LoadRemoteMonitors( const char *protocol, const char *host, const char*port, const char*path, Monitor **&monitors, Purpose purpose ); + static int LoadFileMonitors( const char *file, Monitor **&monitors, Purpose purpose ); #if HAVE_LIBAVFORMAT - static int LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose purpose ); + static int LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose purpose ); #endif // HAVE_LIBAVFORMAT - static Monitor *Load( unsigned int id, bool load_zones, Purpose purpose ); - //void writeStreamImage( Image *image, struct timeval *timestamp, int scale, int mag, int x, int y ); - //void StreamImages( int scale=100, int maxfps=10, time_t ttl=0, int msq_id=0 ); - //void StreamImagesRaw( int scale=100, int maxfps=10, time_t ttl=0 ); - //void StreamImagesZip( int scale=100, int maxfps=10, time_t ttl=0 ); - void SingleImage( int scale=100 ); - void SingleImageRaw( int scale=100 ); - void SingleImageZip( int scale=100 ); + static Monitor *Load( unsigned int id, bool load_zones, Purpose purpose ); + //void writeStreamImage( Image *image, struct timeval *timestamp, int scale, int mag, int x, int y ); + //void StreamImages( int scale=100, int maxfps=10, time_t ttl=0, int msq_id=0 ); + //void StreamImagesRaw( int scale=100, int maxfps=10, time_t ttl=0 ); + //void StreamImagesZip( int scale=100, int maxfps=10, time_t ttl=0 ); + void SingleImage( int scale=100 ); + void SingleImageRaw( int scale=100 ); + void SingleImageZip( int scale=100 ); #if HAVE_LIBAVCODEC - //void StreamMpeg( const char *format, int scale=100, int maxfps=10, int bitrate=100000 ); + //void StreamMpeg( const char *format, int scale=100, int maxfps=10, int bitrate=100000 ); #endif // HAVE_LIBAVCODEC }; @@ -487,47 +493,47 @@ public: class MonitorStream : public StreamBase { protected: - typedef struct SwapImage { - bool valid; - struct timeval timestamp; - char file_name[PATH_MAX]; - } SwapImage; + typedef struct SwapImage { + bool valid; + struct timeval timestamp; + char file_name[PATH_MAX]; + } SwapImage; private: - SwapImage *temp_image_buffer; - int temp_image_buffer_count; - int temp_read_index; - int temp_write_index; + SwapImage *temp_image_buffer; + int temp_image_buffer_count; + int temp_read_index; + int temp_write_index; protected: - time_t ttl; + time_t ttl; protected: - int playback_buffer; - bool delayed; + int playback_buffer; + bool delayed; - int frame_count; + int frame_count; protected: - bool checkSwapPath( const char *path, bool create_path ); + bool checkSwapPath( const char *path, bool create_path ); - bool sendFrame( const char *filepath, struct timeval *timestamp ); - bool sendFrame( Image *image, struct timeval *timestamp ); - void processCommand( const CmdMsg *msg ); + bool sendFrame( const char *filepath, struct timeval *timestamp ); + bool sendFrame( Image *image, struct timeval *timestamp ); + void processCommand( const CmdMsg *msg ); public: - MonitorStream() : playback_buffer( 0 ), delayed( false ), frame_count( 0 ) { - } - void setStreamBuffer( int p_playback_buffer ) { - playback_buffer = p_playback_buffer; - } - void setStreamTTL( time_t p_ttl ) { - ttl = p_ttl; - } - bool setStreamStart( int monitor_id ) { - return loadMonitor( monitor_id ); - } - void runStream(); + MonitorStream() : playback_buffer( 0 ), delayed( false ), frame_count( 0 ) { + } + void setStreamBuffer( int p_playback_buffer ) { + playback_buffer = p_playback_buffer; + } + void setStreamTTL( time_t p_ttl ) { + ttl = p_ttl; + } + bool setStreamStart( int monitor_id ) { + return loadMonitor( monitor_id ); + } + void runStream(); }; #endif // ZM_MONITOR_H From 89598da5c13cd1f52203b92cc7788e3879721e7c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 15:30:30 -0400 Subject: [PATCH 20/26] undo code style changes and whitespace changes --- src/zm_ffmpeg_camera.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp index f4ce59d4b..ce652bc2d 100644 --- a/src/zm_ffmpeg_camera.cpp +++ b/src/zm_ffmpeg_camera.cpp @@ -176,8 +176,9 @@ int FfmpegCamera::Capture( Image &image ) return( -1 ); } Debug( 5, "Got packet from stream %d", packet.stream_index ); - // What about audio stream? - if ( packet.stream_index == mVideoStreamId ) { + // What about audio stream? Maybe someday we could do sound detection... + if ( packet.stream_index == mVideoStreamId ) + { #if LIBAVCODEC_VERSION_CHECK(52, 23, 0, 23, 0) if ( avcodec_decode_video2( mCodecContext, mRawFrame, &frameComplete, &packet ) < 0 ) #else @@ -193,23 +194,23 @@ int FfmpegCamera::Capture( Image &image ) avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height); #if HAVE_LIBSWSCALE - if(mConvertContext == NULL) { - mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL ); + if(mConvertContext == NULL) { + mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL ); - if(mConvertContext == NULL) - Fatal( "Unable to create conversion context for %s", mPath.c_str() ); - } + if(mConvertContext == NULL) + Fatal( "Unable to create conversion context for %s", mPath.c_str() ); + } - if ( sws_scale( mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize ) < 0 ) - Fatal( "Unable to convert raw format %u to target format %u at frame %d", mCodecContext->pix_fmt, imagePixFormat, frameCount ); + if ( sws_scale( mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize ) < 0 ) + Fatal( "Unable to convert raw format %u to target format %u at frame %d", mCodecContext->pix_fmt, imagePixFormat, frameCount ); #else // HAVE_LIBSWSCALE - Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" ); + Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" ); #endif // HAVE_LIBSWSCALE frameCount++; } // end if frameComplete - } else { - Debug( 4, "Different stream_index %d", packet.stream_index ); + } else { + Debug( 4, "Different stream_index %d", packet.stream_index ); } // end if packet.stream_index == mVideoStreamId #if LIBAVCODEC_VERSION_CHECK(57, 8, 0, 12, 100) av_packet_unref( &packet); @@ -218,7 +219,7 @@ int FfmpegCamera::Capture( Image &image ) #endif } // end while ! frameComplete return (0); -} +} // FfmpegCamera::Capture int FfmpegCamera::PostCapture() { @@ -313,7 +314,8 @@ int FfmpegCamera::OpenFfmpeg() { // Find first video stream present mVideoStreamId = -1; - for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) { + for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) + { #if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0)) if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) #else From 9287cd0e0a5614989687337f7fa13273fbb6fd11 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Apr 2016 15:47:40 -0400 Subject: [PATCH 21/26] undo code style changes and whitespace changes --- src/zm_monitor.h | 792 +++++++++++++++++++++++------------------------ 1 file changed, 396 insertions(+), 396 deletions(-) diff --git a/src/zm_monitor.h b/src/zm_monitor.h index 076f074e7..12a43f9ef 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -50,442 +50,442 @@ class Monitor friend class MonitorStream; public: - typedef enum - { - QUERY=0, - CAPTURE, - ANALYSIS - } Purpose; + typedef enum + { + QUERY=0, + CAPTURE, + ANALYSIS + } Purpose; - typedef enum - { - NONE=1, - MONITOR, - MODECT, - RECORD, - MOCORD, - NODECT - } Function; + typedef enum + { + NONE=1, + MONITOR, + MODECT, + RECORD, + MOCORD, + NODECT + } Function; - typedef enum - { - ROTATE_0=1, - ROTATE_90, - ROTATE_180, - ROTATE_270, - FLIP_HORI, - FLIP_VERT - } Orientation; + typedef enum + { + ROTATE_0=1, + ROTATE_90, + ROTATE_180, + ROTATE_270, + FLIP_HORI, + FLIP_VERT + } Orientation; - typedef enum - { - IDLE, - PREALARM, - ALARM, - ALERT, - TAPE - } State; + typedef enum + { + IDLE, + PREALARM, + ALARM, + ALERT, + TAPE + } State; protected: - typedef std::set ZoneSet; + typedef std::set ZoneSet; - typedef enum { GET_SETTINGS=0x1, SET_SETTINGS=0x2, RELOAD=0x4, SUSPEND=0x10, RESUME=0x20 } Action; + typedef enum { GET_SETTINGS=0x1, SET_SETTINGS=0x2, RELOAD=0x4, SUSPEND=0x10, RESUME=0x20 } Action; - typedef enum { CLOSE_TIME, CLOSE_IDLE, CLOSE_ALARM } EventCloseMode; + typedef enum { CLOSE_TIME, CLOSE_IDLE, CLOSE_ALARM } EventCloseMode; - /* sizeof(SharedData) expected to be 336 bytes on 32bit and 64bit */ - typedef struct - { - uint32_t size; /* +0 */ - uint32_t last_write_index; /* +4 */ - uint32_t last_read_index; /* +8 */ - uint32_t state; /* +12 */ - uint32_t last_event; /* +16 */ - uint32_t action; /* +20 */ - int32_t brightness; /* +24 */ - int32_t hue; /* +28 */ - int32_t colour; /* +32 */ - int32_t contrast; /* +36 */ - int32_t alarm_x; /* +40 */ - int32_t alarm_y; /* +44 */ - uint8_t valid; /* +48 */ - uint8_t active; /* +49 */ - uint8_t signal; /* +50 */ - uint8_t format; /* +51 */ - uint32_t imagesize; /* +52 */ - uint32_t epadding1; /* +56 */ - uint32_t epadding2; /* +60 */ - /* - ** This keeps 32bit time_t and 64bit time_t identical and compatible as long as time is before 2038. - ** Shared memory layout should be identical for both 32bit and 64bit and is multiples of 16. - */ - union { /* +64 */ - time_t last_write_time; - uint64_t extrapad1; - }; - union { /* +72 */ - time_t last_read_time; - uint64_t extrapad2; - }; - uint8_t control_state[256]; /* +80 */ - - } SharedData; + /* sizeof(SharedData) expected to be 336 bytes on 32bit and 64bit */ + typedef struct + { + uint32_t size; /* +0 */ + uint32_t last_write_index; /* +4 */ + uint32_t last_read_index; /* +8 */ + uint32_t state; /* +12 */ + uint32_t last_event; /* +16 */ + uint32_t action; /* +20 */ + int32_t brightness; /* +24 */ + int32_t hue; /* +28 */ + int32_t colour; /* +32 */ + int32_t contrast; /* +36 */ + int32_t alarm_x; /* +40 */ + int32_t alarm_y; /* +44 */ + uint8_t valid; /* +48 */ + uint8_t active; /* +49 */ + uint8_t signal; /* +50 */ + uint8_t format; /* +51 */ + uint32_t imagesize; /* +52 */ + uint32_t epadding1; /* +56 */ + uint32_t epadding2; /* +60 */ + /* + ** This keeps 32bit time_t and 64bit time_t identical and compatible as long as time is before 2038. + ** Shared memory layout should be identical for both 32bit and 64bit and is multiples of 16. + */ + union { /* +64 */ + time_t last_write_time; + uint64_t extrapad1; + }; + union { /* +72 */ + time_t last_read_time; + uint64_t extrapad2; + }; + uint8_t control_state[256]; /* +80 */ + + } SharedData; - typedef enum { TRIGGER_CANCEL, TRIGGER_ON, TRIGGER_OFF } TriggerState; - - /* sizeof(TriggerData) expected to be 560 on 32bit & and 64bit */ - typedef struct { - uint32_t size; - uint32_t trigger_state; - uint32_t trigger_score; - uint32_t padding; - char trigger_cause[32]; - char trigger_text[256]; - char trigger_showtext[256]; - } TriggerData; + typedef enum { TRIGGER_CANCEL, TRIGGER_ON, TRIGGER_OFF } TriggerState; + + /* sizeof(TriggerData) expected to be 560 on 32bit & and 64bit */ + typedef struct { + uint32_t size; + uint32_t trigger_state; + uint32_t trigger_score; + uint32_t padding; + char trigger_cause[32]; + char trigger_text[256]; + char trigger_showtext[256]; + } TriggerData; - /* sizeof(Snapshot) expected to be 16 bytes on 32bit and 32 bytes on 64bit */ - struct Snapshot { - struct timeval *timestamp; - Image *image; - void* padding; - }; + /* sizeof(Snapshot) expected to be 16 bytes on 32bit and 32 bytes on 64bit */ + struct Snapshot { + struct timeval *timestamp; + Image *image; + void* padding; + }; - //TODO: Technically we can't exclude this struct when people don't have avformat as the Memory.pm module doesn't know about avformat + //TODO: Technically we can't exclude this struct when people don't have avformat as the Memory.pm module doesn't know about avformat #if 1 - //sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit - typedef struct { - uint32_t size; - char event_file[4096]; - uint32_t recording; //bool arch dependent so use uint32 instead - //uint32_t frameNumber; - - } VideoStoreData; - + //sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit + typedef struct { + uint32_t size; + char event_file[4096]; + uint32_t recording; //bool arch dependent so use uint32 instead + //uint32_t frameNumber; + + } VideoStoreData; + #endif // HAVE_LIBAVFORMAT - class MonitorLink { - protected: - unsigned int id; - char name[64]; + class MonitorLink { + protected: + unsigned int id; + char name[64]; - bool connected; - time_t last_connect_time; + bool connected; + time_t last_connect_time; #if ZM_MEM_MAPPED - int map_fd; - char mem_file[PATH_MAX]; + int map_fd; + char mem_file[PATH_MAX]; #else // ZM_MEM_MAPPED - int shm_id; + int shm_id; #endif // ZM_MEM_MAPPED - off_t mem_size; - unsigned char *mem_ptr; + off_t mem_size; + unsigned char *mem_ptr; - volatile SharedData *shared_data; - volatile TriggerData *trigger_data; - volatile VideoStoreData *video_store_data; + volatile SharedData *shared_data; + volatile TriggerData *trigger_data; + volatile VideoStoreData *video_store_data; - int last_state; - int last_event; + int last_state; + int last_event; - public: - MonitorLink( int p_id, const char *p_name ); - ~MonitorLink(); + public: + MonitorLink( int p_id, const char *p_name ); + ~MonitorLink(); - inline int Id() const { - return( id ); - } - inline const char *Name() const { - return( name ); - } + inline int Id() const { + return( id ); + } + inline const char *Name() const { + return( name ); + } - inline bool isConnected() const { - return( connected ); - } - inline time_t getLastConnectTime() const { - return( last_connect_time ); - } + inline bool isConnected() const { + return( connected ); + } + inline time_t getLastConnectTime() const { + return( last_connect_time ); + } - bool connect(); - bool disconnect(); + bool connect(); + bool disconnect(); - bool isAlarmed(); - bool inAlarm(); - bool hasAlarmed(); - }; + bool isAlarmed(); + bool inAlarm(); + bool hasAlarmed(); + }; protected: - // These are read from the DB and thereafter remain unchanged - unsigned int id; - char name[64]; - unsigned int server_id; - Function function; // What the monitor is doing - bool enabled; // Whether the monitor is enabled or asleep - unsigned int width; // Normally the same as the camera, but not if partly rotated - unsigned int height; // Normally the same as the camera, but not if partly rotated - bool v4l_multi_buffer; - unsigned int v4l_captures_per_frame; - Orientation orientation; // Whether the image has to be rotated at all - unsigned int deinterlacing; + // These are read from the DB and thereafter remain unchanged + unsigned int id; + char name[64]; + unsigned int server_id; + Function function; // What the monitor is doing + bool enabled; // Whether the monitor is enabled or asleep + unsigned int width; // Normally the same as the camera, but not if partly rotated + unsigned int height; // Normally the same as the camera, but not if partly rotated + bool v4l_multi_buffer; + unsigned int v4l_captures_per_frame; + Orientation orientation; // Whether the image has to be rotated at all + unsigned int deinterlacing; - int savejpegspref; - int videowriterpref; - std::string encoderparams; - std::vector encoderparamsvec; - bool record_audio; // Whether to store the audio that we receive + int savejpegspref; + int videowriterpref; + std::string encoderparams; + std::vector encoderparamsvec; + bool record_audio; // Whether to store the audio that we receive - int brightness; // The statically saved brightness of the camera - int contrast; // The statically saved contrast of the camera - int hue; // The statically saved hue of the camera - int colour; // The statically saved colour of the camera - char event_prefix[64]; // The prefix applied to event names as they are created - char label_format[64]; // The format of the timestamp on the images - Coord label_coord; // The coordinates of the timestamp on the images - int label_size; // Size of the timestamp on the images - int image_buffer_count; // Size of circular image buffer, at least twice the size of the pre_event_count - int pre_event_buffer_count; // Size of dedicated circular pre event buffer used when analysis is not performed at capturing framerate, - // value is pre_event_count + alarm_frame_count - 1 - int warmup_count; // How many images to process before looking for events - int pre_event_count; // How many images to hold and prepend to an alarm event - int post_event_count; // How many unalarmed images must occur before the alarm state is reset - int stream_replay_buffer; // How many frames to store to support DVR functions, IGNORED from this object, passed directly into zms now - int section_length; // How long events should last in continuous modes - bool adaptive_skip; // Whether to use the newer adaptive algorithm for this monitor - int frame_skip; // How many frames to skip in continuous modes - int motion_frame_skip; // How many frames to skip in motion detection - double analysis_fps; // Target framerate for video analysis - unsigned int analysis_update_delay; // How long we wait before updating analysis parameters - int capture_delay; // How long we wait between capture frames - int alarm_capture_delay; // How long we wait between capture frames when in alarm state - int alarm_frame_count; // How many alarm frames are required before an event is triggered - int fps_report_interval; // How many images should be captured/processed between reporting the current FPS - int ref_blend_perc; // Percentage of new image going into reference image. - int alarm_ref_blend_perc; // Percentage of new image going into reference image during alarm. - bool track_motion; // Whether this monitor tries to track detected motion - Rgb signal_check_colour; // The colour that the camera will emit when no video signal detected - bool embed_exif; // Whether to embed Exif data into each image frame or not + int brightness; // The statically saved brightness of the camera + int contrast; // The statically saved contrast of the camera + int hue; // The statically saved hue of the camera + int colour; // The statically saved colour of the camera + char event_prefix[64]; // The prefix applied to event names as they are created + char label_format[64]; // The format of the timestamp on the images + Coord label_coord; // The coordinates of the timestamp on the images + int label_size; // Size of the timestamp on the images + int image_buffer_count; // Size of circular image buffer, at least twice the size of the pre_event_count + int pre_event_buffer_count; // Size of dedicated circular pre event buffer used when analysis is not performed at capturing framerate, + // value is pre_event_count + alarm_frame_count - 1 + int warmup_count; // How many images to process before looking for events + int pre_event_count; // How many images to hold and prepend to an alarm event + int post_event_count; // How many unalarmed images must occur before the alarm state is reset + int stream_replay_buffer; // How many frames to store to support DVR functions, IGNORED from this object, passed directly into zms now + int section_length; // How long events should last in continuous modes + bool adaptive_skip; // Whether to use the newer adaptive algorithm for this monitor + int frame_skip; // How many frames to skip in continuous modes + int motion_frame_skip; // How many frames to skip in motion detection + double analysis_fps; // Target framerate for video analysis + unsigned int analysis_update_delay; // How long we wait before updating analysis parameters + int capture_delay; // How long we wait between capture frames + int alarm_capture_delay; // How long we wait between capture frames when in alarm state + int alarm_frame_count; // How many alarm frames are required before an event is triggered + int fps_report_interval; // How many images should be captured/processed between reporting the current FPS + int ref_blend_perc; // Percentage of new image going into reference image. + int alarm_ref_blend_perc; // Percentage of new image going into reference image during alarm. + bool track_motion; // Whether this monitor tries to track detected motion + Rgb signal_check_colour; // The colour that the camera will emit when no video signal detected + bool embed_exif; // Whether to embed Exif data into each image frame or not - double fps; - Image delta_image; - Image ref_image; - Image alarm_image; // Used in creating analysis images, will be initialized in Analysis - Image write_image; // Used when creating snapshot images + double fps; + Image delta_image; + Image ref_image; + Image alarm_image; // Used in creating analysis images, will be initialized in Analysis + Image write_image; // Used when creating snapshot images - Purpose purpose; // What this monitor has been created to do - int event_count; - int image_count; - int ready_count; - int first_alarm_count; - int last_alarm_count; - int buffer_count; - int prealarm_count; - State state; - time_t start_time; - time_t last_fps_time; - time_t auto_resume_time; - unsigned int last_motion_score; + Purpose purpose; // What this monitor has been created to do + int event_count; + int image_count; + int ready_count; + int first_alarm_count; + int last_alarm_count; + int buffer_count; + int prealarm_count; + State state; + time_t start_time; + time_t last_fps_time; + time_t auto_resume_time; + unsigned int last_motion_score; - EventCloseMode event_close_mode; + EventCloseMode event_close_mode; #if ZM_MEM_MAPPED - int map_fd; - char mem_file[PATH_MAX]; + int map_fd; + char mem_file[PATH_MAX]; #else // ZM_MEM_MAPPED - int shm_id; + int shm_id; #endif // ZM_MEM_MAPPED - off_t mem_size; - unsigned char *mem_ptr; + off_t mem_size; + unsigned char *mem_ptr; - SharedData *shared_data; - TriggerData *trigger_data; - VideoStoreData *video_store_data; + SharedData *shared_data; + TriggerData *trigger_data; + VideoStoreData *video_store_data; - Snapshot *image_buffer; - Snapshot next_buffer; /* Used by four field deinterlacing */ - Snapshot *pre_event_buffer; + Snapshot *image_buffer; + Snapshot next_buffer; /* Used by four field deinterlacing */ + Snapshot *pre_event_buffer; - Camera *camera; + Camera *camera; - Event *event; + Event *event; - int n_zones; - Zone **zones; + int n_zones; + Zone **zones; - struct timeval **timestamps; - Image **images; + struct timeval **timestamps; + Image **images; - const unsigned char *privacy_bitmask; + const unsigned char *privacy_bitmask; - int n_linked_monitors; - MonitorLink **linked_monitors; + int n_linked_monitors; + MonitorLink **linked_monitors; public: // OurCheckAlarms seems to be unused. Check it on zm_monitor.cpp for more info. //bool OurCheckAlarms( Zone *zone, const Image *pImage ); - Monitor( - int p_id, - const char *p_name, - unsigned int p_server_id, - int p_function, - bool p_enabled, - const char *p_linked_monitors, - Camera *p_camera, - int p_orientation, - unsigned int p_deinterlacing, - int p_savejpegs, - int p_videowriter, - std::string p_encoderparams, - bool p_record_audio, - const char *p_event_prefix, - const char *p_label_format, - const Coord &p_label_coord, - int label_size, - int p_image_buffer_count, - int p_warmup_count, - int p_pre_event_count, - int p_post_event_count, - int p_stream_replay_buffer, - int p_alarm_frame_count, - int p_section_length, - int p_frame_skip, - int p_motion_frame_skip, - double p_analysis_fps, - unsigned int p_analysis_update_delay, - int p_capture_delay, - int p_alarm_capture_delay, - int p_fps_report_interval, - int p_ref_blend_perc, - int p_alarm_ref_blend_perc, - bool p_track_motion, - Rgb p_signal_check_colour, - bool p_embed_exif, - Purpose p_purpose, - int p_n_zones=0, - Zone *p_zones[]=0 - ); - ~Monitor(); + Monitor( + int p_id, + const char *p_name, + unsigned int p_server_id, + int p_function, + bool p_enabled, + const char *p_linked_monitors, + Camera *p_camera, + int p_orientation, + unsigned int p_deinterlacing, + int p_savejpegs, + int p_videowriter, + std::string p_encoderparams, + bool p_record_audio, + const char *p_event_prefix, + const char *p_label_format, + const Coord &p_label_coord, + int label_size, + int p_image_buffer_count, + int p_warmup_count, + int p_pre_event_count, + int p_post_event_count, + int p_stream_replay_buffer, + int p_alarm_frame_count, + int p_section_length, + int p_frame_skip, + int p_motion_frame_skip, + double p_analysis_fps, + unsigned int p_analysis_update_delay, + int p_capture_delay, + int p_alarm_capture_delay, + int p_fps_report_interval, + int p_ref_blend_perc, + int p_alarm_ref_blend_perc, + bool p_track_motion, + Rgb p_signal_check_colour, + bool p_embed_exif, + Purpose p_purpose, + int p_n_zones=0, + Zone *p_zones[]=0 + ); + ~Monitor(); - void AddZones( int p_n_zones, Zone *p_zones[] ); - void AddPrivacyBitmask( Zone *p_zones[] ); + void AddZones( int p_n_zones, Zone *p_zones[] ); + void AddPrivacyBitmask( Zone *p_zones[] ); - bool connect(); - inline int ShmValid() const { - return( shared_data->valid ); - } + bool connect(); + inline int ShmValid() const { + return( shared_data->valid ); + } - inline int Id() const { - return( id ); - } - inline const char *Name() const { - return( name ); - } - inline Function GetFunction() const { - return( function ); - } - inline bool Enabled() { - if ( function <= MONITOR ) - return( false ); - return( enabled ); - } - inline const char *EventPrefix() const { - return( event_prefix ); - } - inline bool Ready() { - if ( function <= MONITOR ) - return( false ); - return( image_count > ready_count ); - } - inline bool Active() { - if ( function <= MONITOR ) - return( false ); - return( enabled && shared_data->active ); - } - inline bool Exif() { - return( embed_exif ); - } + inline int Id() const { + return( id ); + } + inline const char *Name() const { + return( name ); + } + inline Function GetFunction() const { + return( function ); + } + inline bool Enabled() { + if ( function <= MONITOR ) + return( false ); + return( enabled ); + } + inline const char *EventPrefix() const { + return( event_prefix ); + } + inline bool Ready() { + if ( function <= MONITOR ) + return( false ); + return( image_count > ready_count ); + } + inline bool Active() { + if ( function <= MONITOR ) + return( false ); + return( enabled && shared_data->active ); + } + inline bool Exif() { + return( embed_exif ); + } - unsigned int Width() const { return( width ); } - unsigned int Height() const { return( height ); } - unsigned int Colours() const { return( camera->Colours() ); } - unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } + unsigned int Width() const { return( width ); } + unsigned int Height() const { return( height ); } + unsigned int Colours() const { return( camera->Colours() ); } + unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } - int GetOptSaveJPEGs() const { return( savejpegspref ); } - int GetOptVideoWriter() const { return( videowriterpref ); } - const std::vector* GetOptEncoderParams() const { return( &encoderparamsvec ); } + int GetOptSaveJPEGs() const { return( savejpegspref ); } + int GetOptVideoWriter() const { return( videowriterpref ); } + const std::vector* GetOptEncoderParams() const { return( &encoderparamsvec ); } - State GetState() const; - int GetImage( int index=-1, int scale=100 ); - struct timeval GetTimestamp( int index=-1 ) const; - void UpdateAdaptiveSkip(); - useconds_t GetAnalysisRate(); - unsigned int GetAnalysisUpdateDelay() const { return( analysis_update_delay ); } - int GetCaptureDelay() const { return( capture_delay ); } - int GetAlarmCaptureDelay() const { return( alarm_capture_delay ); } - unsigned int GetLastReadIndex() const; - unsigned int GetLastWriteIndex() const; - unsigned int GetLastEvent() const; - double GetFPS() const; - void ForceAlarmOn( int force_score, const char *force_case, const char *force_text="" ); - void ForceAlarmOff(); - void CancelForced(); - TriggerState GetTriggerState() const { return( (TriggerState)(trigger_data?trigger_data->trigger_state:TRIGGER_CANCEL )); } + State GetState() const; + int GetImage( int index=-1, int scale=100 ); + struct timeval GetTimestamp( int index=-1 ) const; + void UpdateAdaptiveSkip(); + useconds_t GetAnalysisRate(); + unsigned int GetAnalysisUpdateDelay() const { return( analysis_update_delay ); } + int GetCaptureDelay() const { return( capture_delay ); } + int GetAlarmCaptureDelay() const { return( alarm_capture_delay ); } + unsigned int GetLastReadIndex() const; + unsigned int GetLastWriteIndex() const; + unsigned int GetLastEvent() const; + double GetFPS() const; + void ForceAlarmOn( int force_score, const char *force_case, const char *force_text="" ); + void ForceAlarmOff(); + void CancelForced(); + TriggerState GetTriggerState() const { return( (TriggerState)(trigger_data?trigger_data->trigger_state:TRIGGER_CANCEL )); } - void actionReload(); - void actionEnable(); - void actionDisable(); - void actionSuspend(); - void actionResume(); + void actionReload(); + void actionEnable(); + void actionDisable(); + void actionSuspend(); + void actionResume(); - int actionBrightness( int p_brightness=-1 ); - int actionHue( int p_hue=-1 ); - int actionColour( int p_colour=-1 ); - int actionContrast( int p_contrast=-1 ); + int actionBrightness( int p_brightness=-1 ); + int actionHue( int p_hue=-1 ); + int actionColour( int p_colour=-1 ); + int actionContrast( int p_contrast=-1 ); - inline int PrimeCapture() { - return( camera->PrimeCapture() ); - } - inline int PreCapture() { - return( camera->PreCapture() ); - } - int Capture(); - int PostCapture() { - return( camera->PostCapture() ); - } + inline int PrimeCapture() { + return( camera->PrimeCapture() ); + } + inline int PreCapture() { + return( camera->PreCapture() ); + } + int Capture(); + int PostCapture() { + return( camera->PostCapture() ); + } - unsigned int DetectMotion( const Image &comp_image, Event::StringSet &zoneSet ); + unsigned int DetectMotion( const Image &comp_image, Event::StringSet &zoneSet ); // DetectBlack seems to be unused. Check it on zm_monitor.cpp for more info. //unsigned int DetectBlack( const Image &comp_image, Event::StringSet &zoneSet ); - bool CheckSignal( const Image *image ); - bool Analyse(); - void DumpImage( Image *dump_image ) const; - void TimestampImage( Image *ts_image, const struct timeval *ts_time ) const; - bool closeEvent(); + bool CheckSignal( const Image *image ); + bool Analyse(); + void DumpImage( Image *dump_image ) const; + void TimestampImage( Image *ts_image, const struct timeval *ts_time ) const; + bool closeEvent(); - void Reload(); - void ReloadZones(); - void ReloadLinkedMonitors( const char * ); + void Reload(); + void ReloadZones(); + void ReloadLinkedMonitors( const char * ); - bool DumpSettings( char *output, bool verbose ); - void DumpZoneImage( const char *zone_string=0 ); + bool DumpSettings( char *output, bool verbose ); + void DumpZoneImage( const char *zone_string=0 ); #if ZM_HAS_V4L - static int LoadLocalMonitors( const char *device, Monitor **&monitors, Purpose purpose ); + static int LoadLocalMonitors( const char *device, Monitor **&monitors, Purpose purpose ); #endif // ZM_HAS_V4L - static int LoadRemoteMonitors( const char *protocol, const char *host, const char*port, const char*path, Monitor **&monitors, Purpose purpose ); - static int LoadFileMonitors( const char *file, Monitor **&monitors, Purpose purpose ); + static int LoadRemoteMonitors( const char *protocol, const char *host, const char*port, const char*path, Monitor **&monitors, Purpose purpose ); + static int LoadFileMonitors( const char *file, Monitor **&monitors, Purpose purpose ); #if HAVE_LIBAVFORMAT - static int LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose purpose ); + static int LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose purpose ); #endif // HAVE_LIBAVFORMAT - static Monitor *Load( unsigned int id, bool load_zones, Purpose purpose ); - //void writeStreamImage( Image *image, struct timeval *timestamp, int scale, int mag, int x, int y ); - //void StreamImages( int scale=100, int maxfps=10, time_t ttl=0, int msq_id=0 ); - //void StreamImagesRaw( int scale=100, int maxfps=10, time_t ttl=0 ); - //void StreamImagesZip( int scale=100, int maxfps=10, time_t ttl=0 ); - void SingleImage( int scale=100 ); - void SingleImageRaw( int scale=100 ); - void SingleImageZip( int scale=100 ); + static Monitor *Load( unsigned int id, bool load_zones, Purpose purpose ); + //void writeStreamImage( Image *image, struct timeval *timestamp, int scale, int mag, int x, int y ); + //void StreamImages( int scale=100, int maxfps=10, time_t ttl=0, int msq_id=0 ); + //void StreamImagesRaw( int scale=100, int maxfps=10, time_t ttl=0 ); + //void StreamImagesZip( int scale=100, int maxfps=10, time_t ttl=0 ); + void SingleImage( int scale=100 ); + void SingleImageRaw( int scale=100 ); + void SingleImageZip( int scale=100 ); #if HAVE_LIBAVCODEC - //void StreamMpeg( const char *format, int scale=100, int maxfps=10, int bitrate=100000 ); + //void StreamMpeg( const char *format, int scale=100, int maxfps=10, int bitrate=100000 ); #endif // HAVE_LIBAVCODEC }; @@ -493,47 +493,47 @@ public: class MonitorStream : public StreamBase { protected: - typedef struct SwapImage { - bool valid; - struct timeval timestamp; - char file_name[PATH_MAX]; - } SwapImage; + typedef struct SwapImage { + bool valid; + struct timeval timestamp; + char file_name[PATH_MAX]; + } SwapImage; private: - SwapImage *temp_image_buffer; - int temp_image_buffer_count; - int temp_read_index; - int temp_write_index; + SwapImage *temp_image_buffer; + int temp_image_buffer_count; + int temp_read_index; + int temp_write_index; protected: - time_t ttl; + time_t ttl; protected: - int playback_buffer; - bool delayed; + int playback_buffer; + bool delayed; - int frame_count; + int frame_count; protected: - bool checkSwapPath( const char *path, bool create_path ); + bool checkSwapPath( const char *path, bool create_path ); - bool sendFrame( const char *filepath, struct timeval *timestamp ); - bool sendFrame( Image *image, struct timeval *timestamp ); - void processCommand( const CmdMsg *msg ); + bool sendFrame( const char *filepath, struct timeval *timestamp ); + bool sendFrame( Image *image, struct timeval *timestamp ); + void processCommand( const CmdMsg *msg ); public: - MonitorStream() : playback_buffer( 0 ), delayed( false ), frame_count( 0 ) { - } - void setStreamBuffer( int p_playback_buffer ) { - playback_buffer = p_playback_buffer; - } - void setStreamTTL( time_t p_ttl ) { - ttl = p_ttl; - } - bool setStreamStart( int monitor_id ) { - return loadMonitor( monitor_id ); - } - void runStream(); + MonitorStream() : playback_buffer( 0 ), delayed( false ), frame_count( 0 ) { + } + void setStreamBuffer( int p_playback_buffer ) { + playback_buffer = p_playback_buffer; + } + void setStreamTTL( time_t p_ttl ) { + ttl = p_ttl; + } + bool setStreamStart( int monitor_id ) { + return loadMonitor( monitor_id ); + } + void runStream(); }; #endif // ZM_MONITOR_H From ed741687101c293d05868d8d16c32c41e27b3ca6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 15:14:14 -0400 Subject: [PATCH 22/26] increase the size of the Pid field in Logs to accomodate FreeBSD --- db/zm_create.sql.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 3614bfedd..029f20989 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -270,7 +270,7 @@ CREATE TABLE `Logs` ( `TimeKey` decimal(16,6) NOT NULL, `Component` varchar(32) NOT NULL, `ServerId` int(10) unsigned, - `Pid` smallint(6) DEFAULT NULL, + `Pid` int(10) DEFAULT NULL, `Level` tinyint(3) NOT NULL, `Code` char(3) NOT NULL, `Message` text NOT NULL, From 397eb1a01ba5340818ab3150cb68e01f46a08bbc Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 15:14:42 -0400 Subject: [PATCH 23/26] increase the size of the Pid field in Logs to accomodate FreeBSD --- db/zm_update-1.29.1.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/zm_update-1.29.1.sql diff --git a/db/zm_update-1.29.1.sql b/db/zm_update-1.29.1.sql new file mode 100644 index 000000000..8fd43c318 --- /dev/null +++ b/db/zm_update-1.29.1.sql @@ -0,0 +1,7 @@ +-- +-- This updates a 1.29.0 database to 1.29.1 +-- +-- + +-- Increase the size of the Pid field for FreeBSD +ALTER TABLE Logs MODIFY Pid int(10); From 711343a5cc8e4d6ed48e9faf46e573a49f30022d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 16:34:21 -0400 Subject: [PATCH 24/26] fix ZM_SERVER_ID instead of ZM_SERVER --- web/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 8b69926da..25d81bb44 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -982,7 +982,7 @@ function daemonControl( $command, $daemon=false, $args=false ) function zmcControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { + if ( (!defined('ZM_SERVER_ID')) or ( ZM_SERVER_ID==$monitor['ServerId'] ) ) { $row = NULL; if ( $monitor['Type'] == "Local" ) { @@ -1013,7 +1013,7 @@ function zmcControl( $monitor, $mode=false ) function zmaControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { + if ( (!defined('ZM_SERVER_ID')) or ( ZM_SERVER_ID==$monitor['ServerId'] ) ) { if ( !is_array( $monitor ) ) { $monitor = dbFetchOne( "select C.*, M.* from Monitors as M left join Controls as C on (M.ControlId = C.Id ) where M.Id=?", NULL, array($monitor) ); From 0f1a53089137807196c39e0553cb08ee2304fad4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 5 Apr 2016 09:03:37 -0400 Subject: [PATCH 25/26] ciontrol files need spaces on multi-line lines --- distros/debian/control | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/distros/debian/control b/distros/debian/control index 538b24770..c7becfa64 100644 --- a/distros/debian/control +++ b/distros/debian/control @@ -3,41 +3,41 @@ Section: net Priority: optional Maintainer: Isaac Connor Build-Depends: debhelper (>= 9), autoconf, automake, quilt , libtool, dh-autoreconf -,libgnutls-dev|libgnutls28-dev -,libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl -,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev -,libpcre3-dev -,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev -,libv4l-dev (>= 0.8.3), libvlccore-dev, libvlc-dev -,libbz2-dev -,libsys-mmap-perl -,libnetpbm10-dev -,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev -,libgcrypt11-dev|libgcrypt20-dev, libpolkit-gobject-1-dev + ,libgnutls-dev|libgnutls28-dev + ,libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl + ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev + ,libpcre3-dev + ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev + ,libv4l-dev (>= 0.8.3), libvlccore-dev, libvlc-dev + ,libbz2-dev + ,libsys-mmap-perl + ,libnetpbm10-dev + ,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev + ,libgcrypt11-dev|libgcrypt20-dev, libpolkit-gobject-1-dev Standards-Version: 3.9.4 Package: zoneminder Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} -, apache2, libapache2-mod-php5 | libapache2-mod-fcgid -, php5, php5-mysql|php5-mysqlnd, libphp-serialization-perl -, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl -, mariadb-client|mysql-client -, libwww-perl, libarchive-tar-perl, libarchive-zip-perl -, libdevice-serialport-perl, libpcre3 -, ffmpeg | libav-tools -, rsyslog | system-log-daemon -, libmodule-load-perl, libsys-mmap-perl, libjson-any-perl -, netpbm -, libavdevice53 | libavdevice55 -, libjpeg8|libjpeg9|libjpeg62-turbo -, zip -, libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl -, libvlccore5 | libvlccore7 | libvlccore8, libvlc5 -, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev -, libpolkit-gobject-1-0, liburi-encode-perl, php5-gd -, libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl -, libsys-cpu-perl, libsys-meminfo-perl + , apache2, libapache2-mod-php5 | libapache2-mod-fcgid + , php5, php5-mysql|php5-mysqlnd, libphp-serialization-perl + , libdate-manip-perl, libmime-lite-perl, libmime-tools-perl + , mariadb-client|mysql-client + , libwww-perl, libarchive-tar-perl, libarchive-zip-perl + , libdevice-serialport-perl, libpcre3 + , ffmpeg | libav-tools + , rsyslog | system-log-daemon + , libmodule-load-perl, libsys-mmap-perl, libjson-any-perl + , netpbm + , libavdevice53 | libavdevice55 + , libjpeg8|libjpeg9|libjpeg62-turbo + , zip + , libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl + , libvlccore5 | libvlccore7 | libvlccore8, libvlc5 + , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev + , libpolkit-gobject-1-0, liburi-encode-perl, php5-gd + , libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl + , libsys-cpu-perl, libsys-meminfo-perl Recommends: mysql-server|mariadb-server Description: Video camera security and surveillance solution ZoneMinder is intended for use in single or multi-camera video security From 04800afaf56c26ee9dbd7e27162c7c70d2b4e6c1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 5 Apr 2016 12:30:22 -0400 Subject: [PATCH 26/26] Some documenting comments and debug lines, mostly just trying to understand what the code does --- src/zm_rtp_source.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/zm_rtp_source.cpp b/src/zm_rtp_source.cpp index a61bfffe3..a4dfcd5d7 100644 --- a/src/zm_rtp_source.cpp +++ b/src/zm_rtp_source.cpp @@ -262,6 +262,11 @@ bool RtpSource::handlePacket( const unsigned char *packet, size_t packetLen ) int rtpHeaderSize = 12 + rtpHeader->cc * 4; // No need to check for nal type as non fragmented packets already have 001 start sequence appended bool h264FragmentEnd = (mCodecId == AV_CODEC_ID_H264) && (packet[rtpHeaderSize+1] & 0x40); + // M stands for Market, it is the 8th bit + // The interpretation of the marker is defined by a profile. It is intended + // to allow significant events such as frame boundaries to be marked in the + // packet stream. A profile may define additional marker bits or specify + // that there is no marker bit by changing the number of bits in the payload type field. bool thisM = rtpHeader->m || h264FragmentEnd; if ( updateSeq( ntohs(rtpHeader->seqN) ) ) @@ -275,15 +280,18 @@ bool RtpSource::handlePacket( const unsigned char *packet, size_t packetLen ) if( mCodecId == AV_CODEC_ID_H264 ) { int nalType = (packet[rtpHeaderSize] & 0x1f); + Debug( 3, "Have H264 frame: nal type is %d", nalType ); switch (nalType) { - case 24: + case 24: // STAP-A { extraHeader = 2; break; } - case 25: case 26: case 27: + case 25: // STAP-B + case 26: // MTAP-16 + case 27: // MTAP-24 { extraHeader = 3; break; @@ -304,6 +312,9 @@ bool RtpSource::handlePacket( const unsigned char *packet, size_t packetLen ) extraHeader = 2; break; } + default: { + Debug(3, "Unhandled nalType %d", nalType ); + } } // Append NAL frame start code @@ -311,6 +322,8 @@ bool RtpSource::handlePacket( const unsigned char *packet, size_t packetLen ) mFrame.append( "\x0\x0\x1", 3 ); } mFrame.append( packet+rtpHeaderSize+extraHeader, packetLen-rtpHeaderSize-extraHeader ); + } else { + Debug( 3, "NOT H264 frame: type is %d", mCodecId ); } Hexdump( 4, mFrame.head(), 16 );