diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..682db9004 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +web/api/lib +web/skins/classic/js/jquery-1.11.3.js +web/skins/classic/js/jquery.js +web/tools/mootools diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..fa4d6b6e5 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,29 @@ +"use strict"; + +module.exports = { + "env": { + "browser": true, + }, + "extends": ["google"], + "rules": { + "brace-style": "off", + "camelcase": "off", + "comma-dangle": "off", + "key-spacing": "off", + "max-len": "off", + "new-cap": ["error", { + capIsNewExceptions: ["Error", "Warning", "Debug", "Polygon_calcArea", "Play", "Stop"], + newIsCapExceptionPattern: "^Asset\.." + }], + "no-array-constructor": "off", + "no-caller": "off", + "no-new-object": "off", + "no-unused-vars": "off", + "no-var": "off", + "object-curly-spacing": "off", + "prefer-rest-params": "off", + "quotes": "off", + "require-jsdoc": "off", + "spaced-comment": "off", + }, +}; diff --git a/CMakeLists.txt b/CMakeLists.txt index a37a76dd7..d4416c166 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,8 @@ mark_as_advanced( ZM_PERL_MM_PARMS ZM_PERL_SEARCH_PATH ZM_TARGET_DISTRO - ZM_CONFIG_DIR) + ZM_CONFIG_DIR + ZM_SYSTEMD) set(ZM_RUNDIR "/var/run/zm" CACHE PATH "Location of transient process files, default: /var/run/zm") @@ -166,6 +167,8 @@ set(ZM_PERL_SEARCH_PATH "" CACHE PATH installed outside Perl's default search path.") set(ZM_TARGET_DISTRO "" CACHE STRING "Build ZoneMinder for a specific distribution. Currently, valid names are: fc24, fc25, el6, el7, OS13, FreeBSD") +set(ZM_SYSTEMD "OFF" CACHE BOOL + "Set to ON to force building ZM with systemd support. default: OFF") # Reassign some variables if a target distro has been specified if((ZM_TARGET_DISTRO STREQUAL "fc24") OR (ZM_TARGET_DISTRO STREQUAL "fc25")) @@ -223,6 +226,11 @@ include_directories("${CMAKE_BINARY_DIR}") # This is required to enable searching in lib64 (if exists), do not change set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON) +# Set the systemd flag if systemd is autodetected or ZM_SYSTEMD has been set +if(ZM_SYSTEMD OR (IS_DIRECTORY /usr/lib/systemd/system) OR (IS_DIRECTORY /lib/systemd/system)) + set(WITH_SYSTEMD 1) +endif(ZM_SYSTEMD OR (IS_DIRECTORY /usr/lib/systemd/system) OR (IS_DIRECTORY /lib/systemd/system)) + # System checks check_include_file("libv4l1-videodev.h" HAVE_LIBV4L1_VIDEODEV_H) if(NOT HAVE_LIBV4L1_VIDEODEV_H) @@ -404,13 +412,13 @@ find_library(MYSQLCLIENT_LIBRARIES mysqlclient PATH_SUFFIXES mysql) if(MYSQLCLIENT_LIBRARIES) set(HAVE_LIBMYSQLCLIENT 1) list(APPEND ZM_BIN_LIBS "${MYSQLCLIENT_LIBRARIES}") - find_path(MYSQLCLIENT_INCLUDE_DIR mysql/mysql.h) + find_path(MYSQLCLIENT_INCLUDE_DIR mysql.h PATH_SUFFIXES mysql) if(MYSQLCLIENT_INCLUDE_DIR) include_directories("${MYSQLCLIENT_INCLUDE_DIR}") set(CMAKE_REQUIRED_INCLUDES "${MYSQLCLIENT_INCLUDE_DIR}") endif(MYSQLCLIENT_INCLUDE_DIR) mark_as_advanced(FORCE MYSQLCLIENT_LIBRARIES MYSQLCLIENT_INCLUDE_DIR) - check_include_file("mysql/mysql.h" HAVE_MYSQL_H) + check_include_file("mysql.h" HAVE_MYSQL_H) if(NOT HAVE_MYSQL_H) message(FATAL_ERROR "ZoneMinder requires MySQL headers - check that MySQL development packages are installed") @@ -754,12 +762,14 @@ endif(NOT ZM_WEB_GROUP) message(STATUS "Using web user: ${ZM_WEB_USER}") message(STATUS "Using web group: ${ZM_WEB_GROUP}") -# Check for polkit -find_package(Polkit) -if(NOT POLKIT_FOUND) - message(FATAL_ERROR - "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") -endif(NOT POLKIT_FOUND) +if(WITH_SYSTEMD) + # Check for polkit + find_package(Polkit) + if(NOT POLKIT_FOUND) + message(FATAL_ERROR + "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") + endif(NOT POLKIT_FOUND) +endif(WITH_SYSTEMD) # Some variables that zm expects set(ZM_PID "${ZM_RUNDIR}/zm.pid") @@ -828,7 +838,15 @@ else(zmconfgen_result EQUAL 0) endif(zmconfgen_result EQUAL 0) # Install zm.conf -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm.conf" DESTINATION "${ZM_CONFIG_DIR}") +install(CODE " + if (NOT EXISTS \"${ZM_CONFIG_DIR}/zm.conf\") + file(INSTALL \"${CMAKE_CURRENT_BINARY_DIR}/zm.conf\" DESTINATION \"${ZM_CONFIG_DIR}\") + else (NOT EXISTS \"${ZM_CONFIG_DIR}/zm.conf\") + file(RENAME \"${CMAKE_CURRENT_BINARY_DIR}/zm.conf\" \"${CMAKE_CURRENT_BINARY_DIR}/zm.conf.new\") + file(INSTALL \"${CMAKE_CURRENT_BINARY_DIR}/zm.conf.new\" DESTINATION \"${ZM_CONFIG_DIR}\") + endif() + ") + # Uninstall target configure_file( diff --git a/Dockerfile b/Dockerfile index 40f759a5b..27b5bc636 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # ZoneMinder -FROM ubuntu:trusty -MAINTAINER Kyle Johnson +FROM ubuntu:xenial +MAINTAINER Markos Vakondios # Resynchronize the package index files RUN apt-get update && \ @@ -10,8 +10,8 @@ RUN apt-get update && \ libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 \ libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm cmake libjpeg-turbo8-dev \ libjpeg-turbo8 libtheora-dev libvorbis-dev libvpx-dev libx264-dev libmp4v2-dev libav-tools mysql-client \ - apache2 php5 php5-mysql apache2-mpm-prefork libapache2-mod-php5 php5-cli \ - mysql-server libvlc-dev libvlc5 libvlccore-dev libvlccore7 vlc-data libcurl4-openssl-dev \ + apache2 php php-mysql libapache2-mod-php php-cli \ + mysql-server libvlc-dev libvlc5 libvlccore-dev libvlccore8 vlc-data libcurl4-openssl-dev \ libavformat-dev libswscale-dev libavutil-dev libavcodec-dev libavfilter-dev \ libavresample-dev libavdevice-dev libpostproc-dev libv4l-dev libtool libnetpbm10-dev \ libmime-lite-perl dh-autoreconf dpatch \ @@ -46,7 +46,7 @@ RUN chown -R www-data:www-data /usr/local/share/zoneminder/ RUN cp misc/apache.conf /etc/apache2/sites-available/000-default.conf ADD utils/docker/phpdate.ini /etc/php5/apache2/conf.d/25-phpdate.ini -# Expose http ports +# Expose http port EXPOSE 80 # Initial database and apache setup: diff --git a/db/zm_update-1.30.4.sql b/db/zm_update-1.30.4.sql new file mode 100644 index 000000000..267562291 --- /dev/null +++ b/db/zm_update-1.30.4.sql @@ -0,0 +1,5 @@ +-- +-- This updates a 1.30.3 database to 1.30.4 +-- +-- No changes required +-- diff --git a/distros/redhat/zoneminder.spec b/distros/redhat/zoneminder.spec index a6c1bc805..dad18d307 100644 --- a/distros/redhat/zoneminder.spec +++ b/distros/redhat/zoneminder.spec @@ -33,7 +33,7 @@ %global _hardened_build 1 Name: zoneminder -Version: 1.30.3 +Version: 1.30.4 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons @@ -50,6 +50,7 @@ Source1: https://github.com/FriendsOfCake/crud/archive/v%{crud_version}.tar.gz#/ %{?with_init_systemd:BuildRequires: systemd-devel} %{?with_init_systemd:BuildRequires: mariadb-devel} %{?with_init_systemd:BuildRequires: perl-podlators} +%{?with_init_systemd:BuildRequires: polkit-devel} %{?with_init_sysv:BuildRequires: mysql-devel} %{?el6:BuildRequires: epel-rpm-macros} BuildRequires: cmake >= 2.8.7 @@ -81,7 +82,6 @@ BuildRequires: vlc-devel BuildRequires: libcurl-devel BuildRequires: libv4l-devel BuildRequires: ffmpeg-devel -BuildRequires: polkit-devel %{?with_nginx:Requires: nginx} %{?with_nginx:Requires: fcgiwrap} @@ -291,6 +291,8 @@ rm -rf %{_docdir}/%{name}-%{version} %if 0%{?with_init_systemd} %{_tmpfilesdir}/zoneminder.conf %{_unitdir}/zoneminder.service +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules %endif %if 0%{?with_init_sysv} @@ -303,7 +305,6 @@ rm -rf %{_docdir}/%{name}-%{version} %{_bindir}/zmc %{_bindir}/zmcontrol.pl %{_bindir}/zmdc.pl -%{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl %{_bindir}/zmtrack.pl @@ -328,9 +329,6 @@ rm -rf %{_docdir}/%{name}-%{version} %{_libexecdir}/zoneminder/ %{_datadir}/zoneminder/ -%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy -%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules - %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/images @@ -342,6 +340,11 @@ rm -rf %{_docdir}/%{name}-%{version} %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/run/zoneminder %changelog +* Tue May 09 2017 Andrew Bauer - 1.30.4-1 +- modify autosetup macro parameters +- modify requirements for php-pecl-acpu-bc package +- 1.30.4 release + * Tue May 02 2017 Andrew Bauer - 1.30.3-1 - 1.30.3 release diff --git a/docs/faq.rst b/docs/faq.rst index 1460e034d..9228274d7 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -309,7 +309,7 @@ The main causes are. * Capture frame rates. Unless there's a compelling reason in your case there is often little benefit in running cameras at 25fps when 5-10fps would often get you results just as good. Try changing your monitor settings to limit your cameras to lower frame rates. You can still configure ZM to ignore these limits and capture as fast as possible when motion is detected. * Run function. Obviously running in Record or Mocord modes or in Modect with lots of events generates a lot of DB and file activity and so CPU and load will increase. * Basic default detection zones. By default when a camera is added one detection zone is added which covers the whole image with a default set of parameters. If your camera covers a view in which various regions are unlikely to generate a valid alarm (ie the sky) then I would experiment with reducing the zone sizes or adding inactive zones to blank out areas you don't want to monitor. Additionally the actual settings of the zone themselves may not be optimal. When doing motion detection the number of changed pixels above a threshold is examined, then this is filter, then contiguous regions are calculated to see if an alarm is generated. If any maximum or minimum threshold is exceeded according to your zone settings at any time the calculation stops. If your settings always result in the calculations going through to the last stage before being failed then additional CPU time is used unnecessarily. Make sure your maximum and minimumzone thresholds are set to sensible values and experiment by switching RECORD_EVENT_STATS on and seeing what the actual values of alarmed pixels etc are during sample events. - * Optimise your settings. After you've got some settings you're happy with then switching off RECORD_EVENT_STATS will prevent the statistics being written to the database which saves some time. Other settings which might make a difference are ZM_FAST_RGB_DIFFS, ZM_OPT_FRAME_SERVER and the JPEG_xxx_QUALITY ones. + * Optimise your settings. After you've got some settings you're happy with then switching off RECORD_EVENT_STATS will prevent the statistics being written to the database which saves some time. Other settings which might make a difference are ZM_FAST_RGB_DIFFS and the JPEG_xxx_QUALITY ones. I'm sure there are other things which might make a difference such as what else you have running on the box and memory sizes (make sure there's no swapping going on). Also speed of disk etc will make some difference during event capture and also if you are watching the whole time then you may have a bunch of zms processes running also. diff --git a/docs/userguide/filterevents.rst b/docs/userguide/filterevents.rst index bc0dcffe2..8477ef157 100644 --- a/docs/userguide/filterevents.rst +++ b/docs/userguide/filterevents.rst @@ -29,7 +29,7 @@ Here is what the filter window looks like events later and also make sure archived events don't get deleted, for example * Email details of all matches: Sends an email to the configured address with details about the event. The email can be customized as per TBD - * Execute command on all matches: Allows you to execute any arbitrary command on the matched events + * Execute command on all matches: Allows you to execute any arbitrary command on the matched events. You can use replacement tokens as subsequent arguents to the command, the last argument will be the absolute path to the event, preceeded by replacement arguents. eg: /usr/bin/script.sh %MN% will excecute as /usr/bin/script.sh MonitorName /path/to/event. * Delete all matches: Deletes all the matched events * *E*: Use 'Submit' to 'test' your matching conditions. This will just match and show you what filters match. Use 'Execute' to actually execute the action after matching your conditions. Use 'Save' to save the filter for future use and 'Reset' to clear your settings diff --git a/docs/userguide/options/options_system.rst b/docs/userguide/options/options_system.rst index 7df3d259a..53e560fe5 100644 --- a/docs/userguide/options/options_system.rst +++ b/docs/userguide/options/options_system.rst @@ -33,10 +33,6 @@ RUN_AUDIT - The zmaudit daemon exists to check that the saved information in the AUDIT_CHECK_INTERVAL - The zmaudit daemon exists to check that the saved information in the database and on the filesystem match and are consistent with each other. If an error occurs or if you are using 'fast deletes' it may be that database records are deleted but files remain. In this case, and similar, zmaudit will remove redundant information to synchronise the two data stores. The default check interval of 900 seconds (15 minutes) is fine for most systems however if you have a very large number of events the process of scanning the database and filesystem may take a long time and impact performance. In this case you may prefer to make this interval much larger to reduce the impact on your system. This option determines how often these checks are performed. -OPT_FRAME_SERVER - In some circumstances it is possible for a slow disk to take so long writing images to disk that it causes the analysis daemon to fall behind especially during high frame rate events. Setting this option to yes enables a frame server daemon (zmf) which will be sent the images from the analysis daemon and will do the actual writing of images itself freeing up the analysis daemon to get on with other things. Should this transmission fail or other permanent or transient error occur, this function will fall back to the analysis daemon. - -FRAME_SOCKET_SIZE - For large captured images it is possible for the writes from the analysis daemon to the frame server to fail as the amount to be written exceeds the default buffer size. While the images are then written by the analysis daemon so no data is lost, it defeats the object of the frame server daemon in the first place. You can use this option to indicate that a larger buffer size should be used. Note that you may have to change the existing maximum socket buffer size on your system via sysctl (or in /proc/sys/net/core/wmem_max) to allow this new size to be set. Alternatively you can change the default buffer size on your system in the same way in which case that will be used with no change necessary in this option - OPT_CONTROL - ZoneMinder includes limited support for controllable cameras. A number of sample protocols are included and others can easily be added. If you wish to control your cameras via ZoneMinder then select this option otherwise if you only have static cameras or use other control methods then leave this option off. OPT_TRIGGERS - ZoneMinder can interact with external systems which prompt or cancel alarms. This is done via the zmtrigger.pl script. This option indicates whether you want to use these external triggers. Most people will say no here. diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt index 75e803018..3f92bd5da 100644 --- a/misc/CMakeLists.txt +++ b/misc/CMakeLists.txt @@ -13,7 +13,9 @@ configure_file(zoneminder.desktop.in "${CMAKE_CURRENT_BINARY_DIR}/zoneminder.des # Do not install the misc files by default #install(FILES "${CMAKE_CURRENT_BINARY_DIR}/apache.conf" "${CMAKE_CURRENT_BINARY_DIR}/logrotate.conf" "${CMAKE_CURRENT_BINARY_DIR}/syslog.conf" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/misc") -# Install Policykit rules and actions into the proper folders -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/actions") -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.rules" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/rules.d") +# Install Policykit rules and actions into the proper folders only on systems with systemd +if(WITH_SYSTEMD) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/actions") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.rules" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/rules.d") +endif(WITH_SYSTEMD) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zoneminder.desktop" DESTINATION "${CMAKE_INSTALL_DATADIR}/applications") diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index d6ff8b2d9..62cfe3048 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -2722,47 +2722,6 @@ our @options = ( type => $types{boolean}, category => 'config', }, - { - name => 'ZM_OPT_FRAME_SERVER', - default => 'no', - description => 'Should analysis farm out the writing of images to disk', -#requires => [ { name => 'ZM_OPT_ADAPTIVE_SKIP', value => 'yes' } ], - help => q` - In some circumstances it is possible for a slow disk to take so - long writing images to disk that it causes the analysis daemon - to fall behind especially during high frame rate events. - Setting this option to yes enables a frame server daemon (zmf) - which will be sent the images from the analysis daemon and will - do the actual writing of images itself freeing up the analysis - daemon to get on with other things. Should this transmission - fail or other permanent or transient error occur, this function - will fall back to the analysis daemon. - `, - type => $types{boolean}, - category => 'system', - }, - { - name => 'ZM_FRAME_SOCKET_SIZE', - default => '0', - description => 'Specify the frame server socket buffer size if non-standard', - requires => [ { name => 'ZM_OPT_FRAME_SERVER', value => 'yes' } ], - help => q` - For large captured images it is possible for the writes from - the analysis daemon to the frame server to fail as the amount - to be written exceeds the default buffer size. While the images - are then written by the analysis daemon so no data is lost, it - defeats the object of the frame server daemon in the first - place. You can use this option to indicate that a larger buffer - size should be used. Note that you may have to change the - existing maximum socket buffer size on your system via sysctl - (or in /proc/sys/net/core/wmem_max) to allow this new size to - be set. Alternatively you can change the default buffer size on - your system in the same way in which case that will be used - with no change necessary in this option - `, - type => $types{integer}, - category => 'system', - }, { name => 'ZM_OPT_CONTROL', default => 'no', diff --git a/scripts/zmdc.pl.in b/scripts/zmdc.pl.in index fba711107..a952899c6 100644 --- a/scripts/zmdc.pl.in +++ b/scripts/zmdc.pl.in @@ -92,7 +92,6 @@ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; my @daemons = ( 'zmc', 'zma', - 'zmf', 'zmfilter.pl', 'zmaudit.pl', 'zmtrigger.pl', diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 245faf23c..5f658dbda 100644 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -935,6 +935,7 @@ sub executeCommand my $command = $filter->{AutoExecuteCmd}; $command .= " $event_path"; + $command = substituteTags( $command, $filter, $event ); Info( "Executing '$command'\n" ); my $output = qx($command); diff --git a/scripts/zmpkg.pl.in b/scripts/zmpkg.pl.in index cd9910aa6..597d7ac1a 100644 --- a/scripts/zmpkg.pl.in +++ b/scripts/zmpkg.pl.in @@ -251,10 +251,6 @@ if ( $command =~ /^(?:start|restart)$/ ) } if ( $monitor->{Function} ne 'Monitor' ) { - if ( $Config{ZM_OPT_FRAME_SERVER} ) - { - runCommand( "zmdc.pl start zmf -m $monitor->{Id}" ); - } runCommand( "zmdc.pl start zma -m $monitor->{Id}" ); } if ( $Config{ZM_OPT_CONTROL} ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0d2c27a77..9ec209cf7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,21 +12,19 @@ add_library(zm STATIC ${ZM_BIN_SRC_FILES}) add_executable(zmc zmc.cpp) add_executable(zma zma.cpp) add_executable(zmu zmu.cpp) -add_executable(zmf zmf.cpp) add_executable(zms zms.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}) # Generate man files for the binaries destined for the bin folder -FOREACH(CBINARY zma zmc zmf zmu) +FOREACH(CBINARY zma zmc zmu) POD2MAN(${CMAKE_CURRENT_SOURCE_DIR}/${CBINARY}.cpp zoneminder-${CBINARY} 8) -ENDFOREACH(CBINARY zma zmc zmf zmu) +ENDFOREACH(CBINARY zma zmc zmu) -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 zmc zma zmu 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}") diff --git a/src/zm_camera.cpp b/src/zm_camera.cpp index 7abafee52..0ea7af373 100644 --- a/src/zm_camera.cpp +++ b/src/zm_camera.cpp @@ -40,10 +40,10 @@ Camera::Camera( unsigned int p_monitor_id, SourceType p_type, unsigned int p_wid Debug(2,"New camera id: %d width: %d height: %d colours: %d subpixelorder: %d capture: %d",monitor_id,width,height,colours,subpixelorder,capture); /* Because many loops are unrolled and work on 16 colours/time or 4 pixels/time, we have to meet requirements */ - if((colours == ZM_COLOUR_GRAY8 || colours == ZM_COLOUR_RGB32) && (imagesize % 16) != 0) { - Fatal("Image size is not multiples of 16"); - } else if(colours == ZM_COLOUR_RGB24 && ((imagesize % 16) != 0 || (imagesize % 12) != 0)) { - Fatal("Image size is not multiples of 12 and 16"); + if((colours == ZM_COLOUR_GRAY8 || colours == ZM_COLOUR_RGB32) && (imagesize % 64) != 0) { + Fatal("Image size is not multiples of 64"); + } else if(colours == ZM_COLOUR_RGB24 && ((imagesize % 64) != 0 || (imagesize % 12) != 0)) { + Fatal("Image size is not multiples of 12 and 64"); } } diff --git a/src/zm_event.cpp b/src/zm_event.cpp index 89df6bc00..4df2f24b1 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -42,8 +42,6 @@ extern "C" #include "zm_sendfile.h" } -#include "zmf.h" - #if HAVE_SYS_SENDFILE_H #include #endif @@ -278,116 +276,6 @@ void Event::createNotes( std::string ¬es ) { int Event::sd = -1; -bool Event::OpenFrameSocket( int monitor_id ) { - if ( sd > 0 ) { - close( sd ); - } - - sd = socket( AF_UNIX, SOCK_STREAM, 0 ); - if ( sd < 0 ) { - Error( "Can't create socket: %s", strerror(errno) ); - return( false ); - } - - int socket_buffer_size = config.frame_socket_size; - if ( socket_buffer_size > 0 ) { - if ( setsockopt( sd, SOL_SOCKET, SO_SNDBUF, &socket_buffer_size, sizeof(socket_buffer_size) ) < 0 ) { - Error( "Can't get socket buffer size to %d, error = %s", socket_buffer_size, strerror(errno) ); - close( sd ); - sd = -1; - return( false ); - } - } - - int flags; - if ( (flags = fcntl( sd, F_GETFL )) < 0 ) { - Error( "Can't get socket flags, error = %s", strerror(errno) ); - close( sd ); - sd = -1; - return( false ); - } - flags |= O_NONBLOCK; - if ( fcntl( sd, F_SETFL, flags ) < 0 ) { - Error( "Can't set socket flags, error = %s", strerror(errno) ); - close( sd ); - sd = -1; - return( false ); - } - - char sock_path[PATH_MAX] = ""; - snprintf( sock_path, sizeof(sock_path), "%s/zmf-%d.sock", config.path_socks, monitor_id ); - - struct sockaddr_un addr; - - strncpy( addr.sun_path, sock_path, sizeof(addr.sun_path) ); - addr.sun_family = AF_UNIX; - - if ( connect( sd, (struct sockaddr *)&addr, strlen(addr.sun_path)+sizeof(addr.sun_family)+1) < 0 ) { - Warning( "Can't connect to frame server: %s", strerror(errno) ); - close( sd ); - sd = -1; - return( false ); - } - - Debug( 1, "Opened connection to frame server" ); - return( true ); -} - -bool Event::ValidateFrameSocket( int monitor_id ) { - if ( sd < 0 ) { - return( OpenFrameSocket( monitor_id ) ); - } - return( true ); -} - -bool Event::SendFrameImage( const Image *image, bool alarm_frame ) { - if ( !ValidateFrameSocket( monitor->Id() ) ) { - return( false ); - } - - static int jpg_buffer_size = 0; - static unsigned char jpg_buffer[ZM_MAX_IMAGE_SIZE]; - - image->EncodeJpeg( jpg_buffer, &jpg_buffer_size, (alarm_frame&&(config.jpeg_alarm_file_quality>config.jpeg_file_quality))?config.jpeg_alarm_file_quality:config.jpeg_file_quality ); - - static FrameHeader frame_header; - - frame_header.event_id = id; - if ( config.use_deep_storage ) - frame_header.event_time = start_time.tv_sec; - frame_header.frame_id = frames; - frame_header.alarm_frame = alarm_frame; - frame_header.image_length = jpg_buffer_size; - - struct iovec iovecs[2]; - iovecs[0].iov_base = &frame_header; - iovecs[0].iov_len = sizeof(frame_header); - iovecs[1].iov_base = jpg_buffer; - iovecs[1].iov_len = jpg_buffer_size; - - ssize_t writev_size = sizeof(frame_header)+jpg_buffer_size; - ssize_t writev_result = writev( sd, iovecs, sizeof(iovecs)/sizeof(*iovecs)); - if ( writev_result != writev_size ) { - if ( writev_result < 0 ) { - if ( errno == EAGAIN ) { - Warning( "Blocking write detected" ); - } else { - Error( "Can't write frame: %s", strerror(errno) ); - close( sd ); - sd = -1; - } - } else { - Error( "Incomplete frame write: %zd of %zd bytes written", writev_result, writev_size ); - close( sd ); - sd = -1; - } - return( false ); - } - Debug( 1, "Wrote frame image, %d bytes", jpg_buffer_size ); - - return( true ); -} - bool Event::WriteFrameImage( Image *image, struct timeval timestamp, const char *event_file, bool alarm_frame ) { Image* ImgToWrite; Image* ts_image = NULL; @@ -400,10 +288,9 @@ bool Event::WriteFrameImage( Image *image, struct timeval timestamp, const char } else ImgToWrite=image; - if ( !config.opt_frame_server || !SendFrameImage(ImgToWrite, alarm_frame) ) { - int thisquality = ( alarm_frame && (config.jpeg_alarm_file_quality > config.jpeg_file_quality) ) ? config.jpeg_alarm_file_quality : 0 ; // quality to use, zero is default - ImgToWrite->WriteJpeg( event_file, thisquality, (monitor->Exif() ? timestamp : (timeval){0,0}) ); // exif is only timestamp at present this switches on or off for write - } + int thisquality = ( alarm_frame && (config.jpeg_alarm_file_quality > config.jpeg_file_quality) ) ? config.jpeg_alarm_file_quality : 0 ; // quality to use, zero is default + ImgToWrite->WriteJpeg( event_file, thisquality, (monitor->Exif() ? timestamp : (timeval){0,0}) ); // exif is only timestamp at present this switches on or off for write + if(ts_image) delete(ts_image); // clean up if used. return( true ); } diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 7b353ed17..4921c75d3 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -204,16 +204,32 @@ void Image::Initialise() fptr_blend = &std_blend; Debug(4,"Blend: Using standard blend function"); } + + __attribute__((aligned(64))) uint8_t blend1[128] = { + 86,58,54,63,149,62,209,34,148,46,186,176,9,236,193,254,113,146,228,220,123,164,92,98,9,72,67,156,63,118,96,167, + 48,224,106,176,201,245,223,219,198,50,100,31,68,77,33,76,166,90,254,128,191,82,84,32,3,171,147,248,14,196,141,179, + 79,237,121,11,132,37,194,225,45,171,169,167,56,64,193,85,147,33,97,221,94,97,90,44,191,248,65,8,17,240,167,207, + 224,23,71,74,81,1,46,110,227,94,163,170,55,155,52,147,224,154,237,35,255,26,229,11,223,242,118,155,82,37,189,2 + }; + __attribute__((aligned(64))) uint8_t blend2[128] = { + 92,188,203,118,121,231,252,218,126,88,80,72,123,16,91,131,109,0,57,56,95,204,74,8,137,94,6,69,18,146,229,194, + 146,230,13,146,95,48,185,65,162,47,152,172,184,111,245,143,247,105,49,42,89,37,145,255,221,200,103,80,98,39,14,227, + 227,46,46,59,248,7,83,20,157,79,36,161,237,55,77,175,232,200,38,170,198,239,89,19,82,88,130,120,203,184,141,117, + 228,140,150,107,103,195,74,130,42,11,150,70,176,204,198,188,38,252,174,104,128,106,31,17,141,231,62,104,179,29,143,130 + }; + __attribute__((aligned(64))) uint8_t blendexp[128] = { + 86,73,71,69,145,82,214,56,145,51,173,163,22,209,180,239,112,128,207,200,119,168,89,87,24,74,59,145,57,121,111,170, + 59,224,94,172,188,221,218,200,193,49,106,47,81,81,58,84,175,91,229,117,178,76,91,58,29,174,141,227,24,177,125,184, + 96,214,112,16,145,33,180,200,58,159,153,166,77,62,179,95,157,53,89,214,106,114,89,41,177,228,72,21,39,233,163,196, + 224,37,80,77,83,24,49,112,204,84,161,158,69,160,69,151,201,165,229,43,239,35,205,11,213,240,111,148,93,36,183,17 + }; + __attribute__((aligned(64))) uint8_t blendres[128]; - __attribute__((aligned(16))) uint8_t blend1[16] = {142,255,159,91,88,227,0,52,37,80,152,97,104,252,90,82}; - __attribute__((aligned(16))) uint8_t blend2[16] = {129,56,136,96,119,149,94,29,96,176,1,144,230,203,111,172}; - __attribute__((aligned(16))) uint8_t blendres[16]; - __attribute__((aligned(16))) uint8_t blendexp[16] = {141,231,157,92,91,217,11,49,45,92,133,103,119,246,92,93}; /* Expected results for 12.5% blend */ - - (*fptr_blend)(blend1,blend2,blendres,16,12.5); + /* Run the blend function */ + (*fptr_blend)(blend1,blend2,blendres,128,12.0); /* Compare results with expected results */ - for(int i=0;i<16;i++) { + for(int i=0;i<128;i++) { if(abs(blendexp[i] - blendres[i]) > 3) { Panic("Blend function failed self-test: Results differ from the expected results"); } @@ -238,15 +254,6 @@ void Image::Initialise() fptr_delta8_bgra = &sse2_delta8_bgra; fptr_delta8_argb = &sse2_delta8_argb; fptr_delta8_abgr = &sse2_delta8_abgr; - /* - ** On some systems, the 4 SSE2 algorithms above might be a little slower than - ** the standard algorithms, especially on early Pentium 4 processors. - ** In that case, comment out the 4 lines above and uncomment the 4 lines below - */ - // fptr_delta8_rgba = &std_delta8_rgba; - // fptr_delta8_bgra = &std_delta8_bgra; - // fptr_delta8_argb = &std_delta8_argb; - // fptr_delta8_abgr = &std_delta8_abgr; fptr_delta8_gray8 = &sse2_delta8_gray8; Debug(4,"Delta: Using SSE2 delta functions"); } else if(neonversion >= 1) { @@ -276,11 +283,55 @@ void Image::Initialise() Debug(4,"Delta: CPU extensions disabled, using standard delta functions"); } + __attribute__((aligned(64))) uint8_t delta8_1[128] = { + 221,22,234,254,8,140,15,28,166,13,203,56,92,250,79,225,19,59,241,145,253,33,87,204,97,168,229,180,3,108,205,177, + 41,108,65,149,4,87,16,240,56,50,135,64,153,3,219,214,239,55,169,180,167,45,243,56,191,119,145,250,102,145,73,32, + 207,213,189,167,147,83,217,30,113,51,142,125,219,97,60,5,135,195,95,133,21,197,150,82,134,93,198,97,97,49,117,24, + 242,253,242,5,190,71,182,1,0,69,25,181,139,84,242,79,150,158,29,215,98,100,245,16,86,165,18,98,46,100,139,19 + }; + __attribute__((aligned(64))) uint8_t delta8_2[128] = { + 236,22,153,161,50,141,15,130,89,251,33,5,140,201,225,194,138,76,248,89,25,26,29,93,250,251,48,157,41,126,140,152, + 170,177,134,14,234,99,3,105,217,76,38,233,89,30,93,48,234,40,202,80,184,4,250,71,183,249,76,78,184,148,185,120, + 137,214,238,57,50,93,29,60,99,207,40,15,43,28,177,118,60,231,90,47,198,251,250,241,212,114,249,17,95,161,216,218, + 51,178,137,161,213,108,35,72,65,24,5,176,110,15,0,2,137,58,0,133,197,1,122,169,175,33,223,138,37,114,52,186 + }; + __attribute__((aligned(64))) uint8_t delta8_gray8_exp[128] = { + 15,0,81,93,42,1,0,102,77,238,170,51,48,49,146,31,119,17,7,56,228,7,58,111,153,83,181,23,38,18,65,25, + 129,69,69,135,230,12,13,135,161,26,97,169,64,27,126,166,5,15,33,100,17,41,7,15,8,130,69,172,82,3,112,88, + 70,1,49,110,97,10,188,30,14,156,102,110,176,69,117,113,75,36,5,86,177,54,100,159,78,21,51,80,2,112,99,194, + 191,75,105,156,23,37,147,71,65,45,20,5,29,69,242,77,13,100,29,82,99,99,123,153,89,132,205,40,9,14,87,167 + }; + __attribute__((aligned(64))) uint8_t delta8_rgba_exp[32] = { + 73,25,148,105,20,64,129,49,85,43,106,123,47,13,102,92,58,126,110,110,29,109,54,124,114,114,19,179,51,127,154,97 + }; + __attribute__((aligned(64))) uint8_t delta8_gray8_res[128]; + __attribute__((aligned(64))) uint8_t delta8_rgba_res[32]; + + /* Run the delta8 grayscale function */ + (*fptr_delta8_gray8)(delta8_1,delta8_2,delta8_gray8_exp,128); + + /* Compare results with expected results */ + for(int i=0;i<128;i++) { + if(abs(delta8_gray8_exp[i] - delta8_gray8_res[i]) > 7) { + Panic("Delta grayscale function failed self-test: Results differ from the expected results"); + } + } + + /* Run the delta8 RGBA function */ + (*fptr_delta8_rgba)(delta8_1,delta8_2,delta8_rgba_exp,32); + + /* Compare results with expected results */ + for(int i=0;i<32;i++) { + if(abs(delta8_rgba_exp[i] - delta8_rgba_res[i]) > 7) { + Panic("Delta RGBA function failed self-test: Results differ from the expected results"); + } + } + /* SSSE3 deinterlacing functions were removed because they were usually equal or slower than the standard code (compiled with -O2 or better) - The function is too complicated to be vectorized efficiently - */ + The function is too complicated to be vectorized efficiently on SSSE3 + */ fptr_deinterlace_4field_rgba = &std_deinterlace_4field_rgba; fptr_deinterlace_4field_bgra = &std_deinterlace_4field_bgra; fptr_deinterlace_4field_argb = &std_deinterlace_4field_argb; @@ -1658,6 +1709,8 @@ Image *Image::Highlight( unsigned int n_images, Image *images[], const Rgb thres unsigned int size = result->size; for ( unsigned int c = 0; c < colours; c++ ) { + unsigned int ref_colour_rgb = RGB_VAL(ref_colour,c); + for ( unsigned int i = 0; i < size; i++ ) { unsigned int count = 0; @@ -1666,14 +1719,12 @@ Image *Image::Highlight( unsigned int n_images, Image *images[], const Rgb thres { uint8_t *psrc = images[j]->buffer+c; -#ifndef SOLARIS - if ( (unsigned)abs((*psrc)-RGB_VAL(ref_colour,c)) >= RGB_VAL(threshold,c) ) -#else - if ( (unsigned)std::abs((*psrc)-RGB_VAL(ref_colour,c)) >= RGB_VAL(threshold,c) ) -#endif - { - count++; - } + unsigned int diff = ((*psrc)-ref_colour_rgb) > 0 ? (*psrc)-ref_colour_rgb : ref_colour_rgb - (*psrc); + + if (diff >= RGB_VAL(threshold,c)) + { + count++; + } psrc += colours; } *pdest = (count*255)/n_images; @@ -3337,12 +3388,22 @@ void neon32_armv7_fastblend(const uint8_t* col1, const uint8_t* col2, uint8_t* r current_blendpercent = blendpercent; } - /* Q0(D0,D1) = col1 */ - /* Q1(D2,D3) = col2 */ - /* Q2(D4,D5) = col1 backup */ - /* Q3(D6,D7) = divider */ + /* Q0(D0,D1) = col1+0 */ + /* Q1(D2,D3) = col1+16 */ + /* Q2(D4,D5) = col1+32 */ + /* Q3(D6,D7) = col1+48 */ + /* Q4(D8,D9) = col2+0 */ + /* Q5(D10,D11) = col2+16 */ + /* Q6(D12,D13) = col2+32 */ + /* Q7(D14,D15) = col2+48 */ + /* Q8(D16,D17) = col1tmp+0 */ + /* Q9(D18,D19) = col1tmp+16 */ + /* Q10(D20,D21) = col1tmp+32 */ + /* Q11(D22,D23) = col1tmp+48 */ + /* Q12(D24,D25) = divider */ __asm__ __volatile__ ( +<<<<<<< HEAD "mov r12, %4\n\t" "vdup.8 q3, r12\n\t" "neon32_armv7_fastblend_iter:\n\t" @@ -3359,6 +3420,38 @@ void neon32_armv7_fastblend(const uint8_t* col1, const uint8_t* col2, uint8_t* r : "r" (col1), "r" (col2), "r" (result), "r" (count), "g" (divider) : "%r12", "%q0", "%q1", "%q2", "%q3", "cc", "memory" ); +======= + "mov r12, %4\n\t" + "vdup.8 q12, r12\n\t" + "neon32_armv7_fastblend_iter:\n\t" + "pld [%0,#256]\n\t" + "pld [%1,#256]\n\t" + "vldm %0!, {q0,q1,q2,q3}\n\t" + "vldm %1!, {q4,q5,q6,q7}\n\t" + "vrshl.u8 q8, q0, q12\n\t" + "vrshl.u8 q9, q1, q12\n\t" + "vrshl.u8 q10, q2, q12\n\t" + "vrshl.u8 q11, q3, q12\n\t" + "vrshl.u8 q4, q4, q12\n\t" + "vrshl.u8 q5, q5, q12\n\t" + "vrshl.u8 q6, q6, q12\n\t" + "vrshl.u8 q7, q7, q12\n\t" + "vsub.i8 q4, q4, q8\n\t" + "vsub.i8 q5, q5, q9\n\t" + "vsub.i8 q6, q6, q10\n\t" + "vsub.i8 q7, q7, q11\n\t" + "vadd.i8 q4, q4, q0\n\t" + "vadd.i8 q5, q5, q1\n\t" + "vadd.i8 q6, q6, q2\n\t" + "vadd.i8 q7, q7, q3\n\t" + "vstm %2!, {q4,q5,q6,q7}\n\t" + "subs %3, %3, #64\n\t" + "bne neon32_armv7_fastblend_iter\n\t" + : + : "r" (col1), "r" (col2), "r" (result), "r" (count), "r" (divider) + : "%r12", "%q0", "%q1", "%q2", "%q3", "%q4", "%q5", "%q6", "%q7", "%q8", "%q9", "%q10", "%q11", "%q12", "cc", "memory" + ); +>>>>>>> master #else Panic("Neon function called on a non-ARM platform or Neon code is absent"); #endif @@ -3593,10 +3686,17 @@ __attribute__((noinline,__target__("fpu=neon"))) void neon32_armv7_delta8_gray8(const uint8_t* col1, const uint8_t* col2, uint8_t* result, unsigned long count) { #if (defined(__arm__) && !defined(ZM_STRIP_NEON)) - /* Q0(D0,D1) = col1 */ - /* Q1(D2,D3) = col2 */ + /* Q0(D0,D1) = col1+0 */ + /* Q1(D2,D3) = col1+16 */ + /* Q2(D4,D5) = col1+32 */ + /* Q3(D6,D7) = col1+48 */ + /* Q4(D8,D9) = col2+0 */ + /* Q5(D10,D11) = col2+16 */ + /* Q6(D12,D13) = col2+32 */ + /* Q7(D14,D15) = col2+48 */ __asm__ __volatile__ ( +<<<<<<< HEAD "neon32_armv7_delta8_gray8_iter:\n\t" "vldm %0!, {q0}\n\t" "vldm %1!, {q1}\n\t" @@ -3608,6 +3708,24 @@ void neon32_armv7_delta8_gray8(const uint8_t* col1, const uint8_t* col2, uint8_t : "r" (col1), "r" (col2), "r" (result), "r" (count) : "%q0", "%q1", "cc", "memory" ); +======= + "neon32_armv7_delta8_gray8_iter:\n\t" + "pld [%0,#256]\n\t" + "pld [%1,#256]\n\t" + "vldm %0!, {q0,q1,q2,q3}\n\t" + "vldm %1!, {q4,q5,q6,q7}\n\t" + "vabd.u8 q0, q0, q4\n\t" + "vabd.u8 q1, q1, q5\n\t" + "vabd.u8 q2, q2, q6\n\t" + "vabd.u8 q3, q3, q7\n\t" + "vstm %2!, {q0,q1,q2,q3}\n\t" + "subs %3, %3, #64\n\t" + "bne neon32_armv7_delta8_gray8_iter\n\t" + : + : "r" (col1), "r" (col2), "r" (result), "r" (count) + : "%q0", "%q1", "%q2", "%q3", "%q4", "%q5", "%q6", "%q7", "cc", "memory" + ); +>>>>>>> master #else Panic("Neon function called on a non-ARM platform or Neon code is absent"); #endif @@ -3620,11 +3738,18 @@ __attribute__((noinline,__target__("fpu=neon"))) void neon32_armv7_delta8_rgb32(const uint8_t* col1, const uint8_t* col2, uint8_t* result, unsigned long count, uint32_t multiplier) { #if (defined(__arm__) && !defined(ZM_STRIP_NEON)) - /* Q0(D0,D1) = col1 */ - /* Q1(D2,D3) = col2 */ - /* Q2(D4,D5) = multiplier */ + /* Q0(D0,D1) = col1+0 */ + /* Q1(D2,D3) = col1+16 */ + /* Q2(D4,D5) = col1+32 */ + /* Q3(D6,D7) = col1+48 */ + /* Q4(D8,D9) = col2+0 */ + /* Q5(D10,D11) = col2+16 */ + /* Q6(D12,D13) = col2+32 */ + /* Q7(D14,D15) = col2+48 */ + /* Q8(D16,D17) = multiplier */ __asm__ __volatile__ ( +<<<<<<< HEAD "mov r12, %4\n\t" "vdup.32 q2, r12\n\t" "neon32_armv7_delta8_rgb32_iter:\n\t" @@ -3643,6 +3768,43 @@ void neon32_armv7_delta8_rgb32(const uint8_t* col1, const uint8_t* col2, uint8_t : "r" (col1), "r" (col2), "r" (result), "r" (count), "r" (multiplier) : "%r12", "%q0", "%q1", "%q2", "cc", "memory" ); +======= + "mov r12, %4\n\t" + "vdup.32 q8, r12\n\t" + "neon32_armv7_delta8_rgb32_iter:\n\t" + "pld [%0,#256]\n\t" + "pld [%1,#256]\n\t" + "vldm %0!, {q0,q1,q2,q3}\n\t" + "vldm %1!, {q4,q5,q6,q7}\n\t" + "vabd.u8 q0, q0, q4\n\t" + "vabd.u8 q1, q1, q5\n\t" + "vabd.u8 q2, q2, q6\n\t" + "vabd.u8 q3, q3, q7\n\t" + "vrshr.u8 q0, q0, #3\n\t" + "vrshr.u8 q1, q1, #3\n\t" + "vrshr.u8 q2, q2, #3\n\t" + "vrshr.u8 q3, q3, #3\n\t" + "vmul.i8 q0, q0, q8\n\t" + "vmul.i8 q1, q1, q8\n\t" + "vmul.i8 q2, q2, q8\n\t" + "vmul.i8 q3, q3, q8\n\t" + "vpadd.i8 d0, d0, d1\n\t" + "vpadd.i8 d2, d2, d3\n\t" + "vpadd.i8 d4, d4, d5\n\t" + "vpadd.i8 d6, d6, d7\n\t" + "vpadd.i8 d0, d0, d0\n\t" + "vpadd.i8 d1, d2, d2\n\t" + "vpadd.i8 d2, d4, d4\n\t" + "vpadd.i8 d3, d6, d6\n\t" + "vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [%2]!\n\t" + "subs %3, %3, #16\n\t" + "bne neon32_armv7_delta8_rgb32_iter\n\t" + : + : "r" (col1), "r" (col2), "r" (result), "r" (count), "r" (multiplier) + : "%r12", "%q0", "%q1", "%q2", "%q3", "%q4", "%q5", "%q6", "%q7", "%q8", "cc", "memory" + ); +} +>>>>>>> master #else Panic("Neon function called on a non-ARM platform or Neon code is absent"); #endif diff --git a/src/zm_image.h b/src/zm_image.h index 0a90c5c23..3af56f598 100644 --- a/src/zm_image.h +++ b/src/zm_image.h @@ -54,7 +54,7 @@ extern imgbufcpy_fptr_t fptr_imgbufcpy; /* Should be called from Image class functions */ inline static uint8_t* AllocBuffer(size_t p_bufsize) { - uint8_t* buffer = (uint8_t*)zm_mallocaligned(16,p_bufsize); + uint8_t* buffer = (uint8_t*)zm_mallocaligned(64,p_bufsize); if(buffer == NULL) Fatal("Memory allocation failed: %s",strerror(errno)); diff --git a/src/zm_libvlc_camera.cpp b/src/zm_libvlc_camera.cpp index dbe69750f..a4135d352 100644 --- a/src/zm_libvlc_camera.cpp +++ b/src/zm_libvlc_camera.cpp @@ -182,9 +182,9 @@ int LibvlcCamera::PrimeCapture() mLibvlcData.bufferSize = width * height * mBpp; // Libvlc wants 32 byte alignment for images (should in theory do this for all image lines) - mLibvlcData.buffer = (uint8_t*)zm_mallocaligned(32, mLibvlcData.bufferSize); - mLibvlcData.prevBuffer = (uint8_t*)zm_mallocaligned(32, mLibvlcData.bufferSize); - + mLibvlcData.buffer = (uint8_t*)zm_mallocaligned(64, mLibvlcData.bufferSize); + mLibvlcData.prevBuffer = (uint8_t*)zm_mallocaligned(64, mLibvlcData.bufferSize); + mLibvlcData.newImage.setValueImmediate(false); libvlc_media_player_play(mLibvlcMediaPlayer); diff --git a/src/zm_logger.cpp b/src/zm_logger.cpp index ed49ae57d..1941677d9 100644 --- a/src/zm_logger.cpp +++ b/src/zm_logger.cpp @@ -31,9 +31,9 @@ #include #include #include +#include #ifdef __FreeBSD__ #include -#include #endif bool Logger::smInitialised = false; @@ -515,7 +515,8 @@ void Logger::logPrint( bool hex, const char * const filepath, const int line, co va_list argPtr; struct timeval timeVal; - const char * const file = basename(filepath); + char *filecopy = strdup(filepath); + const char * const file = basename(filecopy); const char *classString = smCodes[level].c_str(); if ( level < PANIC || level > DEBUG9 ) @@ -630,6 +631,7 @@ void Logger::logPrint( bool hex, const char * const filepath, const int line, co syslog( priority, "%s [%s] [%s]", classString, mId.c_str(), syslogStart ); } + free(filecopy); if ( level <= FATAL ) { if ( level <= PANIC ) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 35c19927d..982ddefb0 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -148,7 +148,7 @@ bool Monitor::MonitorLink::connect() { return( false ); } mem_ptr = (unsigned char *)shmat( shm_id, 0, 0 ); - if ( mem_ptr < 0 ) { + if ( mem_ptr < (void *)0 ) { Debug( 3, "Can't shmat link memory: %s", strerror(errno) ); connected = false; return( false ); @@ -374,7 +374,7 @@ Monitor::Monitor( + sizeof(VideoStoreData) //Information to pass back to the capture process + (image_buffer_count*sizeof(struct timeval)) + (image_buffer_count*camera->ImageSize()) - + 64; /* Padding used to permit aligning the images buffer to 16 byte boundary */ + + 64; /* Padding used to permit aligning the images buffer to 64 byte boundary */ Debug( 1, "mem.size=%d", mem_size ); mem_ptr = NULL; @@ -530,7 +530,7 @@ bool Monitor::connect() { exit( -1 ); } mem_ptr = (unsigned char *)shmat( shm_id, 0, 0 ); - if ( mem_ptr < 0 ) { + if ( mem_ptr < (void *)0 ) { Error( "Can't shmat: %s", strerror(errno)); exit( -1 ); } @@ -541,10 +541,10 @@ bool Monitor::connect() { struct timeval *shared_timestamps = (struct timeval *)((char *)video_store_data + sizeof(VideoStoreData)); unsigned char *shared_images = (unsigned char *)((char *)shared_timestamps + (image_buffer_count*sizeof(struct timeval))); - if(((unsigned long)shared_images % 16) != 0) { - /* Align images buffer to nearest 16 byte boundary */ - Debug(3,"Aligning shared memory images to the next 16 byte boundary"); - shared_images = (uint8_t*)((unsigned long)shared_images + (16 - ((unsigned long)shared_images % 16))); + if(((unsigned long)shared_images % 64) != 0) { + /* Align images buffer to nearest 64 byte boundary */ + Debug(3,"Aligning shared memory images to the next 64 byte boundary"); + shared_images = (uint8_t*)((unsigned long)shared_images + (64 - ((unsigned long)shared_images % 64))); } Debug(3, "Allocating %d image buffers", image_buffer_count ); image_buffer = new Snapshot[image_buffer_count]; diff --git a/src/zma.cpp b/src/zma.cpp index 8d446668b..4479b4f78 100644 --- a/src/zma.cpp +++ b/src/zma.cpp @@ -141,11 +141,6 @@ int main( int argc, char *argv[] ) { Info( "In mode %d/%d, warming up", monitor->GetFunction(), monitor->Enabled() ); - if ( config.opt_frame_server ) - { - Event::OpenFrameSocket( monitor->Id() ); - } - zmSetDefaultHupHandler(); zmSetDefaultTermHandler(); zmSetDefaultDieHandler(); diff --git a/src/zmf.h b/src/zmf.h deleted file mode 100644 index 9d5bab127..000000000 --- a/src/zmf.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// ZoneMinder Image File Write Class Interface, $Date$, $Revision$ -// Copyright (C) 2001-2008 Philip Coombes -// -// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// - -#ifndef ZMFILE_H -#define ZMFILE_H - -struct FrameHeader -{ - unsigned long event_id; - time_t event_time; - unsigned long frame_id; - bool alarm_frame; - unsigned long image_length; -}; - -#endif // ZMFILE_H diff --git a/utils/docker/setup.sh b/utils/docker/setup.sh index c7b8b121b..2cef688ff 100755 --- a/utils/docker/setup.sh +++ b/utils/docker/setup.sh @@ -1,7 +1,9 @@ #!/bin/bash # Start MySQL -/usr/bin/mysqld_safe & +test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld +su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &" + # Give MySQL time to wake up SECONDS_LEFT=120 diff --git a/utils/docker/start.sh b/utils/docker/start.sh index 29cb2f567..86247e734 100755 --- a/utils/docker/start.sh +++ b/utils/docker/start.sh @@ -7,7 +7,8 @@ umount /dev/shm mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm # Start MySQL -/usr/bin/mysqld_safe & +test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld +su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &" # Ensure we shut down mysql cleanly later: trap close_mysql SIGTERM diff --git a/version b/version index 34aae156b..d230fb9ee 100644 --- a/version +++ b/version @@ -1 +1,5 @@ +<<<<<<< HEAD 1.31.0 +======= +1.30.4 +>>>>>>> master diff --git a/version.enc b/version.enc deleted file mode 100644 index 46cec4186..000000000 Binary files a/version.enc and /dev/null differ diff --git a/web/graphics/spinner.gif b/web/graphics/spinner.gif deleted file mode 100644 index 53dd589fa..000000000 Binary files a/web/graphics/spinner.gif and /dev/null differ diff --git a/web/graphics/spinner.png b/web/graphics/spinner.png new file mode 100644 index 000000000..0388e02f0 Binary files /dev/null and b/web/graphics/spinner.png differ diff --git a/web/graphics/transparent.gif b/web/graphics/transparent.gif deleted file mode 100644 index edab8f2b5..000000000 Binary files a/web/graphics/transparent.gif and /dev/null differ diff --git a/web/graphics/transparent.png b/web/graphics/transparent.png new file mode 100644 index 000000000..1748734dc Binary files /dev/null and b/web/graphics/transparent.png differ diff --git a/web/includes/functions.php b/web/includes/functions.php index 586e1829a..732da9bdb 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -891,21 +891,12 @@ function zmaControl( $monitor, $mode=false ) { daemonControl( "stop", "zmtrack.pl", "-m ".$monitor['Id'] ); } daemonControl( "stop", "zma", "-m ".$monitor['Id'] ); - if ( ZM_OPT_FRAME_SERVER ) { - daemonControl( "stop", "zmf", "-m ".$monitor['Id'] ); - } } else { if ( $mode == "restart" ) { if ( ZM_OPT_CONTROL ) { daemonControl( "stop", "zmtrack.pl", "-m ".$monitor['Id'] ); } daemonControl( "stop", "zma", "-m ".$monitor['Id'] ); - if ( ZM_OPT_FRAME_SERVER ) { - daemonControl( "stop", "zmf", "-m ".$monitor['Id'] ); - } - } - if ( ZM_OPT_FRAME_SERVER ) { - daemonControl( "start", "zmf", "-m ".$monitor['Id'] ); } daemonControl( "start", "zma", "-m ".$monitor['Id'] ); if ( ZM_OPT_CONTROL && $monitor['Controllable'] && $monitor['TrackMotion'] && ( $monitor['Function'] == 'Modect' || $monitor['Function'] == 'Mocord' ) ) { diff --git a/web/js/logger.js b/web/js/logger.js index c4e072541..9cbe50268 100644 --- a/web/js/logger.js +++ b/web/js/logger.js @@ -46,7 +46,7 @@ function logReport( level, message, file, line ) return; if ( arguments && arguments.callee && arguments.callee.caller && arguments.callee.caller.name ) - message += ' - '+arguments.callee.caller.caller.name+'()'; + message += ' - '+arguments.callee.caller.caller.name+'()'; if ( !debugReq ) { @@ -115,4 +115,4 @@ window.onerror = function( message, url, line ) { logReport( "ERR", message, url, line ); - } + }; diff --git a/web/js/overlay.js b/web/js/overlay.js index 74423e7ef..9738487b0 100644 --- a/web/js/overlay.js +++ b/web/js/overlay.js @@ -84,7 +84,7 @@ var Overlay = new Class({ showAnimation:function() { showOverlay(); - + //console.log( "Showing overlay loading" ); if ( !this.loading ) { @@ -116,7 +116,7 @@ function setupOverlays() overlay.getElements('.overlayCloser').each( function( closer ) { - closer.addEvent( 'click', function() { overlay.element.hide(); } ) + closer.addEvent( 'click', function() { overlay.element.hide(); } ); } ); overlay.overlayShow = function() { overlay.element.show(); }; diff --git a/web/lang/ro_ro.php b/web/lang/ro_ro.php index f0c440a9a..a36c4de6c 100644 --- a/web/lang/ro_ro.php +++ b/web/lang/ro_ro.php @@ -822,14 +822,6 @@ $OLANG = array( 'Prompt' => "Crează imagini analizate cu marcaje ale mişcării", 'Help' => "Implicit, în cazul unei alarme, ZoneMinder înregistrează atât imaginile neprelucrate cât şi cele ce au fost analizate şi au zone marcate unde a fost detectată mişcare. Acest lucru poate fi foarte folositor la configurarea zonelor sau în analiza evenimentelor. Acest parametru permite oprirea înregistrării imaginilor cu zone de mişcare marcate." ), - 'OPT_FRAME_SERVER' => array( - 'Prompt' => "Daemon-ul de analiză va scrie imaginile pe disc", - 'Help' => "În unele cazuri este posibil ca viteza de scriere a unui HDD sa fie atât de mică încat să cauzeze încetinirea daemon-ului de analiză în special în timpul evenimentelor cu multe cadre. Activarea acestei opţiuni porneşte daemon-ul de cadre (zmf) care va 'primi' imaginile de la daemon-ul de analiză şi le va scrie pe disc. Dacă această transmisie eşuează sau apar alte erori, funcţia de scriere va reveni daemon-ului de analiză." - ), - 'FRAME_SOCKET_SIZE' => array( - 'Prompt' => "Specificaţi dimensiunea memoriei tampon", - 'Help' => "Pentru imaginile de dimensiuni mari capturate este posibil ca scrierea lor pe disc să eşueze deoarece cantitatea de informaţie scrisă este mai mare decât memoria tampon alocată. Deşi imaginile sunt scrise apoi de către daemon-ul de analiză, se distruge obiectul daemon-ului de cadre. Puteţi folosi această opţiune pentru a specifica o memorie tampon de dimensiuni mai mari. Va trebui sa modificaţi dimensiunea socket-ului tampon maxim folosind 'sysctl' (sau in /proc/sys/net/core/wmem_max) pentru a permite setarea acestei noi valori. Alternativa este să schimbaţi mărimea implicită a memorie tampon a sistemului, caz în care modificarea acestei valori nu mai este necesară." - ), 'OPT_CONTROL' => array( 'Prompt' => "Suport camere controlabile (rotire/înclinare/zoom)", 'Help' => "ZoneMinder include suport limitat pentru camere controlabile. Sunt incluse câteva protocoale mostră şi pot fi adăugate cu uşurinţă şi altele. Dacă vreţi să controlaţi camerele prin intermediul ZoneMinder selectaţi această opţiune." diff --git a/web/lang/ru_ru.php b/web/lang/ru_ru.php index 25ddc62a5..8d0d24a7d 100644 --- a/web/lang/ru_ru.php +++ b/web/lang/ru_ru.php @@ -19,6 +19,7 @@ // // ZoneMinder Russian Translation by Borodin A.S. +// ZoneMinder Russian Translation updated by IDDQDesnik, 2017 // Notes for Translators // 0. Get some credit, put your name in the line above (optional) @@ -74,91 +75,93 @@ $SLANG = array( '24BitColour' => '24 битный цвет', '32BitColour' => '32 битный цвет', // Added - 2011-06-15 '8BitGrey' => '256 оттенков серого', - 'Action' => 'Action', - 'Actual' => 'Действительный', - 'AddNewControl' => 'Add New Control', + 'Action' => 'Действие', + 'AddNewControl' => 'Добавить новый', 'AddNewMonitor' => 'Добавить монитор', 'AddNewUser' => 'Добавить пользователя', 'AddNewZone' => 'Добавить зону', 'Alarm' => 'Тревога', 'AlarmBrFrames' => 'Кадры
тревоги', 'AlarmFrame' => 'Кадр тревоги', - 'AlarmFrameCount' => 'Alarm Frame Count', + 'AlarmFrameCount' => 'Число кадров тревоги', 'AlarmLimits' => 'Гран. зоны трев.', - 'AlarmMaximumFPS' => 'Alarm Maximum FPS', + 'AlarmMaximumFPS' => 'Макс. к/с при тревоге', 'AlarmPx' => 'Пкс трев.', 'AlarmRGBUnset' => 'You must set an alarm RGB colour', - 'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18 + 'AlarmRefImageBlendPct'=> 'Смешение опорного кадра тревоги, %', // Added - 2015-04-18 + 'AlmRefImageBlendPct' => 'Смешение опорного кадра тревоги, %', 'Alert' => 'Настороже', 'All' => 'Все', - 'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22 - 'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23 + 'AnalysisFPS' => 'Частота анализа (к/с)', // Added - 2015-07-22 + 'AnalysisUpdateDelay' => 'Задержка обновления анализа', // Added - 2015-07-23 'Apply' => 'Применить', 'ApplyingStateChange' => 'Состояние сервиса изменяется', 'ArchArchived' => 'Только в архиве', 'ArchUnarchived' => 'Только не в архиве', 'Archive' => 'Архив', - 'Archived' => 'Archived', - 'Area' => 'Area', - 'AreaUnits' => 'Area (px/%)', + 'Archived' => 'Архив', + 'Area' => 'Зона', + 'AreaUnits' => 'Размер (пикс./%)', 'AttrAlarmFrames' => 'Кол-во кадров тревоги', 'AttrArchiveStatus' => 'Статус архивации', 'AttrAvgScore' => 'Сред. оценка', - 'AttrCause' => 'Cause', + 'AttrCause' => 'Причина', 'AttrDate' => 'Дата', 'AttrDateTime' => 'Дата/Время', - 'AttrDiskBlocks' => 'Disk Blocks', - 'AttrDiskPercent' => 'Disk Percent', + 'AttrDiskBlocks' => 'Диск, блоки', + 'AttrDiskPercent' => 'Диск, проценты', 'AttrDuration' => 'Длительность', 'AttrFrames' => 'Кол-во кадров', - 'AttrId' => 'Id', + 'AttrId' => 'ИД', 'AttrMaxScore' => 'Макс. оценка', - 'AttrMonitorId' => 'Id Монитора', + 'AttrMonitorId' => 'ИД Монитора', 'AttrMonitorName' => 'Название Монитора', - 'AttrName' => 'Name', - 'AttrNotes' => 'Notes', - 'AttrSystemLoad' => 'System Load', + 'AttrName' => 'Имя', + 'AttrNotes' => 'Примечание', + 'AttrServerId' => 'ИД сервера', + 'AttrServerName' => 'Имя сервера', + 'AttrSystemLoad' => 'Нагрузка проц.', 'AttrTime' => 'Время', 'AttrTotalScore' => 'Сумм. оценка', 'AttrWeekday' => 'День недели', 'Auto' => 'Auto', - 'AutoStopTimeout' => 'Auto Stop Timeout', - 'Available' => 'Available', // Added - 2009-03-31 + 'AutoStopTimeout' => 'Тайм-аут автоостановки', + 'Available' => 'Доступно', // Added - 2009-03-31 'AvgBrScore' => 'Сред.
оценка', - 'Background' => 'Background', - 'BackgroundFilter' => 'Run filter in background', - 'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more', - 'BadAlarmMaxFPS' => 'Alarm Maximum FPS must be a positive integer or floating point value', - 'BadAnalysisFPS' => 'Analysis FPS must be a positive integer or floating point value', // Added - 2015-07-22 - 'BadAnalysisUpdateDelay'=> 'Analysis update delay must be set to an integer of zero or more', // Added - 2015-07-23 - 'BadChannel' => 'Channel must be set to an integer of zero or more', - 'BadColours' => 'Target colour must be set to a valid value', // Added - 2011-06-15 - 'BadDevice' => 'Device must be set to a valid value', - 'BadFPSReportInterval' => 'FPS report interval buffer count must be an integer of 0 or more', - 'BadFormat' => 'Format must be set to an integer of zero or more', - 'BadFrameSkip' => 'Frame skip count must be an integer of zero or more', - 'BadHeight' => 'Height must be set to a valid value', - 'BadHost' => 'Host must be set to a valid ip address or hostname, do not include http://', + 'Background' => 'Фоновый', + 'BackgroundFilter' => 'Выполнить фильтр в фоновом режиме', + 'BadAlarmFrameCount' => 'Число кадров тревоги должно быть целочисенным и больше нуля', + 'BadAlarmMaxFPS' => 'Макс. к/с при тревоге должно быть положительным', + 'BadAnalysisFPS' => 'Частота анализа должна быть положительной', // Added - 2015-07-22 + 'BadAnalysisUpdateDelay'=> 'Задержка обновления анализа должна быть целочисленной и большей либо равной нулю', // Added - 2015-07-23 + 'BadChannel' => 'Канал должен быть целочисленным и большим либо равным нулю', + 'BadColours' => 'Неправильное цветовое пространство', // Added - 2011-06-15 + 'BadDevice' => 'Неправильный путь к устройству', + 'BadFPSReportInterval' => 'Период обновления индикации скорости должен быть целочисленным и большим либо равным нулю', + 'BadFormat' => 'Неправильный формат', + 'BadFrameSkip' => 'Количество пропускаемых кадров должно быть целочисленным и большим либо равным нулю', + 'BadHeight' => 'Неправильная высота', + 'BadHost' => 'Неправильный IP или имя хоста; указывается без http://', 'BadImageBufferCount' => 'Image buffer size must be an integer of 10 or more', - 'BadLabelX' => 'Label X co-ordinate must be set to an integer of zero or more', - 'BadLabelY' => 'Label Y co-ordinate must be set to an integer of zero or more', - 'BadMaxFPS' => 'Maximum FPS must be a positive integer or floating point value', - 'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more', - 'BadNameChars' => 'Names may only contain alphanumeric characters, spaces plus hyphen and underscore', - 'BadPalette' => 'Palette must be set to a valid value', // Added - 2009-03-31 - 'BadPath' => 'Path must be set to a valid value', - 'BadPort' => 'Port must be set to a valid number', - 'BadPostEventCount' => 'Post event image count must be an integer of zero or more', - 'BadPreEventCount' => 'Pre event image count must be at least zero, and less than image buffer size', - 'BadRefBlendPerc' => 'Reference blend percentage must be a positive integer', - 'BadSectionLength' => 'Section length must be an integer of 30 or more', - 'BadSignalCheckColour' => 'Signal check colour must be a valid RGB colour string', - 'BadStreamReplayBuffer'=> 'Stream replay buffer must be an integer of zero or more', - 'BadWarmupCount' => 'Warmup frames must be an integer of zero or more', - 'BadWebColour' => 'Web colour must be a valid web colour string', - 'BadWidth' => 'Width must be set to a valid value', + 'BadLabelX' => 'X координата ярлыка должна быть целочисленной и большей либо равной нулю', + 'BadLabelY' => 'Y координата ярлыка должна быть целочисленной и большей либо равной нулю', + 'BadMaxFPS' => 'Ограничение скорости записи должно быть положительным', + 'BadMotionFrameSkip' => 'Количество пропускаемых кадров движения должно быть целочисленным и большим либо равным нулю', + 'BadNameChars' => 'Имя может содержать только латинские буквы, цифры и символы пробела, плюса, минуса и подчеркивания', + 'BadPalette' => 'Неправильная палитра', // Added - 2009-03-31 + 'BadPath' => 'Неправильный путь', + 'BadPort' => 'Неправильный порт', + 'BadPostEventCount' => 'Буфер после события должен быть целочисленным и большим либо равным нулю', + 'BadPreEventCount' => 'Буфер до события должен быть целочисленным и большим либо равным нулю и меньше буфера изображений', + 'BadRefBlendPerc' => 'Смешение опорного кадра должно быть положительным и целочисленным', + 'BadSectionLength' => 'Длина секции должна быть целочисленной и большей либо равной тридцати', + 'BadSignalCheckColour' => 'Цвет проверки сигнала должен быть правильной строкой формата RGB', + 'BadStreamReplayBuffer'=> 'Буфер потока повторного воспроизведения должен быть целочисленным и большим либо равным нулю', + 'BadWarmupCount' => 'Кол-во кадров разогрева должно быть целочисленным и большим либо равным нулю', + 'BadWebColour' => 'Цвет отметки должен быть правильным Web-цветом', + 'BadWidth' => 'Неправильная ширина', 'Bandwidth' => 'канал', - 'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing + 'BandwidthHead' => 'канал', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing; 'BlobPx' => 'Пкс объекта', 'BlobSizes' => 'Размер объектов', 'Blobs' => 'Кол-во объектов', @@ -166,66 +169,66 @@ $SLANG = array( 'Buffer' => 'Buffer', // Added - 2015-04-18 'Buffers' => 'Буферы', 'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18 - 'CanAutoFocus' => 'Can Auto Focus', - 'CanAutoGain' => 'Can Auto Gain', - 'CanAutoIris' => 'Can Auto Iris', - 'CanAutoWhite' => 'Can Auto White Bal.', - 'CanAutoZoom' => 'Can Auto Zoom', - 'CanFocus' => 'Can Focus', - 'CanFocusAbs' => 'Can Focus Absolute', - 'CanFocusCon' => 'Can Focus Continuous', - 'CanFocusRel' => 'Can Focus Relative', - 'CanGain' => 'Can Gain ', - 'CanGainAbs' => 'Can Gain Absolute', - 'CanGainCon' => 'Can Gain Continuous', - 'CanGainRel' => 'Can Gain Relative', - 'CanIris' => 'Can Iris', - 'CanIrisAbs' => 'Can Iris Absolute', - 'CanIrisCon' => 'Can Iris Continuous', - 'CanIrisRel' => 'Can Iris Relative', - 'CanMove' => 'Can Move', - 'CanMoveAbs' => 'Can Move Absolute', - 'CanMoveCon' => 'Can Move Continuous', - 'CanMoveDiag' => 'Can Move Diagonally', - 'CanMoveMap' => 'Can Move Mapped', - 'CanMoveRel' => 'Can Move Relative', - 'CanPan' => 'Can Pan' , - 'CanReset' => 'Can Reset', - 'CanSetPresets' => 'Can Set Presets', - 'CanSleep' => 'Can Sleep', - 'CanTilt' => 'Can Tilt', - 'CanWake' => 'Can Wake', - 'CanWhite' => 'Can White Balance', - 'CanWhiteAbs' => 'Can White Bal. Absolute', - 'CanWhiteBal' => 'Can White Bal.', - 'CanWhiteCon' => 'Can White Bal. Continuous', - 'CanWhiteRel' => 'Can White Bal. Relative', - 'CanZoom' => 'Can Zoom', - 'CanZoomAbs' => 'Can Zoom Absolute', - 'CanZoomCon' => 'Can Zoom Continuous', - 'CanZoomRel' => 'Can Zoom Relative', + 'CanAutoFocus' => 'Автофокус', + 'CanAutoGain' => 'Автоусиление', + 'CanAutoIris' => 'Автодиафрагма', + 'CanAutoWhite' => 'Автобаланс белого', + 'CanAutoZoom' => 'Автоприближение', + 'CanFocus' => 'Фокусировка', + 'CanFocusAbs' => 'Абсолютный фокус', + 'CanFocusCon' => 'Непрерывный фокус', + 'CanFocusRel' => 'Относительный фокус', + 'CanGain' => 'Усиление', + 'CanGainAbs' => 'Абсолютное усиление', + 'CanGainCon' => 'Непрерывное усиление', + 'CanGainRel' => 'Относительное усиление', + 'CanIris' => 'Диафрагма', + 'CanIrisAbs' => 'Абсолютная диафрагма', + 'CanIrisCon' => 'Непрерывная диафрагма', + 'CanIrisRel' => 'Относительная диафрагма', + 'CanMove' => 'Перемещение', + 'CanMoveAbs' => 'Абсолютное перемещение', + 'CanMoveCon' => 'Непрерывное перемещение', + 'CanMoveDiag' => 'Диагональное перемещение', + 'CanMoveMap' => 'Перемещение по точкам', + 'CanMoveRel' => 'Относительное перемещение', + 'CanPan' => 'Панорама' , + 'CanReset' => 'Сброс', + 'CanSetPresets' => 'Создание предустановок', + 'CanSleep' => 'Сон', + 'CanTilt' => 'Наклон', + 'CanWake' => 'Пробуждение', + 'CanWhite' => 'Баланс белого', + 'CanWhiteAbs' => 'Абсолютный баланс белого', + 'CanWhiteBal' => 'Баланс белого', + 'CanWhiteCon' => 'Непрерывный баланс белого', + 'CanWhiteRel' => 'Относительный баланс белого', + 'CanZoom' => 'Увеличение', + 'CanZoomAbs' => 'Абсолютное увеличение', + 'CanZoomCon' => 'Непрерывное увеличение', + 'CanZoomRel' => 'Относительное увеличение', 'Cancel' => 'Отменить', 'CancelForcedAlarm' => 'Отменить форсированную тревогу', 'CaptureHeight' => 'Размер по Y', - 'CaptureMethod' => 'Capture Method', // Added - 2009-02-08 + 'CaptureMethod' => 'Метод захвата', // Added - 2009-02-08 'CapturePalette' => 'Режим захвата', 'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18 'CaptureWidth' => 'Размер по X', - 'Cause' => 'Cause', + 'Cause' => 'Причина', 'CheckMethod' => 'Метод проверки тревоги', - 'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31 + 'ChooseDetectedCamera' => 'Выберите камеру', // Added - 2009-03-31 'ChooseFilter' => 'Выбрать фильтр', 'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17 'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17 - 'ChoosePreset' => 'Choose Preset', - 'Clear' => 'Clear', // Added - 2011-06-16 + 'ChoosePreset' => 'Выберите предустановку', + 'Clear' => 'Очистить', // Added - 2011-06-16 'Close' => 'Закрыть', 'Colour' => 'Цвет', 'Command' => 'Command', - 'Component' => 'Component', // Added - 2011-06-16 + 'Component' => 'Компонент', // Added - 2011-06-16 'Config' => 'Config', - 'ConfiguredFor' => 'Настроен на', - 'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?', + 'ConfiguredFor' => 'настроен на', + 'ConfirmDeleteEvents' => 'Вы действительно хотите удалить выбранные события?', 'ConfirmPassword' => 'Подтвердите пароль', 'ConjAnd' => 'и', 'ConjOr' => 'или', @@ -233,59 +236,59 @@ $SLANG = array( 'ContactAdmin' => 'Пожалуйста обратитесь к вашему администратору.', 'Continue' => 'Continue', 'Contrast' => 'Контраст', - 'Control' => 'Control', - 'ControlAddress' => 'Control Address', - 'ControlCap' => 'Control Capability', - 'ControlCaps' => 'Control Capabilities', - 'ControlDevice' => 'Control Device', - 'ControlType' => 'Control Type', - 'Controllable' => 'Controllable', - 'Current' => 'Current', // Added - 2015-04-18 - 'Cycle' => 'Cycle', + 'Control' => 'Управление', + 'ControlAddress' => 'Адрес устройства', + 'ControlCap' => 'Тип управления', + 'ControlCaps' => 'Типы управления', + 'ControlDevice' => 'Управляемое устройство', + 'ControlType' => 'Тип управления', + 'Controllable' => 'Управляемая', + 'Current' => 'Текущий', // Added - 2015-04-18 + 'Cycle' => 'Циклически', 'CycleWatch' => 'Циклический просмотр', - 'DateTime' => 'Date/Time', // Added - 2011-06-16 + 'DateTime' => 'Дата/Время', // Added - 2011-06-16 'Day' => 'День', 'Debug' => 'Debug', - 'DefaultRate' => 'Default Rate', - 'DefaultScale' => 'Default Scale', - 'DefaultView' => 'Default View', - 'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18 + 'DefaultRate' => 'Скорость по умолчанию', + 'DefaultScale' => 'Масштаб по умолчанию', + 'DefaultView' => 'Вид по умолчанию', + 'Deinterlacing' => 'Устранение чересстрочности', // Added - 2015-04-18 'Delay' => 'Delay', // Added - 2015-04-18 'Delete' => 'Удалить', 'DeleteAndNext' => 'Удалить & след.', 'DeleteAndPrev' => 'Удалить & пред.', 'DeleteSavedFilter' => 'Удалить сохраненный фильтр', 'Description' => 'Описание', - 'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31 - 'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18 + 'DetectedCameras' => 'Найденные камеры', // Added - 2009-03-31 + 'DetectedProfiles' => 'Найденные профили', // Added - 2015-04-18 'Device' => 'Device', // Added - 2009-02-08 'DeviceChannel' => 'Канал', 'DeviceFormat' => 'Формат', 'DeviceNumber' => 'Номер устройства', - 'DevicePath' => 'Device Path', + 'DevicePath' => 'Путь к устройству', 'Devices' => 'Devices', 'Dimensions' => 'Размеры', - 'DisableAlarms' => 'Disable Alarms', - 'Disk' => 'Disk', + 'DisableAlarms' => 'Запретить тревогу', + 'Disk' => 'Диск', 'Display' => 'Display', // Added - 2011-01-30 - 'Displaying' => 'Displaying', // Added - 2011-06-16 + 'Displaying' => 'Отображено', // Added - 2011-06-16 'DoNativeMotionDetection'=> 'Do Native Motion Detection', - 'Donate' => 'Please Donate', - 'DonateAlready' => 'No, I\'ve already donated', - 'DonateEnticement' => 'You\'ve been running ZoneMinder for a while now and hopefully are finding it a useful addition to your home or workplace security. Although ZoneMinder is, and will remain, free and open source, it costs money to develop and support. If you would like to help support future development and new features then please consider donating. Donating is, of course, optional but very much appreciated and you can donate as much or as little as you like.

If you would like to donate please select the option below or go to http://www.zoneminder.com/donate.html in your browser.

Thank you for using ZoneMinder and don\'t forget to visit the forums on ZoneMinder.com for support or suggestions about how to make your ZoneMinder experience even better.', - 'DonateRemindDay' => 'Not yet, remind again in 1 day', - 'DonateRemindHour' => 'Not yet, remind again in 1 hour', - 'DonateRemindMonth' => 'Not yet, remind again in 1 month', - 'DonateRemindNever' => 'No, I don\'t want to donate, never remind', - 'DonateRemindWeek' => 'Not yet, remind again in 1 week', - 'DonateYes' => 'Yes, I\'d like to donate now', - 'Download' => 'Download', + 'Donate' => 'Поддержите проект', + 'DonateAlready' => 'Нет, я уже сделал пожертвование', + 'DonateEnticement' => 'Вы какое-то время используете ZoneMinder и, надеемся, находите его полезным дополнением к вашей домашней или рабочей безопасности. Хотя ZoneMinder есть и будет оставаться свободным и бесплатным, он требует денег на разработку и поддержку. Если Вы хотите поддержать его будущее развитие и новые функции, пожалуйста сделайте пожертвование. Это, конечно, необязательно, но очень высоко ценится. Вы можете пожертвовать любую сумму.

Если Вы хотите сделать пожертвование, то выберите соответствующий вариант ниже или перейдите по адресу https://www.bountysource.com/teams/zoneminder в вашем браузере.

Спасибо за использование ZoneMinder, и не забывайте посетить форум на ZoneMinder.com для поддержки и пожеланий как сделать ZoneMinder еще лучше.', + 'DonateRemindDay' => 'Нет, не сейчас, напомнить через день', + 'DonateRemindHour' => 'Нет, не сейчас, напомнить через час', + 'DonateRemindMonth' => 'Нет, не сейчас, напомнить через месяц', + 'DonateRemindNever' => 'Нет, и не напоминать, я не хочу жертвовать', + 'DonateRemindWeek' => 'Нет, не сейчас, напомнить через неделю', + 'DonateYes' => 'Да, я хотел бы сделать пожертвование', + 'Download' => 'Скачать', 'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31 'Duration' => 'Длительность', 'Edit' => 'Редактирование', 'Email' => 'Email', - 'EnableAlarms' => 'Enable Alarms', - 'Enabled' => 'разрешен', + 'EnableAlarms' => 'Разрешить тревогу', + 'Enabled' => 'Включен', 'EnterNewFilterName' => 'Введите новое название фильтра', 'Error' => 'Ошибка', 'ErrorBrackets' => 'Ошибка: количество открывающих и закрывающих скобок должно быть одинаковым', @@ -295,112 +298,112 @@ $SLANG = array( 'EventFilter' => 'Фильтр событий', 'EventId' => 'Event Id', 'EventName' => 'Event Name', - 'EventPrefix' => 'Event Prefix', + 'EventPrefix' => 'Префикс события', 'Events' => 'События', 'Exclude' => 'Исключить', - 'Execute' => 'Execute', - 'Export' => 'Export', - 'ExportDetails' => 'Export Event Details', - 'ExportFailed' => 'Export Failed', - 'ExportFormat' => 'Export File Format', + 'Execute' => 'Выполнить', + 'Export' => 'Экспорт', + 'ExportDetails' => 'Экспортировать описание события', + 'ExportFailed' => 'Ошибка экспорта', + 'ExportFormat' => 'Формат экспорта', 'ExportFormatTar' => 'Tar', 'ExportFormatZip' => 'Zip', - 'ExportFrames' => 'Export Frame Details', - 'ExportImageFiles' => 'Export Image Files', - 'ExportLog' => 'Export Log', // Added - 2011-06-17 - 'ExportMiscFiles' => 'Export Other Files (if present)', - 'ExportOptions' => 'Export Options', - 'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08 - 'ExportVideoFiles' => 'Export Video Files (if present)', - 'Exporting' => 'Exporting', + 'ExportFrames' => 'Экспортировать описание кадров', + 'ExportImageFiles' => 'Экспортировать изображения', + 'ExportLog' => 'Сохранить лог', // Added - 2011-06-17 + 'ExportMiscFiles' => 'Экспортировать прочие файлы (если есть)', + 'ExportOptions' => 'Настройки экспорта', + 'ExportSucceeded' => 'Экспорт успешен', // Added - 2009-02-08 + 'ExportVideoFiles' => 'Экспортировать видео файлы (если есть)', + 'Exporting' => 'Экспортирую', 'FPS' => 'к/c', 'FPSReportInterval' => 'Период обновления индикации скорости', 'FTP' => 'FTP', 'Far' => 'Far', - 'FastForward' => 'Fast Forward', + 'FastForward' => 'Перемотать', 'Feed' => 'Feed', 'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08 - 'File' => 'File', - 'Filter' => 'Filter', // Added - 2015-04-18 - 'FilterArchiveEvents' => 'Archive all matches', - 'FilterDeleteEvents' => 'Delete all matches', - 'FilterEmailEvents' => 'Email details of all matches', - 'FilterExecuteEvents' => 'Execute command on all matches', - 'FilterLog' => 'Filter log', // Added - 2015-04-18 + 'File' => 'Файл', + 'Filter' => 'Фильтр', // Added - 2015-04-18 + 'FilterArchiveEvents' => 'Архивировать выбранное', + 'FilterDeleteEvents' => 'Удалить выбранное', + 'FilterEmailEvents' => 'Отправить выбранное по Email', + 'FilterExecuteEvents' => 'Выполнить команду над выбранным', + 'FilterLog' => 'Фильтр лога', // Added - 2015-04-18 'FilterMessageEvents' => 'Message details of all matches', 'FilterPx' => 'Пкс фильтра', 'FilterUnset' => 'You must specify a filter width and height', 'FilterUploadEvents' => 'Upload all matches', 'FilterVideoEvents' => 'Create video for all matches', - 'Filters' => 'Filters', + 'Filters' => 'Фильтры', 'First' => 'Первый', 'FlippedHori' => 'Flipped Horizontally', 'FlippedVert' => 'Flipped Vertically', - 'FnMocord' => 'Mocord', // Added 2013.08.16. - 'FnModect' => 'Modect', // Added 2013.08.16. - 'FnMonitor' => 'Monitor', // Added 2013.08.16. - 'FnNodect' => 'Nodect', // Added 2013.08.16. - 'FnNone' => 'None', // Added 2013.08.16. - 'FnRecord' => 'Record', // Added 2013.08.16. - 'Focus' => 'Focus', - 'ForceAlarm' => 'Включить тревогу', - 'Format' => 'Format', + 'FnMocord' => 'Mocord', // Added 2013.08.16. + 'FnModect' => 'Modect', // Added 2013.08.16. + 'FnMonitor' => 'Monitor', // Added 2013.08.16. + 'FnNodect' => 'Nodect', // Added 2013.08.16. + 'FnNone' => 'None', // Added 2013.08.16. + 'FnRecord' => 'Record', // Added 2013.08.16. + 'Focus' => 'Фокус', + 'ForceAlarm' => 'Поднять тревогу', + 'Format' => 'Формат', 'Frame' => 'Кадр', - 'FrameId' => 'Id кадра', - 'FrameRate' => 'Скорость', - 'FrameSkip' => 'Пропускать кадры', + 'FrameId' => 'ИД кадра', + 'FrameRate' => 'Частота кадров', + 'FrameSkip' => 'Кол-во пропуск. кадров', 'Frames' => 'кадры', 'Func' => 'Функ.', 'Function' => 'Функция', 'Gain' => 'Gain', - 'General' => 'General', + 'General' => 'Основные', 'GenerateVideo' => 'Генерировать видео', 'GeneratingVideo' => 'Генерируется видео', 'GoToZoneMinder' => 'Перейти на ZoneMinder.com', 'Grey' => 'ч/б', - 'Group' => 'Group', - 'Groups' => 'Groups', - 'HasFocusSpeed' => 'Has Focus Speed', - 'HasGainSpeed' => 'Has Gain Speed', - 'HasHomePreset' => 'Has Home Preset', - 'HasIrisSpeed' => 'Has Iris Speed', - 'HasPanSpeed' => 'Has Pan Speed', - 'HasPresets' => 'Has Presets', - 'HasTiltSpeed' => 'Has Tilt Speed', - 'HasTurboPan' => 'Has Turbo Pan', - 'HasTurboTilt' => 'Has Turbo Tilt', - 'HasWhiteSpeed' => 'Has White Bal. Speed', - 'HasZoomSpeed' => 'Has Zoom Speed', + 'Group' => 'Группа', + 'Groups' => 'Группы', + 'HasFocusSpeed' => 'Скорость фокуса', + 'HasGainSpeed' => 'Скорость усиления', + 'HasHomePreset' => 'Домашняя предустановка', + 'HasIrisSpeed' => 'Скорость диафрагмы', + 'HasPanSpeed' => 'Скорость панорамир.', + 'HasPresets' => 'Предустановки', + 'HasTiltSpeed' => 'Скорость наклона', + 'HasTurboPan' => 'Укоренное панорамир.', + 'HasTurboTilt' => 'Укоренный наклон', + 'HasWhiteSpeed' => 'Скорость баланса белого', + 'HasZoomSpeed' => 'Скорость увеличения', 'High' => 'широкий', 'HighBW' => 'Широкий канал', - 'Home' => 'Home', + 'Home' => 'Домой', 'Hour' => 'Час', 'Hue' => 'Оттенок', - 'Id' => 'Id', - 'Idle' => 'Idle', + 'Id' => 'ИД', + 'Idle' => 'Покой', 'Ignore' => 'Игнорировать', 'Image' => 'Изображение', - 'ImageBufferSize' => 'Размер буфера изображения', + 'ImageBufferSize' => 'Буфер изображений', 'Images' => 'Images', 'In' => 'In', 'Include' => 'Включить', 'Inverted' => 'Инвертировать', - 'Iris' => 'Iris', + 'Iris' => 'Наклон', 'KeyString' => 'Key String', 'Label' => 'Label', 'Language' => 'Язык', 'Last' => 'Последний', - 'Layout' => 'Layout', // Added - 2009-02-08 - 'Level' => 'Level', // Added - 2011-06-16 + 'Layout' => 'Раскладка', // Added - 2009-02-08 + 'Level' => 'Уровень', // Added - 2011-06-16 'Libvlc' => 'Libvlc', - 'LimitResultsPost' => 'results only;', // This is used at the end of the phrase 'Limit to first N results only' - 'LimitResultsPre' => 'Limit to first', // This is used at the beginning of the phrase 'Limit to first N results only' - 'Line' => 'Line', // Added - 2011-06-16 - 'LinkedMonitors' => 'Linked Monitors', - 'List' => 'List', - 'Load' => 'Load', + 'LimitResultsPost' => 'результатами;', // This is used at the end of the phrase 'Limit to first N results only'; + 'LimitResultsPre' => 'Ограничить первыми', // This is used at the beginning of the phrase 'Limit to first N results only'; + 'Line' => 'Строка', // Added - 2011-06-16 + 'LinkedMonitors' => 'Привязанные мониторы', + 'List' => 'Список', + 'Load' => 'Нагрузка', 'Local' => 'Локальный', - 'Log' => 'Log', // Added - 2011-06-16 + 'Log' => 'Лог', // Added - 2011-06-16; 'LoggedInAs' => 'Пользователь', 'Logging' => 'Logging', // Added - 2011-06-16 'LoggingIn' => 'Вход в систему', @@ -409,90 +412,90 @@ $SLANG = array( 'Logs' => 'Logs', // Added - 2011-06-17 'Low' => 'узкий', 'LowBW' => 'Узкий канал', - 'Main' => 'Main', + 'Main' => 'Основные', 'Man' => 'Man', 'Manual' => 'Manual', 'Mark' => 'Метка', 'Max' => 'Макс.', 'MaxBandwidth' => 'Max Bandwidth', 'MaxBrScore' => 'Макс.
оценка', - 'MaxFocusRange' => 'Max Focus Range', - 'MaxFocusSpeed' => 'Max Focus Speed', - 'MaxFocusStep' => 'Max Focus Step', - 'MaxGainRange' => 'Max Gain Range', - 'MaxGainSpeed' => 'Max Gain Speed', - 'MaxGainStep' => 'Max Gain Step', - 'MaxIrisRange' => 'Max Iris Range', - 'MaxIrisSpeed' => 'Max Iris Speed', - 'MaxIrisStep' => 'Max Iris Step', - 'MaxPanRange' => 'Max Pan Range', - 'MaxPanSpeed' => 'Max Pan Speed', - 'MaxPanStep' => 'Max Pan Step', - 'MaxTiltRange' => 'Max Tilt Range', - 'MaxTiltSpeed' => 'Max Tilt Speed', - 'MaxTiltStep' => 'Max Tilt Step', - 'MaxWhiteRange' => 'Max White Bal. Range', - 'MaxWhiteSpeed' => 'Max White Bal. Speed', - 'MaxWhiteStep' => 'Max White Bal. Step', - 'MaxZoomRange' => 'Max Zoom Range', - 'MaxZoomSpeed' => 'Max Zoom Speed', - 'MaxZoomStep' => 'Max Zoom Step', + 'MaxFocusRange' => 'Макс. диап. фокуса', + 'MaxFocusSpeed' => 'Макс. скор. фокуса', + 'MaxFocusStep' => 'Макс. шаг фокуса', + 'MaxGainRange' => 'Макс. диап. усиления', + 'MaxGainSpeed' => 'Макс. скор. усиления', + 'MaxGainStep' => 'Макс. шаг усиления', + 'MaxIrisRange' => 'Макс. диап. диафрагмы', + 'MaxIrisSpeed' => 'Макс. скор. диафрагмы', + 'MaxIrisStep' => 'Макс. шаг диафрагмы', + 'MaxPanRange' => 'Макс. диап. панорамы', + 'MaxPanSpeed' => 'Макс. скор. панорамы', + 'MaxPanStep' => 'Макс. шаг панорамы', + 'MaxTiltRange' => 'Макс. диап. наклона', + 'MaxTiltSpeed' => 'Макс. скор. наклона', + 'MaxTiltStep' => 'Макс. шаг наклона', + 'MaxWhiteRange' => 'Макс. диап. баланса белого', + 'MaxWhiteSpeed' => 'Макс. скор. баланса белого', + 'MaxWhiteStep' => 'Макс. шаг. баланса белого', + 'MaxZoomRange' => 'Макс. диап. увеличения', + 'MaxZoomSpeed' => 'Макс. скор. увеличения', + 'MaxZoomStep' => 'Макс. шаг увеличения', 'MaximumFPS' => 'Ограничение скорости записи (к/с)', 'Medium' => 'средний', 'MediumBW' => 'Обычный канал', - 'Message' => 'Message', // Added - 2011-06-16 - 'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum', - 'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count', + 'Message' => 'Сообщение', // Added - 2011-06-16 + 'MinAlarmAreaLtMax' => 'Минимум зоны тревоги должен быть меньше максимума', + 'MinAlarmAreaUnset' => 'Укажите минимальное число пикселей зоны тревоги', 'MinBlobAreaLtMax' => 'Минимальная площадь объекта должна быть меньше чем максимальная площадь объекта', - 'MinBlobAreaUnset' => 'You must specify the minimum blob pixel count', - 'MinBlobLtMinFilter' => 'Minimum blob area should be less than or equal to minimum filter area', + 'MinBlobAreaUnset' => 'Укажите минимальное число пикселей объекта', + 'MinBlobLtMinFilter' => 'Минимум пикселей объекта должен быть меньше или равен минимуму фильтр. зоны', 'MinBlobsLtMax' => 'Минимальное число объектов должно быть меньше чем максимальное число объектов', - 'MinBlobsUnset' => 'You must specify the minimum blob count', - 'MinFilterAreaLtMax' => 'Minimum filter area should be less than maximum', - 'MinFilterAreaUnset' => 'You must specify the minimum filter pixel count', - 'MinFilterLtMinAlarm' => 'Minimum filter area should be less than or equal to minimum alarm area', - 'MinFocusRange' => 'Min Focus Range', - 'MinFocusSpeed' => 'Min Focus Speed', - 'MinFocusStep' => 'Min Focus Step', - 'MinGainRange' => 'Min Gain Range', - 'MinGainSpeed' => 'Min Gain Speed', - 'MinGainStep' => 'Min Gain Step', - 'MinIrisRange' => 'Min Iris Range', - 'MinIrisSpeed' => 'Min Iris Speed', - 'MinIrisStep' => 'Min Iris Step', - 'MinPanRange' => 'Min Pan Range', - 'MinPanSpeed' => 'Min Pan Speed', - 'MinPanStep' => 'Min Pan Step', - 'MinPixelThresLtMax' => 'Нижний порог кол-ва пикселей должен быть ниже верхнего порога кол-ва пикселей', - 'MinPixelThresUnset' => 'You must specify a minimum pixel threshold', - 'MinTiltRange' => 'Min Tilt Range', - 'MinTiltSpeed' => 'Min Tilt Speed', - 'MinTiltStep' => 'Min Tilt Step', - 'MinWhiteRange' => 'Min White Bal. Range', - 'MinWhiteSpeed' => 'Min White Bal. Speed', - 'MinWhiteStep' => 'Min White Bal. Step', - 'MinZoomRange' => 'Min Zoom Range', - 'MinZoomSpeed' => 'Min Zoom Speed', - 'MinZoomStep' => 'Min Zoom Step', + 'MinBlobsUnset' => 'Укажите минимальное число объектов', + 'MinFilterAreaLtMax' => 'Минимум фильтр. зоны должен быть меньше максимума', + 'MinFilterAreaUnset' => 'Укажите минимальное число пикселей фильтр. зоны', + 'MinFilterLtMinAlarm' => 'Минимум фильтр. зоны должен быть меньше или равен минимуму зоны тревоги', + 'MinFocusRange' => 'Мин. диап. фокуса', + 'MinFocusSpeed' => 'Мин. скор фокуса', + 'MinFocusStep' => 'Мин. шаг фокуса', + 'MinGainRange' => 'Мин. диап. усиления', + 'MinGainSpeed' => 'Мин. скор. усиления', + 'MinGainStep' => 'Мин. шаг усиления', + 'MinIrisRange' => 'Мин. диап. диафрагмы', + 'MinIrisSpeed' => 'Мин. скор. диафрагмы', + 'MinIrisStep' => 'Мин. шаг диафрагмы', + 'MinPanRange' => 'Мин. диап. панорамы', + 'MinPanSpeed' => 'Мин. скор. панорамы', + 'MinPanStep' => 'Мин. шаг панорамы', + 'MinPixelThresLtMax' => 'Нижний порог изменения пикселя должен быть ниже верхнего порога изменения пикселя', + 'MinPixelThresUnset' => 'Укажите минимальный порог изменения пикселя', + 'MinTiltRange' => 'Мин. диап. наклона', + 'MinTiltSpeed' => 'Мин. скор. наклона', + 'MinTiltStep' => 'Мин. шаг наклона', + 'MinWhiteRange' => 'Мин. диап. баланса белого', + 'MinWhiteSpeed' => 'Мин. скор. баланса белого', + 'MinWhiteStep' => 'Мин. шаг баланса белого', + 'MinZoomRange' => 'Мин. диап. увеличения', + 'MinZoomSpeed' => 'Мин. скор. увеличения', + 'MinZoomStep' => 'Мин. шаг увеличения', 'Misc' => 'Разное', - 'Mode' => 'Mode', // Added - 2015-04-18 + 'Mode' => 'Режим', // Added - 2015-04-18 'Monitor' => 'Монитор', - 'MonitorIds' => 'Id Мониторов', - 'MonitorPreset' => 'Monitor Preset', - 'MonitorPresetIntro' => 'Select an appropriate preset from the list below.

Please note that this may overwrite any values you already have configured for this monitor.

', - 'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31 - 'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection.

Select the desired entry from the list below.

Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2009-03-31 + 'MonitorIds' => 'ИД Мониторов', + 'MonitorPreset' => 'Предустановки монитора',//The list below shows detected analog and network cameras and whether they are already being used or available for selection. + 'MonitorPresetIntro' => 'Выберите подходящий вариант из списка ниже.

Обратите внимание, что это может переписать настройки определенные для этого монитора.

', + 'MonitorProbe' => 'Поиск камеры', // Added - 2009-03-31 + 'MonitorProbeIntro' => 'В этом списке показаны найденные аналоговые и сетевые камеры, как уже заведенные, так и доступные для выбора.

Выберите нужную из списка ниже.

Обратите внимание, что не все камеры могут быть найдены, и что выбор камеры может переписать настройки определенные для этого монитора.

', // Added - 2009-03-31 'Monitors' => 'Мониторы', - 'Montage' => 'Montage', + 'Montage' => 'Монтаж', 'Month' => 'Месяц', - 'More' => 'More', // Added - 2011-06-16 - 'MotionFrameSkip' => 'Motion Frame Skip', - 'Move' => 'Move', - 'Mtg2widgrd' => '2-wide grid', // Added 2013.08.15. - 'Mtg3widgrd' => '3-wide grid', // Added 2013.08.15. - 'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15. - 'Mtg4widgrd' => '4-wide grid', // Added 2013.08.15. - 'MtgDefault' => 'Default', // Added 2013.08.15. + 'More' => 'Еще', // Added - 2011-06-16 + 'MotionFrameSkip' => 'Кол-во пропуск. кадров движения', + 'Move' => 'Перемещение', + 'Mtg2widgrd' => '2 в ряд', // Added 2013.08.15. + 'Mtg3widgrd' => '3 в ряд', // Added 2013.08.15. + 'Mtg3widgrx' => '3 в ряд, увеличиваются при тревоге', // Added 2013.08.15. + 'Mtg4widgrd' => '4 в ряд', // Added 2013.08.15. + 'MtgDefault' => 'По умолчанию', // Added 2013.08.15. 'MustBeGe' => 'должно быть больше или равно', 'MustBeLe' => 'должно быть меньше или равно', 'MustConfirmPassword' => 'Вы должны подтвердить пароль', @@ -502,7 +505,7 @@ $SLANG = array( 'Near' => 'Near', 'Network' => 'Сеть', 'New' => 'Нов.', - 'NewGroup' => 'New Group', + 'NewGroup' => 'Новая группа', 'NewLabel' => 'New Label', 'NewPassword' => 'Новый пароль', 'NewState' => 'Новое состояние', @@ -510,20 +513,20 @@ $SLANG = array( 'Next' => 'След.', 'No' => 'Нет', 'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31 - 'NoFramesRecorded' => 'Это событие не содежит кадров', + 'NoFramesRecorded' => 'Это событие не содержит кадров', 'NoGroup' => 'No Group', 'NoSavedFilters' => 'нет сохраненных фильтров', 'NoStatisticsRecorded' => 'Статистика по этому событию/кадру не записана', 'None' => 'отсутствует', 'NoneAvailable' => 'не доступны', 'Normal' => 'Нормальная', - 'Notes' => 'Notes', - 'NumPresets' => 'Num Presets', + 'Notes' => 'Примечание', + 'NumPresets' => 'Кол-во предустановок', 'Off' => 'Off', 'On' => 'On', - 'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera.
If no user has been created for the camera then the user given here will be created with the given password.

', // Added - 2015-04-18 + 'OnvifCredentialsIntro'=> 'Пожалуйста укажите имя пользователя и пароль для выбранной камеры.

Если пользователь для камеры не был создан, тогда будет создан новый с указанными данными.

', // Added - 2015-04-18 'OnvifProbe' => 'ONVIF', // Added - 2015-04-18 - 'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection.

Select the desired entry from the list below.

Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2015-04-18 + 'OnvifProbeIntro' => 'В этом списке показаны найденные ONVIF камеры, как уже заведенные, так и доступные для выбора.

Выберите нужную из списка ниже.

Обратите внимание, что не все камеры могут быть найдены, и что выбор камеры может переписать настройки определенные для этого монитора.

', // Added - 2015-04-18 'OpEq' => 'равно', 'OpGt' => 'больше', 'OpGtEq' => 'больше либо равно', @@ -534,50 +537,51 @@ $SLANG = array( 'OpNe' => 'не равно', 'OpNotIn' => 'не в списке', 'OpNotMatches' => 'не совпадает', - 'Open' => 'Open', - 'OptionHelp' => 'OptionHelp', + 'Open' => 'Открыть', + 'OptionHelp' => 'Справка', 'OptionRestartWarning' => 'Эти изменения подействуют только после перезапуска программы.', 'Options' => 'Опции', 'OrEnterNewName' => 'или введите новое имя', - 'Order' => 'Order', + 'Order' => 'Сортировка', 'Orientation' => 'Ориентация', 'Out' => 'Out', 'OverwriteExisting' => 'Перезаписать существующее', 'Paged' => 'По страницам', - 'Pan' => 'Pan', - 'PanLeft' => 'Pan Left', - 'PanRight' => 'Pan Right', - 'PanTilt' => 'Pan/Tilt', - 'Parameter' => 'Парамер', + 'Pan' => 'Панорама', + 'PanLeft' => 'Панорама влево', + 'PanRight' => 'Панорама вправо', + 'PanTilt' => 'Панорама/Наклон', + 'Parameter' => 'Параметр', 'Password' => 'Пароль', 'PasswordsDifferent' => 'Пароли не совпадают', 'Paths' => 'Пути', - 'Pause' => 'Pause', + 'Pause' => 'Пауза', + 'Paused' => 'Пауза', 'Phone' => 'Phone', 'PhoneBW' => 'Телефонная линия', 'Pid' => 'PID', // Added - 2011-06-16 'PixelDiff' => 'Pixel Diff', 'Pixels' => 'в пикселях', - 'Play' => 'Play', - 'PlayAll' => 'Play All', + 'Play' => 'Играть', + 'PlayAll' => 'Воспр. все', 'PleaseWait' => 'Пожалуйста подождите', 'Plugins' => 'Plugins', - 'Point' => 'Point', + 'Point' => 'Точка', 'PostEventImageBuffer' => 'Буфер после события', 'PreEventImageBuffer' => 'Буфер до события', - 'PreserveAspect' => 'Preserve Aspect Ratio', - 'Preset' => 'Preset', - 'Presets' => 'Presets', + 'PreserveAspect' => 'Сохранять соотношение сторон', + 'Preset' => 'Предустановка', + 'Presets' => 'Предустановки', 'Prev' => 'Пред.', - 'Probe' => 'Probe', // Added - 2009-03-31 - 'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18 - 'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera .

Select the desired entry from the list below.

Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2015-04-18 - 'Progress' => 'Progress', // Added - 2015-04-18 - 'Protocol' => 'Protocol', + 'Probe' => 'Поиск', // Added - 2009-03-31 + 'ProfileProbe' => 'Поиск потока', // Added - 2015-04-18 + 'ProfileProbeIntro' => 'В этом списке показаны существующие профили потока выбранной камеры.

Выберите нужный из списка ниже.

Обратите внимание, что ZoneMinder не может добавить дополнительный профиль, и что выбор профиля может переписать настройки определенные для этого монитора.

', // Added - 2015-04-18 + 'Progress' => 'Прогресс', // Added - 2015-04-18 + 'Protocol' => 'Протокол', 'Rate' => 'Скорость', 'Real' => 'Реальная', 'Record' => 'Record', - 'RefImageBlendPct' => 'Прозрачность опорного кадра, %', + 'RefImageBlendPct' => 'Смешение опорного кадра, %', 'Refresh' => 'Обновить', 'Remote' => 'Удаленный', 'RemoteHostName' => 'Имя удаленного хоста', @@ -585,22 +589,22 @@ $SLANG = array( 'RemoteHostPort' => 'удаленный порт', 'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08 'RemoteImageColours' => 'Цветность на удаленном хосте', - 'RemoteMethod' => 'Remote Method', // Added - 2009-02-08 + 'RemoteMethod' => 'Метод доступа', // Added - 2009-02-08 'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08 'Rename' => 'Переименовать', - 'Replay' => 'Replay', - 'ReplayAll' => 'All Events', - 'ReplayGapless' => 'Gapless Events', - 'ReplaySingle' => 'Single Event', - 'Reset' => 'Reset', + 'Replay' => 'Повтор', + 'ReplayAll' => 'Все события', + 'ReplayGapless' => 'События подряд', + 'ReplaySingle' => 'Одно событие', + 'Reset' => 'Сбросить', 'ResetEventCounts' => 'Обнулить счетчик событий', 'Restart' => 'Перезапустить', 'Restarting' => 'Перезапускается', 'RestrictedCameraIds' => 'Id запрещенных камер', 'RestrictedMonitors' => 'Restricted Monitors', - 'ReturnDelay' => 'Return Delay', - 'ReturnLocation' => 'Return Location', - 'Rewind' => 'Rewind', + 'ReturnDelay' => 'Задержка возврата', + 'ReturnLocation' => 'Положение возврата', + 'Rewind' => 'Назад', 'RotateLeft' => 'Повернуть влево', 'RotateRight' => 'Повернуть вправо', 'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25 @@ -614,27 +618,28 @@ $SLANG = array( 'Score' => 'Оценка', 'Secs' => 'Сек.', 'Sectionlength' => 'Длина секции (в кадрах)', - 'Select' => 'Select', - 'SelectFormat' => 'Select Format', // Added - 2011-06-17 - 'SelectLog' => 'Select Log', // Added - 2011-06-17 + 'Select' => 'Выбор', + 'SelectFormat' => 'Выберите формат', // Added - 2011-06-17 + 'SelectLog' => 'Выберите лог', // Added - 2011-06-17 'SelectMonitors' => 'Select Monitors', 'SelfIntersecting' => 'Polygon edges must not intersect', + 'Server' => 'Сервер', 'Set' => 'Set', 'SetNewBandwidth' => 'Установка новой ширина канала', 'SetPreset' => 'Set Preset', 'Settings' => 'Настройки', 'ShowFilterWindow' => 'Показать окно фильтра', - 'ShowTimeline' => 'Show Timeline', - 'SignalCheckColour' => 'Signal Check Colour', + 'ShowTimeline' => 'Показать график', + 'SignalCheckColour' => 'Цвет проверки сигнала', 'Size' => 'Size', 'SkinDescription' => 'Change the default skin for this computer', // Added - 2011-01-30 'Sleep' => 'Sleep', - 'SortAsc' => 'Asc', - 'SortBy' => 'Sort by', - 'SortDesc' => 'Desc', + 'SortAsc' => 'По возр.', + 'SortBy' => 'Сортировать', + 'SortDesc' => 'По убыв.', 'Source' => 'Источник', 'SourceColours' => 'Source Colours', // Added - 2009-02-08 - 'SourcePath' => 'Source Path', // Added - 2009-02-08 + 'SourcePath' => 'Путь к источнику', // Added - 2009-02-08 'SourceType' => 'Тип источника', 'Speed' => 'Speed', 'SpeedHigh' => 'High Speed', @@ -645,9 +650,9 @@ $SLANG = array( 'State' => 'Состояние', 'Stats' => 'Статистика', 'Status' => 'Статус', - 'Step' => 'Step', - 'StepBack' => 'Step Back', - 'StepForward' => 'Step Forward', + 'Step' => 'Шаг', + 'StepBack' => 'Кадр назад', + 'StepForward' => 'Кадр вперед', 'StepLarge' => 'Large Step', 'StepMedium' => 'Medium Step', 'StepNone' => 'No Step', @@ -656,49 +661,50 @@ $SLANG = array( 'Stop' => 'Остановить', 'Stopped' => 'Остановлен', 'Stream' => 'Поток', - 'StreamReplayBuffer' => 'Stream Replay Image Buffer', - 'Submit' => 'Submit', + 'StreamReplayBuffer' => 'Буфер потока повторного воспр.', + 'Submit' => 'Применить', 'System' => 'Система', - 'SystemLog' => 'System Log', // Added - 2011-06-16 - 'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18 + 'SystemLog' => 'Лог системы', // Added - 2011-06-16 + 'TargetColorspace' => 'Цветовое пространство', // Added - 2015-04-18 'Tele' => 'Tele', 'Thumbnail' => 'Thumbnail', - 'Tilt' => 'Tilt', + 'Tilt' => 'Наклон', 'Time' => 'Время', 'TimeDelta' => 'Относительное время', 'TimeStamp' => 'Метка времени', - 'Timeline' => 'Timeline', - 'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15. - 'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15. - 'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15. - 'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15. + 'Timeline' => 'График', + 'TimelineTip1' => 'Наведите мышку на график чтобы увидеть снимок и описание события.', // Added 2013.08.15. + 'TimelineTip2' => 'Нажмите на окрашенный участок графика или на снимок чтобы просмотреть событие.', // Added 2013.08.15. + 'TimelineTip3' => 'Нажмите на фоновый графика чтобы приблизит его.', // Added 2013.08.15. + 'TimelineTip4' => 'Используйте кнопки снизу для отдаления и перемещения по временной шкале.', // Added 2013.08.15. 'Timestamp' => 'Метка времени', 'TimestampLabelFormat' => 'Формат метки', 'TimestampLabelX' => 'X-координата метки', 'TimestampLabelY' => 'Y-координата метки', - 'Today' => 'Today', + 'TimestampLabelSize' => 'Размер метки', + 'Today' => 'Сегодня', 'Tools' => 'Инструменты', - 'Total' => 'Total', // Added - 2011-06-16 + 'Total' => 'Всего', // Added - 2011-06-16 'TotalBrScore' => 'Сумм.
оценка', - 'TrackDelay' => 'Track Delay', - 'TrackMotion' => 'Track Motion', + 'TrackDelay' => 'Задержка обнаружения', + 'TrackMotion' => 'Отслеживать движение', 'Triggers' => 'Триггеры', - 'TurboPanSpeed' => 'Turbo Pan Speed', - 'TurboTiltSpeed' => 'Turbo Tilt Speed', + 'TurboPanSpeed' => 'Скорость ускор. панорам.', + 'TurboTiltSpeed' => 'Скорость ускор. наклона', 'Type' => 'Тип', 'Unarchive' => 'Уд. из архива', - 'Undefined' => 'Undefined', // Added - 2009-02-08 + 'Undefined' => 'Не определено', // Added - 2009-02-08 'Units' => 'Ед. измерения', - 'Unknown' => 'Unknown', - 'Update' => 'Update', + 'Unknown' => 'Неизвестно', + 'Update' => 'Обновить', 'UpdateAvailable' => 'Доступно обновление ZoneMinder', 'UpdateNotNecessary' => 'Обновление не требуется', - 'Updated' => 'Updated', // Added - 2011-06-16 - 'Upload' => 'Upload', // Added - 2011-08-23 + 'Updated' => 'Обновлено', // Added - 2011-06-16 + 'Upload' => 'Загрузить', // Added - 2011-08-23 'UseFilter' => 'Использовать фильтр', 'UseFilterExprsPost' => ' выражений для фильтра', // This is used at the end of the phrase 'use N filter expressions' 'UseFilterExprsPre' => 'Испол. ', // This is used at the beginning of the phrase 'use N filter expressions' - 'UsedPlugins' => 'Used Plugins', + 'UsedPlugins' => 'Использующиеся плагины', 'User' => 'Пользователь', 'Username' => 'Имя пользователя', 'Users' => 'Пользователи', @@ -728,9 +734,9 @@ $SLANG = array( 'WarmupFrames' => 'Кадры разогрева', 'Watch' => 'Watch', 'Web' => 'Интерфейс', - 'WebColour' => 'Web Colour', + 'WebColour' => 'Цвет отметки', 'Week' => 'Неделя', - 'White' => 'White', + 'White' => 'Бал. белого', 'WhiteBalance' => 'White Balance', 'Wide' => 'Wide', 'X' => 'X', @@ -742,21 +748,21 @@ $SLANG = array( 'Yes' => 'Да', 'YouNoPerms' => 'У вас не достаточно прав для доступа к этому ресурсу.', 'Zone' => 'Зона', - 'ZoneAlarmColour' => 'Цвет тревоги (Red/Green/Blue)', - 'ZoneArea' => 'Zone Area', - 'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count', - 'ZoneFilterSize' => 'Filter Width/Height (pixels)', - 'ZoneMinMaxAlarmArea' => 'Min/Max Alarmed Area', - 'ZoneMinMaxBlobArea' => 'Min/Max Blob Area', - 'ZoneMinMaxBlobs' => 'Min/Max Blobs', - 'ZoneMinMaxFiltArea' => 'Min/Max Filtered Area', - 'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)', + 'ZoneAlarmColour' => 'Цвет тревоги (Кр./Зел./Синий)', + 'ZoneArea' => 'Размер зоны', + 'ZoneExtendAlarmFrames' => 'Кол-во кадров продления тревоги', + 'ZoneFilterSize' => 'Ширина/Высота фильтра (пикс.)', + 'ZoneMinMaxAlarmArea' => 'Мин/Макс разм. зоны тревоги', + 'ZoneMinMaxBlobArea' => 'Мин/Макс разм. объекта', + 'ZoneMinMaxBlobs' => 'Мин/Макс кол-во объектов', + 'ZoneMinMaxFiltArea' => 'Мин/Макс разм. фильтр. зоны ', + 'ZoneMinMaxPixelThres' => 'Мин/Макс порог изм. пикс. (0-255)', 'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17 - 'ZoneOverloadFrames' => 'Overload Frame Ignore Count', + 'ZoneOverloadFrames' => 'Кол-во игнор. кадров перегрузки', 'Zones' => 'Зоны', - 'Zoom' => 'Zoom', - 'ZoomIn' => 'Zoom In', - 'ZoomOut' => 'Zoom Out', + 'Zoom' => 'Увеличение', + 'ZoomIn' => 'Приблизить', + 'ZoomOut' => 'Отдалить', ); // Complex replacements with formatting and/or placements, must be passed through sprintf @@ -768,7 +774,7 @@ $CLANG = array( 'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below) 'MonitorFunction' => 'Функция монитора %1$s', 'RunningRecentVer' => 'У вас установлена новейшая версия ZoneMinder, v%s.', - 'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25 + 'VersionMismatch' => 'Несоответствие версий, версия системы - %1$s, версия БД - %2$s.', // Added - 2011-05-25 ); // The next section allows you to describe a series of word ending and counts used to @@ -885,18 +891,27 @@ function zmVlang( $langVarArray, $count ) // So for example, to override the help text for ZM_LANG_DEFAULT do $OLANG = array( 'OPTIONS_FFMPEG' => array( - 'Help' => "Parameters in this field are passed on to FFmpeg. Multiple parameters can be separated by ,~~ ". - "Examples (do not enter quotes)~~~~". - "\"allowed_media_types=video\" Set datatype to request fromcam (audio, video, data)~~~~". - "\"reorder_queue_size=nnn\" Set number of packets to buffer for handling of reordered packets~~~~". - "\"loglevel=debug\" Set verbosity of FFmpeg (quiet, panic, fatal, error, warning, info, verbose, debug)" + 'Help' => "Параметры заданные в этом поле передаются в FFmpeg. Множественные параметры разделяются запятой.~~ ". + "Примеры (вводятся без кавычек)~~~~". + "\"allowed_media_types=video\" Задает тип данных, запрашиваемый от камеры (аудио, видео, данные)~~~~". + "\"reorder_queue_size=nnn\" Задает количество пакетов в очереди обработки переупорядочивания пакетов~~~~". + "\"loglevel=debug\" Задает уровень вывода сообщений от FFmpeg (quiet, panic, fatal, error, warning, info, verbose, debug)" ), 'OPTIONS_LIBVLC' => array( - 'Help' => "Parameters in this field are passed on to libVLC. Multiple parameters can be separated by ,~~ ". - "Examples (do not enter quotes)~~~~". - "\"--rtp-client-port=nnn\" Set local port to use for rtp data~~~~". - "\"--verbose=2\" Set verbosity of libVLC" + 'Help' => "Параметры заданные в этом поле передаются в libVLC. Множественные параметры разделяются запятой.~~ ". + "Примеры (вводятся без кавычек)~~~~". + "\"--rtp-client-port=nnn\" Задает локальный порт используемый для RTP данных~~~~". + "\"--verbose=2\" Задает уровень вывода сообщений от libVLC" ), + 'SKIN_DEFAULT' => array( + 'Prompt' => "Тема оформления по умолчанию", + 'Help' => "ZoneMinder позволяет использовать много разных веб-интерфейсов. Эта настройка позволяет вам выбрать тему оформления используемую сайтом по умолчанию. Пользователи могут изменить свою подзнее." + ), + 'CSS_DEFAULT' => array( + 'Prompt' => "Набор стилей оформления CSS по умолчанию", + 'Help' => "ZoneMinder позволяет использовать много разных веб-интерфейсов, некоторые из них позволяют использовать разные наборы стилей оформления. Эта настройка позволяет вам выбрать набор стилей для темы оформления используемый сайтом по умолчанию. Пользователи могут изменить свой подзнее." + ), + // 'LANG_DEFAULT' => array( // 'Prompt' => "This is a new prompt for this option", diff --git a/web/skins/classic/graphics/arrow-d.gif b/web/skins/classic/graphics/arrow-d.gif deleted file mode 100644 index 809207beb..000000000 Binary files a/web/skins/classic/graphics/arrow-d.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-d.png b/web/skins/classic/graphics/arrow-d.png new file mode 100644 index 000000000..b79def085 Binary files /dev/null and b/web/skins/classic/graphics/arrow-d.png differ diff --git a/web/skins/classic/graphics/arrow-dl.gif b/web/skins/classic/graphics/arrow-dl.gif deleted file mode 100644 index 6768249cc..000000000 Binary files a/web/skins/classic/graphics/arrow-dl.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-dl.png b/web/skins/classic/graphics/arrow-dl.png new file mode 100644 index 000000000..933220d8a Binary files /dev/null and b/web/skins/classic/graphics/arrow-dl.png differ diff --git a/web/skins/classic/graphics/arrow-dr.gif b/web/skins/classic/graphics/arrow-dr.gif deleted file mode 100644 index d497bdbc1..000000000 Binary files a/web/skins/classic/graphics/arrow-dr.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-dr.png b/web/skins/classic/graphics/arrow-dr.png new file mode 100644 index 000000000..3e3caef92 Binary files /dev/null and b/web/skins/classic/graphics/arrow-dr.png differ diff --git a/web/skins/classic/graphics/arrow-l-d.gif b/web/skins/classic/graphics/arrow-l-d.gif deleted file mode 100644 index d7b405b1f..000000000 Binary files a/web/skins/classic/graphics/arrow-l-d.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-l-d.png b/web/skins/classic/graphics/arrow-l-d.png new file mode 100644 index 000000000..4919f405a Binary files /dev/null and b/web/skins/classic/graphics/arrow-l-d.png differ diff --git a/web/skins/classic/graphics/arrow-l-u.gif b/web/skins/classic/graphics/arrow-l-u.gif deleted file mode 100644 index 9422c0f47..000000000 Binary files a/web/skins/classic/graphics/arrow-l-u.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-l-u.png b/web/skins/classic/graphics/arrow-l-u.png new file mode 100644 index 000000000..4305d4e30 Binary files /dev/null and b/web/skins/classic/graphics/arrow-l-u.png differ diff --git a/web/skins/classic/graphics/arrow-l.gif b/web/skins/classic/graphics/arrow-l.gif deleted file mode 100644 index 42a300132..000000000 Binary files a/web/skins/classic/graphics/arrow-l.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-l.png b/web/skins/classic/graphics/arrow-l.png new file mode 100644 index 000000000..f4f70136f Binary files /dev/null and b/web/skins/classic/graphics/arrow-l.png differ diff --git a/web/skins/classic/graphics/arrow-r.gif b/web/skins/classic/graphics/arrow-r.gif deleted file mode 100644 index e36acc8d8..000000000 Binary files a/web/skins/classic/graphics/arrow-r.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-r.png b/web/skins/classic/graphics/arrow-r.png new file mode 100644 index 000000000..28e9e5e9a Binary files /dev/null and b/web/skins/classic/graphics/arrow-r.png differ diff --git a/web/skins/classic/graphics/arrow-s-d.gif b/web/skins/classic/graphics/arrow-s-d.gif deleted file mode 100644 index bb45dd084..000000000 Binary files a/web/skins/classic/graphics/arrow-s-d.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-s-d.png b/web/skins/classic/graphics/arrow-s-d.png new file mode 100644 index 000000000..b5bdbfd23 Binary files /dev/null and b/web/skins/classic/graphics/arrow-s-d.png differ diff --git a/web/skins/classic/graphics/arrow-s-u.gif b/web/skins/classic/graphics/arrow-s-u.gif deleted file mode 100644 index 455160fad..000000000 Binary files a/web/skins/classic/graphics/arrow-s-u.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-s-u.png b/web/skins/classic/graphics/arrow-s-u.png new file mode 100644 index 000000000..9ef25b9bc Binary files /dev/null and b/web/skins/classic/graphics/arrow-s-u.png differ diff --git a/web/skins/classic/graphics/arrow-u.gif b/web/skins/classic/graphics/arrow-u.gif deleted file mode 100644 index f76f5e005..000000000 Binary files a/web/skins/classic/graphics/arrow-u.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-u.png b/web/skins/classic/graphics/arrow-u.png new file mode 100644 index 000000000..668373053 Binary files /dev/null and b/web/skins/classic/graphics/arrow-u.png differ diff --git a/web/skins/classic/graphics/arrow-ul.gif b/web/skins/classic/graphics/arrow-ul.gif deleted file mode 100644 index 9e620edf1..000000000 Binary files a/web/skins/classic/graphics/arrow-ul.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-ul.png b/web/skins/classic/graphics/arrow-ul.png new file mode 100644 index 000000000..f53cd38e9 Binary files /dev/null and b/web/skins/classic/graphics/arrow-ul.png differ diff --git a/web/skins/classic/graphics/arrow-ur.gif b/web/skins/classic/graphics/arrow-ur.gif deleted file mode 100644 index 8de5ffdae..000000000 Binary files a/web/skins/classic/graphics/arrow-ur.gif and /dev/null differ diff --git a/web/skins/classic/graphics/arrow-ur.png b/web/skins/classic/graphics/arrow-ur.png new file mode 100644 index 000000000..b5cc8ce58 Binary files /dev/null and b/web/skins/classic/graphics/arrow-ur.png differ diff --git a/web/skins/classic/graphics/center.gif b/web/skins/classic/graphics/center.gif deleted file mode 100644 index 492410515..000000000 Binary files a/web/skins/classic/graphics/center.gif and /dev/null differ diff --git a/web/skins/classic/graphics/center.png b/web/skins/classic/graphics/center.png new file mode 100644 index 000000000..8a263c7f7 Binary files /dev/null and b/web/skins/classic/graphics/center.png differ diff --git a/web/skins/classic/graphics/point-g.gif b/web/skins/classic/graphics/point-g.gif deleted file mode 100644 index 4b790a633..000000000 Binary files a/web/skins/classic/graphics/point-g.gif and /dev/null differ diff --git a/web/skins/classic/graphics/point-g.png b/web/skins/classic/graphics/point-g.png new file mode 100644 index 000000000..a60b62211 Binary files /dev/null and b/web/skins/classic/graphics/point-g.png differ diff --git a/web/skins/classic/graphics/point-o.gif b/web/skins/classic/graphics/point-o.gif deleted file mode 100644 index 7abad3743..000000000 Binary files a/web/skins/classic/graphics/point-o.gif and /dev/null differ diff --git a/web/skins/classic/graphics/point-o.png b/web/skins/classic/graphics/point-o.png new file mode 100644 index 000000000..493b9a9ec Binary files /dev/null and b/web/skins/classic/graphics/point-o.png differ diff --git a/web/skins/classic/graphics/point-r.gif b/web/skins/classic/graphics/point-r.gif deleted file mode 100644 index 5d06dd6e0..000000000 Binary files a/web/skins/classic/graphics/point-r.gif and /dev/null differ diff --git a/web/skins/classic/graphics/point-r.png b/web/skins/classic/graphics/point-r.png new file mode 100644 index 000000000..28c56a1a5 Binary files /dev/null and b/web/skins/classic/graphics/point-r.png differ diff --git a/web/skins/classic/graphics/seq-d.gif b/web/skins/classic/graphics/seq-d.gif deleted file mode 100644 index b58de0948..000000000 Binary files a/web/skins/classic/graphics/seq-d.gif and /dev/null differ diff --git a/web/skins/classic/graphics/seq-d.png b/web/skins/classic/graphics/seq-d.png new file mode 100644 index 000000000..c565cb132 Binary files /dev/null and b/web/skins/classic/graphics/seq-d.png differ diff --git a/web/skins/classic/graphics/seq-u.gif b/web/skins/classic/graphics/seq-u.gif deleted file mode 100644 index f090de352..000000000 Binary files a/web/skins/classic/graphics/seq-u.gif and /dev/null differ diff --git a/web/skins/classic/graphics/seq-u.png b/web/skins/classic/graphics/seq-u.png new file mode 100644 index 000000000..20192e9df Binary files /dev/null and b/web/skins/classic/graphics/seq-u.png differ diff --git a/web/skins/classic/js/classic.js b/web/skins/classic/js/classic.js index edd6eb517..58f2e0da9 100644 --- a/web/skins/classic/js/classic.js +++ b/web/skins/classic/js/classic.js @@ -33,7 +33,7 @@ var popupSizes = { 'device': { 'width': 260, 'height': 150 }, 'devices': { 'width': 400, 'height': 240 }, 'donate': { 'width': 500, 'height': 280 }, - 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, minHeight: 540 }, + 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, 'minHeight': 540 }, 'eventdetail': { 'width': 600, 'height': 220 }, 'events': { 'width': 960, 'height': 780 }, 'export': { 'width': 400, 'height': 340 }, diff --git a/web/skins/classic/js/dark.js b/web/skins/classic/js/dark.js index 85d8c97bc..1331c53a0 100644 --- a/web/skins/classic/js/dark.js +++ b/web/skins/classic/js/dark.js @@ -33,7 +33,7 @@ var popupSizes = { 'device': { 'width': 260, 'height': 150 }, 'devices': { 'width': 400, 'height': 240 }, 'donate': { 'width': 500, 'height': 280 }, - 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, minHeight: 540 }, + 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, 'minHeight': 540 }, 'eventdetail': { 'width': 600, 'height': 220 }, 'events': { 'width': 960, 'height': 780 }, 'export': { 'width': 400, 'height': 340 }, diff --git a/web/skins/classic/js/flat.js b/web/skins/classic/js/flat.js index 3e0c1129a..6031c57c9 100644 --- a/web/skins/classic/js/flat.js +++ b/web/skins/classic/js/flat.js @@ -33,7 +33,7 @@ var popupSizes = { 'device': { 'width': 260, 'height': 150 }, 'devices': { 'width': 400, 'height': 240 }, 'donate': { 'width': 500, 'height': 280 }, - 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, minHeight: 540 }, + 'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, 'minHeight': 540 }, 'eventdetail': { 'width': 600, 'height': 220 }, 'events': { 'width': 1220, 'height': 780 }, 'export': { 'width': 400, 'height': 340 }, diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index ff86e9946..0d72a0db2 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -31,11 +31,11 @@ function checkSize() { var h = window.outerHeight; var prevH = h; if (h > screen.availHeight) - h = screen.availHeight; + h = screen.availHeight; if (w > screen.availWidth) - w = screen.availWidth; + w = screen.availWidth; if (w != prevW || h != prevH) - window.resizeTo(w,h); + window.resizeTo(w, h); } } @@ -56,7 +56,7 @@ function getPopupSize( tag, width, height ) if ( popupSize.width && popupSize.height ) { if ( width || height ) - Warning( "Ignoring passed dimensions "+width+"x"+height+" when getting popup size for tag '"+tag+"'" ); + Warning( "Ignoring passed dimensions "+width+"x"+height+" when getting popup size for tag '"+tag+"'" ); return( popupSize ); } if ( popupSize.addWidth ) diff --git a/web/skins/classic/views/frame.php b/web/skins/classic/views/frame.php index f36ce6b50..b8d14df91 100644 --- a/web/skins/classic/views/frame.php +++ b/web/skins/classic/views/frame.php @@ -19,7 +19,11 @@ // if ( !canView( 'Events' ) ) { +<<<<<<< HEAD $view = 'error'; +======= + $view = "error"; +>>>>>>> master return; } @@ -60,6 +64,7 @@ if ( isset( $_REQUEST['scale'] ) ) { $scale = max( reScale( SCALE_BASE, $Monitor->DefaultScale(), ZM_WEB_DEFAULT_SCALE ), SCALE_BASE ); } +<<<<<<< HEAD $show = 'capt'; if ( isset($_REQUEST['show']) ) { $show = $_REQUEST['show']; @@ -67,6 +72,9 @@ if ( isset($_REQUEST['show']) ) { #$show = 'anal'; } $imageData = $Event->getImageSrc( $frame, $scale, ($show=="capt") ); +======= +$imageData = $Event->getImageSrc( $frame, $scale, (isset($_REQUEST['show']) && $_REQUEST['show']=="capt") ); +>>>>>>> master $imagePath = $imageData['thumbPath']; $eventPath = $imageData['eventPath']; @@ -94,6 +102,7 @@ xhtmlHeaders(__FILE__, translate('Frame')." - ".$Event->Id()." - ".$Frame->Frame

+<<<<<<< HEAD <?php echo $Frame->EventId().FrameId() ?>" class=""/>

@@ -104,14 +113,38 @@ xhtmlHeaders(__FILE__, translate('Frame')." - ".$Event->Id()." - ".$Frame->Frame FrameId() < $maxFid ) { ?> +======= + +"> + +<?php echo $Frame->EventId().FrameId() ?>" class=""/> + + +

+FrameId() > 1 ) { ?> + +FrameId() > 1 ) { ?> + +FrameId() < $maxFid ) { ?> + +FrameId() < $maxFid ) { ?> + +>>>>>>> master

+<<<<<<< HEAD

+======= +

" width="Width(), $Event->DefaultScale(), $scale ) ?>" height="Height(), $Event->DefaultScale(), $scale ) ?>" class=""/>

+ +

+

+>>>>>>> master
diff --git a/web/skins/classic/views/js/console.js b/web/skins/classic/views/js/console.js index 3fc77b771..1358976da 100644 --- a/web/skins/classic/views/js/console.js +++ b/web/skins/classic/views/js/console.js @@ -25,15 +25,14 @@ function setButtonStates( element ) function addMonitor( element) { - - var form = element.form; - var dupParam; - var monitorId=-1; - if (form.addBtn.value == jsTranslatedCloneText) + var form = element.form; + var dupParam; + var monitorId=-1; + if (form.addBtn.value == jsTranslatedCloneText) { - // get the value of the first checkbox - for ( var i = 0; i < form.elements.length; i++ ) - { + // get the value of the first checkbox + for ( var i = 0; i < form.elements.length; i++ ) + { if ( form.elements[i].type == "checkbox" ) { if ( form.elements[i].checked ) @@ -42,10 +41,10 @@ function addMonitor( element) break; } } - } - } - dupParam = (monitorId == -1 ) ? '': '&dupId='+monitorId; - createPopup( '?view=monitor'+dupParam, 'zmMonitor0','monitor' ); + } + } + dupParam = (monitorId == -1 ) ? '': '&dupId='+monitorId; + createPopup( '?view=monitor'+dupParam, 'zmMonitor0', 'monitor' ); } function editMonitor( element ) @@ -85,8 +84,8 @@ function reloadWindow() function initPage() { - jsTranslatedAddText = translatedAddText; - jsTranslatedCloneText = translatedCloneText; + jsTranslatedAddText = translatedAddText; + jsTranslatedCloneText = translatedCloneText; reloadWindow.periodical( consoleRefreshTimeout ); if ( showVersionPopup ) createPopup( '?view=version', 'zmVersion', 'version' ); diff --git a/web/skins/classic/views/js/control.js b/web/skins/classic/views/js/control.js index 819f088d8..3b095c624 100644 --- a/web/skins/classic/views/js/control.js +++ b/web/skins/classic/views/js/control.js @@ -26,7 +26,7 @@ function controlCmd( control, event, xtell, ytell ) var x = xEvent.page.x - l; var y = xEvent.page.y - t; - if ( xtell ) + if ( xtell ) { var xge = parseInt( (x*100)/coords.width ); if ( xtell == -1 ) @@ -35,7 +35,7 @@ function controlCmd( control, event, xtell, ytell ) xge = 2*(50 - xge); locParms += "&xge="+xge; } - if ( ytell ) + if ( ytell ) { var yge = parseInt( (y*100)/coords.height ); if ( ytell == -1 ) diff --git a/web/skins/classic/views/js/controlcap.js b/web/skins/classic/views/js/controlcap.js index 44e266943..81bbacca0 100644 --- a/web/skins/classic/views/js/controlcap.js +++ b/web/skins/classic/views/js/controlcap.js @@ -19,6 +19,5 @@ function validateForm( form ) { return( false ); } return( true ); - } diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 623f778d0..a211a5964 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -21,18 +21,27 @@ function changeScale() { vid.height = newHeight; } else { streamScale( scale ); +<<<<<<< HEAD var streamImg = document.getElementById('evtStream'); streamImg.style.width = newWidth + "px"; streamImg.style.height = newHeight + "px"; } Cookie.write( 'zmEventScale'+eventData.MonitorId, scale, { duration: 10*365 } ); +======= + Cookie.write( 'zmEventScale'+eventData.MonitorId, scale, { duration: 10*365 } ); + + /*Stream could be an applet so can't use moo tools*/ + var streamImg = document.getElementById('evtStream'); + streamImg.style.width = newWidth + "px"; + streamImg.style.height = newHeight + "px"; +>>>>>>> master } function changeReplayMode() { var replayMode = $('replayMode').get('value'); - Cookie.write( 'replayMode', replayMode, { duration: 10*365 }) + Cookie.write( 'replayMode', replayMode, { duration: 10*365 }); refreshWindow(); } @@ -45,7 +54,7 @@ var lastEventId = 0; function getCmdResponse( respObj, respText ) { - if ( checkStreamForErrors( "getCmdResponse" ,respObj ) ) + if ( checkStreamForErrors( "getCmdResponse", respObj ) ) return; if ( streamCmdTimer ) @@ -65,7 +74,7 @@ function getCmdResponse( respObj, respText ) $('rate').addClass( 'hidden' ); streamPause( false ); } - else + else { $('modeValue').set( 'text', "Replay" ); $('rateValue').set( 'text', streamStatus.rate ); @@ -203,9 +212,9 @@ function streamSeek( offset ) } function streamQuery() -{ +{ streamReq.send( streamParms+"&command="+CMD_QUERY ); -} +} var slider = null; var scroll = null; @@ -455,7 +464,7 @@ function getFrameResponse( respObj, respText ) eventData['frames'] = new Object(); eventData['frames'][frame.FrameId] = frame; - + loadEventThumb( eventData, frame, respObj.loopback=="true" ); } @@ -494,7 +503,7 @@ function checkFrames( eventId, frameId, loadImage ) if ( !$('eventThumb'+fid) ) { var img = new Element( 'img', { 'id': 'eventThumb'+fid, 'src': 'graphics/transparent.gif', 'alt': fid, 'class': 'placeholder' } ); - img.addEvent( 'click', function () { eventData['frames'][fid] = null; checkFrames( eventId, fid ) } ); + img.addEvent( 'click', function() { eventData['frames'][fid] = null; checkFrames( eventId, fid ); } ); frameQuery( eventId, fid, loadImage && (fid == frameId) ); var imgs = $('eventThumbs').getElements( 'img' ); var injected = false; @@ -723,7 +732,7 @@ function drawProgressBar() var offset = parseInt((index*eventData.Length)/$$(cells).length); $(cell).setProperty( 'title', '+'+secsToTime(offset)+'s' ); $(cell).removeEvent( 'click' ); - $(cell).addEvent( 'click', function(){ streamSeek( offset ); } ); + $(cell).addEvent( 'click', function() { streamSeek( offset ); } ); barWidth += $(cell).getCoordinates().width; } ); @@ -764,7 +773,7 @@ function handleClick( event ) var target = event.target; var x = event.page.x - $(target).getLeft(); var y = event.page.y - $(target).getTop(); - + if ( event.shift ) streamPan( x, y ); else diff --git a/web/skins/classic/views/js/group.js b/web/skins/classic/views/js/group.js index c1ab79581..ee3d1a27d 100644 --- a/web/skins/classic/views/js/group.js +++ b/web/skins/classic/views/js/group.js @@ -9,7 +9,6 @@ if ( refreshParent ) } function configureButtons( element ) { - if ( canEditGroups ) { var form = element.form; form.saveBtn.disabled = (element.value == 0); diff --git a/web/skins/classic/views/js/log.js b/web/skins/classic/views/js/log.js index e6f7fa30e..e27db6517 100644 --- a/web/skins/classic/views/js/log.js +++ b/web/skins/classic/views/js/log.js @@ -22,7 +22,7 @@ var logTimeout = maxSampleTime; var firstLoad = true; var initialDisplayLimit = 200; var sortReversed = false; -var filterFields = [ 'Component', 'ServerId', 'Pid', 'Level', 'File', 'Line']; +var filterFields = ['Component', 'ServerId', 'Pid', 'Level', 'File', 'Line']; var options = {}; function buildFetchParms( parms ) @@ -68,7 +68,7 @@ function logResponse( respObj ) maxLogTime = log.TimeKey; if ( !minLogTime || log.TimeKey < minLogTime ) minLogTime = log.TimeKey; - var row = logTable.push( [ { content: log.DateTime, properties: { style: 'white-space: nowrap' }}, log.Component, log.Server, log.Pid, log.Code, log.Message, log.File, log.Line ] ); + var row = logTable.push( [{ content: log.DateTime, properties: { style: 'white-space: nowrap' }}, log.Component, log.Server, log.Pid, log.Code, log.Message, log.File, log.Line] ); delete log.Message; row.tr.store( 'log', log ); if ( log.Level <= -3 ) @@ -81,7 +81,7 @@ function logResponse( respObj ) row.tr.addClass( 'log-dbg' ); if ( !firstLoad ) { - var color = document.defaultView.getComputedStyle(row.tr,null).getPropertyValue('color'); + var color = document.defaultView.getComputedStyle(row.tr, null).getPropertyValue('color'); var colorParts = color.match(/^rgb.*\((\d+),\s*(\d+),\s*(\d+)/); rowOrigColor = '#' + parseInt(colorParts[1]).toString(16) + parseInt(colorParts[2]).toString(16) + parseInt(colorParts[3]).toString(16); new Fx.Tween( row.tr, { duration: 10000, transition: Fx.Transitions.Sine } ).start( 'color', '#6495ED', rowOrigColor ); @@ -90,15 +90,15 @@ function logResponse( respObj ) ); options = respObj.options; updateFilterSelectors(); - $('lastUpdate').set('text',respObj.updated); - $('logState').set('text',respObj.state); + $('lastUpdate').set('text', respObj.updated); + $('logState').set('text', respObj.state); $('logState').removeClass('ok'); $('logState').removeClass('alert'); $('logState').removeClass('alarm'); $('logState').addClass(respObj.state); - $('totalLogs').set('text',respObj.total); - $('availLogs').set('text',respObj.available); - $('displayLogs').set('text',logCount); + $('totalLogs').set('text', respObj.total); + $('availLogs').set('text', respObj.available); + $('displayLogs').set('text', logCount); if ( firstLoad ) { if ( logCount < displayLimit ) @@ -123,7 +123,7 @@ function logResponse( respObj ) } } logTimer = fetchNextLogs.delay( logTimeout ); -} +} function refreshLog() { @@ -151,7 +151,7 @@ function clearLog() logCount = 0; logTimeout = maxSampleTime; displayLimit = initialDisplayLimit; - $('displayLogs').set('text',logCount); + $('displayLogs').set('text', logCount); options = {}; logTable.empty(); } @@ -265,12 +265,12 @@ function updateFilterSelectors() selector.options[selector.options.length] = new Option( value, label ); } ); - } + } else if ( key == 'ServerId' ) { Object.each(values, function( value, label ) - { + { selector.options[selector.options.length] = new Option( value, label ); } ); @@ -285,7 +285,7 @@ function updateFilterSelectors() ); } if ( filter[key] ) - selector.set('value',filter[key]); + selector.set('value', filter[key]); } ); } @@ -315,13 +315,13 @@ function initPage() if ( sortReversed ) startIndex = displayLimit; else - startIndex = 0;; + startIndex = 0; for ( var i = startIndex; logCount > displayLimit; i++ ) { rows[i].destroy(); logCount--; } - $('displayLogs').set('text',logCount); + $('displayLogs').set('text', logCount); } } ); diff --git a/web/skins/classic/views/js/montage.js b/web/skins/classic/views/js/montage.js index e91c812c2..641168c0b 100644 --- a/web/skins/classic/views/js/montage.js +++ b/web/skins/classic/views/js/montage.js @@ -14,7 +14,7 @@ function Monitor( monitorData ) this.start = function( delay ) { this.streamCmdTimer = this.streamCmdQuery.delay( delay, this ); - } + }; this.setStateClass = function( element, stateClass ) { @@ -28,7 +28,7 @@ function Monitor( monitorData ) element.removeClass( 'idle' ); element.addClass( stateClass ); } - } + }; this.getStreamCmdResponse = function( respObj, respText ) { @@ -57,7 +57,7 @@ function Monitor( monitorData ) } this.setStateClass( $('monitor'+this.id), stateClass ); - /*Stream could be an applet so can't use moo tools*/ + /*Stream could be an applet so can't use moo tools*/ stream.className = stateClass; var isAlarmed = ( this.alarmState == STATE_ALARM || this.alarmState == STATE_ALERT ); @@ -98,15 +98,14 @@ function Monitor( monitorData ) console.error( respObj.message ); // Try to reload the image stream. if ( stream ) - stream.src = stream.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); - + stream.src = stream.src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); } var streamCmdTimeout = statusRefreshTimeout; if ( this.alarmState == STATE_ALARM || this.alarmState == STATE_ALERT ) streamCmdTimeout = streamCmdTimeout/5; this.streamCmdTimer = this.streamCmdQuery.delay( streamCmdTimeout, this ); this.lastAlarmState = this.alarmState; - } + }; this.streamCmdQuery = function( resent ) { @@ -114,7 +113,7 @@ function Monitor( monitorData ) //console.log( this.connKey+": Resending" ); //this.streamCmdReq.cancel(); this.streamCmdReq.send( this.streamCmdParms+"&command="+CMD_QUERY ); - } + }; this.streamCmdReq = new Request.JSON( { url: this.server_url, method: 'get', timeout: AJAX_TIMEOUT, onSuccess: this.getStreamCmdResponse.bind( this ), onTimeout: this.streamCmdQuery.bind( this, true ), link: 'cancel' } ); @@ -172,7 +171,7 @@ function changeScale() { var monitor = monitors[x]; var newWidth = ( monitorData[x].width * scale ) / SCALE_BASE; var newHeight = ( monitorData[x].height * scale ) / SCALE_BASE; - /*Stream could be an applet so can't use moo tools*/ + /*Stream could be an applet so can't use moo tools*/ var streamImg = document.getElementById( 'liveStream'+monitor.id ); if ( streamImg ) { var src = streamImg.src; diff --git a/web/skins/classic/views/js/onvifprobe.js b/web/skins/classic/views/js/onvifprobe.js index f70765dda..93b2c53e9 100644 --- a/web/skins/classic/views/js/onvifprobe.js +++ b/web/skins/classic/views/js/onvifprobe.js @@ -31,7 +31,7 @@ function configureButtons( element ) if(form.elements.namedItem("nextBtn")) { form.nextBtn.disabled = (form.probe.selectedIndex==0) || (form.username == "") || (form.username == null) || - (form.password == "") || (form.password == null); + (form.password == "") || (form.password == null); } if(form.elements.namedItem("saveBtn")) { form.saveBtn.disabled = (form.probe.selectedIndex==0); diff --git a/web/skins/classic/views/js/state.js b/web/skins/classic/views/js/state.js index c1037a648..c21261da6 100644 --- a/web/skins/classic/views/js/state.js +++ b/web/skins/classic/views/js/state.js @@ -1,3 +1,4 @@ +<<<<<<< HEAD $j(document).ready(function() { // Enable or disable the Delete button depending on the selected run state $j("#runState").change(function() { @@ -67,3 +68,58 @@ $j(document).ready(function() { }); +======= +function checkState( element ) +{ + var form = element.form; + + var minIndex = running?2:1; + if ( form.runState.selectedIndex < minIndex ) + { + form.saveBtn.disabled = true; + form.deleteBtn.disabled = true; + } + else + { + form.saveBtn.disabled = false; + form.deleteBtn.disabled = false; + } + + if ( form.newState.value != '' ) + form.saveBtn.disabled = false; + + // PP if we are in 'default' state, disable delete + // you can still save + if (element.value.toLowerCase() == 'default' ) + { + form.saveBtn.disabled = false; + form.deleteBtn.disabled = true; + } +} + +function saveState( element ) +{ + var form = element.form; + + form.view.value = currentView; + form.action.value = 'save'; + form.submit(); +} + +function deleteState( element ) +{ + var form = element.form; + form.view.value = currentView; + form.action.value = 'delete'; + form.submit(); +} + +if ( applying ) +{ + function submitForm() + { + $('contentForm').submit(); + } + window.addEvent( 'domready', function() { submitForm.delay( 1000 ); } ); +} +>>>>>>> master diff --git a/web/skins/classic/views/js/timeline.js b/web/skins/classic/views/js/timeline.js index 260e9ca82..bb34a2ae4 100644 --- a/web/skins/classic/views/js/timeline.js +++ b/web/skins/classic/views/js/timeline.js @@ -125,6 +125,7 @@ function loadEventImage( imagePath, eid, fid, width, height, fps, videoName, dur { var vid= $('preview'); var imageSrc = $('imageSrc'); +<<<<<<< HEAD if ( videoName && vid ) { vid.show(); imageSrc.hide(); @@ -160,9 +161,14 @@ function loadEventImage( imagePath, eid, fid, width, height, fps, videoName, dur imageSrc.addEvent( 'click', showEvent.pass( [ eid, fid, width, height ] ) ); } +======= + imageSrc.setProperty( 'src', imagePrefix+imagePath ); + imageSrc.removeEvent( 'click' ); + imageSrc.addEvent( 'click', showEvent.pass( [eid, fid, width, height] ) ); +>>>>>>> master var eventData = $('eventData'); eventData.removeEvent( 'click' ); - eventData.addEvent( 'click', showEvent.pass( [ eid, fid, width, height ] ) ); + eventData.addEvent( 'click', showEvent.pass( [eid, fid, width, height] ) ); } function tlZoomBounds( minTime, maxTime ) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 20a2cafba..c7fd09ae6 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -1,3 +1,4 @@ +<<<<<<< HEAD function setButtonState( element, butClass ) { element.className = butClass; element.disabled = (butClass != 'inactive'); @@ -40,6 +41,54 @@ function changeScale() { } else { console.error("No element found for liveStream."); } +======= +function setButtonState( element, butClass ) +{ + element.className = butClass; + element.disabled = (butClass != 'inactive'); +} + +function showEvents() +{ + $('ptzControls').addClass( 'hidden' ); + $('events').removeClass( 'hidden' ); + if ( $('eventsControl') ) + $('eventsControl').addClass('hidden'); + if ( $('controlControl') ) + $('controlControl').removeClass('hidden'); + showMode = "events"; +} + +function showPtzControls() +{ + $('events').addClass( 'hidden' ); + $('ptzControls').removeClass( 'hidden' ); + if ( $('eventsControl') ) + $('eventsControl').removeClass('hidden'); + if ( $('controlControl') ) + $('controlControl').addClass('hidden'); + showMode = "control"; +} + +function changeScale() +{ + var scale = $('scale').get('value'); + var newWidth = ( monitorWidth * scale ) / SCALE_BASE; + var newHeight = ( monitorHeight * scale ) / SCALE_BASE; + + Cookie.write( 'zmWatchScale'+monitorId, scale, { duration: 10*365 } ); + + /*Stream could be an applet so can't use moo tools*/ + var streamImg = document.getElementById('liveStream'); + if ( streamImg ) { + streamImg.style.width = newWidth + "px"; + streamImg.style.height = newHeight + "px"; + + streamImg.src = streamImg.src.replace(/scale=\d+/i, 'scale='+scale); + } else { + console.error("No element found for liveStream."); + } +>>>>>>> master } var alarmState = STATE_IDLE; @@ -143,10 +192,64 @@ function getStreamCmdResponse( respObj, respText ) { if ( streamStatus.rate < 1 ) streamCmdSlowFwd( false ); else +<<<<<<< HEAD streamCmdFastFwd( false ); } else { if ( streamStatus.rate > -1 ) streamCmdSlowRev( false ); +======= + $('levelValue').className = "ok"; + + var delayString = secsToTime( streamStatus.delay ); + + if ( streamStatus.paused == true ) + { + $('modeValue').set( 'text', "Paused" ); + $('rate').addClass( 'hidden' ); + $('delayValue').set( 'text', delayString ); + $('delay').removeClass( 'hidden' ); + $('level').removeClass( 'hidden' ); + streamCmdPause( false ); + } + else if ( streamStatus.delayed == true ) + { + $('modeValue').set( 'text', "Replay" ); + $('rateValue').set( 'text', streamStatus.rate ); + $('rate').removeClass( 'hidden' ); + $('delayValue').set( 'text', delayString ); + $('delay').removeClass( 'hidden' ); + $('level').removeClass( 'hidden' ); + if ( streamStatus.rate == 1 ) + { + streamCmdPlay( false ); + } + else if ( streamStatus.rate > 0 ) + { + if ( streamStatus.rate < 1 ) + streamCmdSlowFwd( false ); + else + streamCmdFastFwd( false ); + } + else + { + if ( streamStatus.rate > -1 ) + streamCmdSlowRev( false ); + else + streamCmdFastRev( false ); + } + } + else + { + $('modeValue').set( 'text', "Live" ); + $('rate').addClass( 'hidden' ); + $('delay').addClass( 'hidden' ); + $('level').addClass( 'hidden' ); + streamCmdPlay( false ); + } + $('zoomValue').set( 'text', streamStatus.zoom ); + if ( streamStatus.zoom == "1.0" ) + setButtonState( $('zoomOutBtn'), 'unavail' ); +>>>>>>> master else streamCmdFastRev( false ); } // rate @@ -201,6 +304,7 @@ function getStreamCmdResponse( respObj, respText ) { } else { console.log("Unable to find streamImg liveStream"); } +<<<<<<< HEAD } var streamCmdTimeout = statusRefreshTimeout; @@ -208,6 +312,21 @@ function getStreamCmdResponse( respObj, respText ) { streamCmdTimeout = streamCmdTimeout/5; streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); } +======= + else { + checkStreamForErrors("getStreamCmdResponse", respObj);//log them + // Try to reload the image stream. + var streamImg = document.getElementById('liveStream'); + if ( streamImg ) + streamImg.src = streamImg.src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); + } + + var streamCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + streamCmdTimeout = streamCmdTimeout/5; + streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); +} +>>>>>>> master function streamCmdPause( action ) { setButtonState( $('pauseBtn'), 'active' ); @@ -236,6 +355,7 @@ function streamCmdPlay( action ) { setButtonState( $('slowFwdBtn'), 'unavail' ); setButtonState( $('slowRevBtn'), 'unavail' ); setButtonState( $('fastRevBtn'), 'unavail' ); +<<<<<<< HEAD } if ( action ) streamCmdReq.send( streamCmdParms+"&command="+CMD_PLAY ); @@ -326,6 +446,94 @@ function streamCmdPan( x, y ) { function streamCmdQuery() { streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); } +======= + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_STOP ); + setButtonState( $('stopBtn'), 'unavail' ); + setButtonState( $('playBtn'), 'active' ); +} + +function streamCmdFastFwd( action ) +{ + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTFWD ); +} + +function streamCmdSlowFwd( action ) +{ + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'active' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWFWD ); + setButtonState( $('pauseBtn'), 'active' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); +} + +function streamCmdSlowRev( action ) +{ + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'active' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_SLOWREV ); + setButtonState( $('pauseBtn'), 'active' ); + setButtonState( $('slowRevBtn'), 'inactive' ); +} + +function streamCmdFastRev( action ) +{ + setButtonState( $('pauseBtn'), 'inactive' ); + setButtonState( $('playBtn'), 'inactive' ); + setButtonState( $('stopBtn'), 'inactive' ); + setButtonState( $('fastFwdBtn'), 'inactive' ); + setButtonState( $('slowFwdBtn'), 'inactive' ); + setButtonState( $('slowRevBtn'), 'inactive' ); + setButtonState( $('fastRevBtn'), 'inactive' ); + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_FASTREV ); +} + +function streamCmdZoomIn( x, y ) +{ + streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMIN+"&x="+x+"&y="+y ); +} + +function streamCmdZoomOut() +{ + streamCmdReq.send( streamCmdParms+"&command="+CMD_ZOOMOUT ); +} + +function streamCmdScale( scale ) +{ + streamCmdReq.send( streamCmdParms+"&command="+CMD_SCALE+"&scale="+scale ); +} + +function streamCmdPan( x, y ) +{ + streamCmdReq.send( streamCmdParms+"&command="+CMD_PAN+"&x="+x+"&y="+y ); +} + +function streamCmdQuery() +{ + streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); +} +>>>>>>> master var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate"; if ( auth_hash ) @@ -333,6 +541,7 @@ if ( auth_hash ) var statusCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'get', data: statusCmdParms, timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getStatusCmdResponse } ); var statusCmdTimer = null; +<<<<<<< HEAD function getStatusCmdResponse( respObj, respText ) { console.log("Got statusCmdQuery"); watchdogOk("status"); @@ -358,6 +567,32 @@ function statusCmdQuery() { console.log("Sending statusCmdQuery"); statusCmdReq.send(); } +======= +function getStatusCmdResponse( respObj, respText ) +{ + watchdogOk("status"); + if ( statusCmdTimer ) + statusCmdTimer = clearTimeout( statusCmdTimer ); + + if ( respObj.result == 'Ok' ) + { + $('fpsValue').set( 'text', respObj.monitor.FrameRate ); + setAlarmState( respObj.monitor.Status ); + } + else + checkStreamForErrors("getStatusCmdResponse", respObj); + + var statusCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + statusCmdTimeout = statusCmdTimeout/5; + statusCmdTimer = statusCmdQuery.delay( statusCmdTimeout ); +} + +function statusCmdQuery() +{ + statusCmdReq.send(); +} +>>>>>>> master var alarmCmdParms = "view=request&request=alarm&id="+monitorId; if ( auth_hash ) @@ -365,8 +600,14 @@ if ( auth_hash ) var alarmCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getAlarmCmdResponse, onTimeout: streamCmdQuery } ); var alarmCmdFirst = true; +<<<<<<< HEAD function getAlarmCmdResponse( respObj, respText ) { checkStreamForErrors("getAlarmCmdResponse",respObj); +======= +function getAlarmCmdResponse( respObj, respText ) +{ + checkStreamForErrors("getAlarmCmdResponse", respObj); +>>>>>>> master } function cmdDisableAlarms() { @@ -408,6 +649,7 @@ var eventCmdReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: AJA var eventCmdTimer = null; var eventCmdFirst = true; +<<<<<<< HEAD function highlightRow( row ) { $(row).toggleClass( 'highlight' ); } @@ -470,6 +712,87 @@ function getEventCmdResponse( respObj, respText ) { row.inject( $(eventListBody), 'top' ); if ( !eventCmdFirst ) row.addClass( 'recent' ); +======= +function highlightRow( row ) +{ + $(row).toggleClass( 'highlight' ); +} + +function getEventCmdResponse( respObj, respText ) +{ + watchdogOk("event"); + if ( eventCmdTimer ) + eventCmdTimer = clearTimeout( eventCmdTimer ); + + if ( respObj.result == 'Ok' ) + { + var dbEvents = respObj.events.reverse(); + var eventList = $('eventList'); + var eventListBody = $(eventList).getElement( 'tbody' ); + var eventListRows = $(eventListBody).getElements( 'tr' ); + + eventListRows.each( function( row ) { row.removeClass( 'updated' ); } ); + + for ( var i = 0; i < dbEvents.length; i++ ) + { + var event = dbEvents[i]; + var row = $('event'+event.Id); + var newEvent = (row == null ? true : false); + if ( newEvent ) + { + row = new Element( 'tr', { 'id': 'event'+event.Id } ); + new Element( 'td', { 'class': 'colId' } ).inject( row ); + new Element( 'td', { 'class': 'colName' } ).inject( row ); + new Element( 'td', { 'class': 'colTime' } ).inject( row ); + new Element( 'td', { 'class': 'colSecs' } ).inject( row ); + new Element( 'td', { 'class': 'colFrames' } ).inject( row ); + new Element( 'td', { 'class': 'colScore' } ).inject( row ); + new Element( 'td', { 'class': 'colDelete' } ).inject( row ); + + var cells = row.getElements( 'td' ); + + var link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height] ) } }); + link.set( 'text', event.Id ); + link.inject( row.getElement( 'td.colId' ) ); + + link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [event.Id, '&trms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1', event.Width, event.Height] ) } }); + link.set( 'text', event.Name ); + link.inject( row.getElement( 'td.colName' ) ); + + row.getElement( 'td.colTime' ).set( 'text', event.StartTime ); + row.getElement( 'td.colSecs' ).set( 'text', event.Length ); + + link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramesPopup.pass( [event.Id, event.Width, event.Height] ) } }); + link.set( 'text', event.Frames+'/'+event.AlarmFrames ); + link.inject( row.getElement( 'td.colFrames' ) ); + + link = new Element( 'a', { 'href': '#', 'events': { 'click': createFramePopup.pass( [event.Id, '0', event.Width, event.Height] ) } }); + link.set( 'text', event.AvgScore+'/'+event.MaxScore ); + link.inject( row.getElement( 'td.colScore' ) ); + + link = new Element( 'a', { 'href': '#', 'title': deleteString, 'events': { 'click': function( e ) { deleteEvent( e, event.Id ); }, 'mouseover': highlightRow.pass( row ), 'mouseout': highlightRow.pass( row ) } }); + link.set( 'text', 'X' ); + link.inject( row.getElement( 'td.colDelete' ) ); + + if ( i == 0 ) + row.inject( $(eventListBody) ); + else + { + row.inject( $(eventListBody), 'top' ); + if ( !eventCmdFirst ) + row.addClass( 'recent' ); + } + } + else + { + row.getElement( 'td.colName a' ).set( 'text', event.Name ); + row.getElement( 'td.colSecs' ).set( 'text', event.Length ); + row.getElement( 'td.colFrames a' ).set( 'text', event.Frames+'/'+event.AlarmFrames ); + row.getElement( 'td.colScore a' ).set( 'text', event.AvgScore+'/'+event.MaxScore ); + row.removeClass( 'recent' ); + } + row.addClass( 'updated' ); +>>>>>>> master } } else { row.getElement( 'td.colName a' ).set( 'text', event.Name ); @@ -489,12 +812,17 @@ function getEventCmdResponse( respObj, respText ) { i--; } } +<<<<<<< HEAD while ( rows.length > maxDisplayEvents ) { rows[rows.length-1].destroy(); rows.length--; } } else checkStreamForErrors("getEventCmdResponse",respObj); +======= + else + checkStreamForErrors("getEventCmdResponse", respObj); +>>>>>>> master var eventCmdTimeout = eventsRefreshTimeout; if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) @@ -543,6 +871,7 @@ function controlCmd( control, event, xtell, ytell ) { xge = 2*(50 - xge); locParms += "&xge="+xge; } +<<<<<<< HEAD if ( ytell ) { var yge = parseInt( (y*100)/coords.height ); if ( ytell == -1 ) @@ -550,6 +879,42 @@ function controlCmd( control, event, xtell, ytell ) { else if ( ytell == 2 ) yge = 2*(50 - yge); locParms += "&yge="+yge; +======= +} + +function controlCmd( control, event, xtell, ytell ) +{ + var locParms = ""; + if ( event && (xtell || ytell) ) + { + var xEvent = new Event( event ); + var target = xEvent.target; + var coords = $(target).getCoordinates(); + + var l = coords.left; + var t = coords.top; + var x = xEvent.page.x - l; + var y = xEvent.page.y - t; + + if ( xtell ) + { + var xge = parseInt( (x*100)/coords.width ); + if ( xtell == -1 ) + xge = 100 - xge; + else if ( xtell == 2 ) + xge = 2*(50 - xge); + locParms += "&xge="+xge; + } + if ( ytell ) + { + var yge = parseInt( (y*100)/coords.height ); + if ( ytell == -1 ) + yge = 100 - yge; + else if ( ytell == 2 ) + yge = 2*(50 - yge); + locParms += "&yge="+yge; + } +>>>>>>> master } } controlReq.send( controlParms+"&control="+control+locParms ); @@ -562,6 +927,7 @@ function controlCmdImage( x, y ) { imageControlParms += "&scale="+scale; imageControlParms += "&control="+imageControlMode; +<<<<<<< HEAD controlReq.send( imageControlParms+"&x="+x+"&y="+y ); if ( streamMode == "single" ) fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); @@ -569,6 +935,40 @@ function controlCmdImage( x, y ) { function fetchImage( streamImage ) { streamImage.src = streamImage.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); +======= + controlReq.send( imageControlParms+"&x="+x+"&y="+y ); + if ( streamMode == "single" ) + fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); +} + +var tempImage = null; +function fetchImage( streamImage ) +{ + var now = new Date(); + if ( !tempImage ) + tempImage = new Element( 'img' ); + tempImage.setProperty( 'src', streamSrc+'&'+now.getTime() ); + $(streamImage).setProperty( 'src', tempImage.getProperty( 'src' ) ); +} + +function handleClick( event ) +{ + var target = event.target; + var x = event.page.x - $(target).getLeft(); + var y = event.page.y - $(target).getTop(); + + if ( showMode == "events" || !imageControlMode ) + { + if ( event.shift ) + streamCmdPan( x, y ); + else + streamCmdZoomIn( x, y ); + } + else + { + controlCmdImage( x, y ); + } +>>>>>>> master } function handleClick( event ) { @@ -617,6 +1017,7 @@ function watchdogCheck( type ) { console.log( "Detected streamWatch of type: " + type + " stopped, restarting" ); watchdogFunctions[type](); watchdogInactive[type] = false; +<<<<<<< HEAD } else { watchdogInactive[type] = true; } @@ -651,6 +1052,42 @@ function initPage() { if ( refreshApplet && appletRefreshTime ) appletRefresh.delay( appletRefreshTime*1000 ); +======= +} + +function initPage() +{ + if ( streamMode == "single" ) + { + statusCmdTimer = statusCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('status').periodical(statusRefreshTimeout*2); + } + else + { + streamCmdTimer = streamCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('stream').periodical(statusRefreshTimeout*2); + } + + eventCmdTimer = eventCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('event').periodical(eventsRefreshTimeout*2); + + if ( canStreamNative || streamMode == "single" ) + { + var streamImg = $('imageFeed').getElement('img'); + if ( !streamImg ) + streamImg = $('imageFeed').getElement('object'); + if ( streamMode == "single" ) + { + streamImg.addEvent( 'click', fetchImage.pass( streamImg ) ); + fetchImage.pass( streamImg ).periodical( imageRefreshTimeout ); + } + else + streamImg.addEvent( 'click', function( event ) { handleClick( event ); } ); + } + + if ( refreshApplet && appletRefreshTime ) + appletRefresh.delay( appletRefreshTime*1000 ); +>>>>>>> master } // Kick everything off diff --git a/web/skins/classic/views/js/zone.js b/web/skins/classic/views/js/zone.js index 6e1eef611..60637bf55 100644 --- a/web/skins/classic/views/js/zone.js +++ b/web/skins/classic/views/js/zone.js @@ -110,7 +110,7 @@ function applyZoneType() { form.elements['newZone[MaxAlarmPixels]'].disabled = false; form.elements['newZone[OverloadFrames]'].disabled = false; form.elements['newZone[ExtendAlarmFrames]'].disabled = true; - applyCheckMethod(); + applyCheckMethod(); } } @@ -292,7 +292,7 @@ function updateActivePoint( index ) { $('newZone[Points]['+index+'][y]').value = y; zone['Points'][index].x = x; zone['Points'][index].y = y; - var Point = $('zonePoly').points.getItem(index); + var Point = $('zonePoly').points.getItem(index); Point.x =x; Point.y =y; updateArea(); @@ -319,7 +319,12 @@ function delPoint( index ) { drawZonePoints(); } +<<<<<<< HEAD function limitPointValue( point, loVal, hiVal ) { +======= +function limitPointValue( point, loVal, hiVal ) +{ +>>>>>>> master point.value = constrainValue(point.value, loVal, hiVal); } @@ -329,7 +334,6 @@ function updateArea( ) { var form = $('zoneForm'); form.elements['newZone[Area]'].value = area; if ( form.elements['newZone[Units]'].value == 'Percent' ) { - form.elements['newZone[TempArea]'].value = Math.round( area/monitorArea*100 ); } else if ( form.elements['newZone[Units]'].value == 'Pixels' ) { form.elements['newZone[TempArea]'].value = area; @@ -346,7 +350,7 @@ function updateX( index ) { point.setStyle( 'left', x+'px' ); zone['Points'][index].x = x; - var Point = $('zonePoly').points.getItem(index); + var Point = $('zonePoly').points.getItem(index); Point.x = x; } @@ -358,7 +362,7 @@ function updateY( index ) { point.setStyle( 'top', y+'px' ); zone['Points'][index].y = y; - var Point = $('zonePoly').points.getItem(index); + var Point = $('zonePoly').points.getItem(index); Point.y = y; } @@ -501,18 +505,18 @@ function getStreamCmdResponse( respObj, respText ) { streamCmdPlay( false ); } } else { - checkStreamForErrors("getStreamCmdResponse",respObj);//log them + checkStreamForErrors("getStreamCmdResponse", respObj);//log them // Try to reload the image stream. var streamImg = document.getElementById('liveStream'); if ( streamImg ) - streamImg.src = streamImg.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); + streamImg.src = streamImg.src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); } var streamCmdTimeout = statusRefreshTimeout; if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) streamCmdTimeout = streamCmdTimeout/5; streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); -} +} var streamPause = false; @@ -546,7 +550,7 @@ function streamCmdStop( action ) { function streamCmdQuery() { streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); -} +} var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate"; var statusCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', data: statusCmdParms, timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getStatusCmdResponse } ); @@ -563,13 +567,13 @@ function getStatusCmdResponse( respObj, respText ) { setAlarmState( respObj.monitor.Status ); } else - checkStreamForErrors("getStatusCmdResponse",respObj); + checkStreamForErrors("getStatusCmdResponse", respObj); var statusCmdTimeout = statusRefreshTimeout; if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) statusCmdTimeout = statusCmdTimeout/5; statusCmdTimer = statusCmdQuery.delay( statusCmdTimeout ); -} +} function statusCmdQuery() { statusCmdReq.send();